From 42fc69818650f0efbcb4d0babe38115de567f55d Mon Sep 17 00:00:00 2001 From: Eladash Date: Mon, 28 Oct 2019 22:16:27 +0200 Subject: [PATCH] rsx: Enable primitive restart index only when needed (#6889) * rsx: Enable primitive restart index only when needed * rsx: Use if with initializer in read_put() --- rpcs3/Emu/RSX/RSXFIFO.cpp | 9 +++------ rpcs3/Emu/RSX/gcm_enums.cpp | 10 ---------- rpcs3/Emu/RSX/gcm_enums.h | 6 ++---- rpcs3/Emu/RSX/rsx_decode.h | 6 +++--- rpcs3/Emu/RSX/rsx_methods.h | 35 +++++++++++++++++++++++------------ 5 files changed, 31 insertions(+), 35 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXFIFO.cpp b/rpcs3/Emu/RSX/RSXFIFO.cpp index 886795fa6a..25d190cb7e 100644 --- a/rpcs3/Emu/RSX/RSXFIFO.cpp +++ b/rpcs3/Emu/RSX/RSXFIFO.cpp @@ -39,15 +39,12 @@ namespace rsx } else { - u32 put = m_ctrl->put; - if (LIKELY((put & 3) == 0)) + if (u32 put = m_ctrl->put; LIKELY((put & 3) == 0)) { return put; } - else - { - return m_ctrl->put.and_fetch(~3); - } + + return m_ctrl->put.and_fetch(~3); } } diff --git a/rpcs3/Emu/RSX/gcm_enums.cpp b/rpcs3/Emu/RSX/gcm_enums.cpp index d0f36dd8b0..ae2bb4b644 100644 --- a/rpcs3/Emu/RSX/gcm_enums.cpp +++ b/rpcs3/Emu/RSX/gcm_enums.cpp @@ -17,16 +17,6 @@ rsx::vertex_base_type rsx::to_vertex_base_type(u8 in) fmt::throw_exception("Unknown vertex base type %d" HERE, in); } -rsx::index_array_type rsx::to_index_array_type(u8 in) -{ - switch (in) - { - case CELL_GCM_DRAW_INDEX_ARRAY_TYPE_32: return rsx::index_array_type::u32; - case CELL_GCM_DRAW_INDEX_ARRAY_TYPE_16: return rsx::index_array_type::u16; - } - fmt::throw_exception("Unknown index array type %d" HERE, in); -} - rsx::primitive_type rsx::to_primitive_type(u8 in) { switch (in) diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index bcb771d32b..9b62c86859 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -18,12 +18,10 @@ namespace rsx enum class index_array_type : u8 { - u32, - u16, + u32 = 0, // CELL_GCM_DRAW_INDEX_ARRAY_TYPE_32 + u16 = 1, // CELL_GCM_DRAW_INDEX_ARRAY_TYPE_16 }; - index_array_type to_index_array_type(u8 in); - enum class primitive_type : u8 { invalid, diff --git a/rpcs3/Emu/RSX/rsx_decode.h b/rpcs3/Emu/RSX/rsx_decode.h index 9d7997f638..c733529e97 100644 --- a/rpcs3/Emu/RSX/rsx_decode.h +++ b/rpcs3/Emu/RSX/rsx_decode.h @@ -3357,7 +3357,7 @@ struct registers_decoder private: u32 value; - u32 type_raw() const { return bf_decoder<4, 28>(value); } + u8 type_raw() const { return bf_decoder<4, 8>(value); } public: decoded_type(u32 value) : value(value) {} @@ -3369,8 +3369,8 @@ struct registers_decoder index_array_type type() const { - // Why truncate?? - return to_index_array_type(static_cast(type_raw())); + // Must be a valid value + return static_cast(type_raw()); } }; diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index c78d113841..c0132eb082 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -665,9 +665,14 @@ namespace rsx return decode().stencil_test_enabled(); } - bool restart_index_enabled() const + u8 index_array_location() const { - return decode().restart_index_enabled(); + return decode().index_dma(); + } + + rsx::index_array_type index_type() const + { + return decode().type(); } u32 restart_index() const @@ -675,6 +680,22 @@ namespace rsx return decode().restart_index(); } + bool restart_index_enabled_raw() const + { + return decode().restart_index_enabled(); + } + + bool restart_index_enabled() const + { + if (!restart_index_enabled_raw()) + { + return false; + + } + + return restart_index() <= (index_type() == rsx::index_array_type::u16 ? 0xffff : 0xfffff); + } + u32 z_clear_value(bool is_depth_stencil) const { return decode().clear_z(is_depth_stencil); @@ -695,16 +716,6 @@ namespace rsx return decode().fog_param_1(); } - u8 index_array_location() const - { - return decode().index_dma(); - } - - rsx::index_array_type index_type() const - { - return decode().type(); - } - bool color_mask_b(int index) const { if (index == 0)