blob: 47ff2f3e052e3803353d0faae5a1be1bc16ca6ce [file] [log] [blame]
//
// 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