From cb7adeef08bc1ee445f80acb3b7ab3da0e2d9585 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 21 Apr 2021 13:20:00 +0200 Subject: [PATCH] [d3d11] Add range checking to GetShaderResources --- src/d3d11/d3d11_context.cpp | 37 +++++++++++++++++++++++++------------ src/d3d11/d3d11_context.h | 6 ++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index cff7d2e1..cc942fe4 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1874,8 +1874,8 @@ namespace dxvk { ID3D11ShaderResourceView** ppShaderResourceViews) { D3D10DeviceLock lock = LockContext(); - for (uint32_t i = 0; i < NumViews; i++) - ppShaderResourceViews[i] = m_state.vs.shaderResources.views[StartSlot + i].ref(); + GetShaderResources(m_state.vs.shaderResources, + StartSlot, NumViews, ppShaderResourceViews); } @@ -2016,8 +2016,8 @@ namespace dxvk { ID3D11ShaderResourceView** ppShaderResourceViews) { D3D10DeviceLock lock = LockContext(); - for (uint32_t i = 0; i < NumViews; i++) - ppShaderResourceViews[i] = m_state.hs.shaderResources.views[StartSlot + i].ref(); + GetShaderResources(m_state.hs.shaderResources, + StartSlot, NumViews, ppShaderResourceViews); } @@ -2158,8 +2158,8 @@ namespace dxvk { ID3D11ShaderResourceView** ppShaderResourceViews) { D3D10DeviceLock lock = LockContext(); - for (uint32_t i = 0; i < NumViews; i++) - ppShaderResourceViews[i] = m_state.ds.shaderResources.views[StartSlot + i].ref(); + GetShaderResources(m_state.ds.shaderResources, + StartSlot, NumViews, ppShaderResourceViews); } @@ -2300,8 +2300,8 @@ namespace dxvk { ID3D11ShaderResourceView** ppShaderResourceViews) { D3D10DeviceLock lock = LockContext(); - for (uint32_t i = 0; i < NumViews; i++) - ppShaderResourceViews[i] = m_state.gs.shaderResources.views[StartSlot + i].ref(); + GetShaderResources(m_state.gs.shaderResources, + StartSlot, NumViews, ppShaderResourceViews); } @@ -2442,8 +2442,8 @@ namespace dxvk { ID3D11ShaderResourceView** ppShaderResourceViews) { D3D10DeviceLock lock = LockContext(); - for (uint32_t i = 0; i < NumViews; i++) - ppShaderResourceViews[i] = m_state.ps.shaderResources.views[StartSlot + i].ref(); + GetShaderResources(m_state.ps.shaderResources, + StartSlot, NumViews, ppShaderResourceViews); } @@ -2640,8 +2640,8 @@ namespace dxvk { ID3D11ShaderResourceView** ppShaderResourceViews) { D3D10DeviceLock lock = LockContext(); - for (uint32_t i = 0; i < NumViews; i++) - ppShaderResourceViews[i] = m_state.cs.shaderResources.views[StartSlot + i].ref(); + GetShaderResources(m_state.cs.shaderResources, + StartSlot, NumViews, ppShaderResourceViews); } @@ -3798,6 +3798,19 @@ namespace dxvk { } + void D3D11DeviceContext::GetShaderResources( + const D3D11ShaderResourceBindings& Bindings, + UINT StartSlot, + UINT NumViews, + ID3D11ShaderResourceView** ppShaderResourceViews) { + for (uint32_t i = 0; i < NumViews; i++) { + ppShaderResourceViews[i] = StartSlot + i < Bindings.views.size() + ? Bindings.views[StartSlot + i].ref() + : nullptr; + } + } + + void D3D11DeviceContext::GetSamplers( const D3D11SamplerBindings& Bindings, UINT StartSlot, diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 4aff746f..bb488768 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -830,6 +830,12 @@ namespace dxvk { UINT* pFirstConstant, UINT* pNumConstants); + void GetShaderResources( + const D3D11ShaderResourceBindings& Bindings, + UINT StartSlot, + UINT NumViews, + ID3D11ShaderResourceView** ppShaderResourceViews); + void GetSamplers( const D3D11SamplerBindings& Bindings, UINT StartSlot,