From 117b7b1ba1ea470c8feccf80d5a85b7e85c66d7d Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 24 Apr 2019 20:26:21 +0200 Subject: [PATCH] [d3d11] Implement MultiDrawIndirect extension --- src/d3d11/d3d11_context_ext.cpp | 18 ++++++++++++++++++ src/d3d11/d3d11_device.cpp | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/src/d3d11/d3d11_context_ext.cpp b/src/d3d11/d3d11_context_ext.cpp index 0f73424c..5ca872e3 100644 --- a/src/d3d11/d3d11_context_ext.cpp +++ b/src/d3d11/d3d11_context_ext.cpp @@ -31,7 +31,16 @@ namespace dxvk { ID3D11Buffer* pBufferForArgs, UINT ByteOffsetForArgs, UINT ByteStrideForArgs) { + D3D10DeviceLock lock = m_ctx->LockContext(); + m_ctx->SetDrawBuffer(pBufferForArgs); + m_ctx->EmitCs([ + cCount = DrawCount, + cOffset = ByteOffsetForArgs, + cStride = ByteStrideForArgs + ] (DxvkContext* ctx) { + ctx->drawIndirect(cOffset, cCount, cStride); + }); } @@ -40,7 +49,16 @@ namespace dxvk { ID3D11Buffer* pBufferForArgs, UINT ByteOffsetForArgs, UINT ByteStrideForArgs) { + D3D10DeviceLock lock = m_ctx->LockContext(); + m_ctx->SetDrawBuffer(pBufferForArgs); + m_ctx->EmitCs([ + cCount = DrawCount, + cOffset = ByteOffsetForArgs, + cStride = ByteStrideForArgs + ] (DxvkContext* ctx) { + ctx->drawIndexedIndirect(cOffset, cCount, cStride); + }); } diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 29485a49..8156bf26 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1772,9 +1772,14 @@ namespace dxvk { BOOL STDMETHODCALLTYPE D3D11DeviceExt::GetExtensionSupport( D3D11_VK_EXTENSION Extension) { + const auto& deviceFeatures = m_device->GetDXVKDevice()->features(); + switch (Extension) { case D3D11_VK_EXT_BARRIER_CONTROL: return true; + + case D3D11_VK_EXT_MULTI_DRAW_INDIRECT: + return deviceFeatures.core.features.multiDrawIndirect; default: return false;