| // |
| // Copyright 2022 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // ShadingRateQcomTest.cpp : Tests of the GL_QCOM_shading_rate extension. |
| |
| #include "test_utils/ANGLETest.h" |
| |
| #include "test_utils/gl_raii.h" |
| |
| namespace angle |
| { |
| |
| class ShadingRateQcomTest : public ANGLETest<> |
| { |
| protected: |
| ShadingRateQcomTest() |
| { |
| setWindowWidth(256); |
| setWindowHeight(256); |
| setConfigRedBits(8); |
| setConfigGreenBits(8); |
| setConfigBlueBits(8); |
| setConfigAlphaBits(8); |
| } |
| }; |
| |
| // Test basic functionality of QCOM_shading_rate |
| TEST_P(ShadingRateQcomTest, Basic) |
| { |
| ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_shading_rate")); |
| |
| glClearColor(0.25f, 0.5f, 0.5f, 0.5f); |
| glShadingRateQCOM(GL_SHADING_RATE_1X1_PIXELS_QCOM); |
| glClear(GL_COLOR_BUFFER_BIT); |
| EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 128, 1.0); |
| |
| ANGLE_GL_PROGRAM(uniformColorProgram, essl1_shaders::vs::Simple(), |
| essl1_shaders::fs::UniformColor()); |
| glUseProgram(uniformColorProgram); |
| GLint colorUniformLocation = |
| glGetUniformLocation(uniformColorProgram, angle::essl1_shaders::ColorUniform()); |
| ASSERT_NE(colorUniformLocation, -1); |
| |
| glShadingRateQCOM(GL_SHADING_RATE_1X2_PIXELS_QCOM); |
| glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f); |
| drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); |
| |
| glShadingRateQCOM(GL_SHADING_RATE_2X1_PIXELS_QCOM); |
| glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f); |
| drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); |
| |
| glShadingRateQCOM(GL_SHADING_RATE_2X2_PIXELS_QCOM); |
| glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f); |
| drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue); |
| |
| glShadingRateQCOM(GL_SHADING_RATE_4X2_PIXELS_QCOM); |
| glUniform4f(colorUniformLocation, 1.0f, 1.0f, 0.0f, 1.0f); |
| drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow); |
| |
| glShadingRateQCOM(GL_SHADING_RATE_4X4_PIXELS_QCOM); |
| glUniform4f(colorUniformLocation, 0.0f, 1.0f, 1.0f, 1.0f); |
| drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan); |
| |
| glEnable(GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM); |
| glUniform4f(colorUniformLocation, 1.0f, 0.0f, 1.0f, 1.0f); |
| drawQuad(uniformColorProgram, essl1_shaders::PositionAttrib(), 0.5f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta); |
| } |
| |
| // Use this to select which configurations (e.g. which renderer, which GLES major version) these |
| // tests should be run against. |
| GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ShadingRateQcomTest); |
| ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(ShadingRateQcomTest); |
| |
| } // namespace angle |