From 93b2776604d0febf27f2b65cdcfa8194d01210b5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 1 Apr 2018 13:18:57 +0300 Subject: [PATCH] rsx: Fix vertex input detection - Properly detect inline array registers vs constant value registers - Silence needless spam, 306E is 2D surface engiine, the assumption that y is multiplied by 306E pitch is not crazy --- rpcs3/Emu/RSX/RSXThread.cpp | 41 +++++++++++++++++++++-------------- rpcs3/Emu/RSX/rsx_methods.cpp | 5 ----- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index b7842484ea..2efead0a88 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1389,25 +1389,33 @@ namespace rsx if (!enabled) continue; - if (vertex_push_buffers[index].size > 0) - { - std::pair volatile_range_info = std::make_pair(index, static_cast(vertex_push_buffers[index].data.size() * sizeof(u32))); - result.volatile_blocks.push_back(volatile_range_info); - result.attribute_placement[index] = attribute_buffer_placement::transient; - continue; - } - //Check for interleaving - auto &info = state.vertex_arrays_info[index]; - if (info.size() == 0 && state.register_vertex_info[index].size > 0) + const auto &info = state.vertex_arrays_info[index]; + if (rsx::method_registers.current_draw_clause.is_immediate_draw) { - //Reads from register - result.referenced_registers.push_back(index); - result.attribute_placement[index] = attribute_buffer_placement::transient; - continue; + if (vertex_push_buffers[index].vertex_count > 1) + { + //Read temp buffer (register array) + std::pair volatile_range_info = std::make_pair(index, static_cast(vertex_push_buffers[index].data.size() * sizeof(u32))); + result.volatile_blocks.push_back(volatile_range_info); + result.attribute_placement[index] = attribute_buffer_placement::transient; + continue; + } + + //Might be an indexed immediate draw - real vertex arrays but glArrayElement style of IB declaration } - if (info.size() > 0) + if (!info.size()) + { + if (state.register_vertex_info[index].size > 0) + { + //Reads from register + result.referenced_registers.push_back(index); + result.attribute_placement[index] = attribute_buffer_placement::transient; + continue; + } + } + else { result.attribute_placement[index] = attribute_buffer_placement::persistent; const u32 base_address = info.offset() & 0x7fffffff; @@ -1990,7 +1998,8 @@ namespace rsx //Data is either from an immediate render or register input //Immediate data overrides register input - if (rsx::method_registers.current_draw_clause.is_immediate_draw && vertex_push_buffers[index].size > 0) + if (rsx::method_registers.current_draw_clause.is_immediate_draw && + vertex_push_buffers[index].vertex_count > 1) { const auto &info = rsx::method_registers.register_vertex_info[index]; type = info.type; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index aea99d0c61..34239ff352 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -561,11 +561,6 @@ namespace rsx u16 x = method_registers.nv308a_x(); u16 y = method_registers.nv308a_y(); - if (y) - { - LOG_ERROR(RSX, "%s: y is not null (0x%x)", __FUNCTION__, y); - } - const u32 pixel_offset = (method_registers.blit_engine_output_pitch_nv3062() * y) + (x << 2); u32 address = get_address(method_registers.blit_engine_output_offset_nv3062() + pixel_offset + index * 4, method_registers.blit_engine_output_location_nv3062()); vm::write32(address, arg);