GPU: Disable display when CRTC configuration is invalid
This commit is contained in:
parent
79111e4e03
commit
8c6cb877eb
|
@ -517,19 +517,21 @@ void GPU::UpdateCRTCDisplayParameters()
|
||||||
|
|
||||||
if (horizontal_display_end <= cs.horizontal_active_end)
|
if (horizontal_display_end <= cs.horizontal_active_end)
|
||||||
{
|
{
|
||||||
cs.display_vram_width =
|
cs.display_vram_width = std::max<u16>(
|
||||||
std::max<u16>((((horizontal_display_end - std::max(horizontal_display_start, cs.horizontal_active_start)) +
|
(((horizontal_display_end -
|
||||||
(cs.dot_clock_divider - 1)) /
|
std::min(horizontal_display_end, std::max(horizontal_display_start, cs.horizontal_active_start))) +
|
||||||
cs.dot_clock_divider),
|
(cs.dot_clock_divider - 1)) /
|
||||||
1u);
|
cs.dot_clock_divider),
|
||||||
|
1u);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cs.display_vram_width =
|
cs.display_vram_width = std::max<u16>(
|
||||||
std::max<u16>((((cs.horizontal_active_end - std::max(horizontal_display_start, cs.horizontal_active_start)) +
|
(((cs.horizontal_active_end -
|
||||||
(cs.dot_clock_divider - 1)) /
|
std::min(cs.horizontal_active_end, std::max(horizontal_display_start, cs.horizontal_active_start))) +
|
||||||
cs.dot_clock_divider),
|
(cs.dot_clock_divider - 1)) /
|
||||||
1u);
|
cs.dot_clock_divider),
|
||||||
|
1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vertical_display_start >= cs.vertical_active_start)
|
if (vertical_display_start >= cs.vertical_active_start)
|
||||||
|
@ -545,13 +547,16 @@ void GPU::UpdateCRTCDisplayParameters()
|
||||||
|
|
||||||
if (vertical_display_end <= cs.vertical_active_end)
|
if (vertical_display_end <= cs.vertical_active_end)
|
||||||
{
|
{
|
||||||
cs.display_vram_height = (vertical_display_end - std::max(vertical_display_start, cs.vertical_active_start))
|
cs.display_vram_height = (vertical_display_end - std::min(vertical_display_end, std::max(vertical_display_start,
|
||||||
|
cs.vertical_active_start)))
|
||||||
<< height_shift;
|
<< height_shift;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cs.display_vram_height = (cs.vertical_active_end - std::max(vertical_display_start, cs.vertical_active_start))
|
cs.display_vram_height =
|
||||||
<< height_shift;
|
(cs.vertical_active_end -
|
||||||
|
std::min(vertical_display_end, std::max(vertical_display_start, cs.vertical_active_start)))
|
||||||
|
<< height_shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -334,6 +334,12 @@ protected:
|
||||||
// Ticks for hblank/vblank.
|
// Ticks for hblank/vblank.
|
||||||
void Execute(TickCount ticks);
|
void Execute(TickCount ticks);
|
||||||
|
|
||||||
|
/// Returns false if the DAC is loading any data from VRAM.
|
||||||
|
ALWAYS_INLINE bool IsDisplayDisabled() const
|
||||||
|
{
|
||||||
|
return m_GPUSTAT.display_disable || m_crtc_state.display_vram_width == 0 || m_crtc_state.display_vram_height == 0;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if scanout should be interlaced.
|
/// Returns true if scanout should be interlaced.
|
||||||
ALWAYS_INLINE bool IsInterlacedDisplayEnabled() const { return (!m_force_progressive_scan) & m_GPUSTAT.In480iMode(); }
|
ALWAYS_INLINE bool IsInterlacedDisplayEnabled() const { return (!m_force_progressive_scan) & m_GPUSTAT.In480iMode(); }
|
||||||
|
|
||||||
|
|
|
@ -552,7 +552,7 @@ void GPU_HW_D3D11::UpdateDisplay()
|
||||||
const u32 scaled_display_height = display_height * m_resolution_scale;
|
const u32 scaled_display_height = display_height * m_resolution_scale;
|
||||||
const bool interlaced = IsInterlacedDisplayEnabled();
|
const bool interlaced = IsInterlacedDisplayEnabled();
|
||||||
|
|
||||||
if (m_GPUSTAT.display_disable)
|
if (IsDisplayDisabled())
|
||||||
{
|
{
|
||||||
m_host_display->ClearDisplayTexture();
|
m_host_display->ClearDisplayTexture();
|
||||||
}
|
}
|
||||||
|
|
|
@ -544,7 +544,7 @@ void GPU_HW_OpenGL::UpdateDisplay()
|
||||||
const u32 scaled_display_height = display_height * m_resolution_scale;
|
const u32 scaled_display_height = display_height * m_resolution_scale;
|
||||||
const bool interlaced = IsInterlacedDisplayEnabled();
|
const bool interlaced = IsInterlacedDisplayEnabled();
|
||||||
|
|
||||||
if (m_GPUSTAT.display_disable)
|
if (IsDisplayDisabled())
|
||||||
{
|
{
|
||||||
m_host_display->ClearDisplayTexture();
|
m_host_display->ClearDisplayTexture();
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,7 +144,7 @@ void GPU_SW::UpdateDisplay()
|
||||||
|
|
||||||
if (!m_system->GetSettings().debugging.show_vram)
|
if (!m_system->GetSettings().debugging.show_vram)
|
||||||
{
|
{
|
||||||
if (m_GPUSTAT.display_disable)
|
if (IsDisplayDisabled())
|
||||||
{
|
{
|
||||||
m_host_display->ClearDisplayTexture();
|
m_host_display->ClearDisplayTexture();
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue