From c43702e445bcd08d63cb8cc53c0814ea09537775 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 18 Mar 2018 12:45:27 +0100 Subject: [PATCH] [d3d11] Implement GetConstantBuffers1 methods --- src/d3d11/d3d11_context.cpp | 114 ++++++++++++++++++++++++++++-------- src/d3d11/d3d11_context.h | 8 +++ 2 files changed, 99 insertions(+), 23 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index b9559c21..fb9983ee 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1205,8 +1205,11 @@ namespace dxvk { UINT StartSlot, UINT NumBuffers, ID3D11Buffer** ppConstantBuffers) { - for (uint32_t i = 0; i < NumBuffers; i++) - ppConstantBuffers[i] = m_state.vs.constantBuffers.at(StartSlot + i).buffer.ref(); + GetConstantBuffers( + m_state.vs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + nullptr, nullptr); } @@ -1216,7 +1219,12 @@ namespace dxvk { ID3D11Buffer** ppConstantBuffers, UINT* pFirstConstant, UINT* pNumConstants) { - Logger::err("D3D11DeviceContext::VSSetConstantBuffers1: not implemented"); + GetConstantBuffers( + m_state.vs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + pFirstConstant, + pNumConstants); } @@ -1287,7 +1295,7 @@ namespace dxvk { const UINT* pNumConstants) { this->SetConstantBuffers( DxbcProgramType::HullShader, - m_state.vs.constantBuffers, + m_state.hs.constantBuffers, StartSlot, NumBuffers, ppConstantBuffers, pFirstConstant, @@ -1323,8 +1331,11 @@ namespace dxvk { UINT StartSlot, UINT NumBuffers, ID3D11Buffer** ppConstantBuffers) { - for (uint32_t i = 0; i < NumBuffers; i++) - ppConstantBuffers[i] = m_state.hs.constantBuffers.at(StartSlot + i).buffer.ref(); + GetConstantBuffers( + m_state.hs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + nullptr, nullptr); } @@ -1334,7 +1345,12 @@ namespace dxvk { ID3D11Buffer** ppConstantBuffers, UINT* pFirstConstant, UINT* pNumConstants) { - Logger::err("D3D11DeviceContext::HSGetConstantBuffers1: not implemented"); + GetConstantBuffers( + m_state.hs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + pFirstConstant, + pNumConstants); } @@ -1405,7 +1421,7 @@ namespace dxvk { const UINT* pNumConstants) { this->SetConstantBuffers( DxbcProgramType::DomainShader, - m_state.vs.constantBuffers, + m_state.ds.constantBuffers, StartSlot, NumBuffers, ppConstantBuffers, pFirstConstant, @@ -1441,8 +1457,11 @@ namespace dxvk { UINT StartSlot, UINT NumBuffers, ID3D11Buffer** ppConstantBuffers) { - for (uint32_t i = 0; i < NumBuffers; i++) - ppConstantBuffers[i] = m_state.ds.constantBuffers.at(StartSlot + i).buffer.ref(); + GetConstantBuffers( + m_state.ds.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + nullptr, nullptr); } @@ -1452,7 +1471,12 @@ namespace dxvk { ID3D11Buffer** ppConstantBuffers, UINT* pFirstConstant, UINT* pNumConstants) { - Logger::err("D3D11DeviceContext::DSGetConstantBuffers1: not implemented"); + GetConstantBuffers( + m_state.ds.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + pFirstConstant, + pNumConstants); } @@ -1511,7 +1535,7 @@ namespace dxvk { const UINT* pNumConstants) { this->SetConstantBuffers( DxbcProgramType::GeometryShader, - m_state.vs.constantBuffers, + m_state.gs.constantBuffers, StartSlot, NumBuffers, ppConstantBuffers, pFirstConstant, @@ -1559,8 +1583,11 @@ namespace dxvk { UINT StartSlot, UINT NumBuffers, ID3D11Buffer** ppConstantBuffers) { - for (uint32_t i = 0; i < NumBuffers; i++) - ppConstantBuffers[i] = m_state.gs.constantBuffers.at(StartSlot + i).buffer.ref(); + GetConstantBuffers( + m_state.gs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + nullptr, nullptr); } @@ -1570,7 +1597,12 @@ namespace dxvk { ID3D11Buffer** ppConstantBuffers, UINT* pFirstConstant, UINT* pNumConstants) { - Logger::err("D3D11DeviceContext::GSGetConstantBuffers1: not implemented"); + GetConstantBuffers( + m_state.gs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + pFirstConstant, + pNumConstants); } @@ -1629,7 +1661,7 @@ namespace dxvk { const UINT* pNumConstants) { this->SetConstantBuffers( DxbcProgramType::PixelShader, - m_state.vs.constantBuffers, + m_state.ps.constantBuffers, StartSlot, NumBuffers, ppConstantBuffers, pFirstConstant, @@ -1677,8 +1709,11 @@ namespace dxvk { UINT StartSlot, UINT NumBuffers, ID3D11Buffer** ppConstantBuffers) { - for (uint32_t i = 0; i < NumBuffers; i++) - ppConstantBuffers[i] = m_state.ps.constantBuffers.at(StartSlot + i).buffer.ref(); + GetConstantBuffers( + m_state.ps.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + nullptr, nullptr); } @@ -1688,7 +1723,12 @@ namespace dxvk { ID3D11Buffer** ppConstantBuffers, UINT* pFirstConstant, UINT* pNumConstants) { - Logger::err("D3D11DeviceContext::PSSetConstantBuffers1: not implemented"); + GetConstantBuffers( + m_state.ps.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + pFirstConstant, + pNumConstants); } @@ -1747,7 +1787,7 @@ namespace dxvk { const UINT* pNumConstants) { this->SetConstantBuffers( DxbcProgramType::ComputeShader, - m_state.vs.constantBuffers, + m_state.cs.constantBuffers, StartSlot, NumBuffers, ppConstantBuffers, pFirstConstant, @@ -1814,8 +1854,11 @@ namespace dxvk { UINT StartSlot, UINT NumBuffers, ID3D11Buffer** ppConstantBuffers) { - for (uint32_t i = 0; i < NumBuffers; i++) - ppConstantBuffers[i] = m_state.cs.constantBuffers.at(StartSlot + i).buffer.ref(); + GetConstantBuffers( + m_state.cs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + nullptr, nullptr); } @@ -1825,7 +1868,12 @@ namespace dxvk { ID3D11Buffer** ppConstantBuffers, UINT* pFirstConstant, UINT* pNumConstants) { - Logger::warn("D3D11DeviceContext::CSGetConstantBuffers1: not implemented"); + GetConstantBuffers( + m_state.cs.constantBuffers, + StartSlot, NumBuffers, + ppConstantBuffers, + pFirstConstant, + pNumConstants); } @@ -2564,6 +2612,26 @@ namespace dxvk { } + void D3D11DeviceContext::GetConstantBuffers( + const D3D11ConstantBufferBindings& Bindings, + UINT StartSlot, + UINT NumBuffers, + ID3D11Buffer** ppConstantBuffers, + UINT* pFirstConstant, + UINT* pNumConstants) { + for (uint32_t i = 0; i < NumBuffers; i++) { + if (ppConstantBuffers != nullptr) + ppConstantBuffers[i] = Bindings[StartSlot + i].buffer.ref(); + + if (pFirstConstant != nullptr) + pFirstConstant[i] = Bindings[StartSlot + i].constantOffset; + + if (pNumConstants != nullptr) + pNumConstants[i] = Bindings[StartSlot + i].constantCount; + } + } + + void D3D11DeviceContext::RestoreState() { BindFramebuffer(); diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 7e4fce87..7f6d79b2 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -743,6 +743,14 @@ namespace dxvk { ID3D11UnorderedAccessView* const* ppUnorderedAccessViews, const UINT* pUAVInitialCounts); + void GetConstantBuffers( + const D3D11ConstantBufferBindings& Bindings, + UINT StartSlot, + UINT NumBuffers, + ID3D11Buffer** ppConstantBuffers, + UINT* pFirstConstant, + UINT* pNumConstants); + void RestoreState(); void RestoreConstantBuffers(