summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2020-04-21 10:07:36 -0400
committerGitHub <noreply@github.com>2020-04-21 10:07:36 -0400
commitd845b31579a136d1b6d610110bec1bbd02fcbebb (patch)
treeed3ed954d75a7a7b5fd031dc2026e2809519a657 /Source/Core
parent2d8758daaa2e07a7fbfc4a17d5cb089b27a6d10c (diff)
parentff7180cac422cf20c174031d7d41c05961234828 (diff)
Merge pull request #8717 from stenzek/mismatched-xf-bp
VertexManagerBase: Skip drawing objects with mismatched xf/bp stages
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Analytics.cpp24
-rw-r--r--Source/Core/Core/Analytics.h7
-rw-r--r--Source/Core/VideoCommon/VertexManagerBase.cpp26
3 files changed, 45 insertions, 12 deletions
diff --git a/Source/Core/Core/Analytics.cpp b/Source/Core/Core/Analytics.cpp
index 6b28eeb153..af289b4ff5 100644
--- a/Source/Core/Core/Analytics.cpp
+++ b/Source/Core/Core/Analytics.cpp
@@ -132,18 +132,18 @@ void DolphinAnalytics::ReportGameStart()
}
// Keep in sync with enum class GameQuirk definition.
-constexpr std::array<const char*, 10> GAME_QUIRKS_NAMES{
- "icache-matters",
- "directly-reads-wiimote-input",
- "uses-DVDLowStopLaser",
- "uses-DVDLowOffset",
- "uses-DVDLowReadDiskBca",
- "uses-DVDLowRequestDiscStatus",
- "uses-DVDLowRequestRetryNumber",
- "uses-DVDLowSerMeasControl",
- "uses-different-partition-command",
- "uses-di-interrupt-command",
-};
+constexpr std::array<const char*, 12> GAME_QUIRKS_NAMES{"icache-matters",
+ "directly-reads-wiimote-input",
+ "uses-DVDLowStopLaser",
+ "uses-DVDLowOffset",
+ "uses-DVDLowReadDiskBca",
+ "uses-DVDLowRequestDiscStatus",
+ "uses-DVDLowRequestRetryNumber",
+ "uses-DVDLowSerMeasControl",
+ "uses-different-partition-command",
+ "uses-di-interrupt-command",
+ "mismatched-gpu-texgens-between-xf-and-bp",
+ "mismatched-gpu-colors-between-xf-and-bp"};
static_assert(GAME_QUIRKS_NAMES.size() == static_cast<u32>(GameQuirk::COUNT),
"Game quirks names and enum definition are out of sync.");
diff --git a/Source/Core/Core/Analytics.h b/Source/Core/Core/Analytics.h
index f78cafbac6..94f7eb5a78 100644
--- a/Source/Core/Core/Analytics.h
+++ b/Source/Core/Core/Analytics.h
@@ -47,6 +47,13 @@ enum class GameQuirk
// (DVDLowClearCoverInterrupt is used, though)
USES_DI_INTERRUPT_MASK_COMMAND,
+ // Some games configure a mismatched number of texture coordinates or colors between the transform
+ // and TEV/BP stages of the rendering pipeline. Currently, Dolphin just skips over these objects
+ // as the hardware renderers are not equipped to handle the case where the registers between
+ // stages are mismatched.
+ MISMATCHED_GPU_TEXGENS_BETWEEN_XF_AND_BP,
+ MISMATCHED_GPU_COLORS_BETWEEN_XF_AND_BP,
+
COUNT,
};
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index c9be06cd48..ce80f0008a 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -14,6 +14,7 @@
#include "Common/Logging/Log.h"
#include "Common/MathUtil.h"
+#include "Core/Analytics.h"
#include "Core/ConfigManager.h"
#include "VideoCommon/BPMemory.h"
@@ -353,6 +354,31 @@ void VertexManagerBase::Flush()
m_is_flushed = true;
+ if (xfmem.numTexGen.numTexGens != bpmem.genMode.numtexgens ||
+ xfmem.numChan.numColorChans != bpmem.genMode.numcolchans)
+ {
+ ERROR_LOG(VIDEO,
+ "Mismatched configuration between XF and BP stages - %u/%u texgens, %u/%u colors. "
+ "Skipping draw. Please report on the issue tracker.",
+ xfmem.numTexGen.numTexGens, bpmem.genMode.numtexgens.Value(),
+ xfmem.numChan.numColorChans, bpmem.genMode.numcolchans.Value());
+
+ // Analytics reporting so we can discover which games have this problem, that way when we
+ // eventually simulate the behavior we have test cases for it.
+ if (xfmem.numTexGen.numTexGens != bpmem.genMode.numtexgens)
+ {
+ DolphinAnalytics::Instance().ReportGameQuirk(
+ GameQuirk::MISMATCHED_GPU_TEXGENS_BETWEEN_XF_AND_BP);
+ }
+ if (xfmem.numChan.numColorChans != bpmem.genMode.numcolchans)
+ {
+ DolphinAnalytics::Instance().ReportGameQuirk(
+ GameQuirk::MISMATCHED_GPU_TEXGENS_BETWEEN_XF_AND_BP);
+ }
+
+ return;
+ }
+
#if defined(_DEBUG) || defined(DEBUGFAST)
PRIM_LOG("frame%d:\n texgen=%u, numchan=%u, dualtex=%u, ztex=%u, cole=%u, alpe=%u, ze=%u",
g_ActiveConfig.iSaveTargetId, xfmem.numTexGen.numTexGens, xfmem.numChan.numColorChans,