mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-01 05:48:11 +03:00
Add ES2 support for copying GL_SRGB8_ALPHA8 to GL_RGBA8
Bug: angleproject:7907 Change-Id: I02ae9785ea1f942e85983c18155cfd75ec39b5c2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4887271 Commit-Queue: ccameron chromium <ccameron@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
This commit is contained in:
committed by
Angle LUCI CQ
parent
7b1b8a0161
commit
a1e3abc06b
@@ -84,6 +84,7 @@ bool IsValidCopyTextureSourceInternalFormatEnum(GLenum internalFormat)
|
||||
case GL_RGBA8:
|
||||
case GL_BGRA_EXT:
|
||||
case GL_BGRA8_EXT:
|
||||
case GL_SRGB_ALPHA_EXT:
|
||||
return true;
|
||||
|
||||
default:
|
||||
|
||||
@@ -1385,6 +1385,7 @@ b/266235549 D3D11 : ComputeShaderTest.SSBOAliasOverWrite/* = SKIP
|
||||
b/292285899 PIXEL4ORXL GLES : EGLSurfaceTest.DestroyAndRecreateWhileCurrent/* = SKIP
|
||||
|
||||
// Work in progress.
|
||||
7907 D3D11 : CopyTextureTest.NoConvertSRGBToRGB/ES2_D3D11 = SKIP
|
||||
7907 D3D11 : CopyTextureTestES3.NoConvertSRGBToRGB/ES3_D3D11 = SKIP
|
||||
|
||||
// Please do not add expectations below this line,
|
||||
|
||||
@@ -107,6 +107,73 @@ class CopyTextureTest : public ANGLETest<>
|
||||
EXPECT_EQ(expectedUniqueValues[3], uniqueValues[3].size());
|
||||
}
|
||||
|
||||
void testSrgbToRgb(GLenum internalformat, GLenum format)
|
||||
{
|
||||
const size_t kTestCount = 4;
|
||||
const GLColor kSourceColor[kTestCount] = {
|
||||
GLColor(89, 67, 45, 123),
|
||||
GLColor(87, 69, 45, 123),
|
||||
GLColor(180, 143, 93, 123),
|
||||
GLColor(89, 67, 45, 123),
|
||||
};
|
||||
const GLColor kExpectedColor[kTestCount] = {
|
||||
GLColor(89, 67, 45, 123),
|
||||
GLColor(180, 143, 93, 123),
|
||||
GLColor(87, 69, 45, 123),
|
||||
GLColor(89, 67, 45, 123),
|
||||
};
|
||||
bool kPremultiply[kTestCount] = {false, false, true, true};
|
||||
bool kUnmultiply[kTestCount] = {false, true, false, true};
|
||||
|
||||
for (size_t test = 0; test < kTestCount; ++test)
|
||||
{
|
||||
// Create image as sRGB.
|
||||
GLTexture sourceTexture;
|
||||
glBindTexture(GL_TEXTURE_2D, sourceTexture);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, GL_UNSIGNED_BYTE,
|
||||
&kSourceColor[test]);
|
||||
ASSERT_GL_NO_ERROR();
|
||||
|
||||
GLTexture destTexture;
|
||||
glBindTexture(GL_TEXTURE_2D, destTexture);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
ASSERT_GL_NO_ERROR();
|
||||
|
||||
// Note: flipY is used to avoid direct transfer between textures and force a draw-based
|
||||
// path.
|
||||
glCopySubTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, // level,
|
||||
0, 0, // src x,y
|
||||
0, 0, // dst x,y
|
||||
1, 1, // width, height
|
||||
true, // flip-y
|
||||
kPremultiply[test], // premul
|
||||
kUnmultiply[test]); // unmul
|
||||
ASSERT_GL_NO_ERROR();
|
||||
|
||||
// Verify the copy.
|
||||
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(),
|
||||
essl1_shaders::fs::Texture2D());
|
||||
glUseProgram(program);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, destTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
GLint textureLocation =
|
||||
glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
|
||||
ASSERT_NE(-1, textureLocation);
|
||||
glUniform1i(textureLocation, 0);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
|
||||
drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
|
||||
ASSERT_GL_NO_ERROR();
|
||||
|
||||
EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpectedColor[test], 2);
|
||||
}
|
||||
}
|
||||
|
||||
GLuint mTextures[2] = {
|
||||
0,
|
||||
0,
|
||||
@@ -2744,69 +2811,19 @@ TEST_P(CopyTextureTestES3, InvalidateCopyThenBlend)
|
||||
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::yellow);
|
||||
}
|
||||
|
||||
// Test that sRGB-to-RGB copy does not change pixel values.
|
||||
// http://anglebug.com/7907
|
||||
TEST_P(CopyTextureTest, NoConvertSRGBToRGB)
|
||||
{
|
||||
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB"));
|
||||
testSrgbToRgb(GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT);
|
||||
}
|
||||
|
||||
// Test that sRGB-to-RGB copy does not change pixel values.
|
||||
// http://anglebug.com/7907
|
||||
TEST_P(CopyTextureTestES3, NoConvertSRGBToRGB)
|
||||
{
|
||||
const size_t kTestCount = 4;
|
||||
const GLColor kSourceColor[kTestCount] = {
|
||||
GLColor(89, 67, 45, 123),
|
||||
GLColor(87, 69, 45, 123),
|
||||
GLColor(180, 143, 93, 123),
|
||||
GLColor(89, 67, 45, 123),
|
||||
};
|
||||
const GLColor kExpectedColor[kTestCount] = {
|
||||
GLColor(89, 67, 45, 123),
|
||||
GLColor(180, 143, 93, 123),
|
||||
GLColor(87, 69, 45, 123),
|
||||
GLColor(89, 67, 45, 123),
|
||||
};
|
||||
bool kPremultiply[kTestCount] = {false, false, true, true};
|
||||
bool kUnmultiply[kTestCount] = {false, true, false, true};
|
||||
|
||||
for (size_t test = 0; test < kTestCount; ++test)
|
||||
{
|
||||
// Create image as sRGB.
|
||||
GLTexture sourceTexture;
|
||||
glBindTexture(GL_TEXTURE_2D, sourceTexture);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
||||
&kSourceColor[test]);
|
||||
|
||||
GLTexture destTexture;
|
||||
glBindTexture(GL_TEXTURE_2D, destTexture);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
|
||||
// Note: flipY is used to avoid direct transfer between textures and force a draw-based
|
||||
// path.
|
||||
glCopySubTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, // level,
|
||||
0, 0, // src x,y
|
||||
0, 0, // dst x,y
|
||||
1, 1, // width, height
|
||||
true, // flip-y
|
||||
kPremultiply[test], // premul
|
||||
kUnmultiply[test]); // unmul
|
||||
ASSERT_GL_NO_ERROR();
|
||||
|
||||
// Verify the copy.
|
||||
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
|
||||
glUseProgram(program);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, destTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
GLint textureLocation = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
|
||||
ASSERT_NE(-1, textureLocation);
|
||||
glUniform1i(textureLocation, 0);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
|
||||
drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
|
||||
ASSERT_GL_NO_ERROR();
|
||||
|
||||
EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpectedColor[test], 2);
|
||||
}
|
||||
testSrgbToRgb(GL_SRGB8_ALPHA8, GL_RGBA);
|
||||
}
|
||||
|
||||
void CopyTextureTestES3::invalidateBlitThenBlendCommon(GLsizei layerCount)
|
||||
|
||||
Reference in New Issue
Block a user