From 043adab2cecd5a657cde729591586117d8a28221 Mon Sep 17 00:00:00 2001 From: vlj Date: Mon, 1 Jun 2015 00:02:32 +0200 Subject: [PATCH] d3d12: Fix fragment constant filling The command buffer does not necessarily set them in order... --- rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 69de6aadb4..05ef59f54d 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -492,15 +492,22 @@ void D3D12GSRender::FillPixelShaderConstantsBuffer() { u32 vector[4]; // Is it assigned by color register in command buffer ? - if (!m_fragment_constants.empty() && offsetInFP == m_fragment_constants.front().id - m_cur_fragment_prog->offset) + // TODO : we loop every iteration, we might do better... + bool isCommandBufferSetConstant = false; + for (const RSXTransformConstant& c : m_fragment_constants) { - const RSXTransformConstant& c = m_fragment_constants.front(); - vector[0] = (u32&)c.x; - vector[1] = (u32&)c.y; - vector[2] = (u32&)c.z; - vector[3] = (u32&)c.w; + size_t fragmentId = c.id - m_cur_fragment_prog->offset; + if (fragmentId == offsetInFP) + { + isCommandBufferSetConstant = true; + vector[0] = (u32&)c.x; + vector[1] = (u32&)c.y; + vector[2] = (u32&)c.z; + vector[3] = (u32&)c.w; + break; + } } - else + if (!isCommandBufferSetConstant) { auto data = vm::ptr::make(m_cur_fragment_prog->addr + (u32)offsetInFP);