From 1e431edf09aeedab7f3b8704bb73238004427a9f Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 11 Oct 2015 19:50:59 +0200 Subject: [PATCH] Remove fragment program --- rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp | 6 +++--- rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 1 + rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp | 16 +++++----------- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 8 ++++---- rpcs3/Emu/RSX/RSXThread.cpp | 11 ----------- rpcs3/Emu/RSX/RSXThread.h | 4 +--- 6 files changed, 14 insertions(+), 32 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 2e74f28cb7..62ae24f1e9 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -314,7 +314,7 @@ void D3D12GSRender::FillVertexShaderConstantsBuffer() void D3D12GSRender::FillPixelShaderConstantsBuffer() { // Get constant from fragment program - const std::vector &fragmentOffset = m_cachePSO.getFragmentConstantOffsetsCache(m_cur_fragment_prog); + const std::vector &fragmentOffset = m_cachePSO.getFragmentConstantOffsetsCache(&fragment_program); size_t bufferSize = fragmentOffset.size() * 4 * sizeof(float) + 1; // Multiple of 256 never 0 bufferSize = (bufferSize + 255) & ~255; @@ -333,7 +333,7 @@ void D3D12GSRender::FillPixelShaderConstantsBuffer() bool isCommandBufferSetConstant = false; for (const auto& entry : fragment_constants) { - size_t fragmentId = entry.first - m_cur_fragment_prog->offset; + size_t fragmentId = entry.first - fragment_program.offset; if (fragmentId == offsetInFP) { isCommandBufferSetConstant = true; @@ -346,7 +346,7 @@ void D3D12GSRender::FillPixelShaderConstantsBuffer() } if (!isCommandBufferSetConstant) { - auto data = vm::ps3::ptr::make(m_cur_fragment_prog->addr + (u32)offsetInFP); + auto data = vm::ps3::ptr::make(fragment_program.addr + (u32)offsetInFP); u32 c0 = (data[0] >> 16 | data[0] << 16); u32 c1 = (data[1] >> 16 | data[1] << 16); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 5fa7345cee..f4a51e96d3 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -310,6 +310,7 @@ private: // Copy of RTT to be used as texture std::unordered_map m_texturesRTTs; + RSXFragmentProgram fragment_program; PipelineStateObjectCache m_cachePSO; std::pair *m_PSO; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp index b6dd777ac9..c34ef6b36f 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp @@ -52,16 +52,10 @@ void D3D12GSRender::notifyRasterizerStateChange() bool D3D12GSRender::LoadProgram() { - if (m_PSO != nullptr) - return true; - - if (!m_cur_fragment_prog) - { - LOG_WARNING(RSX, "LoadProgram: m_cur_shader_prog == NULL"); - return false; - } - - m_cur_fragment_prog->ctrl = m_shader_ctrl; + u32 shader_program = rsx::method_registers[NV4097_SET_SHADER_PROGRAM]; + fragment_program.offset = shader_program & ~0x3; + fragment_program.addr = rsx::get_address(fragment_program.offset, (shader_program & 0x3) - 1); + fragment_program.ctrl = rsx::method_registers[NV4097_SET_SHADER_CONTROL]; if (!m_cur_vertex_prog) { @@ -306,7 +300,7 @@ bool D3D12GSRender::LoadProgram() prop.IASet = m_IASet; - m_PSO = m_cachePSO.getGraphicPipelineState(m_cur_vertex_prog, m_cur_fragment_prog, prop, std::make_pair(m_device.Get(), m_rootSignatures)); + m_PSO = m_cachePSO.getGraphicPipelineState(m_cur_vertex_prog, &fragment_program, prop, std::make_pair(m_device.Get(), m_rootSignatures)); return m_PSO != nullptr; } diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index caa14ca8bf..d05c0ff65d 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1062,7 +1062,7 @@ void GLGSRender::InitVertexData() void GLGSRender::InitFragmentData() { - if (!m_cur_fragment_prog) +/* if (!m_cur_fragment_prog) { LOG_ERROR(RSX, "InitFragmentData: m_cur_shader_prog == NULL"); return; @@ -1088,7 +1088,7 @@ void GLGSRender::InitFragmentData() float f3 = (float&)c3; glUniform4f(l, f0, f1, f2, f3); checkForGlError("glUniform4f " + name + fmt::format(" %u [%f %f %f %f]", l, f0, f1, f2, f3)); - } + }*/ /* for (const RSXTransformConstant& c : m_fragment_constants) { @@ -1111,7 +1111,7 @@ void GLGSRender::InitFragmentData() bool GLGSRender::LoadProgram() { - if (!m_cur_fragment_prog) +/* if (!m_cur_fragment_prog) { LOG_WARNING(RSX, "LoadProgram: m_cur_shader_prog == NULL"); return false; @@ -1127,7 +1127,7 @@ bool GLGSRender::LoadProgram() GLProgram *result = m_prog_buffer.getGraphicPipelineState(m_cur_vertex_prog, m_cur_fragment_prog, nullptr, nullptr); m_program.id = result->id; - m_program.Use(); + m_program.Use();*/ return true; } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a3e36dbc44..b6a7a95388 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -938,16 +938,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Shader case NV4097_SET_SHADER_PROGRAM: - { - m_cur_fragment_prog = &m_fragment_progs[m_cur_fragment_prog_num]; - - const u32 a0 = ARGS(0); - m_cur_fragment_prog->offset = a0 & ~0x3; - m_cur_fragment_prog->addr = rsx::get_address(m_cur_fragment_prog->offset, (a0 & 0x3) - 1); - m_cur_fragment_prog->ctrl = 0x40; notifyProgramChange(); break; - } case NV4097_SET_SHADER_CONTROL: { @@ -2146,7 +2138,6 @@ void RSXThread::End() m_indexed_array.Reset(); fragment_constants.clear(); - m_cur_fragment_prog_num = 0; m_clear_surface_mask = 0; m_begin_end = 0; @@ -2274,8 +2265,6 @@ void RSXThread::Init(const u32 ioAddress, const u32 ioSize, const u32 ctrlAddres local_mem_addr = localAddress; m_cur_vertex_prog = nullptr; - m_cur_fragment_prog = nullptr; - m_cur_fragment_prog_num = 0; m_used_gcm_commands.clear(); diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 7af2643c8c..d05d5d6332 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -156,9 +156,7 @@ public: std::unordered_map> transform_constants; std::unordered_map> fragment_constants; - u32 m_shader_ctrl, m_cur_fragment_prog_num; - RSXFragmentProgram m_fragment_progs[rsx::limits::fragment_count]; - RSXFragmentProgram* m_cur_fragment_prog; + u32 m_shader_ctrl; RSXVertexProgram m_vertex_progs[rsx::limits::vertex_count]; RSXVertexProgram* m_cur_vertex_prog;