From 7a996648bb33b6998e2ce08d118eb1143ff6d89d Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sat, 28 Nov 2015 20:41:30 +0100 Subject: [PATCH 1/4] gl: Use fill_gragment_constans_buffer --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 9 +++++++-- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 19 ++++++++----------- rpcs3/Emu/RSX/GL/GLGSRender.h | 1 + 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 861e82e7a1..75b7a9ab10 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -28,7 +28,7 @@ std::string GLFragmentDecompilerThread::compareFunction(COMPARE f, const std::st void GLFragmentDecompilerThread::insertHeader(std::stringstream & OS) { - OS << "#version 140" << std::endl; + OS << "#version 420" << std::endl; } void GLFragmentDecompilerThread::insertIntputs(std::stringstream & OS) @@ -68,13 +68,18 @@ void GLFragmentDecompilerThread::insertConstants(std::stringstream & OS) } + OS << "layout(std140, binding = 2) uniform FragmentConstantsBuffer" << std::endl; + OS << "{" << std::endl; for (ParamType PT : m_parr.params[PF_PARAM_UNIFORM]) { if (PT.type == "sampler2D") continue; for (ParamItem PI : PT.items) - OS << "uniform " << PT.type << " " << PI.name << ";" << std::endl; + OS << " " << PT.type << " " << PI.name << ";" << std::endl; } + // A dummy value otherwise it's invalid to create an empty uniform buffer + OS << " vec4 void_value;" << std::endl; + OS << "};" << std::endl; } void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index f5aecd5359..7a5289e4fe 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1065,9 +1065,11 @@ void GLGSRender::oninit_thread() m_ebo.create(); m_scale_offset_buffer.create(16 * sizeof(float)); m_vertex_constants_buffer.create(512 * 4 * sizeof(float)); + m_fragment_constants_buffer.create(); glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_scale_offset_buffer.id()); glBindBufferBase(GL_UNIFORM_BUFFER, 1, m_vertex_constants_buffer.id()); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, m_fragment_constants_buffer.id()); m_vao.array_buffer = m_vbo; m_vao.element_array_buffer = m_ebo; @@ -1275,17 +1277,12 @@ bool GLGSRender::load_program() fill_vertex_program_constants_data(buffer); glUnmapBuffer(GL_UNIFORM_BUFFER); - for (u32 constant_offset : m_prog_buffer.getFragmentConstantOffsetsCache(&fragment_program)) - { - auto data = vm::ps3::_ptr(fragment_program.addr + constant_offset); - - u32 c0 = (data[0] >> 16 | data[0] << 16); - u32 c1 = (data[1] >> 16 | data[1] << 16); - u32 c2 = (data[2] >> 16 | data[2] << 16); - u32 c3 = (data[3] >> 16 | data[3] << 16); - - m_program->uniforms["fc" + std::to_string(constant_offset)] = color4f{ (f32&)c0, (f32&)c1, (f32&)c2, (f32&)c3 }; - } + glBindBuffer(GL_UNIFORM_BUFFER, m_fragment_constants_buffer.id()); + size_t buffer_size = m_prog_buffer.get_fragment_constants_buffer_size(&fragment_program); + glBufferData(GL_UNIFORM_BUFFER, buffer_size, nullptr, GL_STATIC_DRAW); + buffer = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); + m_prog_buffer.fill_fragment_constans_buffer(buffer, &fragment_program); + glUnmapBuffer(GL_UNIFORM_BUFFER); return true; } diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 70ca4fbd96..705a0d1d26 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -77,6 +77,7 @@ private: gl::buffer m_scale_offset_buffer; gl::buffer m_vertex_constants_buffer; + gl::buffer m_fragment_constants_buffer; gl::buffer m_vbo; gl::buffer m_ebo; From c86cfef58e6b90bfacb424302fdd447ce7540964 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sat, 28 Nov 2015 20:58:00 +0100 Subject: [PATCH 2/4] rsx/common: Remove getFragmentConstantOffsetsCache --- rpcs3/Emu/RSX/Common/ProgramStateCache.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/ProgramStateCache.h b/rpcs3/Emu/RSX/Common/ProgramStateCache.h index af85971c80..7a20e3fa3d 100644 --- a/rpcs3/Emu/RSX/Common/ProgramStateCache.h +++ b/rpcs3/Emu/RSX/Common/ProgramStateCache.h @@ -382,13 +382,4 @@ public: offset += 4 * sizeof(u32); } } - - const std::vector &getFragmentConstantOffsetsCache(const RSXFragmentProgram *fragmentShader) const - { - typename binary2FS::const_iterator It = m_cacheFS.find(vm::base(fragmentShader->addr)); - if (It != m_cacheFS.end()) - return It->second.FragmentConstantOffsetCache; - LOG_ERROR(RSX, "Can't retrieve constant offset cache"); - return dummyFragmentConstantCache; - } }; From 399478c2cdaad6164c166a989a11c8331f02e404 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 29 Nov 2015 18:20:43 +0100 Subject: [PATCH 3/4] gl: Use const and ref for loops in GLFragmentProgram.cpp --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 75b7a9ab10..3ece495c60 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -33,9 +33,9 @@ void GLFragmentDecompilerThread::insertHeader(std::stringstream & OS) void GLFragmentDecompilerThread::insertIntputs(std::stringstream & OS) { - for (ParamType PT : m_parr.params[PF_PARAM_IN]) + for (const ParamType& PT : m_parr.params[PF_PARAM_IN]) { - for (ParamItem PI : PT.items) + for (const ParamItem& PI : PT.items) OS << "in " << PT.type << " " << PI.name << ";" << std::endl; } } @@ -59,22 +59,22 @@ void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS) void GLFragmentDecompilerThread::insertConstants(std::stringstream & OS) { - for (ParamType PT : m_parr.params[PF_PARAM_UNIFORM]) + for (const ParamType& PT : m_parr.params[PF_PARAM_UNIFORM]) { if (PT.type != "sampler2D") continue; - for (ParamItem PI : PT.items) + for (const ParamItem& PI : PT.items) OS << "uniform " << PT.type << " " << PI.name << ";" << std::endl; } OS << "layout(std140, binding = 2) uniform FragmentConstantsBuffer" << std::endl; OS << "{" << std::endl; - for (ParamType PT : m_parr.params[PF_PARAM_UNIFORM]) + for (const ParamType& PT : m_parr.params[PF_PARAM_UNIFORM]) { if (PT.type == "sampler2D") continue; - for (ParamItem PI : PT.items) + for (const ParamItem& PI : PT.items) OS << " " << PT.type << " " << PI.name << ";" << std::endl; } // A dummy value otherwise it's invalid to create an empty uniform buffer @@ -87,9 +87,9 @@ void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) OS << "void main ()" << std::endl; OS << "{" << std::endl; - for (ParamType PT : m_parr.params[PF_PARAM_NONE]) + for (const ParamType& PT : m_parr.params[PF_PARAM_NONE]) { - for (ParamItem PI : PT.items) + for (const ParamItem& PI : PT.items) { OS << " " << PT.type << " " << PI.name; if (!PI.value.empty()) @@ -158,7 +158,7 @@ void GLFragmentProgram::Decompile(RSXFragmentProgram& prog) decompiler.Task(); for (const ParamType& PT : decompiler.m_parr.params[PF_PARAM_UNIFORM]) { - for (const ParamItem PI : PT.items) + for (const ParamItem& PI : PT.items) { if (PT.type == "sampler2D") continue; From 1e9d1c1dd9dfe3a3b843fffc055ad3451346761f Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 29 Nov 2015 18:22:53 +0100 Subject: [PATCH 4/4] gl: Uncomment viewport setting code --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 7a5289e4fe..79f3414dae 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -586,11 +586,11 @@ void GLGSRender::begin() __glcheck glDepthMask(rsx::method_registers[NV4097_SET_DEPTH_MASK]); __glcheck glStencilMask(rsx::method_registers[NV4097_SET_STENCIL_MASK]); - //int viewport_x = int(rsx::method_registers[NV4097_SET_VIEWPORT_HORIZONTAL] & 0xffff); - //int viewport_y = int(rsx::method_registers[NV4097_SET_VIEWPORT_VERTICAL] & 0xffff); - //int viewport_w = int(rsx::method_registers[NV4097_SET_VIEWPORT_HORIZONTAL] >> 16); - //int viewport_h = int(rsx::method_registers[NV4097_SET_VIEWPORT_VERTICAL] >> 16); - //glViewport(viewport_x, viewport_y, viewport_w, viewport_h); + int viewport_x = int(rsx::method_registers[NV4097_SET_VIEWPORT_HORIZONTAL] & 0xffff); + int viewport_y = int(rsx::method_registers[NV4097_SET_VIEWPORT_VERTICAL] & 0xffff); + int viewport_w = int(rsx::method_registers[NV4097_SET_VIEWPORT_HORIZONTAL] >> 16); + int viewport_h = int(rsx::method_registers[NV4097_SET_VIEWPORT_VERTICAL] >> 16); + glViewport(viewport_x, viewport_y, viewport_w, viewport_h); //scissor test is always enabled glEnable(GL_SCISSOR_TEST);