From 386727081256aa65b75a9e187c8a19940772c686 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 24 Apr 2019 22:06:23 +0200 Subject: [PATCH] [d3d11] Implement MultiDrawIndirectCount extension --- src/d3d11/d3d11_context_ext.cpp | 24 ++++++++++++++++++++++-- src/d3d11/d3d11_device.cpp | 5 +++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/d3d11/d3d11_context_ext.cpp b/src/d3d11/d3d11_context_ext.cpp index fd335eea..3f164ff3 100644 --- a/src/d3d11/d3d11_context_ext.cpp +++ b/src/d3d11/d3d11_context_ext.cpp @@ -69,7 +69,17 @@ namespace dxvk { ID3D11Buffer* pBufferForArgs, UINT ByteOffsetForArgs, UINT ByteStrideForArgs) { - + D3D10DeviceLock lock = m_ctx->LockContext(); + m_ctx->SetDrawBuffers(pBufferForArgs, pBufferForCount); + + m_ctx->EmitCs([ + cMaxCount = MaxDrawCount, + cArgOffset = ByteOffsetForArgs, + cCntOffset = ByteOffsetForCount, + cStride = ByteStrideForArgs + ] (DxvkContext* ctx) { + ctx->drawIndirectCount(cArgOffset, cCntOffset, cMaxCount, cStride); + }); } @@ -80,7 +90,17 @@ namespace dxvk { ID3D11Buffer* pBufferForArgs, UINT ByteOffsetForArgs, UINT ByteStrideForArgs) { - + D3D10DeviceLock lock = m_ctx->LockContext(); + m_ctx->SetDrawBuffers(pBufferForArgs, pBufferForCount); + + m_ctx->EmitCs([ + cMaxCount = MaxDrawCount, + cArgOffset = ByteOffsetForArgs, + cCntOffset = ByteOffsetForCount, + cStride = ByteStrideForArgs + ] (DxvkContext* ctx) { + ctx->drawIndexedIndirectCount(cArgOffset, cCntOffset, cMaxCount, cStride); + }); } diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 8156bf26..4075bb4c 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1773,6 +1773,7 @@ namespace dxvk { BOOL STDMETHODCALLTYPE D3D11DeviceExt::GetExtensionSupport( D3D11_VK_EXTENSION Extension) { const auto& deviceFeatures = m_device->GetDXVKDevice()->features(); + const auto& deviceExtensions = m_device->GetDXVKDevice()->extensions(); switch (Extension) { case D3D11_VK_EXT_BARRIER_CONTROL: @@ -1781,6 +1782,10 @@ namespace dxvk { case D3D11_VK_EXT_MULTI_DRAW_INDIRECT: return deviceFeatures.core.features.multiDrawIndirect; + case D3D11_VK_EXT_MULTI_DRAW_INDIRECT_COUNT: + return deviceFeatures.core.features.multiDrawIndirect + && deviceExtensions.khrDrawIndirectCount; + default: return false; }