diff --git a/rpcs3/Emu/RSX/RSXFragmentProgram.h b/rpcs3/Emu/RSX/RSXFragmentProgram.h index 3b3b08ca6e..3b03701929 100644 --- a/rpcs3/Emu/RSX/RSXFragmentProgram.h +++ b/rpcs3/Emu/RSX/RSXFragmentProgram.h @@ -242,6 +242,18 @@ struct RSXFragmentProgram } data_storage_helper(const data_storage_helper& other) + { + this->operator=(other); + } + + data_storage_helper(data_storage_helper&& other) + : data_ptr(other.data_ptr) + , local_storage(std::move(other.local_storage)) + { + other.data_ptr = nullptr; + } + + data_storage_helper& operator=(const data_storage_helper& other) { if (other.data_ptr == other.local_storage.data()) { @@ -253,6 +265,20 @@ struct RSXFragmentProgram data_ptr = other.data_ptr; local_storage.clear(); } + + return *this; + } + + data_storage_helper& operator=(data_storage_helper&& other) + { + if (this != &other) + { + data_ptr = other.data_ptr; + local_storage = std::move(other.local_storage); + other.data_ptr = nullptr; + } + + return *this; } void deep_copy(u32 max_length) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 484e44f41e..048bee237f 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -390,11 +390,11 @@ namespace rsx void thread::capture_frame(const std::string &name) { - frame_trace_data::draw_state draw_state = {}; + frame_trace_data::draw_state draw_state{}; draw_state.programs = get_programs(); draw_state.name = name; - frame_debug.draw_calls.push_back(draw_state); + frame_debug.draw_calls.emplace_back(std::move(draw_state)); } void thread::begin() diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index 52b57352de..70da4d9e98 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -475,7 +475,7 @@ namespace rsx return decoded_type(register_value); } - rsx_state &operator=(const rsx_state& in) + rsx_state& operator=(const rsx_state& in) { registers = in.registers; transform_program = in.transform_program; @@ -484,6 +484,15 @@ namespace rsx return *this; } + rsx_state& operator=(rsx_state&& in) + { + registers = std::move(in.registers); + transform_program = std::move(in.transform_program); + transform_constants = std::move(in.transform_constants); + register_vertex_info = std::move(in.register_vertex_info); + return *this; + } + std::array fragment_textures; std::array vertex_textures; @@ -521,13 +530,25 @@ namespace rsx } public: - rsx_state() : - fragment_textures(fill_array(registers, std::make_index_sequence<16>())), - vertex_textures(fill_array(registers, std::make_index_sequence<4>())), - vertex_arrays_info(fill_array(registers, std::make_index_sequence<16>())) + rsx_state() + : fragment_textures(fill_array(registers, std::make_index_sequence<16>())) + , vertex_textures(fill_array(registers, std::make_index_sequence<4>())) + , vertex_arrays_info(fill_array(registers, std::make_index_sequence<16>())) { } + rsx_state(const rsx_state& other) + : rsx_state() + { + this->operator=(other); + } + + rsx_state(rsx_state&& other) + : rsx_state() + { + this->operator=(std::move(other)); + } + ~rsx_state() = default; void decode(u32 reg, u32 value); diff --git a/rpcs3/cmake_modules/ConfigureCompiler.cmake b/rpcs3/cmake_modules/ConfigureCompiler.cmake index ddcca746c4..4485d96ee3 100644 --- a/rpcs3/cmake_modules/ConfigureCompiler.cmake +++ b/rpcs3/cmake_modules/ConfigureCompiler.cmake @@ -36,7 +36,7 @@ else() add_compile_options(-Wignored-qualifiers) add_compile_options(-Wredundant-move) add_compile_options(-Wcast-qual) - #add_compile_options(-Wdeprecated-copy) + add_compile_options(-Wdeprecated-copy) add_compile_options(-Wtautological-compare) #add_compile_options(-Wshadow) #add_compile_options(-Wconversion)