Workaround for strange driver hang on Raspberry Pi 3.

Strangely, this does not fix the text rendering in the UI, but might
still be enough for the libretro use case in #15469.

See #15469
This commit is contained in:
Henrik Rydgård 2022-06-19 11:53:16 +02:00
parent d07c256a1d
commit 1d17b01c16
4 changed files with 52 additions and 11 deletions

View file

@ -582,6 +582,15 @@ OpenGLContext::OpenGLContext() {
}
}
bugs_.Infest(Bugs::RASPBERRY_SHADER_COMP_HANG);
#if PPSSPP_ARCH(ARMV7)
if (caps_.vendor == GPUVendor::VENDOR_BROADCOM) {
bugs_.Infest(Bugs::RASPBERRY_SHADER_COMP_HANG);
}
#endif
// Try to detect old Tegra chips by checking for sub 3.0 GL versions. Like Vivante and Broadcom,
// those can't handle NaN values in conditionals.
if (caps_.vendor == GPUVendor::VENDOR_VIVANTE ||

View file

@ -283,6 +283,27 @@ const UniformBufferDesc vsColBufDesc { sizeof(VsColUB), {
{ "TintSaturation", 4, -1, UniformType::FLOAT2, 64 },
} };
static const std::vector<ShaderSource> vsTexColNoTint = { {
GLSL_1xx,
R"(
#if __VERSION__ >= 130
#define attribute in
#define varying out
#endif
attribute vec3 Position;
attribute vec4 Color0;
attribute vec2 TexCoord0;
varying vec4 oColor0;
varying vec2 oTexCoord0;
uniform mat4 WorldViewProj;
uniform vec2 TintSaturation;
void main() {
gl_Position = WorldViewProj * vec4(Position, 1.0);
oColor0 = Color0;
oTexCoord0 = TexCoord0;
})"
} };
static const std::vector<ShaderSource> vsTexCol = {
{ GLSL_1xx,
R"(
@ -437,7 +458,12 @@ ShaderModule *CreateShader(DrawContext *draw, ShaderStage stage, const std::vect
}
bool DrawContext::CreatePresets() {
vsPresets_[VS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::Vertex, vsTexCol);
if (bugs_.Has(Bugs::RASPBERRY_SHADER_COMP_HANG)) {
vsPresets_[VS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::Vertex, vsTexColNoTint);
} else {
vsPresets_[VS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::Vertex, vsTexCol);
}
vsPresets_[VS_COLOR_2D] = CreateShader(this, ShaderStage::Vertex, vsCol);
fsPresets_[FS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::Fragment, fsTexCol);
@ -603,6 +629,8 @@ const char *Bugs::GetBugName(uint32_t bug) {
case BROKEN_FLAT_IN_SHADER: return "BROKEN_FLAT_IN_SHADER";
case EQUAL_WZ_CORRUPTS_DEPTH: return "EQUAL_WZ_CORRUPTS_DEPTH";
case MALI_STENCIL_DISCARD_BUG: return "MALI_STENCIL_DISCARD_BUG";
case RASPBERRY_SHADER_COMP_HANG: return "RASPBERRY_SHADER_COMP_HANG";
default: return "(N/A)";
}
}

View file

@ -323,6 +323,7 @@ public:
BROKEN_FLAT_IN_SHADER = 6,
EQUAL_WZ_CORRUPTS_DEPTH = 7,
MALI_STENCIL_DISCARD_BUG = 8,
RASPBERRY_SHADER_COMP_HANG = 9,
MAX_BUG,
};
@ -347,8 +348,7 @@ private:
template <typename T>
struct AutoRef {
AutoRef() {
}
AutoRef() {}
explicit AutoRef(T *p) {
ptr = p;
if (ptr)

View file

@ -894,14 +894,18 @@ void GameSettingsScreen::CreateViews() {
return UI::EVENT_CONTINUE;
});
PopupSliderChoiceFloat *tint = new PopupSliderChoiceFloat(&g_Config.fUITint, 0.0, 1.0, sy->T("Color Tint"), 0.01f, screenManager());
tint->SetHasDropShadow(false);
tint->SetLiveUpdate(true);
systemSettings->Add(tint);
PopupSliderChoiceFloat *saturation = new PopupSliderChoiceFloat(&g_Config.fUISaturation, 0.0, 2.0, sy->T("Color Saturation"), 0.01f, screenManager());
saturation->SetHasDropShadow(false);
saturation->SetLiveUpdate(true);
systemSettings->Add(saturation);
if (!draw->GetBugs().Has(Draw::Bugs::RASPBERRY_SHADER_COMP_HANG)) {
// We use shaders without tint capability on hardware with this driver bug.
PopupSliderChoiceFloat *tint = new PopupSliderChoiceFloat(&g_Config.fUITint, 0.0, 1.0, sy->T("Color Tint"), 0.01f, screenManager());
tint->SetHasDropShadow(false);
tint->SetLiveUpdate(true);
systemSettings->Add(tint);
PopupSliderChoiceFloat *saturation = new PopupSliderChoiceFloat(&g_Config.fUISaturation, 0.0, 2.0, sy->T("Color Saturation"), 0.01f, screenManager());
saturation->SetHasDropShadow(false);
saturation->SetLiveUpdate(true);
systemSettings->Add(saturation);
}
static const char *backgroundAnimations[] = { "No animation", "Floating symbols", "Recent games", "Waves", "Moving background" };
systemSettings->Add(new PopupMultiChoice(&g_Config.iBackgroundAnimation, sy->T("UI background animation"), backgroundAnimations, 0, ARRAY_SIZE(backgroundAnimations), sy->GetName(), screenManager()));