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));
      |                 ^
```
pull/3705/head
Yang Liu 7 months ago committed by GitHub
parent 19a165a5b1
commit 14ff42cd3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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;
}

@ -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);

Loading…
Cancel
Save