From 4f2324cae7181bcb8c274840b17fe86d34cbf54a Mon Sep 17 00:00:00 2001 From: FlexBy420 <68403300+FlexBy420@users.noreply.github.com> Date: Sat, 24 May 2025 14:52:22 +0200 Subject: [PATCH 1/5] Remove roadmap link from README Roadmap was removed from the website as it wasn't updated in years. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 669a0879a1..c47af8d204 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ If you want to contribute as a developer, please take a look at the following pa * [Coding Style](https://github.com/RPCS3/rpcs3/wiki/Coding-Style) * [Developer Information](https://github.com/RPCS3/rpcs3/wiki/Developer-Information) -* [Roadmap](https://rpcs3.net/roadmap) You should also contact any of the developers in the forums or in the Discord server to learn more about the current state of the emulator. From da273761d17ab5a033815ee954a8f1759a3943da Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 24 May 2025 04:45:35 +0200 Subject: [PATCH 2/5] Fix some static analysis warnings --- rpcs3/Emu/RSX/Program/CgBinaryProgram.h | 8 ++-- rpcs3/Emu/RSX/RSXZCULL.h | 3 +- rpcs3/Emu/RSX/VK/vkutils/garbage_collector.h | 2 +- rpcs3/rpcs3qt/memory_viewer_panel.cpp | 42 +++++++++++--------- rpcs3/rpcs3qt/midi_creator.cpp | 7 ++-- rpcs3/rpcs3qt/recvmessage_dialog_frame.h | 2 +- rpcs3/rpcs3qt/skylander_dialog.cpp | 5 ++- 7 files changed, 36 insertions(+), 33 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/CgBinaryProgram.h b/rpcs3/Emu/RSX/Program/CgBinaryProgram.h index 56d8f4d70b..f956c93035 100644 --- a/rpcs3/Emu/RSX/Program/CgBinaryProgram.h +++ b/rpcs3/Emu/RSX/Program/CgBinaryProgram.h @@ -143,10 +143,10 @@ class CgBinaryDisasm std::vector m_loop_end_offsets; // VP members - u32 m_sca_opcode; - u32 m_vec_opcode; - static const usz m_max_instr_count = 512; - usz m_instr_count; + u32 m_sca_opcode = 0; + u32 m_vec_opcode = 0; + static constexpr usz m_max_instr_count = 512; + usz m_instr_count = 0; std::vector m_data; public: diff --git a/rpcs3/Emu/RSX/RSXZCULL.h b/rpcs3/Emu/RSX/RSXZCULL.h index 4627fa2ca5..679357b457 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.h +++ b/rpcs3/Emu/RSX/RSXZCULL.h @@ -18,9 +18,8 @@ namespace rsx static inline std::string_view location_tostring(u32 location) { - ensure(location < 2); constexpr const char* location_names[2] = { "CELL_GCM_LOCATION_LOCAL", "CELL_GCM_LOCATION_MAIN" }; - return location_names[location]; + return ::at32(location_names, location); } static inline u32 classify_location(u32 address) diff --git a/rpcs3/Emu/RSX/VK/vkutils/garbage_collector.h b/rpcs3/Emu/RSX/VK/vkutils/garbage_collector.h index 3ca3c5e02c..48d531f18d 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/garbage_collector.h +++ b/rpcs3/Emu/RSX/VK/vkutils/garbage_collector.h @@ -16,7 +16,7 @@ namespace vk disposable_t() = delete; disposable_t(const disposable_t&) = delete; - disposable_t(disposable_t&& other) : + disposable_t(disposable_t&& other) noexcept : ptr(std::exchange(other.ptr, nullptr)), deleter(other.deleter) {} diff --git a/rpcs3/rpcs3qt/memory_viewer_panel.cpp b/rpcs3/rpcs3qt/memory_viewer_panel.cpp index c381b18404..d2d03f01b9 100644 --- a/rpcs3/rpcs3qt/memory_viewer_panel.cpp +++ b/rpcs3/rpcs3qt/memory_viewer_panel.cpp @@ -425,7 +425,7 @@ memory_viewer_panel::memory_viewer_panel(QWidget* parent, std::shared_ptrtext()).toULong(&ok, 16); @@ -433,17 +433,17 @@ memory_viewer_panel::memory_viewer_panel(QWidget* parent, std::shared_ptr(&QSpinBox::valueChanged), [=, this]() + connect(sb_words, static_cast(&QSpinBox::valueChanged), this, [=, this]() { m_colcount = 1 << sb_words->value(); ShowMemory(); }); - connect(b_prev, &QAbstractButton::clicked, [this]() { scroll(-1); }); - connect(b_next, &QAbstractButton::clicked, [this]() { scroll(1); }); - connect(b_fprev, &QAbstractButton::clicked, [this]() { scroll(m_rowcount * -1); }); - connect(b_fnext, &QAbstractButton::clicked, [this]() { scroll(m_rowcount); }); - connect(b_img, &QAbstractButton::clicked, [=, this]() + connect(b_prev, &QAbstractButton::clicked, this, [this]() { scroll(-1); }); + connect(b_next, &QAbstractButton::clicked, this, [this]() { scroll(1); }); + connect(b_fprev, &QAbstractButton::clicked, this, [this]() { scroll(m_rowcount * -1); }); + connect(b_fnext, &QAbstractButton::clicked, this, [this]() { scroll(m_rowcount); }); + connect(b_img, &QAbstractButton::clicked, this, [=, this]() { const color_format format = cbox_img_mode->currentData().value(); const int sizex = sb_img_size_x->value(); @@ -580,7 +580,7 @@ memory_viewer_panel::memory_viewer_panel(QWidget* parent, std::shared_ptr(id); - connect(this, &memory_viewer_panel::finished, [handle_ptr = std::move(handle_ptr), id, this](int) + connect(this, &memory_viewer_panel::finished, this, [handle_ptr = std::move(handle_ptr), id, this](int) { if (m_search_thread) { @@ -617,7 +617,7 @@ memory_viewer_panel::~memory_viewer_panel() void memory_viewer_panel::wheelEvent(QWheelEvent *event) { - // Set some scrollspeed modifiers: + // Set some scroll speed modifiers: u32 step_size = 1; if (event->modifiers().testFlag(Qt::ControlModifier)) step_size *= m_rowcount; @@ -986,6 +986,7 @@ void memory_viewer_panel::ShowImage(QWidget* parent, u32 addr, color_format form const u32 memsize = utils::mul_saturate(utils::mul_saturate(texel_bytes, width), height); if (memsize == 0) { + gui_log.error("Can not show image. memsize is 0 (texel_bytes=%d, width=%d, height=%d)", texel_bytes, width, height); return; } @@ -993,6 +994,7 @@ void memory_viewer_panel::ShowImage(QWidget* parent, u32 addr, color_format form if (!originalBuffer) { + gui_log.error("Can not show image. originalBuffer is null (addr=%d, memsize=%d)", addr, memsize); return; } @@ -1001,6 +1003,7 @@ void memory_viewer_panel::ShowImage(QWidget* parent, u32 addr, color_format form if (!convertedBuffer) { // OOM or invalid memory address, give up + gui_log.error("Can not show image. convertedBuffer is null (addr=%d, memsize=%d)", addr, memsize); return; } @@ -1014,7 +1017,7 @@ void memory_viewer_panel::ShowImage(QWidget* parent, u32 addr, color_format form { const u32 offset = y * pitch; const u32 offset_new = y * pitch_new; - for (u32 x = 0, x_new = 0; x < pitch; x += 3, x_new += 4) + for (u32 x = 0, x_new = 0; x < pitch && x_new < pitch_new; x += 3, x_new += 4) { convertedBuffer[offset_new + x_new + 0] = originalBuffer[offset + x + 2]; convertedBuffer[offset_new + x_new + 1] = originalBuffer[offset + x + 1]; @@ -1116,19 +1119,20 @@ void memory_viewer_panel::ShowImage(QWidget* parent, u32 addr, color_format form } // Flip vertically - if (flipv && height > 1 && memsize > 1) + if (flipv && width > 0 && height > 1 && memsize > 1) { const u32 pitch = width * 4; + std::vector tmp_row(pitch); + for (u32 y = 0; y < height / 2; y++) { - const u32 offset = y * pitch; - const u32 flip_offset = (height - y - 1) * pitch; - for (u32 x = 0; x < pitch; x++) - { - const u8 tmp = convertedBuffer[offset + x]; - convertedBuffer[offset + x] = convertedBuffer[flip_offset + x]; - convertedBuffer[flip_offset + x] = tmp; - } + u8* row_top = &convertedBuffer[y * pitch]; + u8* row_bottom = &convertedBuffer[(height - y - 1) * pitch]; + + // Swap rows + std::memcpy(tmp_row.data(), row_top, pitch); + std::memcpy(row_top, row_bottom, pitch); + std::memcpy(row_bottom, tmp_row.data(), pitch); } } diff --git a/rpcs3/rpcs3qt/midi_creator.cpp b/rpcs3/rpcs3qt/midi_creator.cpp index 0a61eeae9b..57476af3d6 100644 --- a/rpcs3/rpcs3qt/midi_creator.cpp +++ b/rpcs3/rpcs3qt/midi_creator.cpp @@ -86,13 +86,12 @@ std::array midi_creator::get_selection_list() con std::string midi_creator::set_device(u32 num, const midi_device& device) { - ensure(num < m_sel_list.size()); - - m_sel_list[num] = device; + midi_device& dev = ::at32(m_sel_list, num); + dev = device; if (device.name == get_none().toStdString()) { - m_sel_list[num].name.clear(); + dev.name.clear(); } std::string result; diff --git a/rpcs3/rpcs3qt/recvmessage_dialog_frame.h b/rpcs3/rpcs3qt/recvmessage_dialog_frame.h index 10b9bd87e9..16303daa46 100644 --- a/rpcs3/rpcs3qt/recvmessage_dialog_frame.h +++ b/rpcs3/rpcs3qt/recvmessage_dialog_frame.h @@ -11,7 +11,7 @@ struct recvmessage_signal_struct { shared_ptr> msg; - u64 msg_id; + u64 msg_id = 0; }; Q_DECLARE_METATYPE(recvmessage_signal_struct); diff --git a/rpcs3/rpcs3qt/skylander_dialog.cpp b/rpcs3/rpcs3qt/skylander_dialog.cpp index beebb8a965..94d9025a17 100644 --- a/rpcs3/rpcs3qt/skylander_dialog.cpp +++ b/rpcs3/rpcs3qt/skylander_dialog.cpp @@ -17,7 +17,7 @@ skylander_dialog* skylander_dialog::inst = nullptr; std::optional> skylander_dialog::sky_slots[UI_SKY_NUM]; QString last_skylander_path; -const std::map, const std::string> list_skylanders = { +static const std::map, const std::string> list_skylanders = { {{0, 0x0000}, "Whirlwind"}, {{0, 0x1801}, "Series 2 Whirlwind"}, {{0, 0x1C02}, "Polar Whirlwind"}, @@ -502,7 +502,8 @@ const std::map, const std::string> list_sk u16 skylander_crc16(u16 init_value, const u8* buffer, u32 size) { - const unsigned short CRC_CCITT_TABLE[256] = {0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, + constexpr unsigned short CRC_CCITT_TABLE[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, From 09ab5477e881b0592f336122799165e52bd03157 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 24 May 2025 04:45:54 +0200 Subject: [PATCH 3/5] rsx: use more const ref --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 8 ++++---- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 6 +++--- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 2 +- rpcs3/Emu/RSX/GL/GLTexture.cpp | 2 +- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 2 +- rpcs3/Emu/RSX/VK/VKResourceManager.cpp | 2 +- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 1a0515ef48..955bfbd59b 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -569,7 +569,7 @@ void GLGSRender::emit_geometry(u32 sub_index) if (vertex_state && !m_vertex_layout.validate()) { // No vertex inputs enabled - // Execute remainining pipeline barriers with NOP draw + // Execute remaining pipeline barriers with NOP draw do { draw_call.execute_pipeline_dependencies(m_ctx); @@ -619,9 +619,9 @@ void GLGSRender::emit_geometry(u32 sub_index) } else { - const auto subranges = draw_call.get_subranges(); + const auto& subranges = draw_call.get_subranges(); const auto draw_count = subranges.size(); - const auto driver_caps = gl::get_driver_caps(); + const auto& driver_caps = gl::get_driver_caps(); bool use_draw_arrays_fallback = false; m_scratch_buffer.resize(draw_count * 24); @@ -631,7 +631,7 @@ void GLGSRender::emit_geometry(u32 sub_index) u32 first = 0; u32 dst_index = 0; - for (const auto &range : subranges) + for (const auto& range : subranges) { firsts[dst_index] = first; counts[dst_index] = range.count; diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 3f65be3bae..3c95d571d3 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -33,7 +33,7 @@ void GLFragmentDecompilerThread::insertHeader(std::stringstream & OS) if (device_props.has_native_half_support) { - const auto driver_caps = gl::get_driver_caps(); + const auto& driver_caps = gl::get_driver_caps(); if (driver_caps.NV_gpu_shader5_supported) { required_extensions.push_back("GL_NV_gpu_shader5"); @@ -47,7 +47,7 @@ void GLFragmentDecompilerThread::insertHeader(std::stringstream & OS) if (properties.multisampled_sampler_mask) { // Requires this extension or GLSL 450 - const auto driver_caps = gl::get_driver_caps(); + const auto& driver_caps = gl::get_driver_caps(); if (driver_caps.glsl_version.version >= 450) { gl_version = 450; @@ -366,7 +366,7 @@ void GLFragmentProgram::Decompile(const RSXFragmentProgram& prog) if (g_cfg.video.shader_precision == gpu_preset_level::low) { - const auto driver_caps = gl::get_driver_caps(); + const auto& driver_caps = gl::get_driver_caps(); decompiler.device_props.has_native_half_support = driver_caps.NV_gpu_shader5_supported || driver_caps.AMD_gpu_shader_half_float_supported; decompiler.device_props.has_low_precision_rounding = driver_caps.vendor_NVIDIA; } diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 6101bd70c1..b6c27c4dd8 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -148,7 +148,7 @@ void GLGSRender::on_init_thread() rsx_log.success("GL VERSION: %s", reinterpret_cast(glGetString(GL_VERSION))); rsx_log.success("GLSL VERSION: %s", reinterpret_cast(glGetString(GL_SHADING_LANGUAGE_VERSION))); - auto& gl_caps = gl::get_driver_caps(); + const auto& gl_caps = gl::get_driver_caps(); std::vector exception_reasons; if (!gl_caps.ARB_texture_buffer_object_supported) diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index a0711d52d7..0c34690bf4 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -582,7 +582,7 @@ namespace gl const std::vector &input_layouts, bool is_swizzled, GLenum gl_format, GLenum gl_type, rsx::simple_array& staging_buffer) { - const auto driver_caps = gl::get_driver_caps(); + const auto& driver_caps = gl::get_driver_caps(); rsx::texture_uploader_capabilities caps { .supports_byteswap = true, diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 2c7699407e..9ac52774ea 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -565,7 +565,7 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) m_fragment_texture_params_buffer_info = { m_fragment_texture_params_ring_info.heap->value, 0, 16 }; m_raster_env_buffer_info = { m_raster_env_ring_info.heap->value, 0, 128 }; - const auto limits = m_device->gpu().get_limits(); + const auto& limits = m_device->gpu().get_limits(); m_texbuffer_view_size = std::min(limits.maxTexelBufferElements, VK_ATTRIB_RING_BUFFER_SIZE_M * 0x100000u); if (m_texbuffer_view_size < 0x800000) diff --git a/rpcs3/Emu/RSX/VK/VKResourceManager.cpp b/rpcs3/Emu/RSX/VK/VKResourceManager.cpp index 3c9eff4ef3..9d34509a09 100644 --- a/rpcs3/Emu/RSX/VK/VKResourceManager.cpp +++ b/rpcs3/Emu/RSX/VK/VKResourceManager.cpp @@ -50,7 +50,7 @@ namespace vk { // For any managed resources, try to keep the number of unused/idle resources as low as possible. // Improves search times as well as keeping us below the hardware limit. - const auto limits = get_current_renderer()->gpu().get_limits(); + const auto& limits = get_current_renderer()->gpu().get_limits(); const auto allocated_sampler_count = vmm_get_application_pool_usage(VMM_ALLOCATION_POOL_SAMPLER); const auto max_allowed_samplers = std::min((limits.maxSamplerAllocationCount * 3u) / 4u, 2048u); diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index 3146552f56..1aa90648ce 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -11,7 +11,7 @@ namespace vk { void image::validate(const vk::render_device& dev, const VkImageCreateInfo& info) const { - const auto gpu_limits = dev.gpu().get_limits(); + const auto& gpu_limits = dev.gpu().get_limits(); u32 longest_dim, dim_limit; switch (info.imageType) From 3aba805bc976fbb51b5d4202c9222af5eb24f781 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 24 May 2025 04:46:51 +0200 Subject: [PATCH 4/5] rsx: Fix use after move warning --- rpcs3/Emu/RSX/Common/surface_store.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/RSX/Common/surface_store.h b/rpcs3/Emu/RSX/Common/surface_store.h index 35813965e0..9b266a54ed 100644 --- a/rpcs3/Emu/RSX/Common/surface_store.h +++ b/rpcs3/Emu/RSX/Common/surface_store.h @@ -504,6 +504,7 @@ namespace rsx { // Exchange this surface with the invalidated one surface = std::move(old_surface_storage); + old_surface_storage = {}; } else { From 3e674a896f9e70ee7112c89c0a2a07f0df4d2326 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 24 May 2025 04:47:26 +0200 Subject: [PATCH 5/5] Minor struct memory layout optimization --- rpcs3/Emu/Io/pad_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Io/pad_types.h b/rpcs3/Emu/Io/pad_types.h index 710edb2743..e6761a295f 100644 --- a/rpcs3/Emu/Io/pad_types.h +++ b/rpcs3/Emu/Io/pad_types.h @@ -459,11 +459,11 @@ struct VibrateMotor struct ps_move_data { - bool external_device_connected = false; u32 external_device_id = 0; - std::array external_device_data{}; std::array external_device_read{}; // CELL_GEM_EXTERNAL_PORT_DEVICE_INFO_SIZE std::array external_device_write{}; // CELL_GEM_EXTERNAL_PORT_OUTPUT_SIZE + std::array external_device_data{}; + bool external_device_connected = false; bool external_device_read_requested = false; bool external_device_write_requested = false;