From f87e396958b5262e3d783cc477cbb4cf47b31c21 Mon Sep 17 00:00:00 2001 From: vlj Date: Mon, 12 Sep 2016 23:50:52 +0200 Subject: [PATCH] rsx: Dump DRAW_ARRAYS and DRAW_INDEX_ARRAYS. --- rpcs3/Emu/RSX/rsx_decode.h | 280 ++++++++++++++++------------------ rpcs3/Emu/RSX/rsx_methods.cpp | 12 +- 2 files changed, 134 insertions(+), 158 deletions(-) diff --git a/rpcs3/Emu/RSX/rsx_decode.h b/rpcs3/Emu/RSX/rsx_decode.h index 5049e089da..fe323616fe 100644 --- a/rpcs3/Emu/RSX/rsx_decode.h +++ b/rpcs3/Emu/RSX/rsx_decode.h @@ -4309,6 +4309,78 @@ struct registers_decoder } }; +template <> +struct registers_decoder +{ + struct decoded_type + { + private: + union { + u32 raw_value; + bitfield_decoder_t<0, 24> start; + bitfield_decoder_t<24, 8> count; + } m_data; + + public: + decoded_type(u32 raw_value) + { + m_data.raw_value = raw_value; + } + + u32 start() const + { + return m_data.start; + } + + u16 count() const + { + return m_data.count + 1; + } + }; + + static std::string dump(decoded_type&& decoded_values) + { + return "Draw vertexes range [" + std::to_string(decoded_values.start()) + ", " + + std::to_string(decoded_values.start() + decoded_values.count()) + "]"; + } +}; + +template <> +struct registers_decoder +{ + struct decoded_type + { + private: + union { + u32 raw_value; + bitfield_decoder_t<0, 24> start; + bitfield_decoder_t<24, 8> count; + } m_data; + + public: + decoded_type(u32 raw_value) + { + m_data.raw_value = raw_value; + } + + u32 start() const + { + return m_data.start; + } + + u16 count() const + { + return m_data.count + 1; + } + }; + + static std::string dump(decoded_type&& decoded_values) + { + return "Draw vertexes range [IdxArray[" + std::to_string(decoded_values.start()) + + "], IdxArray[" + std::to_string(decoded_values.start() + decoded_values.count()) + "}]"; + } +}; + #define TRANSFORM_PROGRAM(index) template<> struct registers_decoder : public transform_program_helper {}; #define DECLARE_TRANSFORM_PROGRAM(index) NV4097_SET_TRANSFORM_PROGRAM + index, EXPAND_RANGE_512(0, TRANSFORM_PROGRAM) @@ -4504,156 +4576,60 @@ EXPAND_RANGE_16(0, VERTEX_DATA4F) EXPAND_RANGE_16(0, VERTEX_DATA2S) EXPAND_RANGE_16(0, VERTEX_DATA4S) -constexpr std::integer_sequence opcode_list{}; +constexpr std::integer_sequence + opcode_list{}; } // end namespace rsx diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index ff4946116a..c3cd80946f 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -188,19 +188,19 @@ namespace rsx void draw_arrays(thread* rsx, u32 _reg, u32 arg) { rsx::method_registers.current_draw_clause.command = rsx::draw_command::array; - u32 first = arg & 0xffffff; - u32 count = (arg >> 24) + 1; + rsx::registers_decoder::decoded_type v(arg); - rsx::method_registers.current_draw_clause.first_count_commands.emplace_back(std::make_pair(first, count)); + rsx::method_registers.current_draw_clause.first_count_commands.emplace_back( + std::make_pair(v.start(), v.count())); } void draw_index_array(thread* rsx, u32 _reg, u32 arg) { rsx::method_registers.current_draw_clause.command = rsx::draw_command::indexed; - u32 first = arg & 0xffffff; - u32 count = (arg >> 24) + 1; + rsx::registers_decoder::decoded_type v(arg); - rsx::method_registers.current_draw_clause.first_count_commands.emplace_back(std::make_pair(first, count)); + rsx::method_registers.current_draw_clause.first_count_commands.emplace_back( + std::make_pair(v.start(), v.count())); } void draw_inline_array(thread* rsx, u32 _reg, u32 arg)