1 //
2 // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // ShadingRateQcomTest.cpp : Tests of the GL_QCOM_shading_rate extension.
8
9 #include "test_utils/ANGLETest.h"
10
11 #include "test_utils/gl_raii.h"
12
13 namespace angle
14 {
15
16 class ShadingRateQcomTest : public ANGLETest<>
17 {
18 protected:
ShadingRateQcomTest()19 ShadingRateQcomTest()
20 {
21 setWindowWidth(256);
22 setWindowHeight(256);
23 setConfigRedBits(8);
24 setConfigGreenBits(8);
25 setConfigBlueBits(8);
26 setConfigAlphaBits(8);
27 }
28 };
29
30 // Test basic functionality of QCOM_shading_rate
TEST_P(ShadingRateQcomTest,Basic)31 TEST_P(ShadingRateQcomTest, Basic)
32 {
33 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_shading_rate"));
34
35 glClearColor(0.25f, 0.5f, 0.5f, 0.5f);
36 glShadingRateQCOM(GL_SHADING_RATE_1X1_PIXELS_QCOM);
37 glClear(GL_COLOR_BUFFER_BIT);
38 EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 128, 1.0);
39
40 ANGLE_GL_PROGRAM(uniformColorProgram, essl1_shaders::vs::Simple(),
41 essl1_shaders::fs::UniformColor());
42 glUseProgram(uniformColorProgram);
43 GLint colorUniformLocation =
44 glGetUniformLocation(uniformColorProgram, angle::essl1_shaders::ColorUniform());
45 ASSERT_NE(colorUniformLocation, -1);
46
47 glShadingRateQCOM(GL_SHADING_RATE_1X2_PIXELS_QCOM);
48 glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
49 drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f);
50 ASSERT_GL_NO_ERROR();
51 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
52
53 glShadingRateQCOM(GL_SHADING_RATE_2X1_PIXELS_QCOM);
54 glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
55 drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f);
56 ASSERT_GL_NO_ERROR();
57 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
58
59 glShadingRateQCOM(GL_SHADING_RATE_2X2_PIXELS_QCOM);
60 glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
61 drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f);
62 ASSERT_GL_NO_ERROR();
63 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
64
65 glShadingRateQCOM(GL_SHADING_RATE_4X2_PIXELS_QCOM);
66 glUniform4f(colorUniformLocation, 1.0f, 1.0f, 0.0f, 1.0f);
67 drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f);
68 ASSERT_GL_NO_ERROR();
69 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
70
71 glShadingRateQCOM(GL_SHADING_RATE_4X4_PIXELS_QCOM);
72 glUniform4f(colorUniformLocation, 0.0f, 1.0f, 1.0f, 1.0f);
73 drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f);
74 ASSERT_GL_NO_ERROR();
75 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
76
77 glEnable(GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM);
78 glUniform4f(colorUniformLocation, 1.0f, 0.0f, 1.0f, 1.0f);
79 drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f);
80 ASSERT_GL_NO_ERROR();
81 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
82 }
83
84 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
85 // tests should be run against.
86 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ShadingRateQcomTest);
87 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(ShadingRateQcomTest);
88
89 } // namespace angle
90