diff --git a/rpcs3/Emu/RSX/Common/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Common/ProgramStateCache.cpp index 982d6cf141..2b441e9c34 100644 --- a/rpcs3/Emu/RSX/Common/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Common/ProgramStateCache.cpp @@ -329,6 +329,7 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys s32 index = 0; s32 program_offset = -1; u32 ucode_size = 0; + u32 constants_size = 0; u16 textures_mask = 0; while (true) @@ -364,6 +365,7 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys //Instruction references constant, skip one slot occupied by data index++; ucode_size += 16; + constants_size += 16; } } @@ -386,7 +388,7 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys index++; } - return{ (u32)program_offset, ucode_size, textures_mask }; + return{ (u32)program_offset, ucode_size, constants_size, textures_mask }; } size_t fragment_program_utils::get_fragment_program_ucode_hash(const RSXFragmentProgram& program) diff --git a/rpcs3/Emu/RSX/Common/ProgramStateCache.h b/rpcs3/Emu/RSX/Common/ProgramStateCache.h index 9fe0c723c2..875685906f 100644 --- a/rpcs3/Emu/RSX/Common/ProgramStateCache.h +++ b/rpcs3/Emu/RSX/Common/ProgramStateCache.h @@ -57,6 +57,7 @@ namespace program_hash_util { u32 program_start_offset; u32 program_ucode_length; + u32 program_constants_buffer_length; u16 referenced_textures_mask; }; diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 18c542931f..ff0d680d34 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1189,7 +1189,7 @@ void GLGSRender::load_program_env(const gl::vertex_upload_info& upload_info) u32 vertex_constants_offset; u32 fragment_constants_offset; - const u32 fragment_constants_size = (const u32)m_prog_buffer.get_fragment_constants_buffer_size(current_fragment_program); + const u32 fragment_constants_size = current_fp_metadata.program_constants_buffer_length; const u32 fragment_buffer_size = fragment_constants_size + (18 * 4 * sizeof(float)); const bool update_transform_constants = !!(m_graphics_state & rsx::pipeline_state::transform_constants_dirty); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 902fffd462..3aee2013fb 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1326,7 +1326,7 @@ void VKGSRender::end() m_vertex_upload_time += std::chrono::duration_cast(vertex_end - vertex_start).count(); // Load program execution environment - program_start = textures_end; + program_start = vertex_end; load_program_env(upload_info); VkBufferView persistent_buffer = m_persistent_attribute_storage ? m_persistent_attribute_storage->value : null_buffer_view->value; @@ -2374,7 +2374,7 @@ void VKGSRender::load_program_env(const vk::vertex_upload_info& vertex_info) if (1)//m_graphics_state & (rsx::pipeline_state::fragment_state_dirty | rsx::pipeline_state::vertex_state_dirty)) { - const size_t fragment_constants_sz = m_prog_buffer->get_fragment_constants_buffer_size(current_fragment_program); + const size_t fragment_constants_sz = current_fp_metadata.program_constants_buffer_length; const size_t fragment_buffer_sz = fragment_constants_sz + (18 * 4 * sizeof(float)); const size_t required_mem = 512 + fragment_buffer_sz; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index cc93b3426f..3b291f34ba 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -43,7 +43,7 @@ namespace rsx { //Don't throw, gather information and ignore broken/garbage commands //TODO: Investigate why these commands are executed at all. (Heap corruption? Alignment padding?) - LOG_ERROR(RSX, "Invalid RSX method 0x%x (arg=0x%x)" HERE, _reg << 2, arg); + LOG_ERROR(RSX, "Invalid RSX method 0x%x (arg=0x%x)", _reg << 2, arg); rsx->invalid_command_interrupt_raised = true; }