From bd297d079d7ad92e43be7d10e70c7e2f9e56a444 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 9 Feb 2018 13:32:30 +0300 Subject: [PATCH] rsx: Minor optimizations --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 4 ++-- rpcs3/Emu/RSX/RSXThread.cpp | 15 +++++++++++++++ rpcs3/Emu/RSX/RSXThread.h | 14 ++++++++++++++ rpcs3/Emu/RSX/VK/VKGSRender.cpp | 16 ++++++++-------- rpcs3/Emu/RSX/rsx_methods.cpp | 5 +++++ rpcs3/Emu/RSX/rsx_methods.h | 2 ++ 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 6e51d2c83f..312dc61e1d 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -297,7 +297,7 @@ void GLGSRender::end() for (int i = 0; i < rsx::limits::fragment_textures_count; ++i) { - if (m_program->uniforms.has_location("tex" + std::to_string(i), &unused_location)) + if (m_program->uniforms.has_location(rsx::constants::fragment_texture_names[i], &unused_location)) { auto sampler_state = static_cast(fs_sampler_state[i].get()); auto &tex = rsx::method_registers.fragment_textures[i]; @@ -333,7 +333,7 @@ void GLGSRender::end() for (int i = 0; i < rsx::limits::vertex_textures_count; ++i) { - if (m_program->uniforms.has_location("vtex" + std::to_string(i), &unused_location)) + if (m_program->uniforms.has_location(rsx::constants::vertex_texture_names[i], &unused_location)) { auto sampler_state = static_cast(vs_sampler_state[i].get()); glActiveTexture(GL_TEXTURE0 + rsx::limits::fragment_textures_count + i); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index b3fe94e968..dcab732f5a 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -729,6 +729,21 @@ namespace rsx flush_commands_flag = false; break; } + case NV4097_SET_TEXTURE_OFFSET: + case NV4097_SET_TEXTURE_FORMAT: + case NV4097_SET_TEXTURE_ADDRESS: + case NV4097_SET_TEXTURE_CONTROL0: + case NV4097_SET_TEXTURE_CONTROL1: + case NV4097_SET_TEXTURE_FILTER: + case NV4097_SET_TEXTURE_IMAGE_RECT: + case NV4097_SET_TEXTURE_BORDER_COLOR: + { + //Safe to ignore if value has not changed + if (method_registers.test(reg, value)) + flush_commands_flag = false; + + break; + } } if (flush_commands_flag) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 77401f9478..7fba4ec791 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -45,6 +45,20 @@ namespace rsx }; } + namespace constants + { + static std::array fragment_texture_names = + { + "tex0", "tex1", "tex2", "tex3", "tex4", "tex5", "tex6", "tex7", + "tex8", "tex9", "tex10", "tex11", "tex12", "tex13", "tex14", "tex15", + }; + + static std::array vertex_texture_names = + { + "vtex0", "vtex1", "vtex2", "vtex3", + }; + } + enum framebuffer_creation_context : u8 { context_draw = 0, diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 275ce68047..3f14b5dca9 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1232,11 +1232,11 @@ void VKGSRender::end() for (int i = 0; i < rsx::limits::fragment_textures_count; ++i) { - if (m_program->has_uniform("tex" + std::to_string(i))) + if (m_program->has_uniform(rsx::constants::fragment_texture_names[i])) { if (!rsx::method_registers.fragment_textures[i].enabled()) { - m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "tex" + std::to_string(i), m_current_frame->descriptor_set); + m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, rsx::constants::fragment_texture_names[i], m_current_frame->descriptor_set); continue; } @@ -1252,21 +1252,21 @@ void VKGSRender::end() if (!image_ptr) { LOG_ERROR(RSX, "Texture upload failed to texture index %d. Binding null sampler.", i); - m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "tex" + std::to_string(i), m_current_frame->descriptor_set); + m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, rsx::constants::fragment_texture_names[i], m_current_frame->descriptor_set); continue; } - m_program->bind_uniform({ fs_sampler_handles[i]->value, image_ptr->value, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "tex" + std::to_string(i), m_current_frame->descriptor_set); + m_program->bind_uniform({ fs_sampler_handles[i]->value, image_ptr->value, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, rsx::constants::fragment_texture_names[i], m_current_frame->descriptor_set); } } for (int i = 0; i < rsx::limits::vertex_textures_count; ++i) { - if (m_program->has_uniform("vtex" + std::to_string(i))) + if (m_program->has_uniform(rsx::constants::vertex_texture_names[i])) { if (!rsx::method_registers.vertex_textures[i].enabled()) { - m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "vtex" + std::to_string(i), m_current_frame->descriptor_set); + m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, rsx::constants::vertex_texture_names[i], m_current_frame->descriptor_set); continue; } @@ -1282,11 +1282,11 @@ void VKGSRender::end() if (!image_ptr) { LOG_ERROR(RSX, "Texture upload failed to vtexture index %d. Binding null sampler.", i); - m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "vtex" + std::to_string(i), m_current_frame->descriptor_set); + m_program->bind_uniform({ vk::null_sampler(), vk::null_image_view(*m_current_command_buffer), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, rsx::constants::vertex_texture_names[i], m_current_frame->descriptor_set); continue; } - m_program->bind_uniform({ vs_sampler_handles[i]->value, image_ptr->value, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "vtex" + std::to_string(i), m_current_frame->descriptor_set); + m_program->bind_uniform({ vs_sampler_handles[i]->value, image_ptr->value, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, rsx::constants::vertex_texture_names[i], m_current_frame->descriptor_set); } } diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 297d1176c8..65dcd5745a 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -1190,6 +1190,11 @@ namespace rsx registers[reg] = value; } + bool rsx_state::test(u32 reg, u32 value) const + { + return registers[reg] == value; + } + namespace method_detail { template class T, int Index = 0> diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index 0969f9c349..88e5220e70 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -189,6 +189,8 @@ namespace rsx void decode(u32 reg, u32 value); + bool test(u32 reg, u32 value) const; + void reset(); template