Commit 0faa4a3d by Alexey Knyazev Committed by Commit Bot

Add BlendIntegerTest.MRT

Bug: angleproject:5071 Bug: angleproject:5125 Bug: angleproject:5126 Change-Id: I58539ae721efa6bcaff04c52cb8137b303d3db1e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2418716Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 82683093
......@@ -23,10 +23,10 @@ class BlendIntegerTest : public ANGLETest
}
template <typename T, GLuint components>
void compareValue(const T *value, const char *name)
void compareValue(const T *value, const char *name, GLenum attachment)
{
T pixel[4];
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadBuffer(attachment);
glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER,
std::is_same<T, int32_t>::value ? GL_INT : GL_UNSIGNED_INT, pixel);
for (size_t componentIdx = 0; componentIdx < components; componentIdx++)
......@@ -76,14 +76,16 @@ class BlendIntegerTest : public ANGLETest
const int32_t clearValueSigned[4] = {-128, -128, -128, -128};
glClearBufferiv(GL_COLOR, 0, clearValueSigned);
ASSERT_GL_NO_ERROR();
compareValue<int32_t, components>(clearValueSigned, "clearValueSigned");
compareValue<int32_t, components>(clearValueSigned, "clearValueSigned",
GL_COLOR_ATTACHMENT0);
}
else
{
const uint32_t clearValueUnsigned[4] = {127, 127, 127, 3};
glClearBufferuiv(GL_COLOR, 0, clearValueUnsigned);
ASSERT_GL_NO_ERROR();
compareValue<uint32_t, components>(clearValueUnsigned, "clearValueUnsigned");
compareValue<uint32_t, components>(clearValueUnsigned, "clearValueUnsigned",
GL_COLOR_ATTACHMENT0);
}
glEnable(GL_BLEND);
......@@ -98,12 +100,102 @@ class BlendIntegerTest : public ANGLETest
if (isSigned)
{
const int32_t colorValueSigned[4] = {-1, -1, -1, -1};
compareValue<int32_t, components>(colorValueSigned, "colorValueSigned");
compareValue<int32_t, components>(colorValueSigned, "colorValueSigned",
GL_COLOR_ATTACHMENT0);
}
else
{
const uint32_t colorValueUnsigned[4] = {1, 1, 1, 1};
compareValue<uint32_t, components>(colorValueUnsigned, "colorValueUnsigned");
compareValue<uint32_t, components>(colorValueUnsigned, "colorValueUnsigned",
GL_COLOR_ATTACHMENT0);
}
}
template <bool isSigned>
void runTestMRT()
{
constexpr char kFragmentSigned[] = R"(#version 300 es
layout(location = 1) out highp vec4 o_drawBuffer1;
layout(location = 2) out highp ivec4 o_drawBuffer2;
layout(location = 3) out highp vec4 o_drawBuffer3;
void main(void)
{
o_drawBuffer1 = vec4(0, 0, 0, 0);
o_drawBuffer2 = ivec4(0, 0, 0, 0);
o_drawBuffer3 = vec4(0, 0, 0, 0);
})";
constexpr char kFragmentUnsigned[] = R"(#version 300 es
layout(location = 1) out highp vec4 o_drawBuffer1;
layout(location = 2) out highp uvec4 o_drawBuffer2;
layout(location = 3) out highp vec4 o_drawBuffer3;
void main(void)
{
o_drawBuffer1 = vec4(0, 0, 0, 0);
o_drawBuffer2 = uvec4(0, 0, 0, 0);
o_drawBuffer3 = vec4(0, 0, 0, 0);
})";
ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(),
isSigned ? kFragmentSigned : kFragmentUnsigned);
glUseProgram(program);
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
GLRenderbuffer colorRenderbuffer1;
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer1);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, getWindowWidth(), getWindowHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER,
colorRenderbuffer1);
GLRenderbuffer colorRenderbuffer2;
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer2);
glRenderbufferStorage(GL_RENDERBUFFER, isSigned ? GL_RGBA32I : GL_RGBA32UI,
getWindowWidth(), getWindowHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER,
colorRenderbuffer2);
GLRenderbuffer colorRenderbuffer3;
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer3);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, getWindowWidth(), getWindowHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_RENDERBUFFER,
colorRenderbuffer3);
GLenum drawBuffers[] = {GL_NONE, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2,
GL_COLOR_ATTACHMENT3};
glDrawBuffers(4, drawBuffers);
if (isSigned)
{
const int32_t clearValue[4] = {-1, 2, -3, 4};
glClearBufferiv(GL_COLOR, 2, clearValue);
ASSERT_GL_NO_ERROR();
compareValue<int32_t, 4>(clearValue, "clearValue", GL_COLOR_ATTACHMENT2);
}
else
{
const uint32_t clearValue[4] = {1, 2, 3, 4};
glClearBufferuiv(GL_COLOR, 2, clearValue);
ASSERT_GL_NO_ERROR();
compareValue<uint32_t, 4>(clearValue, "clearValue", GL_COLOR_ATTACHMENT2);
}
glBlendEquation(GL_MAX);
glEnable(GL_BLEND);
drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
ASSERT_GL_NO_ERROR();
if (isSigned)
{
const int32_t drawValue[4] = {0, 0, 0, 0};
compareValue<int32_t, 4>(drawValue, "drawValue", GL_COLOR_ATTACHMENT2);
}
else
{
const uint32_t drawValue[4] = {0, 0, 0, 0};
compareValue<uint32_t, 4>(drawValue, "drawValue", GL_COLOR_ATTACHMENT2);
}
}
};
......@@ -205,6 +297,36 @@ TEST_P(BlendIntegerTest, RGB10_A2UI)
runTest<GL_RGB10_A2UI, 4, false>();
}
// Test that blending does not cancel draws on signed integer attachments.
TEST_P(BlendIntegerTest, MRTSigned)
{
// http://anglebug.com/5071
ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsIntel());
// http://anglebug.com/5125
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX() && IsIntel());
// http://anglebug.com/5126
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAdreno());
runTestMRT<true>();
}
// Test that blending does not cancel draws on unsigned integer attachments.
TEST_P(BlendIntegerTest, MRTUnsigned)
{
// http://anglebug.com/5071
ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsIntel());
// http://anglebug.com/5125
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX() && IsIntel());
// http://anglebug.com/5126
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAdreno());
runTestMRT<false>();
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST_ES3(BlendIntegerTest);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment