From ca50077341bf1ddbc47d3a005483483d7f6df172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 17 Jan 2021 18:02:13 +0100 Subject: [PATCH] More GPU test improvements * Fix the flat test. Unfortunately doesn't repro the bug :( --- Common/GPU/OpenGL/GLFeatures.cpp | 2 + UI/GPUDriverTestScreen.cpp | 88 +++++++++++++++++++++++++++++--- UI/GPUDriverTestScreen.h | 1 + 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 9ae4185c33..9759915345 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -594,6 +594,8 @@ std::string ApplyGLSLPrelude(const std::string &source, uint32_t stage) { if (!gl_extensions.IsGLES && gl_extensions.IsCoreContext) { // We need to add a corresponding #version. Apple drivers fail without an exact match. version = StringFromFormat("#version %d\n", gl_extensions.GLSLVersion()); + } else if (gl_extensions.IsGLES && gl_extensions.GLES3) { + version = StringFromFormat("#version %d es\n", gl_extensions.GLSLVersion()); } if (stage == GL_FRAGMENT_SHADER) { temp = version + glsl_fragment_prelude + source; diff --git a/UI/GPUDriverTestScreen.cpp b/UI/GPUDriverTestScreen.cpp index 2ea83cb63c..c6f6011954 100644 --- a/UI/GPUDriverTestScreen.cpp +++ b/UI/GPUDriverTestScreen.cpp @@ -98,7 +98,62 @@ static const std::vector fsAdrenoLogicTest = { }, }; +static const std::vector vsAdrenoLogicTest = { + { GLSL_1xx, + "#if __VERSION__ >= 130\n" + "#define attribute in\n" + "#define varying out\n" + "#endif\n" + "attribute vec3 Position;\n" + "attribute vec4 Color0;\n" + "attribute vec2 TexCoord0;\n" + "varying vec4 oColor0;\n" + "varying vec2 oTexCoord0;\n" + "uniform mat4 WorldViewProj;\n" + "void main() {\n" + " gl_Position = WorldViewProj * vec4(Position, 1.0);\n" + " oColor0 = Color0;\n" + " oTexCoord0 = TexCoord0;\n" + "}\n" + }, + { ShaderLanguage::GLSL_VULKAN, + "#version 450\n" + "#extension GL_ARB_separate_shader_objects : enable\n" + "#extension GL_ARB_shading_language_420pack : enable\n" + "layout (std140, set = 0, binding = 0) uniform bufferVals {\n" + " mat4 WorldViewProj;\n" + "} myBufferVals;\n" + "layout (location = 0) in vec4 pos;\n" + "layout (location = 1) in vec4 inColor;\n" + "layout (location = 2) in vec2 inTexCoord;\n" + "layout (location = 0) out lowp vec4 outColor;\n" + "layout (location = 1) out highp vec2 outTexCoord;\n" + "out gl_PerVertex { vec4 gl_Position; };\n" + "void main() {\n" + " outColor = inColor;\n" + " outTexCoord = inTexCoord;\n" + " gl_Position = myBufferVals.WorldViewProj * pos;\n" + "}\n" + } +}; + static const std::vector fsFlat = { + {ShaderLanguage::GLSL_3xx, + "#ifdef GL_ES\n" + "precision lowp float;\n" + "precision highp int;\n" + "#endif\n" + "uniform sampler2D Sampler0;\n" + "flat in lowp vec4 oColor0;\n" + "in mediump vec3 oTexCoord0;\n" + "out vec4 fragColor0;\n" + "void main() {\n" + " vec4 t = texture(Sampler0, oTexCoord0.xy);\n" + " vec4 p = oColor0;\n" + " vec4 v = p * t;\n" + " fragColor0 = v;\n" + "}\n" + }, {ShaderLanguage::GLSL_1xx, "#ifdef GL_ES\n" "precision lowp float;\n" @@ -109,13 +164,13 @@ static const std::vector fsFlat = { "#define gl_FragColor fragColor0\n" "out vec4 fragColor0;\n" "#endif\n" - "flat varying vec4 oColor0;\n" + "varying vec4 oColor0;\n" "varying vec2 oTexCoord0;\n" "uniform sampler2D Sampler0;\n" "void main() { gl_FragColor = texture2D(Sampler0, oTexCoord0) * oColor0; }\n" }, {ShaderLanguage::GLSL_VULKAN, - "#version 140\n" + "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" "#extension GL_ARB_shading_language_420pack : enable\n" "layout(location = 0) flat in lowp vec4 oColor0;\n" @@ -126,9 +181,23 @@ static const std::vector fsFlat = { } }; -// shared with the adreno test static const std::vector vsFlat = { - { GLSL_1xx, + { GLSL_3xx, + "#version 300 es\n" + "in vec3 Position;\n" + "in vec2 TexCoord0;\n" + "in lowp vec4 Color0;\n" + "uniform mat4 WorldViewProj;\n" + "flat out lowp vec4 oColor0;\n" + "out mediump vec3 oTexCoord0;\n" + "void main() {\n" + " oTexCoord0 = vec3(TexCoord0, 1.0);\n" + " oColor0 = Color0;\n" + " vec4 outPos = WorldViewProj * vec4(Position, 1.0);\n" + " gl_Position = outPos;\n" + "}\n" + }, + { GLSL_1xx, // Doesn't actually repro the problem since flat support isn't guaranteed "#if __VERSION__ >= 130\n" "#define attribute in\n" "#define varying out\n" @@ -136,7 +205,7 @@ static const std::vector vsFlat = { "attribute vec3 Position;\n" "attribute vec4 Color0;\n" "attribute vec2 TexCoord0;\n" - "flat varying vec4 oColor0;\n" + "varying vec4 oColor0;\n" "varying vec2 oTexCoord0;\n" "uniform mat4 WorldViewProj;\n" "void main() {\n" @@ -206,6 +275,8 @@ GPUDriverTestScreen::~GPUDriverTestScreen() { if (adrenoLogicDiscardFragShader_) adrenoLogicDiscardFragShader_->Release(); + if (adrenoLogicDiscardVertShader_) + adrenoLogicDiscardVertShader_->Release(); if (flatFragShader_) flatFragShader_->Release(); if (flatVertShader_) @@ -472,6 +543,7 @@ void GPUDriverTestScreen::ShaderTest() { if (!adrenoLogicDiscardPipeline_) { adrenoLogicDiscardFragShader_ = CreateShader(draw, ShaderStage::Fragment, fsAdrenoLogicTest); + adrenoLogicDiscardVertShader_ = CreateShader(draw, ShaderStage::Vertex, vsAdrenoLogicTest); flatFragShader_ = CreateShader(draw, ShaderStage::Fragment, fsFlat); flatVertShader_ = CreateShader(draw, ShaderStage::Vertex, vsFlat); @@ -490,7 +562,7 @@ void GPUDriverTestScreen::ShaderTest() { PipelineDesc adrenoLogicDiscardDesc{ Primitive::TRIANGLE_LIST, - { flatVertShader_, adrenoLogicDiscardFragShader_ }, + { adrenoLogicDiscardVertShader_, adrenoLogicDiscardFragShader_ }, inputLayout, depthStencilOff, blendOff, rasterNoCull, &vsColBufDesc, }; adrenoLogicDiscardPipeline_ = draw->CreateGraphicsPipeline(adrenoLogicDiscardDesc); @@ -544,7 +616,7 @@ void GPUDriverTestScreen::ShaderTest() { dc.Begin(); dc.DrawText("Flat shaded tex", x, y, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); - dc.DrawText("(TEST OK if no gradient!)", x + 400, y, 0xFFFFFFFF, ALIGN_LEFT); + dc.DrawText("(TEST OK if logo but no gradient!)", x + 400, y, 0xFFFFFFFF, ALIGN_LEFT); dc.Flush(); bounds = { x + 200, y, 100, 100 }; @@ -553,7 +625,7 @@ void GPUDriverTestScreen::ShaderTest() { dc.BeginPipeline(flatShadingPipeline_, samplerNearest_); // There is a "provoking vertex" difference here between GL and Vulkan when using flat shading. One gets one color, one gets the other. // Wherever possible we should reconfigure the GL provoking vertex to match Vulkan, probably. - dc.DrawImageVGradient(ImageID("I_ICON"), 0xFFFFFFFF, 0x808080FF, bounds); + dc.DrawImageVGradient(ImageID("I_ICON"), 0xFFFFFFFF, 0xFF808080, bounds); dc.Flush(); } diff --git a/UI/GPUDriverTestScreen.h b/UI/GPUDriverTestScreen.h index 1b8776f051..2eb077c826 100644 --- a/UI/GPUDriverTestScreen.h +++ b/UI/GPUDriverTestScreen.h @@ -51,6 +51,7 @@ private: Draw::Pipeline *adrenoLogicDiscardPipeline_ = nullptr; Draw::ShaderModule *adrenoLogicDiscardFragShader_ = nullptr; + Draw::ShaderModule *adrenoLogicDiscardVertShader_ = nullptr; Draw::Pipeline *flatShadingPipeline_ = nullptr; Draw::ShaderModule *flatFragShader_ = nullptr; Draw::ShaderModule *flatVertShader_ = nullptr;