mirror of https://github.com/PCSX2/pcsx2.git
GS/HW: Add partial target invalidation option
Eventually hopefully we can make this the default, but it breaks too much at the moment. Fixes missing/corrupted textures in True Crime: New York City.
This commit is contained in:
parent
a06a07d961
commit
4583c64ff7
|
@ -17799,9 +17799,12 @@ SLES-53616:
|
|||
eeRoundMode: 0 # Fixes scene switching in intro.
|
||||
gsHWFixes:
|
||||
cpuSpriteRenderBW: 1 # Fixes textures.
|
||||
preloadFrameData: 1 # Fixes static text screens.
|
||||
partialTargetInvalidation: 1 # Needed due to procedural textures overlapping EE writes.
|
||||
preloadFrameData: 1 # Fixes numberplates and ensures above targets are valid.
|
||||
roundSprite: 1 # Fixes lines in some post-effects.
|
||||
cpuCLUTRender: 1 # Fixes light occlusion.
|
||||
gpuTargetCLUT: 1 # Fixes light occlusion.
|
||||
mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer.
|
||||
trilinearFiltering: 1
|
||||
SLES-53617:
|
||||
name: "True Crime - New York City"
|
||||
region: "PAL-G"
|
||||
|
@ -17811,9 +17814,12 @@ SLES-53617:
|
|||
eeRoundMode: 0 # Fixes scene switching in intro.
|
||||
gsHWFixes:
|
||||
cpuSpriteRenderBW: 1 # Fixes textures.
|
||||
preloadFrameData: 1 # Fixes static text screens.
|
||||
partialTargetInvalidation: 1 # Needed due to procedural textures overlapping EE writes.
|
||||
preloadFrameData: 1 # Fixes numberplates and ensures above targets are valid.
|
||||
roundSprite: 1 # Fixes lines in some post-effects.
|
||||
cpuCLUTRender: 1 # Fixes light occlusion.
|
||||
gpuTargetCLUT: 1 # Fixes light occlusion.
|
||||
mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer.
|
||||
trilinearFiltering: 1
|
||||
SLES-53618:
|
||||
name: "True Crime - New York City"
|
||||
region: "PAL-S"
|
||||
|
@ -17823,9 +17829,12 @@ SLES-53618:
|
|||
eeRoundMode: 0 # Fixes scene switching in intro.
|
||||
gsHWFixes:
|
||||
cpuSpriteRenderBW: 1 # Fixes textures.
|
||||
preloadFrameData: 1 # Fixes static text screens.
|
||||
partialTargetInvalidation: 1 # Needed due to procedural textures overlapping EE writes.
|
||||
preloadFrameData: 1 # Fixes numberplates and ensures above targets are valid.
|
||||
roundSprite: 1 # Fixes lines in some post-effects.
|
||||
cpuCLUTRender: 1 # Fixes light occlusion.
|
||||
gpuTargetCLUT: 1 # Fixes light occlusion.
|
||||
mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer.
|
||||
trilinearFiltering: 1
|
||||
SLES-53621:
|
||||
name: "Wallace & Gromit - The Curse of the Were-Rabbit"
|
||||
region: "PAL-M5"
|
||||
|
@ -32922,9 +32931,12 @@ SLPM-66473:
|
|||
eeRoundMode: 0 # Fixes scene switching in intro.
|
||||
gsHWFixes:
|
||||
cpuSpriteRenderBW: 1 # Fixes textures.
|
||||
preloadFrameData: 1 # Fixes static text screens.
|
||||
partialTargetInvalidation: 1 # Needed due to procedural textures overlapping EE writes.
|
||||
preloadFrameData: 1 # Fixes numberplates and ensures above targets are valid.
|
||||
roundSprite: 1 # Fixes lines in some post-effects.
|
||||
cpuCLUTRender: 1 # Fixes light occlusion.
|
||||
gpuTargetCLUT: 1 # Fixes light occlusion.
|
||||
mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer.
|
||||
trilinearFiltering: 1
|
||||
SLPM-66474:
|
||||
name: "Odin Sphere"
|
||||
region: "NTSC-J"
|
||||
|
@ -35287,9 +35299,12 @@ SLPM-74243:
|
|||
eeRoundMode: 0 # Fixes scene switching in intro.
|
||||
gsHWFixes:
|
||||
cpuSpriteRenderBW: 1 # Fixes textures.
|
||||
preloadFrameData: 1 # Fixes static text screens.
|
||||
partialTargetInvalidation: 1 # Needed due to procedural textures overlapping EE writes.
|
||||
preloadFrameData: 1 # Fixes numberplates and ensures above targets are valid.
|
||||
roundSprite: 1 # Fixes lines in some post-effects.
|
||||
cpuCLUTRender: 1 # Fixes light occlusion.
|
||||
gpuTargetCLUT: 1 # Fixes light occlusion.
|
||||
mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer.
|
||||
trilinearFiltering: 1
|
||||
SLPM-74244:
|
||||
name: "Phantasy Star Universe [PlayStation 2 The Best]"
|
||||
region: "NTSC-J"
|
||||
|
@ -45988,9 +46003,12 @@ SLUS-21106:
|
|||
eeRoundMode: 0 # Fixes scene switching in intro.
|
||||
gsHWFixes:
|
||||
cpuSpriteRenderBW: 1 # Fixes textures.
|
||||
preloadFrameData: 1 # Fixes static text screens.
|
||||
partialTargetInvalidation: 1 # Needed due to procedural textures overlapping EE writes.
|
||||
preloadFrameData: 1 # Fixes numberplates and ensures above targets are valid.
|
||||
roundSprite: 1 # Fixes lines in some post-effects.
|
||||
cpuCLUTRender: 1 # Fixes light occlusion.
|
||||
gpuTargetCLUT: 1 # Fixes light occlusion.
|
||||
mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer.
|
||||
trilinearFiltering: 1
|
||||
SLUS-21107:
|
||||
name: "X-Men - The Official Game"
|
||||
region: "NTSC-U"
|
||||
|
|
|
@ -178,8 +178,11 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget*
|
|||
&GraphicsSettingsWidget::onTrilinearFilteringChanged);
|
||||
connect(m_ui.gpuPaletteConversion, QOverload<int>::of(&QCheckBox::stateChanged), this,
|
||||
&GraphicsSettingsWidget::onGpuPaletteConversionChanged);
|
||||
connect(m_ui.textureInsideRt, QOverload<int>::of(&QCheckBox::stateChanged), this,
|
||||
&GraphicsSettingsWidget::onTextureInsideRtChanged);
|
||||
onTrilinearFilteringChanged();
|
||||
onGpuPaletteConversionChanged(m_ui.gpuPaletteConversion->checkState());
|
||||
onTextureInsideRtChanged(m_ui.textureInsideRt->checkState());
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// HW Renderer Fixes
|
||||
|
@ -199,6 +202,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget*
|
|||
sif, m_ui.disablePartialInvalidation, "EmuCore/GS", "UserHacks_DisablePartialInvalidation", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.textureInsideRt, "EmuCore/GS", "UserHacks_TextureInsideRt", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.readTCOnClose, "EmuCore/GS", "UserHacks_ReadTCOnClose", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.targetPartialInvalidation, "EmuCore/GS", "UserHacks_TargetPartialInvalidation", false);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// HW Upscaling Fixes
|
||||
|
@ -523,7 +527,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget*
|
|||
"Disables accurate GS Memory Clearing to be done on the CPU, and let the GPU handle it, which can help Kingdom Hearts "
|
||||
"games."));
|
||||
|
||||
dialog->registerWidgetHelp(m_ui.disablePartialInvalidation, tr("Disable Partial Invalidation"), tr("Unchecked"),
|
||||
dialog->registerWidgetHelp(m_ui.disablePartialInvalidation, tr("Disable Partial Source Invalidation"), tr("Unchecked"),
|
||||
tr("By default, the texture cache handles partial invalidations. Unfortunately it is very costly to compute CPU wise. "
|
||||
"This hack replaces the partial invalidation with a complete deletion of the texture to reduce the CPU load. "
|
||||
"It helps snowblind engine games."));
|
||||
|
@ -536,12 +540,15 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget*
|
|||
"Fixes black screen issues in games like Armored Core: Last Raven."));
|
||||
|
||||
dialog->registerWidgetHelp(m_ui.textureInsideRt, tr("Texture Inside RT"), tr("Unchecked"),
|
||||
tr("Allows the texture cache to reuse as an input texture the inner portion of a previous framebuffer. "
|
||||
"In some selected games this is enabled by default regardless of this setting."));
|
||||
tr("Allows the texture cache to reuse as an input texture the inner portion of a previous framebuffer."));
|
||||
|
||||
dialog->registerWidgetHelp(m_ui.readTCOnClose, tr("Read Targets When Closing"), tr("Unchecked"),
|
||||
tr("Flushes all targets in the texture cache back to local memory when shutting down. Can prevent lost visuals when saving "
|
||||
"state or switching renderers, but can also cause graphical corruption."));
|
||||
|
||||
dialog->registerWidgetHelp(m_ui.targetPartialInvalidation, tr("Target Partial Invalidation"), tr("Unchecked"),
|
||||
tr("Allows partial invalidation of render targets, which can fix graphical errors in some games. Texture Inside Render Target "
|
||||
"automatically enables this option."));
|
||||
}
|
||||
|
||||
// Upscaling Fixes tab
|
||||
|
@ -844,9 +851,19 @@ void GraphicsSettingsWidget::onEnableAudioCaptureArgumentsChanged()
|
|||
|
||||
void GraphicsSettingsWidget::onGpuPaletteConversionChanged(int state)
|
||||
{
|
||||
const bool enabled = state == Qt::CheckState::PartiallyChecked ? Host::GetBaseBoolSettingValue("EmuCore/GS", "paltex", false) : state;
|
||||
const bool disabled =
|
||||
state == Qt::CheckState::PartiallyChecked ? Host::GetBaseBoolSettingValue("EmuCore/GS", "paltex", false) : (state != 0);
|
||||
|
||||
m_ui.anisotropicFiltering->setEnabled(!enabled);
|
||||
m_ui.anisotropicFiltering->setDisabled(disabled);
|
||||
}
|
||||
|
||||
void GraphicsSettingsWidget::onTextureInsideRtChanged(int state)
|
||||
{
|
||||
const bool disabled = state == Qt::CheckState::PartiallyChecked ?
|
||||
Host::GetBaseBoolSettingValue("EmuCore/GS", "UserHacks_TextureInsideRt", false) :
|
||||
(state != 0);
|
||||
|
||||
m_ui.targetPartialInvalidation->setDisabled(disabled);
|
||||
}
|
||||
|
||||
GSRendererType GraphicsSettingsWidget::getEffectiveRenderer() const
|
||||
|
|
|
@ -41,6 +41,7 @@ private Q_SLOTS:
|
|||
void onAdapterChanged(int index);
|
||||
void onTrilinearFilteringChanged();
|
||||
void onGpuPaletteConversionChanged(int state);
|
||||
void onTextureInsideRtChanged(int state);
|
||||
void onFullscreenModeChanged(int index);
|
||||
void onShadeBoostChanged();
|
||||
void onCaptureContainerChanged();
|
||||
|
|
|
@ -920,91 +920,13 @@
|
|||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_12">
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>Skipdraw Range:</string>
|
||||
<string>Software CLUT Render:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="skipDrawStart">
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="skipDrawEnd">
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="frameBufferConversion">
|
||||
<property name="text">
|
||||
<string>Frame Buffer Conversion</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="hwAutoFlush">
|
||||
<property name="text">
|
||||
<string>Auto Flush</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="disableDepthEmulation">
|
||||
<property name="text">
|
||||
<string>Disable Depth Emulation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="preloadFrameData">
|
||||
<property name="text">
|
||||
<string>Preload Frame Data</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="disablePartialInvalidation">
|
||||
<property name="text">
|
||||
<string>Disable Partial Invalidation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="disableSafeFeatures">
|
||||
<property name="text">
|
||||
<string>Disable Safe Features</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="textureInsideRt">
|
||||
<property name="text">
|
||||
<string>Texture Inside RT</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QCheckBox" name="readTCOnClose">
|
||||
<property name="text">
|
||||
<string>Read Targets When Closing</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QComboBox" name="cpuCLUTRender">
|
||||
<property name="currentText">
|
||||
|
@ -1030,13 +952,6 @@
|
|||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>Software CLUT Render:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_47">
|
||||
<property name="text">
|
||||
|
@ -1063,6 +978,98 @@
|
|||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="text">
|
||||
<string>Skipdraw Range:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="skipDrawStart">
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="skipDrawEnd">
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="preloadFrameData">
|
||||
<property name="text">
|
||||
<string>Preload Frame Data</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="textureInsideRt">
|
||||
<property name="text">
|
||||
<string>Texture Inside RT</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="disableDepthEmulation">
|
||||
<property name="text">
|
||||
<string>Disable Depth Emulation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="disablePartialInvalidation">
|
||||
<property name="text">
|
||||
<string>Disable Partial Source Invalidation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="disableSafeFeatures">
|
||||
<property name="text">
|
||||
<string>Disable Safe Features</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QCheckBox" name="targetPartialInvalidation">
|
||||
<property name="text">
|
||||
<string>Target Partial Invalidation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="frameBufferConversion">
|
||||
<property name="text">
|
||||
<string>Frame Buffer Conversion</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="hwAutoFlush">
|
||||
<property name="text">
|
||||
<string>Auto Flush</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="readTCOnClose">
|
||||
<property name="text">
|
||||
<string>Read Targets When Closing</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QGroupBox" name="upscalingFixesTab">
|
||||
|
|
|
@ -671,6 +671,7 @@ struct Pcsx2Config
|
|||
UserHacks_MergePPSprite : 1,
|
||||
UserHacks_WildHack : 1,
|
||||
UserHacks_TextureInsideRt : 1,
|
||||
UserHacks_TargetPartialInvalidation : 1,
|
||||
FXAA : 1,
|
||||
ShadeBoost : 1,
|
||||
DumpGSData : 1,
|
||||
|
|
|
@ -151,6 +151,11 @@
|
|||
"minimum": 0,
|
||||
"maximum": 1
|
||||
},
|
||||
"partialTargetInvalidation": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 1
|
||||
},
|
||||
"textureInsideRT": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
|
|
|
@ -3196,6 +3196,10 @@ void FullscreenUI::DrawGraphicsSettingsPage()
|
|||
DrawToggleSetting(bsi, "Texture Inside Render Target",
|
||||
"Allows the texture cache to reuse as an input texture the inner portion of a previous framebuffer.", "EmuCore/GS",
|
||||
"UserHacks_TextureInsideRt", false, manual_hw_fixes);
|
||||
DrawToggleSetting(bsi, "Target Partial Invalidation",
|
||||
"Allows partial invalidation of render targets, which can fix graphical errors in some games.", "EmuCore/GS",
|
||||
"UserHacks_TargetPartialInvalidation", false,
|
||||
!GetEffectiveBoolSetting(bsi, "EmuCore/GS", "UserHacks_TextureInsideRt", false));
|
||||
DrawToggleSetting(bsi, "Read Targets When Closing",
|
||||
"Flushes all targets in the texture cache back to local memory when shutting down.", "EmuCore/GS",
|
||||
"UserHacks_ReadTCOnClose", false, manual_hw_fixes);
|
||||
|
|
|
@ -427,6 +427,8 @@ void ImGuiManager::DrawSettingsOverlay()
|
|||
APPEND("DDE ");
|
||||
if (GSConfig.UserHacks_DisablePartialInvalidation)
|
||||
APPEND("DPIV ");
|
||||
if (GSConfig.UserHacks_TargetPartialInvalidation)
|
||||
APPEND("TPV ");
|
||||
if (GSConfig.UserHacks_DisableSafeFeatures)
|
||||
APPEND("DSF ");
|
||||
if (GSConfig.WrapGSMem)
|
||||
|
|
|
@ -1210,6 +1210,9 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
const u32 end_bp = off.bn(rect.z - 1, rect.w - 1);
|
||||
const u32 unwrapped_end_bp = end_bp + ((end_bp < bp) ? MAX_BLOCKS : 0);
|
||||
|
||||
// Ideally in the future we can turn this on unconditionally, but for now it breaks too much.
|
||||
const bool check_inside_target = (GSConfig.UserHacks_TargetPartialInvalidation || GSConfig.UserHacks_TextureInsideRt);
|
||||
|
||||
for (int type = 0; type < 2; type++)
|
||||
{
|
||||
auto& list = m_dst[type];
|
||||
|
@ -1355,17 +1358,11 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
const u32 rowsize = bw * 8192;
|
||||
const u32 offset = static_cast<u32>((t->m_TEX0.TBP0 - bp) * 256);
|
||||
|
||||
// This grossness is needed to fix incorrect invalidations in True Crime: New York City.
|
||||
// Because it's writing tiny texture blocks (which are later decompressed) over previous targets,
|
||||
// we need to be ensure said targets are invalidated, otherwise the SW prim render path won't be
|
||||
// triggered. This whole thing needs rewriting anyway, because it can't handle non-page-aligned
|
||||
// writes, but for now we'll just use the unsafer logic when the TC hack is enabled.
|
||||
const bool start_of_page = rowsize > 0 && (offset % rowsize == 0);
|
||||
if (start_of_page || (rowsize > 0 && GSConfig.UserHacks_CPUSpriteRenderBW != 0))
|
||||
if (rowsize > 0 && offset % rowsize == 0)
|
||||
{
|
||||
int y = GSLocalMemory::m_psm[psm].pgs.y * offset / rowsize;
|
||||
|
||||
if (r.bottom > y && (start_of_page || r.top >= y))
|
||||
if (r.bottom > y)
|
||||
{
|
||||
GL_CACHE("TC: Dirty After Target(%s) %d (0x%x)", to_string(type),
|
||||
t->m_texture ? t->m_texture->GetID() : 0,
|
||||
|
@ -1410,7 +1407,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
continue;
|
||||
}
|
||||
}
|
||||
else if (GSConfig.UserHacks_TextureInsideRt && t->Overlaps(bp, bw, psm, rect) && GSUtil::HasCompatibleBits(psm, t->m_TEX0.PSM))
|
||||
else if (check_inside_target && t->Overlaps(bp, bw, psm, rect) && GSUtil::HasSharedBits(psm, t->m_TEX0.PSM))
|
||||
{
|
||||
SurfaceOffsetKey sok;
|
||||
sok.elems[0].bp = bp;
|
||||
|
|
|
@ -347,6 +347,7 @@ static const char* s_gs_hw_fix_names[] = {
|
|||
"wrapGSMem",
|
||||
"preloadFrameData",
|
||||
"disablePartialInvalidation",
|
||||
"partialTargetInvalidation",
|
||||
"textureInsideRT",
|
||||
"alignSprite",
|
||||
"mergeSprite",
|
||||
|
@ -564,6 +565,9 @@ bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOpti
|
|||
case GSHWFixId::DisablePartialInvalidation:
|
||||
return (static_cast<int>(config.UserHacks_DisablePartialInvalidation) == value);
|
||||
|
||||
case GSHWFixId::TargetPartialInvalidation:
|
||||
return (static_cast<int>(config.UserHacks_TargetPartialInvalidation) == value);
|
||||
|
||||
case GSHWFixId::TextureInsideRT:
|
||||
return (static_cast<int>(config.UserHacks_TextureInsideRt) == value);
|
||||
|
||||
|
@ -678,6 +682,10 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions&
|
|||
config.UserHacks_DisablePartialInvalidation = (value > 0);
|
||||
break;
|
||||
|
||||
case GSHWFixId::TargetPartialInvalidation:
|
||||
config.UserHacks_TargetPartialInvalidation = (value > 0);
|
||||
break;
|
||||
|
||||
case GSHWFixId::TextureInsideRT:
|
||||
config.UserHacks_TextureInsideRt = (value > 0);
|
||||
break;
|
||||
|
|
|
@ -67,6 +67,7 @@ namespace GameDatabaseSchema
|
|||
WrapGSMem,
|
||||
PreloadFrameData,
|
||||
DisablePartialInvalidation,
|
||||
TargetPartialInvalidation,
|
||||
TextureInsideRT,
|
||||
AlignSprite,
|
||||
MergeSprite,
|
||||
|
|
|
@ -648,6 +648,7 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap)
|
|||
GSSettingBoolEx(UserHacks_MergePPSprite, "UserHacks_merge_pp_sprite");
|
||||
GSSettingBoolEx(UserHacks_WildHack, "UserHacks_WildHack");
|
||||
GSSettingBoolEx(UserHacks_TextureInsideRt, "UserHacks_TextureInsideRt");
|
||||
GSSettingBoolEx(UserHacks_TargetPartialInvalidation, "UserHacks_TargetPartialInvalidation");
|
||||
GSSettingBoolEx(FXAA, "fxaa");
|
||||
GSSettingBool(ShadeBoost);
|
||||
GSSettingBoolEx(DumpGSData, "dump");
|
||||
|
@ -774,6 +775,7 @@ void Pcsx2Config::GSOptions::MaskUserHacks()
|
|||
UserHacks_CPUFBConversion = false;
|
||||
UserHacks_ReadTCOnClose = false;
|
||||
UserHacks_TextureInsideRt = false;
|
||||
UserHacks_TargetPartialInvalidation = false;
|
||||
UserHacks_TCOffsetX = 0;
|
||||
UserHacks_TCOffsetY = 0;
|
||||
UserHacks_CPUSpriteRenderBW = 0;
|
||||
|
|
Loading…
Reference in New Issue