diff --git a/src/d3d10/d3d10_device.cpp b/src/d3d10/d3d10_device.cpp index 0a14fc80..cba6d008 100644 --- a/src/d3d10/d3d10_device.cpp +++ b/src/d3d10/d3d10_device.cpp @@ -1550,7 +1550,10 @@ namespace dxvk { ID3D10Buffer** ppSOTargets, UINT* pOffsets) { ID3D11Buffer* d3d11Buffers[D3D10_SO_BUFFER_SLOT_COUNT]; - m_context->SOGetTargets(NumBuffers, ppSOTargets ? d3d11Buffers : nullptr); + + m_context->SOGetTargetsWithOffsets(NumBuffers, + ppSOTargets ? d3d11Buffers : nullptr, + pOffsets); if (ppSOTargets != nullptr) { for (uint32_t i = 0; i < NumBuffers; i++) { @@ -1559,9 +1562,6 @@ namespace dxvk { : nullptr; } } - - if (pOffsets != nullptr) - Logger::warn("D3D10: SOGetTargets: Reporting buffer offsets not supported"); } diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 7159386b..32a1b024 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -2561,6 +2561,20 @@ namespace dxvk { } + void STDMETHODCALLTYPE D3D11DeviceContext::SOGetTargetsWithOffsets( + UINT NumBuffers, + ID3D11Buffer** ppSOTargets, + UINT* pOffsets) { + for (uint32_t i = 0; i < NumBuffers; i++) { + if (ppSOTargets != nullptr) + ppSOTargets[i] = m_state.so.targets[i].buffer.ref(); + + if (pOffsets != nullptr) + pOffsets[i] = m_state.so.targets[i].offset; + } + } + + void STDMETHODCALLTYPE D3D11DeviceContext::TransitionSurfaceLayout( IDXGIVkInteropSurface* pSurface, const VkImageSubresourceRange* pSubresources, diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 9fd7e56c..47efa7a3 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -631,6 +631,11 @@ namespace dxvk { UINT NumBuffers, ID3D11Buffer** ppSOTargets) final; + void STDMETHODCALLTYPE SOGetTargetsWithOffsets( + UINT NumBuffers, + ID3D11Buffer** ppSOTargets, + UINT* pOffsets); + void STDMETHODCALLTYPE TransitionSurfaceLayout( IDXGIVkInteropSurface* pSurface, const VkImageSubresourceRange* pSubresources,