mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-09 15:49:25 +01:00
Show a panic alert if the CP matrix indices don't match the XF matrix indices
This almost certainly never happens, but if it does we want to know.
This commit is contained in:
parent
38a75f6a49
commit
8df55b492c
@ -136,7 +136,7 @@ void DolphinAnalytics::ReportGameStart()
|
||||
}
|
||||
|
||||
// Keep in sync with enum class GameQuirk definition.
|
||||
constexpr std::array<const char*, 27> GAME_QUIRKS_NAMES{
|
||||
constexpr std::array<const char*, 28> GAME_QUIRKS_NAMES{
|
||||
"icache-matters",
|
||||
"directly-reads-wiimote-input",
|
||||
"uses-DVDLowStopLaser",
|
||||
@ -164,6 +164,7 @@ constexpr std::array<const char*, 27> GAME_QUIRKS_NAMES{
|
||||
"mismatched-gpu-colors-between-cp-and-xf",
|
||||
"mismatched-gpu-normals-between-cp-and-xf",
|
||||
"mismatched-gpu-tex-coords-between-cp-and-xf",
|
||||
"mismatched-gpu-matrix-indices-between-cp-and-xf",
|
||||
};
|
||||
static_assert(GAME_QUIRKS_NAMES.size() == static_cast<u32>(GameQuirk::COUNT),
|
||||
"Game quirks names and enum definition are out of sync.");
|
||||
|
@ -87,6 +87,10 @@ enum class GameQuirk
|
||||
MISMATCHED_GPU_COLORS_BETWEEN_CP_AND_XF,
|
||||
MISMATCHED_GPU_NORMALS_BETWEEN_CP_AND_XF,
|
||||
MISMATCHED_GPU_TEX_COORDS_BETWEEN_CP_AND_XF,
|
||||
// Both CP and XF have normally-identical matrix index information. We currently always
|
||||
// use the CP one in the hardware renderers and the XF one in the software renderer,
|
||||
// but testing is needed to find out which of these is actually used for what.
|
||||
MISMATCHED_GPU_MATRIX_INDICES_BETWEEN_CP_AND_XF,
|
||||
|
||||
COUNT,
|
||||
};
|
||||
|
@ -106,20 +106,6 @@ void SWVertexLoader::DrawCurrentBatch(u32 base_index, u32 num_indices, u32 base_
|
||||
|
||||
void SWVertexLoader::SetFormat()
|
||||
{
|
||||
// matrix index from xf regs or cp memory?
|
||||
if (xfmem.MatrixIndexA.PosNormalMtxIdx != g_main_cp_state.matrix_index_a.PosNormalMtxIdx ||
|
||||
xfmem.MatrixIndexA.Tex0MtxIdx != g_main_cp_state.matrix_index_a.Tex0MtxIdx ||
|
||||
xfmem.MatrixIndexA.Tex1MtxIdx != g_main_cp_state.matrix_index_a.Tex1MtxIdx ||
|
||||
xfmem.MatrixIndexA.Tex2MtxIdx != g_main_cp_state.matrix_index_a.Tex2MtxIdx ||
|
||||
xfmem.MatrixIndexA.Tex3MtxIdx != g_main_cp_state.matrix_index_a.Tex3MtxIdx ||
|
||||
xfmem.MatrixIndexB.Tex4MtxIdx != g_main_cp_state.matrix_index_b.Tex4MtxIdx ||
|
||||
xfmem.MatrixIndexB.Tex5MtxIdx != g_main_cp_state.matrix_index_b.Tex5MtxIdx ||
|
||||
xfmem.MatrixIndexB.Tex6MtxIdx != g_main_cp_state.matrix_index_b.Tex6MtxIdx ||
|
||||
xfmem.MatrixIndexB.Tex7MtxIdx != g_main_cp_state.matrix_index_b.Tex7MtxIdx)
|
||||
{
|
||||
ERROR_LOG_FMT(VIDEO, "Matrix indices don't match");
|
||||
}
|
||||
|
||||
m_vertex.posMtx = xfmem.MatrixIndexA.PosNormalMtxIdx;
|
||||
m_vertex.texMtx[0] = xfmem.MatrixIndexA.Tex0MtxIdx;
|
||||
m_vertex.texMtx[1] = xfmem.MatrixIndexA.Tex1MtxIdx;
|
||||
|
@ -321,6 +321,18 @@ static void CheckCPConfiguration(int vtx_attr_group)
|
||||
// Don't bail out, though; we can still render something successfully
|
||||
// (real hardware seems to hang in this case, though)
|
||||
}
|
||||
|
||||
if (g_main_cp_state.matrix_index_a.Hex != xfmem.MatrixIndexA.Hex ||
|
||||
g_main_cp_state.matrix_index_b.Hex != xfmem.MatrixIndexB.Hex)
|
||||
{
|
||||
PanicAlertFmt("Mismatched matrix index configuration between CP and XF stages - "
|
||||
"index A: {:08x}/{:08x}, index B {:08x}/{:08x}. "
|
||||
"Please report on the issue tracker.",
|
||||
g_main_cp_state.matrix_index_a.Hex, xfmem.MatrixIndexA.Hex,
|
||||
g_main_cp_state.matrix_index_b.Hex, xfmem.MatrixIndexB.Hex);
|
||||
DolphinAnalytics::Instance().ReportGameQuirk(
|
||||
GameQuirk::MISMATCHED_GPU_MATRIX_INDICES_BETWEEN_CP_AND_XF);
|
||||
}
|
||||
}
|
||||
|
||||
int RunVertices(int vtx_attr_group, OpcodeDecoder::Primitive primitive, int count, DataReader src,
|
||||
|
Loading…
x
Reference in New Issue
Block a user