diff --git a/rpcs3/Emu/RSX/gcm_enums.cpp b/rpcs3/Emu/RSX/gcm_enums.cpp index 061314f079..d0f3191157 100644 --- a/rpcs3/Emu/RSX/gcm_enums.cpp +++ b/rpcs3/Emu/RSX/gcm_enums.cpp @@ -232,7 +232,7 @@ namespace rsx case cull_face::front: return "front"; case cull_face::front_and_back: return "front and back"; } - fmt::throw_exception("Unexpected enum found" HERE); + return "Unknown cull face value"; } std::string to_string(surface_target target) @@ -827,17 +827,6 @@ rsx::front_face rsx::to_front_face(u16 in) fmt::throw_exception("Unknown front face 0x%x" HERE, in); } -rsx::cull_face rsx::to_cull_face(u16 in) -{ - switch (in) - { - case CELL_GCM_FRONT_AND_BACK: return rsx::cull_face::front_and_back; - case CELL_GCM_FRONT: return rsx::cull_face::front; - case CELL_GCM_BACK: return rsx::cull_face::back; - } - fmt::throw_exception("Unknown cull face 0x%x" HERE, in); -} - enum { CELL_GCM_TRANSFER_ORIGIN_CENTER = 1, diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 1a5251d293..bd861028e4 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -271,15 +271,13 @@ namespace rsx front_face to_front_face(u16 in); - enum class cull_face : u8 + enum class cull_face : u32 { - front, - back, - front_and_back, + front = 0x0404, // CELL_GCM_FRONT + back = 0x0405, // CELL_GCM_BACK + front_and_back = 0x0408, // CELL_GCM_FRONT_AND_BACK }; - cull_face to_cull_face(u16 in); - enum class user_clip_plane_op : u8 { disable, diff --git a/rpcs3/Emu/RSX/rsx_decode.h b/rpcs3/Emu/RSX/rsx_decode.h index b5bf90b632..ed229f38c7 100644 --- a/rpcs3/Emu/RSX/rsx_decode.h +++ b/rpcs3/Emu/RSX/rsx_decode.h @@ -2927,14 +2927,13 @@ struct registers_decoder union { u32 raw_value; - bitfield_decoder_t<0, 32> cull_face_mode; } m_data; public: decoded_type(u32 raw_value) { m_data.raw_value = raw_value; } cull_face cull_face_mode() const { - return to_cull_face(m_data.cull_face_mode); + return static_cast(m_data.raw_value); } }; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 158d43198c..0ea249c68e 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -158,6 +158,20 @@ namespace rsx } } + void set_cull_face(thread* rsx, u32 reg, u32 arg) + { + switch(arg) + { + case CELL_GCM_FRONT_AND_BACK: return; + case CELL_GCM_FRONT: return; + case CELL_GCM_BACK: return; + default: break; + } + + // Ignore value if unknown + method_registers.registers[reg] = method_registers.register_previous_value; + } + void texture_read_semaphore_release(thread* rsx, u32 _reg, u32 arg) { // Pipeline barrier seems to be equivalent to a SHADER_READ stage barrier @@ -381,17 +395,17 @@ namespace rsx } }; - void set_transform_program_start(thread* rsx, u32, u32) + void set_transform_program_start(thread* rsx, u32 reg, u32) { - if (method_registers.register_change_flag) + if (method_registers.registers[reg] != method_registers.register_previous_value) { rsx->m_graphics_state |= rsx::pipeline_state::vertex_program_dirty; } } - void set_vertex_attribute_output_mask(thread* rsx, u32, u32) + void set_vertex_attribute_output_mask(thread* rsx, u32 reg, u32) { - if (method_registers.register_change_flag) + if (method_registers.registers[reg] != method_registers.register_previous_value) { rsx->m_graphics_state |= rsx::pipeline_state::vertex_program_dirty | rsx::pipeline_state::fragment_program_dirty; } @@ -1325,16 +1339,8 @@ namespace rsx void rsx_state::decode(u32 reg, u32 value) { - auto& old_value = registers[reg]; - if (old_value != value) - { - register_change_flag = true; - old_value = value; - } - else - { - register_change_flag = false; - } + // Store new value and save previous + register_previous_value = std::exchange(registers[reg], value); } bool rsx_state::test(u32 reg, u32 value) const @@ -1747,6 +1753,7 @@ namespace rsx bind(); // NV4097 + bind(); bind(); bind(); bind(); diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index e9d815bcc6..fcc47869f7 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -127,8 +127,9 @@ namespace rsx struct rsx_state { - protected: - std::array registers; + public: + std::array registers{}; + u32 register_previous_value; template using decoded_type = typename registers_decoder::decoded_type; @@ -140,7 +141,6 @@ namespace rsx return decoded_type(register_value); } - public: rsx_state &operator=(const rsx_state& in) { registers = in.registers; @@ -159,8 +159,6 @@ namespace rsx draw_clause current_draw_clause; - bool register_change_flag; - /** * RSX can sources vertex attributes from 2 places: * 1. Immediate values passed by NV4097_SET_VERTEX_DATA*_M + ARRAY_ID write.