// // Copyright 2016 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. // // SRGBFramebufferTest.cpp: Tests of sRGB framebuffer functionality. #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" namespace angle { class SRGBFramebufferTest : public ANGLETest { protected: SRGBFramebufferTest() { setWindowWidth(128); setWindowHeight(128); setConfigRedBits(8); setConfigGreenBits(8); setConfigBlueBits(8); setConfigAlphaBits(8); } void testSetUp() override { mProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); ASSERT_NE(0u, mProgram); mColorLocation = glGetUniformLocation(mProgram, essl1_shaders::ColorUniform()); ASSERT_NE(-1, mColorLocation); } void testTearDown() override { glDeleteProgram(mProgram); } GLuint mProgram = 0; GLint mColorLocation = -1; }; // Test basic validation of GL_EXT_sRGB_write_control TEST_P(SRGBFramebufferTest, Validation) { GLenum expectedError = IsGLExtensionEnabled("GL_EXT_sRGB_write_control") ? GL_NO_ERROR : GL_INVALID_ENUM; GLboolean value = GL_FALSE; glEnable(GL_FRAMEBUFFER_SRGB_EXT); EXPECT_GL_ERROR(expectedError); glGetBooleanv(GL_FRAMEBUFFER_SRGB_EXT, &value); EXPECT_GL_ERROR(expectedError); if (expectedError == GL_NO_ERROR) { EXPECT_GL_TRUE(value); } glDisable(GL_FRAMEBUFFER_SRGB_EXT); EXPECT_GL_ERROR(expectedError); glGetBooleanv(GL_FRAMEBUFFER_SRGB_EXT, &value); EXPECT_GL_ERROR(expectedError); if (expectedError == GL_NO_ERROR) { EXPECT_GL_FALSE(value); } } // Test basic functionality of GL_EXT_sRGB_write_control TEST_P(SRGBFramebufferTest, BasicUsage) { if (!IsGLExtensionEnabled("GL_EXT_sRGB_write_control") || (!IsGLExtensionEnabled("GL_EXT_sRGB") && getClientMajorVersion() < 3)) { std::cout << "Test skipped because GL_EXT_sRGB_write_control and GL_EXT_sRGB are not available." << std::endl; return; } GLColor linearColor(64, 127, 191, 255); GLColor srgbColor(13, 54, 133, 255); GLTexture texture; glBindTexture(GL_TEXTURE_2D, texture.get()); glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, nullptr); GLFramebuffer framebuffer; glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.get(), 0); glUseProgram(mProgram); glUniform4fv(mColorLocation, 1, srgbColor.toNormalizedVector().data()); glEnable(GL_FRAMEBUFFER_SRGB_EXT); drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.5f); EXPECT_PIXEL_COLOR_NEAR(0, 0, linearColor, 1.0); glDisable(GL_FRAMEBUFFER_SRGB_EXT); drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.5f); EXPECT_PIXEL_COLOR_NEAR(0, 0, srgbColor, 1.0); } // Use this to select which configurations (e.g. which renderer, which GLES major version) these // tests should be run against. ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SRGBFramebufferTest); } // namespace angle