From efbd77deb4270a56543f4204d3fe22f4dd6d4539 Mon Sep 17 00:00:00 2001 From: eladash Date: Tue, 11 Sep 2018 09:56:05 +0300 Subject: [PATCH] rsx: dont silently ignore null shader address --- rpcs3/Emu/RSX/Capture/rsx_capture.cpp | 31 +++++++++++++-------------- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 8 +------ rpcs3/Emu/RSX/GL/GLGSRender.h | 1 - rpcs3/Emu/RSX/RSXThread.cpp | 8 ------- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 8 +------ rpcs3/Emu/RSX/VK/VKGSRender.h | 1 - rpcs3/Emu/RSX/rsx_methods.cpp | 2 ++ 7 files changed, 19 insertions(+), 40 deletions(-) diff --git a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp index 72d5087606..59dad4aa1a 100644 --- a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp +++ b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp @@ -81,24 +81,23 @@ namespace rsx // capture fragment shader mem const u32 shader_program = method_registers.shader_program_address(); - if (shader_program != 0) - { - const u32 program_location = (shader_program & 0x3) - 1; - const u32 program_offset = (shader_program & ~0x3); + verify("Null shader address!" HERE), shader_program != 0; - const u32 addr = get_address(program_offset, program_location); - const auto program_info = program_hash_util::fragment_program_utils::analyse_fragment_program(vm::base(addr)); - const u32 program_start = program_info.program_start_offset; - const u32 ucode_size = program_info.program_ucode_length; + const u32 program_location = (shader_program & 0x3) - 1; + const u32 program_offset = (shader_program & ~0x3); - frame_capture_data::memory_block block; - block.addr = addr; - block.ioOffset = get_io_offset(program_offset, program_location); - frame_capture_data::memory_block_data block_data; - block_data.data.resize(ucode_size + program_start); - std::memcpy(block_data.data.data(), vm::base(addr), ucode_size + program_start); - insert_mem_block_in_map(mem_changes, std::move(block), std::move(block_data)); - } + const u32 addr = get_address(program_offset, program_location); + const auto program_info = program_hash_util::fragment_program_utils::analyse_fragment_program(vm::base(addr)); + const u32 program_start = program_info.program_start_offset; + const u32 ucode_size = program_info.program_ucode_length; + + frame_capture_data::memory_block block; + block.addr = addr; + block.ioOffset = get_io_offset(program_offset, program_location); + frame_capture_data::memory_block_data block_data; + block_data.data.resize(ucode_size + program_start); + std::memcpy(block_data.data.data(), vm::base(addr), ucode_size + program_start); + insert_mem_block_in_map(mem_changes, std::move(block), std::move(block_data)); // vertex shader is passed in registers, so it can be ignored diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index f54c4b20e4..50583ba133 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -181,8 +181,7 @@ void GLGSRender::end() std::chrono::time_point state_check_start = steady_clock::now(); if (skip_frame || !framebuffer_status_valid || - (conditional_render_enabled && conditional_render_test_failed) || - !check_program_state()) + (conditional_render_enabled && conditional_render_test_failed)) { rsx::thread::end(); return; @@ -1140,11 +1139,6 @@ bool GLGSRender::do_method(u32 cmd, u32 arg) return false; } -bool GLGSRender::check_program_state() -{ - return (rsx::method_registers.shader_program_address() != 0); -} - bool GLGSRender::load_program() { if (m_graphics_state & rsx::pipeline_state::invalidate_pipeline_bits) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 2b1a251153..9b19c86614 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -359,7 +359,6 @@ private: void clear_surface(u32 arg); void init_buffers(rsx::framebuffer_creation_context context, bool skip_reading = false); - bool check_program_state(); bool load_program(); void load_program_env(const gl::vertex_upload_info& upload_info); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index c9df337b39..d48e282dc0 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1946,11 +1946,6 @@ namespace rsx auto &result = current_fragment_program = {}; const u32 shader_program = rsx::method_registers.shader_program_address(); - if (shader_program == 0) - { - current_fp_metadata = {}; - return; - } const u32 program_location = (shader_program & 0x3) - 1; const u32 program_offset = (shader_program & ~0x3); @@ -2083,9 +2078,6 @@ namespace rsx auto &result = current_fragment_program = {}; const u32 shader_program = rsx::method_registers.shader_program_address(); - if (shader_program == 0) - return; - const u32 program_location = (shader_program & 0x3) - 1; const u32 program_offset = (shader_program & ~0x3); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index fb544595cc..d3300cc0ef 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1098,8 +1098,7 @@ void VKGSRender::close_render_pass() void VKGSRender::end() { if (skip_frame || !framebuffer_status_valid || renderer_unavailable || - (conditional_render_enabled && conditional_render_test_failed) || - !check_program_status()) + (conditional_render_enabled && conditional_render_test_failed)) { rsx::thread::end(); return; @@ -2211,11 +2210,6 @@ bool VKGSRender::do_method(u32 cmd, u32 arg) } } -bool VKGSRender::check_program_status() -{ - return (rsx::method_registers.shader_program_address() != 0); -} - bool VKGSRender::load_program() { if (m_graphics_state & rsx::pipeline_state::invalidate_pipeline_bits) diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 5039571b04..4e506f3d64 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -404,7 +404,6 @@ private: vk::vertex_upload_info upload_vertex_data(); public: - bool check_program_status(); bool load_program(); void load_program_env(const vk::vertex_upload_info& vertex_info); void init_buffers(rsx::framebuffer_creation_context context, bool skip_reading = false); diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index d1e8c0693c..da83e31921 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -461,6 +461,8 @@ namespace rsx if (!(rsx::method_registers.current_draw_clause.first_count_commands.empty() && rsx::method_registers.current_draw_clause.inline_vertex_array.empty())) { + verify("Null shader address!" HERE), (method_registers.shader_program_address()); + rsxthr->end(); } }