rsx: dont silently ignore null shader address

This commit is contained in:
eladash 2018-09-11 09:56:05 +03:00 committed by kd-11
parent 7c4693e271
commit efbd77deb4
7 changed files with 19 additions and 40 deletions

View File

@ -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

View File

@ -181,8 +181,7 @@ void GLGSRender::end()
std::chrono::time_point<steady_clock> 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)

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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();
}
}