summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2015-09-17 14:24:06 -0400
committerLioncash <mathew1800@gmail.com>2015-09-17 14:24:11 -0400
commit28d1001ff8ce0d2843a3786d56deb43bf6df750a (patch)
treeb76af6b560a5bfe0033ee52796ba897687a359ba /Source/Core/VideoCommon
parent7681d7b67aab3861014028833ba6cb7cbadfc691 (diff)
VertexLoaderUtils: Get rid of pointer casts
Eliminates most ubsan asserts that stem from VideoCommon when running starfield.
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/VertexLoaderUtils.h19
1 files changed, 11 insertions, 8 deletions
diff --git a/Source/Core/VideoCommon/VertexLoaderUtils.h b/Source/Core/VideoCommon/VertexLoaderUtils.h
index 143740ddf4..db37e26c43 100644
--- a/Source/Core/VideoCommon/VertexLoaderUtils.h
+++ b/Source/Core/VideoCommon/VertexLoaderUtils.h
@@ -4,6 +4,7 @@
#pragma once
+#include <cstring>
#include "Common/Common.h"
#include "VideoCommon/VertexManagerBase.h"
@@ -24,10 +25,11 @@ __forceinline void DataSkip()
}
template <typename T>
-__forceinline T DataPeek(int _uOffset, u8** bufp = &g_video_buffer_read_ptr)
+__forceinline T DataPeek(int _uOffset, u8* bufp = g_video_buffer_read_ptr)
{
- auto const result = Common::FromBigEndian(*reinterpret_cast<T*>(*bufp + _uOffset));
- return result;
+ T result;
+ std::memcpy(&result, &bufp[_uOffset], sizeof(T));
+ return Common::FromBigEndian(result);
}
// TODO: kill these
@@ -49,7 +51,7 @@ __forceinline u32 DataPeek32(int _uOffset)
template <typename T>
__forceinline T DataRead(u8** bufp = &g_video_buffer_read_ptr)
{
- auto const result = DataPeek<T>(0, bufp);
+ auto const result = DataPeek<T>(0, *bufp);
*bufp += sizeof(T);
return result;
}
@@ -77,9 +79,10 @@ __forceinline u32 DataReadU32()
__forceinline u32 DataReadU32Unswapped()
{
- u32 tmp = *(u32*)g_video_buffer_read_ptr;
- g_video_buffer_read_ptr += 4;
- return tmp;
+ u32 result;
+ std::memcpy(&result, g_video_buffer_read_ptr, sizeof(u32));
+ g_video_buffer_read_ptr += sizeof(u32);
+ return result;
}
__forceinline u8* DataGetPosition()
@@ -90,6 +93,6 @@ __forceinline u8* DataGetPosition()
template <typename T>
__forceinline void DataWrite(T data)
{
- *(T*)g_vertex_manager_write_ptr = data;
+ std::memcpy(g_vertex_manager_write_ptr, &data, sizeof(T));
g_vertex_manager_write_ptr += sizeof(T);
}