summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexLoaderManager.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2024-04-04 22:10:18 +0200
committerGitHub <noreply@github.com>2024-04-04 22:10:18 +0200
commitad331205d1b3c4efb41981a332c9d6fc86009ce3 (patch)
tree8ae92d26c027eaa38af74f5ba3528f5a7087b10e /Source/Core/VideoCommon/VertexLoaderManager.cpp
parent4312840a4b8cd52ce1beee3a13ba12afe2b59e53 (diff)
parenta3951dc2d72ebb6f240d592fdbb348137130ce49 (diff)
Merge pull request #12684 from Pokechu22/invalid-vertex-component
Fix out of bounds accesses for invalid vertex component formats
Diffstat (limited to 'Source/Core/VideoCommon/VertexLoaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/VertexLoaderManager.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/VertexLoaderManager.cpp b/Source/Core/VideoCommon/VertexLoaderManager.cpp
index 5da66c273d..8ae9a9aa46 100644
--- a/Source/Core/VideoCommon/VertexLoaderManager.cpp
+++ b/Source/Core/VideoCommon/VertexLoaderManager.cpp
@@ -319,6 +319,51 @@ static void CheckCPConfiguration(int vtx_attr_group)
DolphinAnalytics::Instance().ReportGameQuirk(
GameQuirk::MISMATCHED_GPU_MATRIX_INDICES_BETWEEN_CP_AND_XF);
}
+
+ if (g_main_cp_state.vtx_attr[vtx_attr_group].g0.PosFormat >= ComponentFormat::InvalidFloat5)
+ {
+ WARN_LOG_FMT(VIDEO, "Invalid position format {} for VAT {} - {:08x} {:08x} {:08x}",
+ g_main_cp_state.vtx_attr[vtx_attr_group].g0.PosFormat, vtx_attr_group,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g0.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g1.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g2.Hex);
+ DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::INVALID_POSITION_COMPONENT_FORMAT);
+ }
+ if (g_main_cp_state.vtx_attr[vtx_attr_group].g0.NormalFormat >= ComponentFormat::InvalidFloat5)
+ {
+ WARN_LOG_FMT(VIDEO, "Invalid normal format {} for VAT {} - {:08x} {:08x} {:08x}",
+ g_main_cp_state.vtx_attr[vtx_attr_group].g0.NormalFormat, vtx_attr_group,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g0.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g1.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g2.Hex);
+ DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::INVALID_NORMAL_COMPONENT_FORMAT);
+ }
+ for (size_t i = 0; i < 8; i++)
+ {
+ if (g_main_cp_state.vtx_attr[vtx_attr_group].GetTexFormat(i) >= ComponentFormat::InvalidFloat5)
+ {
+ WARN_LOG_FMT(VIDEO,
+ "Invalid texture coordinate {} format {} for VAT {} - {:08x} {:08x} {:08x}", i,
+ g_main_cp_state.vtx_attr[vtx_attr_group].GetTexFormat(i), vtx_attr_group,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g0.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g1.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g2.Hex);
+ DolphinAnalytics::Instance().ReportGameQuirk(
+ GameQuirk::INVALID_TEXTURE_COORDINATE_COMPONENT_FORMAT);
+ }
+ }
+ for (size_t i = 0; i < 2; i++)
+ {
+ if (g_main_cp_state.vtx_attr[vtx_attr_group].GetColorFormat(i) > ColorFormat::RGBA8888)
+ {
+ WARN_LOG_FMT(VIDEO, "Invalid color {} format {} for VAT {} - {:08x} {:08x} {:08x}", i,
+ g_main_cp_state.vtx_attr[vtx_attr_group].GetColorFormat(i), vtx_attr_group,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g0.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g1.Hex,
+ g_main_cp_state.vtx_attr[vtx_attr_group].g2.Hex);
+ DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::INVALID_COLOR_COMPONENT_FORMAT);
+ }
+ }
}
template <bool IsPreprocess>