diff options
Diffstat (limited to 'src/tests')
-rw-r--r-- | src/tests/angle_end2end_tests_expectations.txt | 10 | ||||
-rw-r--r-- | src/tests/compiler_tests/RecordConstantPrecision_test.cpp | 6 | ||||
-rw-r--r-- | src/tests/gl_tests/CopyTexImageTest.cpp | 50 | ||||
-rw-r--r-- | src/tests/gl_tests/GLSLTest.cpp | 132 | ||||
-rw-r--r-- | src/tests/restricted_traces/OWNERS | 1 |
5 files changed, 195 insertions, 4 deletions
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt index c5f0fa3345..e4a30369f8 100644 --- a/src/tests/angle_end2end_tests_expectations.txt +++ b/src/tests/angle_end2end_tests_expectations.txt @@ -29,6 +29,8 @@ 6989 GLES : BlitFramebufferTestES31.OOBResolve/* = SKIP 7881 VULKAN : MultithreadingTestES3.UnsynchronizedTextureReads/* = SKIP 7881 VULKAN : MultithreadingTestES3.UnsynchronizedTextureReads2/* = SKIP +// Incorrectly handled pretty much in all backends +8446 : CopyTexImageTestES3.RedefineSameLevel/* = SKIP 6743 OPENGL : SimpleStateChangeTestES3.RespecifyBufferAfterBeginTransformFeedback/* = SKIP 6743 GLES : SimpleStateChangeTestES3.RespecifyBufferAfterBeginTransformFeedback/* = SKIP @@ -109,6 +111,8 @@ b/273271471 WIN INTEL VULKAN : ShaderAlgorithmTest.rgb_to_hsl_vertex_shader/* = 7872 WIN INTEL OPENGL : VertexAttributeTest.AliasingMatrixAttribLocations/ES2_OpenGL = SKIP 7872 WIN INTEL OPENGL : VertexAttributeTest.ShortUnnormalized/ES2_OpenGL = SKIP 7872 WIN INTEL OPENGL : ViewportTest.DoubleWindowCentered/ES2_OpenGL = SKIP +8441 WIN INTEL OPENGL : GLSLTest_ES3.LargeInterfaceBlockArray/* = SKIP +8441 WIN INTEL OPENGL : GLSLTest_ES3.LargeInterfaceBlockNestedArray/* = SKIP // Linux 6065 LINUX INTEL VULKAN : SimpleStateChangeTestES31.DrawThenUpdateUBOThenDrawThenDrawIndexed/* = SKIP @@ -144,6 +148,10 @@ b/273271471 WIN INTEL VULKAN : ShaderAlgorithmTest.rgb_to_hsl_vertex_shader/* = 6977 LINUX NVIDIA OpenGL : MipmapTestES31.GenerateLowerMipsWithDraw/* = SKIP 7301 LINUX NVIDIA OpenGL : CopyTexImageTest.RGBAToRGB/ES2_OpenGL_EmulateCopyTexImage2DFromRenderbuffers/* = SKIP 7371 LINUX NVIDIA OpenGL : FramebufferTest_ES3.SurfaceDimensionsChangeAndFragCoord/* = SKIP +8441 NVIDIA OPENGL : GLSLTest_ES3.LargeInterfaceBlockArray/* = SKIP +8441 NVIDIA OPENGL : GLSLTest_ES3.LargeInterfaceBlockNestedArray/* = SKIP +8441 NVIDIA GLES : GLSLTest_ES3.LargeInterfaceBlockArray/* = SKIP +8441 NVIDIA GLES : GLSLTest_ES3.LargeInterfaceBlockNestedArray/* = SKIP // Nvidia Vulkan 7236 NVIDIA VULKAN : GLSLTest_ES31.TessellationControlShaderMatrixCopyBug/* = SKIP @@ -1042,6 +1050,8 @@ b/308668391 PIXEL4ORXL VULKAN : ImageTest.SourceYUVAHBTargetExternalRGBSampleNoD 7389 MAC OPENGL : Texture2DTest.ManySupersedingTextureUpdates/* = SKIP 8437 MAC OPENGL : GLSLTest_ES3.LotsOfFieldsInStruct/* = SKIP +8437 MAC OPENGL : GLSLTest_ES3.LargeInterfaceBlockArray/* = SKIP +8437 MAC OPENGL : GLSLTest_ES3.LargeInterfaceBlockNestedArray/* = SKIP // GL, GLES run into issues with cleanup 7495 WIN OpenGL : EGLMultiContextTest.ReuseUnterminatedDisplay/* = SKIP diff --git a/src/tests/compiler_tests/RecordConstantPrecision_test.cpp b/src/tests/compiler_tests/RecordConstantPrecision_test.cpp index 07923f9914..9446576ac7 100644 --- a/src/tests/compiler_tests/RecordConstantPrecision_test.cpp +++ b/src/tests/compiler_tests/RecordConstantPrecision_test.cpp @@ -141,11 +141,11 @@ TEST_F(RecordConstantPrecisionTest, HigherPrecisionConstantInIndex) uniform mediump float u; void main() { - const highp int a = 33000; - mediump float b[34000]; + const highp int a = 330; + mediump float b[340]; gl_FragColor = vec4(b[a]); })"; compile(shaderString); ASSERT_FALSE(foundInCode("const highp int s")); - ASSERT_TRUE(foundInCode("b[33000]")); + ASSERT_TRUE(foundInCode("b[330]")); } diff --git a/src/tests/gl_tests/CopyTexImageTest.cpp b/src/tests/gl_tests/CopyTexImageTest.cpp index e0a8fb85b2..bcdae07dc8 100644 --- a/src/tests/gl_tests/CopyTexImageTest.cpp +++ b/src/tests/gl_tests/CopyTexImageTest.cpp @@ -1263,6 +1263,56 @@ TEST_P(CopyTexImageTestES3, 3DSubImageDrawMismatchedTextureTypes) glBindTexture(GL_TEXTURE_3D, 0); } +// Make sure a single-level texture can be redefined through glCopyTexImage2D from a framebuffer +// bound to the same texture. Regression test for a bug in the Vulkan backend where the texture was +// released before the copy. +TEST_P(CopyTexImageTestES3, RedefineSameLevel) +{ + constexpr GLsizei kSize = 32; + constexpr GLsizei kHalfSize = kSize / 2; + + // Create a single-level texture with four colors in different regions. + std::vector<GLColor> initData(kSize * kSize); + for (GLsizei y = 0; y < kSize; ++y) + { + const bool isTop = y < kHalfSize; + for (GLsizei x = 0; x < kSize; ++x) + { + const bool isLeft = x < kHalfSize; + + GLColor color = isLeft && isTop ? GLColor::red + : isLeft && !isTop ? GLColor::green + : !isLeft && isTop ? GLColor::blue + : GLColor::yellow; + color.A = 123; + initData[y * kSize + x] = color; + } + } + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, + initData.data()); + + // Bind the framebuffer to the same texture + GLFramebuffer framebuffer; + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); + + // Redefine the texture + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kHalfSize / 2, kHalfSize / 2, kHalfSize, kHalfSize, + 0); + + // Verify copy is done correctly. + ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); + + EXPECT_PIXEL_RECT_EQ(0, 0, kHalfSize / 2, kHalfSize / 2, GLColor::red); + EXPECT_PIXEL_RECT_EQ(kHalfSize / 2, 0, kHalfSize / 2, kHalfSize / 2, GLColor::blue); + EXPECT_PIXEL_RECT_EQ(0, kHalfSize / 2, kHalfSize / 2, kHalfSize / 2, GLColor::green); + EXPECT_PIXEL_RECT_EQ(kHalfSize / 2, kHalfSize / 2, kHalfSize / 2, kHalfSize / 2, + GLColor::yellow); +} + ANGLE_INSTANTIATE_TEST(CopyTexImageTest, ANGLE_ALL_TEST_PLATFORMS_ES2, ES2_D3D11_PRESENT_PATH_FAST(), diff --git a/src/tests/gl_tests/GLSLTest.cpp b/src/tests/gl_tests/GLSLTest.cpp index 4ff7f66e79..7b6e70d168 100644 --- a/src/tests/gl_tests/GLSLTest.cpp +++ b/src/tests/gl_tests/GLSLTest.cpp @@ -18318,6 +18318,138 @@ void main() { EXPECT_EQ(0u, shader); } +// Test that passing large arrays to functions are compiled correctly. Regression test for the +// SPIR-V generator that made a copy of the array to pass to the function, by decomposing and +// reconstructing it (in the absence of OpCopyLogical), but the reconstruction instruction has a +// length higher than can fit in SPIR-V. +TEST_P(GLSLTest_ES3, LargeInterfaceBlockArrayPassedToFunction) +{ + constexpr char kFS[] = R"(#version 300 es +precision highp float; +uniform Large { float a[65536]; }; +float f(float b[65536]) +{ + b[0] = 1.0; + return b[0] + b[1]; +} +out vec4 color; +void main() { + color = vec4(f(a), 0.0, 0.0, 1.0); +})"; + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, kFS); + EXPECT_EQ(0u, shader); +} + +// Make sure the shader in LargeInterfaceBlockArrayPassedToFunction works if the large local is +// avoided. +TEST_P(GLSLTest_ES3, LargeInterfaceBlockArray) +{ + int maxUniformBlockSize = 0; + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize); + ANGLE_SKIP_TEST_IF(maxUniformBlockSize < 16384 * 4); + + constexpr char kFS[] = R"(#version 300 es +precision highp float; +uniform Large { float a[16384]; }; +out vec4 color; +void main() { + color = vec4(a[0], 0.0, 0.0, 1.0); +})"; + + ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS); +} + +// Similar to LargeInterfaceBlockArrayPassedToFunction, but the array is nested in a struct. +TEST_P(GLSLTest_ES3, LargeInterfaceBlockNestedArrayPassedToFunction) +{ + constexpr char kFS[] = R"(#version 300 es +precision highp float; +struct S { float a[65536]; }; +uniform Large { S s; }; +float f(float b[65536]) +{ + b[0] = 1.0; + return b[0] + b[1]; +} +out vec4 color; +void main() { + color = vec4(f(s.a), 0.0, 0.0, 1.0); +})"; + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, kFS); + EXPECT_EQ(0u, shader); +} + +// Make sure the shader in LargeInterfaceBlockNestedArrayPassedToFunction works if the large local +// is avoided. +TEST_P(GLSLTest_ES3, LargeInterfaceBlockNestedArray) +{ + int maxUniformBlockSize = 0; + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize); + ANGLE_SKIP_TEST_IF(maxUniformBlockSize < 16384 * 4); + + constexpr char kFS[] = R"(#version 300 es +precision highp float; +struct S { float a[16384]; }; +uniform Large { S s; }; +out vec4 color; +void main() { + color = vec4(s.a[0], 0.0, 0.0, 1.0); +})"; + + ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS); +} + +// Similar to LargeInterfaceBlockArrayPassedToFunction, but the large array is copied to a local +// variable instead. +TEST_P(GLSLTest_ES3, LargeInterfaceBlockArrayCopiedToLocal) +{ + constexpr char kFS[] = R"(#version 300 es +precision highp float; +uniform Large { float a[65536]; }; +out vec4 color; +void main() { + float b[65536] = a; + color = vec4(b[0], 0.0, 0.0, 1.0); +})"; + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, kFS); + EXPECT_EQ(0u, shader); +} + +// Similar to LargeInterfaceBlockArrayCopiedToLocal, but the array is nested in a struct +TEST_P(GLSLTest_ES3, LargeInterfaceBlockNestedArrayCopiedToLocal) +{ + constexpr char kFS[] = R"(#version 300 es +precision highp float; +struct S { float a[65536]; }; +uniform Large { S s; }; +out vec4 color; +void main() { + S s2 = s; + color = vec4(s2.a[0], 0.0, 0.0, 1.0); +})"; + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, kFS); + EXPECT_EQ(0u, shader); +} + +// Test that too large varyings are rejected. +TEST_P(GLSLTest_ES3, LargeArrayVarying) +{ + constexpr char kFS[] = R"(#version 300 es +precision highp float; +in float a[65536]; +out vec4 color; +void main() { + color = vec4(a[0], 0.0, 0.0, 1.0); +})"; + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, kFS); + EXPECT_EQ(0u, shader); +} + } // anonymous namespace ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND( diff --git a/src/tests/restricted_traces/OWNERS b/src/tests/restricted_traces/OWNERS index ea7391a638..1ab1839530 100644 --- a/src/tests/restricted_traces/OWNERS +++ b/src/tests/restricted_traces/OWNERS @@ -1,2 +1 @@ cnorthrop@google.com -jmadill@chromium.org |