From 14ff42cd3b499bf835751ed3f0bea25c88fda424 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 10 Mar 2026 11:13:43 +0800 Subject: [PATCH] GPU: Fix gsvector_nosimd -Wnontrivial-memcall warnings (#3704) GSVector types are not trivially copyable, so passing their addresses to memcpy/memmove/memset triggers warnings. Use the internal S32/F32 member arrays directly for these operations, and use fill() instead of memset for array initialization. Warning example before this commit: ``` common/gsvector_nosimd.h:1527:17: warning: first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'GSVector4i' [-Wnontrivial-memcall] 1527 | std::memcpy(&ret, p, sizeof(ret.S32)); | ^ ``` --- src/common/gsvector_nosimd.h | 8 ++++---- src/core/gpu_hw_texture_cache.cpp | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/common/gsvector_nosimd.h b/src/common/gsvector_nosimd.h index cf3e65072..ae6cad9b1 100644 --- a/src/common/gsvector_nosimd.h +++ b/src/common/gsvector_nosimd.h @@ -1524,7 +1524,7 @@ public: ALWAYS_INLINE static GSVector4i loadnt(const void* p) { GSVector4i ret; - std::memcpy(&ret, p, sizeof(ret.S32)); + std::memcpy(&ret.S32, p, sizeof(ret.S32)); return ret; } @@ -2434,7 +2434,7 @@ ALWAYS_INLINE GSVector2::GSVector2(const GSVector2i& v) ALWAYS_INLINE GSVector2i GSVector2i::cast(const GSVector2& v) { GSVector2i ret; - std::memcpy(&ret, &v, sizeof(ret)); + std::memcpy(&ret.S32, &v.F32, sizeof(ret.S32)); return ret; } @@ -2464,14 +2464,14 @@ ALWAYS_INLINE GSVector4::GSVector4(const GSVector4i& v) ALWAYS_INLINE GSVector4i GSVector4i::cast(const GSVector4& v) { GSVector4i ret; - std::memcpy(&ret, &v, sizeof(ret)); + std::memcpy(&ret.S32, &v.F32, sizeof(ret.S32)); return ret; } ALWAYS_INLINE GSVector4 GSVector4::cast(const GSVector4i& v) { GSVector4 ret; - std::memcpy(&ret, &v, sizeof(ret)); + std::memcpy(&ret.F32, &v.S32, sizeof(ret.F32)); return ret; } diff --git a/src/core/gpu_hw_texture_cache.cpp b/src/core/gpu_hw_texture_cache.cpp index 79ae09e83..6684278ad 100644 --- a/src/core/gpu_hw_texture_cache.cpp +++ b/src/core/gpu_hw_texture_cache.cpp @@ -1082,7 +1082,8 @@ void GPUTextureCache::AddWrittenRectangle(const GSVector4i rect, bool update_vra // reorder it const u32 remaining_rects = page.num_draw_rects - i; if (remaining_rects > 0) - std::memmove(&page.draw_rects[i], &page.draw_rects[i + 1], sizeof(GSVector4i) * remaining_rects); + for (GSVector4i *it = &page.draw_rects[i], *end = &page.draw_rects[i + remaining_rects]; it != end; it++) + *it = *(it + 1); } } @@ -1584,7 +1585,7 @@ void GPUTextureCache::Invalidate() PageEntry& page = s_state.pages[i]; page.num_draw_rects = 0; page.total_draw_rect = GSVector4i::zero(); - std::memset(page.draw_rects.data(), 0, sizeof(page.draw_rects)); + page.draw_rects = {}; while (page.writes.tail) RemoveVRAMWrite(page.writes.tail->ref);