GPU/HW: Fix crash when changing downsampling factor

This commit is contained in:
Stenzek 2025-03-20 21:18:30 +10:00
parent 19c03aff4d
commit 5c41a48e39
No known key found for this signature in database

View File

@ -475,7 +475,7 @@ bool GPU_HW::UpdateSettings(const GPUSettings& old_settings, Error* error)
const bool downsampling_shaders_changed =
((m_resolution_scale > 1) != (resolution_scale > 1) ||
(resolution_scale > 1 && (g_gpu_settings.gpu_downsample_mode != old_settings.gpu_downsample_mode ||
(m_downsample_mode == GPUDownsampleMode::Box &&
(g_gpu_settings.gpu_downsample_mode == GPUDownsampleMode::Box &&
(resolution_scale != m_resolution_scale ||
g_gpu_settings.gpu_downsample_scale != old_settings.gpu_downsample_scale)))));
@ -706,7 +706,19 @@ void GPU_HW::CheckSettings()
{
const u32 resolution_scale = CalculateResolutionScale();
const u32 box_downscale = GetBoxDownsampleScale(resolution_scale);
if (box_downscale != g_gpu_settings.gpu_downsample_scale || box_downscale == resolution_scale)
if (box_downscale == resolution_scale)
{
m_downsample_mode = GPUDownsampleMode::Disabled;
Host::AddIconOSDMessage(
"BoxDownsampleUnsupported", ICON_FA_PAINT_BRUSH,
fmt::format(
TRANSLATE_FS("GPU_HW",
"Resolution scale {0}x is not divisible by downsample scale {1}x, downsampling disabled."),
resolution_scale, g_gpu_settings.gpu_downsample_scale),
Host::OSD_WARNING_DURATION);
}
else if (box_downscale != g_gpu_settings.gpu_downsample_scale)
{
Host::AddIconOSDMessage(
"BoxDownsampleUnsupported", ICON_FA_PAINT_BRUSH,
@ -719,9 +731,6 @@ void GPU_HW::CheckSettings()
{
Host::RemoveKeyedOSDMessage("BoxDownsampleUnsupported");
}
if (box_downscale == g_gpu_settings.gpu_resolution_scale)
m_downsample_mode = GPUDownsampleMode::Disabled;
}
}
@ -1791,6 +1800,9 @@ bool GPU_HW::CompileDownsamplePipelines(Error* error)
m_downsample_lod_sampler.reset();
m_downsample_composite_sampler.reset();
if (m_downsample_mode == GPUDownsampleMode::Disabled)
return true;
const GPU_HW_ShaderGen shadergen(g_gpu_device->GetRenderAPI(), m_supports_dual_source_blend,
m_supports_framebuffer_fetch);