diff options
Diffstat (limited to 'gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp')
-rw-r--r-- | gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp b/gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp new file mode 100644 index 000000000..47ff2f3e0 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp @@ -0,0 +1,141 @@ +// +// 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 SetUp() override + { + ANGLETest::SetUp(); + + const std::string vs = + "precision highp float;\n" + "attribute vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + "}\n"; + + const std::string fs = + "precision highp float;\n" + "uniform vec4 color;\n" + "void main()\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + mColorLocation = glGetUniformLocation(mProgram, "color"); + ASSERT_NE(-1, mColorLocation); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram = 0; + GLint mColorLocation = -1; +}; + +// Test basic validation of GL_EXT_sRGB_write_control +TEST_P(SRGBFramebufferTest, Validation) +{ + GLenum expectedError = + extensionEnabled("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_EQ(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_EQ(GL_FALSE, value); + } +} + +// Test basic functionality of GL_EXT_sRGB_write_control +TEST_P(SRGBFramebufferTest, BasicUsage) +{ + if (!extensionEnabled("GL_EXT_sRGB_write_control") || + (!extensionEnabled("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, "position", 0.5f); + EXPECT_PIXEL_COLOR_NEAR(0, 0, linearColor, 1.0); + + glDisable(GL_FRAMEBUFFER_SRGB_EXT); + drawQuad(mProgram, "position", 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(SRGBFramebufferTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace angle |