Commit f7843da2 by Ian Elliott Committed by Angle LUCI CQ

Create tests for GL_EXT_shader_framebuffer_fetch extension

This CL refactors most of the existing tests for the GL_EXT_shader_framebuffer_fetch_non_coherent extension, sharing shader and test code with new tests for the coherent extension. Bug: b/188095445 Change-Id: I23eac5dae9055f1c8f9eeb9c33429fd1091e68fb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2923323Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Ian Elliott <ianelliott@google.com>
parent baca10b7
...@@ -65,9 +65,9 @@ ...@@ -65,9 +65,9 @@
5981 PIXEL4ORXL GLES : VulkanExternalImageTest.TextureFormatCompatChromiumFd/* = SKIP 5981 PIXEL4ORXL GLES : VulkanExternalImageTest.TextureFormatCompatChromiumFd/* = SKIP
5946 PIXEL4ORXL VULKAN : TransformFeedbackTestES32.PrimitivesWrittenAndGenerated/* = SKIP 5946 PIXEL4ORXL VULKAN : TransformFeedbackTestES32.PrimitivesWrittenAndGenerated/* = SKIP
5947 PIXEL4ORXL VULKAN : FramebufferFetchNonCoherentES31.DrawFetchBlitDrawFetch/* = SKIP 5947 PIXEL4ORXL VULKAN : FramebufferFetchES31.DrawFetchBlitDrawFetch_NonCoherent/* = SKIP
5947 PIXEL4ORXL VULKAN : FramebufferFetchNonCoherentES31.DrawNonFetchDrawFetchWithDifferentAttachments/* = SKIP 5947 PIXEL4ORXL VULKAN : FramebufferFetchES31.DrawNonFetchDrawFetchWithDifferentAttachments_NonCoherent/* = SKIP
5947 PIXEL4ORXL VULKAN : FramebufferFetchNonCoherentES31.DrawNonFetchDrawFetchWithDifferentPrograms/* = SKIP 5947 PIXEL4ORXL VULKAN : FramebufferFetchES31.DrawNonFetchDrawFetchWithDifferentPrograms_NonCoherent/* = SKIP
5981 PIXEL4ORXL VULKAN : BlitFramebufferANGLETest.BlitWithDepthDefaultToUser/* = SKIP 5981 PIXEL4ORXL VULKAN : BlitFramebufferANGLETest.BlitWithDepthDefaultToUser/* = SKIP
5981 PIXEL4ORXL VULKAN : BlitFramebufferANGLETest.BlitWithDepthUserToDefault/* = SKIP 5981 PIXEL4ORXL VULKAN : BlitFramebufferANGLETest.BlitWithDepthUserToDefault/* = SKIP
5981 PIXEL4ORXL VULKAN : ClearTestES3.MaskedClearHeterogeneousAttachments/* = SKIP 5981 PIXEL4ORXL VULKAN : ClearTestES3.MaskedClearHeterogeneousAttachments/* = SKIP
......
...@@ -3,8 +3,9 @@ ...@@ -3,8 +3,9 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// //
// ExternalBufferTest: // FramebufferFetchTest:
// Tests the correctness of EXT_shader_framebuffer_fetch_non_coherent extension. // Tests the correctness of the EXT_shader_framebuffer_fetch and the
// EXT_shader_framebuffer_fetch_non_coherent extensions.
// //
#include "test_utils/ANGLETest.h" #include "test_utils/ANGLETest.h"
...@@ -13,66 +14,20 @@ ...@@ -13,66 +14,20 @@
namespace angle namespace angle
{ {
//
// Shared Vertex Shaders for the tests below
//
// A 1.0 GLSL vertex shader
static constexpr char k100VS[] = R"(#version 100
attribute vec4 a_position;
class FramebufferFetchNonCoherentES31 : public ANGLETest void main (void)
{
protected:
static constexpr GLuint kMaxColorBuffer = 4u;
static constexpr GLuint kViewportWidth = 16u;
static constexpr GLuint kViewportHeight = 16u;
FramebufferFetchNonCoherentES31()
{
setWindowWidth(16);
setWindowHeight(16);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setConfigDepthBits(24);
}
void render(GLuint coordLoc, GLboolean isFramebufferFetchProgram)
{
const GLfloat coords[] = {
-1.0f, -1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f,
};
const GLushort indices[] = {
0, 1, 2, 2, 3, 0,
};
glViewport(0, 0, kViewportWidth, kViewportHeight);
GLBuffer coordinatesBuffer;
GLBuffer elementsBuffer;
glBindBuffer(GL_ARRAY_BUFFER, coordinatesBuffer);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)sizeof(coords), coords, GL_STATIC_DRAW);
glEnableVertexAttribArray(coordLoc);
glVertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)sizeof(indices), &indices[0],
GL_STATIC_DRAW);
if (isFramebufferFetchProgram)
{
glFramebufferFetchBarrierEXT();
}
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
ASSERT_GL_NO_ERROR();
}
};
// Testing EXT_shader_framebuffer_fetch_non_coherent with inout qualifier
TEST_P(FramebufferFetchNonCoherentES31, BasicInout)
{ {
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent")); gl_Position = a_position;
})";
constexpr char kVS[] = R"(#version 310 es // A 3.1 GLSL vertex shader
static constexpr char k310VS[] = R"(#version 310 es
in highp vec4 a_position; in highp vec4 a_position;
void main (void) void main (void)
...@@ -80,61 +35,117 @@ void main (void) ...@@ -80,61 +35,117 @@ void main (void)
gl_Position = a_position; gl_Position = a_position;
})"; })";
constexpr char kFS[] = R"(#version 310 es //
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require // Shared simple (i.e. no framebuffer fetch) Fragment Shaders for the tests below
layout(noncoherent, location = 0) inout highp vec4 o_color; //
// Simple (i.e. no framebuffer fetch) 3.1 GLSL fragment shader that writes to 1 attachment
static constexpr char k310NoFetch1AttachmentFS[] = R"(#version 310 es
layout(location = 0) out highp vec4 o_color;
uniform highp vec4 u_color; uniform highp vec4 u_color;
void main (void) void main (void)
{ {
o_color += u_color; o_color = u_color;
})"; })";
GLProgram program; //
program.makeRaster(kVS, kFS); // Shared Coherent Fragment Shaders for the tests below
glUseProgram(program); //
// Coherent version of a 1.0 GLSL fragment shader that uses gl_LastFragData
static constexpr char k100CoherentFS[] = R"(#version 100
#extension GL_EXT_shader_framebuffer_fetch : require
mediump vec4 gl_LastFragData[gl_MaxDrawBuffers];
uniform highp vec4 u_color;
ASSERT_GL_NO_ERROR(); void main (void)
{
gl_FragColor = u_color + gl_LastFragData[0];
})";
GLFramebuffer framebuffer; // Coherent version of a 3.1 GLSL fragment shader that writes to 1 attachment
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); static constexpr char k310Coherent1AttachmentFS[] = R"(#version 310 es
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green); #extension GL_EXT_shader_framebuffer_fetch : require
GLTexture colorBufferTex; layout(location = 0) inout highp vec4 o_color;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex, 0);
ASSERT_GL_NO_ERROR(); uniform highp vec4 u_color;
void main (void)
{
o_color += u_color;
})";
float color[4] = {1.0f, 0.0f, 0.0f, 1.0f}; // Coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments
GLint colorLocation = glGetUniformLocation(program, "u_color"); static constexpr char k310Coherent4AttachmentFS[] = R"(#version 310 es
glUniform4fv(colorLocation, 1, color); #extension GL_EXT_shader_framebuffer_fetch : require
layout(location = 0) inout highp vec4 o_color0;
layout(location = 1) inout highp vec4 o_color1;
layout(location = 2) inout highp vec4 o_color2;
layout(location = 3) inout highp vec4 o_color3;
uniform highp vec4 u_color;
GLint positionLocation = glGetAttribLocation(program, "a_position"); void main (void)
render(positionLocation, GL_TRUE); {
o_color0 += u_color;
o_color1 += u_color;
o_color2 += u_color;
o_color3 += u_color;
})";
ASSERT_GL_NO_ERROR(); // Coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments via an inout
// array
static constexpr char k310Coherent4AttachmentArrayFS[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch : require
layout(location = 0) inout highp vec4 o_color[4];
uniform highp vec4 u_color;
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); void main (void)
{
o_color[0] += u_color;
o_color[1] += u_color;
o_color[2] += u_color;
o_color[3] += u_color;
})";
glBindFramebuffer(GL_FRAMEBUFFER, 0); // Coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments with the order of
} // non-fetch program and fetch program with different attachments (version 1)
static constexpr char k310CoherentDifferent4AttachmentFS1[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch : require
layout(location = 0) inout highp vec4 o_color0;
layout(location = 1) out highp vec4 o_color1;
layout(location = 2) inout highp vec4 o_color2;
layout(location = 3) out highp vec4 o_color3;
uniform highp vec4 u_color;
// Testing EXT_shader_framebuffer_fetch_non_coherent with gl_LastFragData void main (void)
TEST_P(FramebufferFetchNonCoherentES31, BasicLastFragData)
{ {
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent")); o_color0 += u_color;
o_color1 = u_color;
o_color2 += u_color;
o_color3 = u_color;
})";
constexpr char kVS[] = R"(#version 100 // Coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments with the order
attribute vec4 a_position; // of non-fetch program and fetch program with different attachments (version 2)
static constexpr char k310CoherentDifferent4AttachmentFS2[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch : require
layout(location = 0) inout highp vec4 o_color0;
layout(location = 1) out highp vec4 o_color1;
layout(location = 2) out highp vec4 o_color2;
layout(location = 3) inout highp vec4 o_color3;
uniform highp vec4 u_color;
void main (void) void main (void)
{ {
gl_Position = a_position; o_color0 += u_color;
o_color1 = u_color;
o_color2 = u_color;
o_color3 += u_color;
})"; })";
constexpr char kFS[] = R"(#version 100 //
// Shared Non-Coherent Fragment Shaders for the tests below
//
// Non-coherent version of a 1.0 GLSL fragment shader that uses gl_LastFragData
static constexpr char k100NonCoherentFS[] = R"(#version 100
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require #extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
layout(noncoherent) mediump vec4 gl_LastFragData[gl_MaxDrawBuffers]; layout(noncoherent) mediump vec4 gl_LastFragData[gl_MaxDrawBuffers];
uniform highp vec4 u_color; uniform highp vec4 u_color;
...@@ -144,52 +155,19 @@ void main (void) ...@@ -144,52 +155,19 @@ void main (void)
gl_FragColor = u_color + gl_LastFragData[0]; gl_FragColor = u_color + gl_LastFragData[0];
})"; })";
GLProgram program; // Non-coherent version of a 3.1 GLSL fragment shader that writes to 1 attachment
program.makeRaster(kVS, kFS); static constexpr char k310NonCoherent1AttachmentFS[] = R"(#version 310 es
glUseProgram(program); #extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
layout(noncoherent, location = 0) inout highp vec4 o_color;
ASSERT_GL_NO_ERROR();
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex, 0);
ASSERT_GL_NO_ERROR();
float color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
GLint colorLocation = glGetUniformLocation(program, "u_color");
glUniform4fv(colorLocation, 1, color);
GLint positionLocation = glGetAttribLocation(program, "a_position");
render(positionLocation, GL_TRUE);
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
// Testing EXT_shader_framebuffer_fetch_non_coherent with multiple render target
TEST_P(FramebufferFetchNonCoherentES31, MultipleRenderTarget)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es
in highp vec4 a_position;
uniform highp vec4 u_color;
void main (void) void main (void)
{ {
gl_Position = a_position; o_color += u_color;
})"; })";
constexpr char kFS[] = R"(#version 310 es // Non-coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments
static constexpr char k310NonCoherent4AttachmentFS[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require #extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
layout(noncoherent, location = 0) inout highp vec4 o_color0; layout(noncoherent, location = 0) inout highp vec4 o_color0;
layout(noncoherent, location = 1) inout highp vec4 o_color1; layout(noncoherent, location = 1) inout highp vec4 o_color1;
...@@ -205,78 +183,9 @@ void main (void) ...@@ -205,78 +183,9 @@ void main (void)
o_color3 += u_color; o_color3 += u_color;
})"; })";
GLProgram program; // Non-coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments via an inout
program.makeRaster(kVS, kFS); // array
glUseProgram(program); static constexpr char k310NonCoherent4AttachmentArrayFS[] = R"(#version 310 es
ASSERT_GL_NO_ERROR();
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> color0(kViewportWidth * kViewportHeight, GLColor::black);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
std::vector<GLColor> color3(kViewportWidth * kViewportHeight, GLColor::cyan);
GLTexture colorBufferTex[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color0.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color3.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
float color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
GLint colorLocation = glGetUniformLocation(program, "u_color");
glUniform4fv(colorLocation, 1, color);
GLint positionLocation = glGetAttribLocation(program, "a_position");
render(positionLocation, GL_TRUE);
ASSERT_GL_NO_ERROR();
glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::white);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
// Testing EXT_shader_framebuffer_fetch_non_coherent with multiple render target using inout array
TEST_P(FramebufferFetchNonCoherentES31, MultipleRenderTargetWithInoutArray)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es
in highp vec4 a_position;
void main (void)
{
gl_Position = a_position;
})";
constexpr char kFS[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require #extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
layout(noncoherent, location = 0) inout highp vec4 o_color[4]; layout(noncoherent, location = 0) inout highp vec4 o_color[4];
uniform highp vec4 u_color; uniform highp vec4 u_color;
...@@ -289,905 +198,1202 @@ void main (void) ...@@ -289,905 +198,1202 @@ void main (void)
o_color[3] += u_color; o_color[3] += u_color;
})"; })";
GLProgram program; // Non-coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments with the order
program.makeRaster(kVS, kFS); // of non-fetch program and fetch program with different attachments (version 1)
glUseProgram(program); static constexpr char k310NonCoherentDifferent4AttachmentFS1[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
ASSERT_GL_NO_ERROR(); layout(noncoherent, location = 0) inout highp vec4 o_color0;
layout(location = 1) out highp vec4 o_color1;
GLFramebuffer framebuffer; layout(noncoherent, location = 2) inout highp vec4 o_color2;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); layout(location = 3) out highp vec4 o_color3;
std::vector<GLColor> color0(kViewportWidth * kViewportHeight, GLColor::black); uniform highp vec4 u_color;
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
std::vector<GLColor> color3(kViewportWidth * kViewportHeight, GLColor::cyan);
GLTexture colorBufferTex[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color0.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color3.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
float color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
GLint colorLocation = glGetUniformLocation(program, "u_color");
glUniform4fv(colorLocation, 1, color);
GLint positionLocation = glGetAttribLocation(program, "a_position");
render(positionLocation, GL_TRUE);
ASSERT_GL_NO_ERROR();
glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::white);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
// Testing EXT_shader_framebuffer_fetch_non_coherent with multiple draw
TEST_P(FramebufferFetchNonCoherentES31, MultipleDraw)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es
in highp vec4 a_position;
void main (void) void main (void)
{ {
gl_Position = a_position; o_color0 += u_color;
o_color1 = u_color;
o_color2 += u_color;
o_color3 = u_color;
})"; })";
constexpr char kFS[] = R"(#version 310 es // Non-coherent version of a 3.1 GLSL fragment shader that writes to 4 attachments with the order
// of non-fetch program and fetch program with different attachments (version 2)
static constexpr char k310NonCoherentDifferent4AttachmentFS2[] = R"(#version 310 es
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require #extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
layout(noncoherent, location = 0) inout highp vec4 o_color; layout(noncoherent, location = 0) inout highp vec4 o_color0;
layout(location = 1) out highp vec4 o_color1;
layout(location = 2) out highp vec4 o_color2;
layout(noncoherent, location = 3) inout highp vec4 o_color3;
uniform highp vec4 u_color; uniform highp vec4 u_color;
void main (void) void main (void)
{ {
o_color += u_color; o_color0 += u_color;
o_color1 = u_color;
o_color2 = u_color;
o_color3 += u_color;
})"; })";
GLProgram program; class FramebufferFetchES31 : public ANGLETest
program.makeRaster(kVS, kFS); {
glUseProgram(program); protected:
static constexpr GLuint kMaxColorBuffer = 4u;
static constexpr GLuint kViewportWidth = 16u;
static constexpr GLuint kViewportHeight = 16u;
ASSERT_GL_NO_ERROR(); FramebufferFetchES31()
{
setWindowWidth(16);
setWindowHeight(16);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setConfigDepthBits(24);
GLFramebuffer framebuffer; mCoherentExtension = false;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); }
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex, 0);
ASSERT_GL_NO_ERROR(); enum WhichExtension
{
COHERENT,
NON_COHERENT,
};
void setWhichExtension(WhichExtension whichExtension)
{
mCoherentExtension = (whichExtension == COHERENT) ? true : false;
}
float color1[4] = {1.0f, 0.0f, 0.0f, 1.0f}; enum WhichFragmentShader
GLint colorLocation = glGetUniformLocation(program, "u_color"); {
glUniform4fv(colorLocation, 1, color1); GLSL100,
GLSL310_NO_FETCH_1ATTACHMENT,
GLSL310_1ATTACHMENT,
GLSL310_4ATTACHMENT,
GLSL310_4ATTACHMENT_ARRAY,
GLSL310_4ATTACHMENT_DIFFERENT1,
GLSL310_4ATTACHMENT_DIFFERENT2,
};
const char *getFragmentShader(WhichFragmentShader whichFragmentShader)
{
if (mCoherentExtension)
{
switch (whichFragmentShader)
{
case GLSL100:
return k100CoherentFS;
case GLSL310_NO_FETCH_1ATTACHMENT:
return k310NoFetch1AttachmentFS;
case GLSL310_1ATTACHMENT:
return k310Coherent1AttachmentFS;
case GLSL310_4ATTACHMENT:
return k310Coherent4AttachmentFS;
case GLSL310_4ATTACHMENT_ARRAY:
return k310Coherent4AttachmentArrayFS;
case GLSL310_4ATTACHMENT_DIFFERENT1:
return k310CoherentDifferent4AttachmentFS1;
case GLSL310_4ATTACHMENT_DIFFERENT2:
return k310CoherentDifferent4AttachmentFS2;
}
}
else
{
switch (whichFragmentShader)
{
case GLSL100:
return k100NonCoherentFS;
case GLSL310_NO_FETCH_1ATTACHMENT:
return k310NoFetch1AttachmentFS;
case GLSL310_1ATTACHMENT:
return k310NonCoherent1AttachmentFS;
case GLSL310_4ATTACHMENT:
return k310NonCoherent4AttachmentFS;
case GLSL310_4ATTACHMENT_ARRAY:
return k310NonCoherent4AttachmentArrayFS;
case GLSL310_4ATTACHMENT_DIFFERENT1:
return k310NonCoherentDifferent4AttachmentFS1;
case GLSL310_4ATTACHMENT_DIFFERENT2:
return k310NonCoherentDifferent4AttachmentFS2;
}
}
}
GLint positionLocation = glGetAttribLocation(program, "a_position"); void render(GLuint coordLoc, GLboolean needsFramebufferFetchBarrier)
render(positionLocation, GL_TRUE); {
const GLfloat coords[] = {
-1.0f, -1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f,
};
const GLushort indices[] = {
0, 1, 2, 2, 3, 0,
};
glViewport(0, 0, kViewportWidth, kViewportHeight);
GLBuffer coordinatesBuffer;
GLBuffer elementsBuffer;
glBindBuffer(GL_ARRAY_BUFFER, coordinatesBuffer);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)sizeof(coords), coords, GL_STATIC_DRAW);
glEnableVertexAttribArray(coordLoc);
glVertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)sizeof(indices), &indices[0],
GL_STATIC_DRAW);
float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f}; if (needsFramebufferFetchBarrier)
glUniform4fv(colorLocation, 1, color2); {
glFramebufferFetchBarrierEXT();
}
render(positionLocation, GL_TRUE); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
}
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::white); void BasicTest(GLProgram program)
{
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex,
0);
glBindFramebuffer(GL_FRAMEBUFFER, 0); ASSERT_GL_NO_ERROR();
}
// Testing EXT_shader_framebuffer_fetch_non_coherent with the order of non-fetch program and fetch float color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
// program GLint colorLocation = glGetUniformLocation(program, "u_color");
TEST_P(FramebufferFetchNonCoherentES31, DrawNonFetchDrawFetch) glUniform4fv(colorLocation, 1, color);
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es GLint positionLocation = glGetAttribLocation(program, "a_position");
in highp vec4 a_position; render(positionLocation, !mCoherentExtension);
void main (void) ASSERT_GL_NO_ERROR();
{
gl_Position = a_position;
})";
constexpr char kFS1[] = R"(#version 310 es EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
layout(location = 0) out highp vec4 o_color;
uniform highp vec4 u_color; glBindFramebuffer(GL_FRAMEBUFFER, 0);
void main (void) }
{
o_color = u_color;
})";
constexpr char kFS2[] = R"(#version 310 es void MultipleRenderTargetTest(GLProgram program)
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require {
layout(noncoherent, location = 0) inout highp vec4 o_color; GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> color0(kViewportWidth * kViewportHeight, GLColor::black);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
std::vector<GLColor> color3(kViewportWidth * kViewportHeight, GLColor::cyan);
GLTexture colorBufferTex[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color0.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color3.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
uniform highp vec4 u_color; ASSERT_GL_NO_ERROR();
void main (void)
{
o_color += u_color;
})";
GLProgram programNonFetch, programFetch; float color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
programNonFetch.makeRaster(kVS, kFS1); GLint colorLocation = glGetUniformLocation(program, "u_color");
glUseProgram(programNonFetch); glUniform4fv(colorLocation, 1, color);
ASSERT_GL_NO_ERROR(); GLint positionLocation = glGetAttribLocation(program, "a_position");
render(positionLocation, !mCoherentExtension);
GLFramebuffer framebuffer; ASSERT_GL_NO_ERROR();
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex, 0);
ASSERT_GL_NO_ERROR(); glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::white);
float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f}; glBindFramebuffer(GL_FRAMEBUFFER, 0);
GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color"); }
glUniform4fv(colorLocationNonFetch, 1, colorRed);
GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position"); void MultipleRenderTargetArrayTest(GLProgram program)
render(positionLocationNonFetch, GL_FALSE); {
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> color0(kViewportWidth * kViewportHeight, GLColor::black);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
std::vector<GLColor> color3(kViewportWidth * kViewportHeight, GLColor::cyan);
GLTexture colorBufferTex[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color0.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color3.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); float color[4] = {1.0f, 0.0f, 0.0f, 1.0f};
GLint colorLocation = glGetUniformLocation(program, "u_color");
glUniform4fv(colorLocation, 1, color);
programFetch.makeRaster(kVS, kFS2); GLint positionLocation = glGetAttribLocation(program, "a_position");
glUseProgram(programFetch); render(positionLocation, !mCoherentExtension);
float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f}; ASSERT_GL_NO_ERROR();
GLint colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
glUniform4fv(colorLocationFetch, 1, colorGreen);
GLint positionLocationFetch = glGetAttribLocation(programFetch, "a_position"); glReadBuffer(colorAttachments[0]);
render(positionLocationFetch, GL_TRUE); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::white);
ASSERT_GL_NO_ERROR(); glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); void MultipleDrawTest(GLProgram program)
{
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex,
0);
glUseProgram(programNonFetch); ASSERT_GL_NO_ERROR();
glUniform4fv(colorLocationNonFetch, 1, colorRed);
render(positionLocationNonFetch, GL_FALSE);
ASSERT_GL_NO_ERROR(); float color1[4] = {1.0f, 0.0f, 0.0f, 1.0f};
GLint colorLocation = glGetUniformLocation(program, "u_color");
glUniform4fv(colorLocation, 1, color1);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); GLint positionLocation = glGetAttribLocation(program, "a_position");
render(positionLocation, !mCoherentExtension);
glUseProgram(programFetch); float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
glUniform4fv(colorLocationFetch, 1, colorGreen); glUniform4fv(colorLocation, 1, color2);
render(positionLocationFetch, GL_TRUE);
ASSERT_GL_NO_ERROR(); render(positionLocation, !mCoherentExtension);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); ASSERT_GL_NO_ERROR();
glBindFramebuffer(GL_FRAMEBUFFER, 0); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::white);
}
// Testing EXT_shader_framebuffer_fetch_non_coherent with the order of fetch program and non-fetch glBindFramebuffer(GL_FRAMEBUFFER, 0);
// program }
TEST_P(FramebufferFetchNonCoherentES31, DrawFetchDrawNonFetch)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es void DrawNonFetchDrawFetchTest(GLProgram programNonFetch, GLProgram programFetch)
in highp vec4 a_position; {
glUseProgram(programNonFetch);
ASSERT_GL_NO_ERROR();
void main (void) GLFramebuffer framebuffer;
{ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
gl_Position = a_position; std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
})"; GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex,
0);
constexpr char kFS1[] = R"(#version 310 es ASSERT_GL_NO_ERROR();
layout(location = 0) out highp vec4 o_color;
uniform highp vec4 u_color; float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
void main (void) GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
{ glUniform4fv(colorLocationNonFetch, 1, colorRed);
o_color = u_color;
})";
constexpr char kFS2[] = R"(#version 310 es GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position");
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require // Render without regard to glFramebufferFetchBarrierEXT()
layout(noncoherent, location = 0) inout highp vec4 o_color; render(positionLocationNonFetch, GL_FALSE);
uniform highp vec4 u_color; ASSERT_GL_NO_ERROR();
void main (void)
{
o_color += u_color;
})";
GLProgram programNonFetch, programFetch; EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
programFetch.makeRaster(kVS, kFS2);
glUseProgram(programFetch);
ASSERT_GL_NO_ERROR(); glUseProgram(programFetch);
GLFramebuffer framebuffer; float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f};
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); GLint colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green); glUniform4fv(colorLocationFetch, 1, colorGreen);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex, 0);
ASSERT_GL_NO_ERROR(); GLint positionLocationFetch = glGetAttribLocation(programFetch, "a_position");
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocationFetch, !mCoherentExtension);
float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f}; ASSERT_GL_NO_ERROR();
GLint colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
glUniform4fv(colorLocationFetch, 1, colorRed);
GLint positionLocationFetch = glGetAttribLocation(programFetch, "a_position"); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
render(positionLocationFetch, GL_TRUE);
ASSERT_GL_NO_ERROR(); glUseProgram(programNonFetch);
glUniform4fv(colorLocationNonFetch, 1, colorRed);
// Render without regard to glFramebufferFetchBarrierEXT()
render(positionLocationNonFetch, GL_FALSE);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); ASSERT_GL_NO_ERROR();
programNonFetch.makeRaster(kVS, kFS1); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glUseProgram(programNonFetch);
GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color"); glUseProgram(programFetch);
glUniform4fv(colorLocationNonFetch, 1, colorRed); glUniform4fv(colorLocationFetch, 1, colorGreen);
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocationFetch, !mCoherentExtension);
GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position"); ASSERT_GL_NO_ERROR();
render(positionLocationNonFetch, GL_FALSE);
ASSERT_GL_NO_ERROR(); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f}; void DrawFetchDrawNonFetchTest(GLProgram programNonFetch, GLProgram programFetch)
glUseProgram(programFetch); {
glUniform4fv(colorLocationFetch, 1, colorGreen); glUseProgram(programFetch);
render(positionLocationFetch, GL_TRUE); ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex,
0);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); ASSERT_GL_NO_ERROR();
glUseProgram(programNonFetch); float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
glUniform4fv(colorLocationNonFetch, 1, colorRed); GLint colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
render(positionLocationNonFetch, GL_FALSE); glUniform4fv(colorLocationFetch, 1, colorRed);
ASSERT_GL_NO_ERROR(); GLint positionLocationFetch = glGetAttribLocation(programFetch, "a_position");
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocationFetch, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glBindFramebuffer(GL_FRAMEBUFFER, 0); glUseProgram(programNonFetch);
}
// Testing EXT_shader_framebuffer_fetch_non_coherent with the order of non-fetch program and fetch GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
// program with different attachments glUniform4fv(colorLocationNonFetch, 1, colorRed);
TEST_P(FramebufferFetchNonCoherentES31, DrawNonFetchDrawFetchWithDifferentAttachments)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position");
in highp vec4 a_position; // Render without regard to glFramebufferFetchBarrierEXT()
render(positionLocationNonFetch, GL_FALSE);
ASSERT_GL_NO_ERROR();
void main (void) EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
{
gl_Position = a_position;
})";
constexpr char kFS1[] = R"(#version 310 es float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f};
layout(location = 0) out highp vec4 o_color; glUseProgram(programFetch);
glUniform4fv(colorLocationFetch, 1, colorGreen);
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocationFetch, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
uniform highp vec4 u_color; EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
void main (void)
{
o_color = u_color;
})";
constexpr char kFS2[] = R"(#version 310 es glUseProgram(programNonFetch);
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require glUniform4fv(colorLocationNonFetch, 1, colorRed);
layout(noncoherent, location = 0) inout highp vec4 o_color0; // Render without regard to glFramebufferFetchBarrierEXT()
layout(location = 1) out highp vec4 o_color1; render(positionLocationNonFetch, GL_FALSE);
layout(noncoherent, location = 2) inout highp vec4 o_color2;
layout(location = 3) out highp vec4 o_color3;
uniform highp vec4 u_color;
void main (void) ASSERT_GL_NO_ERROR();
{
o_color0 += u_color;
o_color1 = u_color;
o_color2 += u_color;
o_color3 = u_color;
})";
GLProgram programNonFetch, programFetch1; EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
programNonFetch.makeRaster(kVS, kFS1);
glUseProgram(programNonFetch);
ASSERT_GL_NO_ERROR(); glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
GLFramebuffer framebuffer; void DrawNonFetchDrawFetchWithDifferentAttachmentsTest(GLProgram programNonFetch,
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); GLProgram programFetch)
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green); {
GLTexture colorTex; glUseProgram(programNonFetch);
glBindTexture(GL_TEXTURE_2D, colorTex); ASSERT_GL_NO_ERROR();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
ASSERT_GL_NO_ERROR(); GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorTex;
glBindTexture(GL_TEXTURE_2D, colorTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f}; ASSERT_GL_NO_ERROR();
GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
glUniform4fv(colorLocationNonFetch, 1, colorRed);
GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position"); float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
render(positionLocationNonFetch, GL_FALSE); GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
glUniform4fv(colorLocationNonFetch, 1, colorRed);
ASSERT_GL_NO_ERROR(); GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position");
// Render without regard to glFramebufferFetchBarrierEXT()
render(positionLocationNonFetch, GL_FALSE);
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
programFetch1.makeRaster(kVS, kFS2); glUseProgram(programFetch);
glUseProgram(programFetch1); ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); GLFramebuffer framebufferMRT1;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
GLTexture colorBufferTex1[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex1[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
GLFramebuffer framebufferMRT1; GLint colorLocation = glGetUniformLocation(programFetch, "u_color");
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1); glUniform4fv(colorLocation, 1, colorRed);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
GLTexture colorBufferTex1[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex1[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR(); GLint positionLocation = glGetAttribLocation(programFetch, "a_position");
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
GLint colorLocation = glGetUniformLocation(programFetch1, "u_color"); glReadBuffer(colorAttachments[0]);
glUniform4fv(colorLocation, 1, colorRed); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
GLFramebuffer framebufferMRT2;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT2);
GLTexture colorBufferTex2[kMaxColorBuffer];
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex2[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
GLint positionLocation = glGetAttribLocation(programFetch1, "a_position"); glUniform4fv(colorLocation, 1, colorRed);
render(positionLocation, GL_TRUE); // Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[0]); glBindFramebuffer(GL_FRAMEBUFFER, 0);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
GLFramebuffer framebufferMRT2;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT2);
GLTexture colorBufferTex2[kMaxColorBuffer];
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex2[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex2[i], 0);
} }
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
glUniform4fv(colorLocation, 1, colorRed);
render(positionLocation, GL_TRUE);
ASSERT_GL_NO_ERROR(); void DrawNonFetchDrawFetchWithDifferentProgramsTest(GLProgram programNonFetch,
GLProgram programFetch1,
GLProgram programFetch2)
{
glUseProgram(programNonFetch);
ASSERT_GL_NO_ERROR();
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorTex;
glBindTexture(GL_TEXTURE_2D, colorTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
glReadBuffer(colorAttachments[0]); ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glBindFramebuffer(GL_FRAMEBUFFER, 0); float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
} GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
glUniform4fv(colorLocationNonFetch, 1, colorRed);
// Testing EXT_shader_framebuffer_fetch_non_coherent with the order of non-fetch program and fetch GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position");
// with different programs // Render without regard to glFramebufferFetchBarrierEXT()
TEST_P(FramebufferFetchNonCoherentES31, DrawNonFetchDrawFetchWithDifferentPrograms) render(positionLocationNonFetch, GL_FALSE);
{ ASSERT_GL_NO_ERROR();
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
in highp vec4 a_position;
void main (void) glUseProgram(programFetch1);
{ ASSERT_GL_NO_ERROR();
gl_Position = a_position;
})";
constexpr char kFS1[] = R"(#version 310 es GLFramebuffer framebufferMRT1;
layout(location = 0) out highp vec4 o_color; glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex1[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex1[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
uniform highp vec4 u_color; GLint colorLocation = glGetUniformLocation(programFetch1, "u_color");
void main (void) glUniform4fv(colorLocation, 1, colorRed);
{
o_color = u_color;
})";
constexpr char kFS2[] = R"(#version 310 es GLint positionLocation = glGetAttribLocation(programFetch1, "a_position");
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require // Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
layout(noncoherent, location = 0) inout highp vec4 o_color0; // extension being used
layout(location = 1) out highp vec4 o_color1; render(positionLocation, !mCoherentExtension);
layout(noncoherent, location = 2) inout highp vec4 o_color2; ASSERT_GL_NO_ERROR();
layout(location = 3) out highp vec4 o_color3;
uniform highp vec4 u_color;
void main (void) glReadBuffer(colorAttachments[0]);
{ EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
o_color0 += u_color; glReadBuffer(colorAttachments[1]);
o_color1 = u_color; EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
o_color2 += u_color; glReadBuffer(colorAttachments[2]);
o_color3 = u_color; EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
})"; glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
constexpr char kFS3[] = R"(#version 310 es glUseProgram(programFetch2);
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require ASSERT_GL_NO_ERROR();
layout(noncoherent, location = 0) inout highp vec4 o_color0;
layout(location = 1) out highp vec4 o_color1;
layout(location = 2) out highp vec4 o_color2;
layout(noncoherent, location = 3) inout highp vec4 o_color3;
uniform highp vec4 u_color;
void main (void) glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
{ glClear(GL_COLOR_BUFFER_BIT);
o_color0 += u_color;
o_color1 = u_color;
o_color2 = u_color;
o_color3 += u_color;
})";
GLProgram programNonFetch, programFetch1, programFetch2; GLint colorLocation1 = glGetUniformLocation(programFetch2, "u_color");
programNonFetch.makeRaster(kVS, kFS1); glUniform4fv(colorLocation1, 1, colorRed);
glUseProgram(programNonFetch);
ASSERT_GL_NO_ERROR(); GLint positionLocation1 = glGetAttribLocation(programFetch2, "a_position");
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation1, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
GLFramebuffer framebuffer; glReadBuffer(colorAttachments[0]);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green); glReadBuffer(colorAttachments[1]);
GLTexture colorTex; EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glBindTexture(GL_TEXTURE_2D, colorTex); glReadBuffer(colorAttachments[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA, EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
GL_UNSIGNED_BYTE, greenColor.data()); glReadBuffer(colorAttachments[3]);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
ASSERT_GL_NO_ERROR(); glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f}; void DrawFetchBlitDrawFetchTest(GLProgram programNonFetch, GLProgram programFetch)
GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color"); {
glUniform4fv(colorLocationNonFetch, 1, colorRed); glUseProgram(programFetch);
ASSERT_GL_NO_ERROR();
GLFramebuffer framebufferMRT1;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
GLTexture colorBufferTex1[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex1[i], 0);
}
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR();
GLint positionLocationNonFetch = glGetAttribLocation(programNonFetch, "a_position"); float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
render(positionLocationNonFetch, GL_FALSE); GLint colorLocation = glGetUniformLocation(programFetch, "u_color");
glUniform4fv(colorLocation, 1, colorRed);
ASSERT_GL_NO_ERROR(); GLint positionLocation = glGetAttribLocation(programFetch, "a_position");
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
GLFramebuffer framebufferColor;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferColor);
GLTexture colorTex;
glBindTexture(GL_TEXTURE_2D, colorTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, framebufferColor);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, framebufferMRT1);
glBlitFramebuffer(0, 0, kViewportWidth, kViewportHeight, 0, 0, kViewportWidth,
kViewportHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
ASSERT_GL_NO_ERROR();
programFetch1.makeRaster(kVS, kFS2); glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1);
glUseProgram(programFetch1); glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f};
glUniform4fv(colorLocation, 1, colorGreen);
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); glReadBuffer(colorAttachments[0]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::cyan);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::green);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::cyan);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::green);
GLFramebuffer framebufferMRT1; glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex1[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex1[i], 0);
} }
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
ASSERT_GL_NO_ERROR(); void ProgramPipelineTest(const char *kVS, const char *kFS1, const char *kFS2)
{
GLProgram programVert, programNonFetch, programFetch;
const char *sourceArray[3] = {kVS, kFS1, kFS2};
GLShader vertShader(GL_VERTEX_SHADER);
glShaderSource(vertShader, 1, &sourceArray[0], nullptr);
glCompileShader(vertShader);
glProgramParameteri(programVert, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(programVert, vertShader);
glLinkProgram(programVert);
ASSERT_GL_NO_ERROR();
GLint colorLocation = glGetUniformLocation(programFetch1, "u_color"); GLShader fragShader1(GL_FRAGMENT_SHADER);
glUniform4fv(colorLocation, 1, colorRed); glShaderSource(fragShader1, 1, &sourceArray[1], nullptr);
glCompileShader(fragShader1);
glProgramParameteri(programNonFetch, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(programNonFetch, fragShader1);
glLinkProgram(programNonFetch);
ASSERT_GL_NO_ERROR();
GLint positionLocation = glGetAttribLocation(programFetch1, "a_position"); GLShader fragShader2(GL_FRAGMENT_SHADER);
render(positionLocation, GL_TRUE); glShaderSource(fragShader2, 1, &sourceArray[2], nullptr);
glCompileShader(fragShader2);
glProgramParameteri(programFetch, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(programFetch, fragShader2);
glLinkProgram(programFetch);
ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); GLProgramPipeline pipeline1, pipeline2, pipeline3, pipeline4;
glUseProgramStages(pipeline1, GL_VERTEX_SHADER_BIT, programVert);
glUseProgramStages(pipeline1, GL_FRAGMENT_SHADER_BIT, programNonFetch);
glBindProgramPipeline(pipeline1);
ASSERT_GL_NO_ERROR();
glReadBuffer(colorAttachments[0]); GLFramebuffer framebuffer;
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glReadBuffer(colorAttachments[1]); std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); GLTexture colorBufferTex;
glReadBuffer(colorAttachments[2]); glBindTexture(GL_TEXTURE_2D, colorBufferTex);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
glReadBuffer(colorAttachments[3]); GL_UNSIGNED_BYTE, greenColor.data());
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex,
0);
ASSERT_GL_NO_ERROR();
programFetch2.makeRaster(kVS, kFS3); glActiveShaderProgram(pipeline1, programNonFetch);
glUseProgram(programFetch2); float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
glUniform4fv(colorLocationNonFetch, 1, colorRed);
ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); glActiveShaderProgram(pipeline1, programVert);
GLint positionLocation = glGetAttribLocation(programVert, "a_position");
// Render without regard to glFramebufferFetchBarrierEXT()
render(positionLocation, GL_FALSE);
ASSERT_GL_NO_ERROR();
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glClear(GL_COLOR_BUFFER_BIT);
GLint colorLocation1 = glGetUniformLocation(programFetch2, "u_color"); glUseProgramStages(pipeline2, GL_VERTEX_SHADER_BIT, programVert);
glUniform4fv(colorLocation1, 1, colorRed); glUseProgramStages(pipeline2, GL_FRAGMENT_SHADER_BIT, programFetch);
glBindProgramPipeline(pipeline2);
ASSERT_GL_NO_ERROR();
GLint positionLocation1 = glGetAttribLocation(programFetch2, "a_position"); glActiveShaderProgram(pipeline2, programFetch);
render(positionLocation1, GL_TRUE); float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f};
GLint colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
glUniform4fv(colorLocationFetch, 1, colorGreen);
ASSERT_GL_NO_ERROR(); // Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
glReadBuffer(colorAttachments[0]); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
glBindFramebuffer(GL_FRAMEBUFFER, 0); glUseProgramStages(pipeline3, GL_VERTEX_SHADER_BIT, programVert);
} glUseProgramStages(pipeline3, GL_FRAGMENT_SHADER_BIT, programNonFetch);
glBindProgramPipeline(pipeline3);
ASSERT_GL_NO_ERROR();
// Testing EXT_shader_framebuffer_fetch_non_coherent with the order of draw fetch, blit and draw glActiveShaderProgram(pipeline3, programNonFetch);
// fetch colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
TEST_P(FramebufferFetchNonCoherentES31, DrawFetchBlitDrawFetch) glUniform4fv(colorLocationNonFetch, 1, colorRed);
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
constexpr char kVS[] = R"(#version 310 es ASSERT_GL_NO_ERROR();
in highp vec4 a_position;
void main (void) // Render without regard to glFramebufferFetchBarrierEXT()
{ render(positionLocation, GL_FALSE);
gl_Position = a_position; ASSERT_GL_NO_ERROR();
})";
constexpr char kFS1[] = R"(#version 310 es EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require
layout(noncoherent, location = 0) inout highp vec4 o_color0;
layout(location = 1) out highp vec4 o_color1;
layout(noncoherent, location = 2) inout highp vec4 o_color2;
layout(location = 3) out highp vec4 o_color3;
uniform highp vec4 u_color;
void main (void) glUseProgramStages(pipeline4, GL_VERTEX_SHADER_BIT, programVert);
{ glUseProgramStages(pipeline4, GL_FRAGMENT_SHADER_BIT, programFetch);
o_color0 += u_color; glBindProgramPipeline(pipeline4);
o_color1 = u_color; ASSERT_GL_NO_ERROR();
o_color2 += u_color;
o_color3 = u_color;
})";
GLProgram programFetch; glActiveShaderProgram(pipeline4, programFetch);
programFetch.makeRaster(kVS, kFS1); colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
glUseProgram(programFetch); glUniform4fv(colorLocationFetch, 1, colorGreen);
// Render potentially with a glFramebufferFetchBarrierEXT() depending on the [non-]coherent
// extension being used
render(positionLocation, !mCoherentExtension);
ASSERT_GL_NO_ERROR();
ASSERT_GL_NO_ERROR(); EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow);
GLFramebuffer framebufferMRT1; glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1);
std::vector<GLColor> color1(kViewportWidth * kViewportHeight, GLColor::green);
std::vector<GLColor> color2(kViewportWidth * kViewportHeight, GLColor::blue);
GLTexture colorBufferTex1[kMaxColorBuffer];
GLenum colorAttachments[kMaxColorBuffer] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color1.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, colorBufferTex1[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glBindTexture(GL_TEXTURE_2D, 0);
for (unsigned int i = 0; i < kMaxColorBuffer; i++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, colorAttachments[i], GL_TEXTURE_2D,
colorBufferTex1[i], 0);
} }
glDrawBuffers(kMaxColorBuffer, &colorAttachments[0]);
bool mCoherentExtension;
};
// Test coherent extension with inout qualifier
TEST_P(FramebufferFetchES31, BasicInout_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
GLProgram program;
program.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
glUseProgram(program);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f}; BasicTest(program);
GLint colorLocation = glGetUniformLocation(programFetch, "u_color"); }
glUniform4fv(colorLocation, 1, colorRed);
GLint positionLocation = glGetAttribLocation(programFetch, "a_position"); // Test non-coherent extension with inout qualifier
render(positionLocation, GL_TRUE); TEST_P(FramebufferFetchES31, BasicInout_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
GLProgram program;
program.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
glUseProgram(program);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glReadBuffer(colorAttachments[0]); BasicTest(program);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); }
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red);
GLFramebuffer framebufferColor;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferColor);
GLTexture colorTex;
glBindTexture(GL_TEXTURE_2D, colorTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, color2.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, framebufferColor);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, framebufferMRT1);
glBlitFramebuffer(0, 0, kViewportWidth, kViewportHeight, 0, 0, kViewportWidth, kViewportHeight, // Test coherent extension with gl_LastFragData
GL_COLOR_BUFFER_BIT, GL_NEAREST); TEST_P(FramebufferFetchES31, BasicLastFragData_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
GLProgram program;
program.makeRaster(k100VS, getFragmentShader(GLSL100));
glUseProgram(program);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMRT1); BasicTest(program);
glReadBuffer(colorAttachments[0]); }
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
glReadBuffer(colorAttachments[2]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
glReadBuffer(colorAttachments[3]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::blue);
float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f};
glUniform4fv(colorLocation, 1, colorGreen);
render(positionLocation, GL_TRUE); // Test non-coherent extension with gl_LastFragData
TEST_P(FramebufferFetchES31, BasicLastFragData_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
GLProgram program;
program.makeRaster(k100VS, getFragmentShader(GLSL100));
glUseProgram(program);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glReadBuffer(colorAttachments[0]); BasicTest(program);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::cyan); }
glReadBuffer(colorAttachments[1]);
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::green); // Testing coherent extension with multiple render target
glReadBuffer(colorAttachments[2]); TEST_P(FramebufferFetchES31, MultipleRenderTarget_Coherent)
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::cyan); {
glReadBuffer(colorAttachments[3]); ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::green); setWhichExtension(COHERENT);
glBindFramebuffer(GL_FRAMEBUFFER, 0); GLProgram program;
program.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT));
glUseProgram(program);
ASSERT_GL_NO_ERROR();
MultipleRenderTargetTest(program);
} }
// Testing EXT_shader_framebuffer_fetch_non_coherent with program pipeline // Testing non-coherent extension with multiple render target
TEST_P(FramebufferFetchNonCoherentES31, ProgramPipeline) TEST_P(FramebufferFetchES31, MultipleRenderTarget_NonCoherent)
{ {
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent")); ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
const char kVS[] = R"(#version 310 es GLProgram program;
in highp vec4 a_position; program.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT));
glUseProgram(program);
ASSERT_GL_NO_ERROR();
void main (void) MultipleRenderTargetTest(program);
}
// Testing non-coherent extension with multiple render target using inout array
TEST_P(FramebufferFetchES31, MultipleRenderTargetWithInoutArray_NonCoherent)
{ {
gl_Position = a_position; ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
})"; setWhichExtension(NON_COHERENT);
constexpr char kFS1[] = R"(#version 310 es GLProgram program;
layout(location = 0) out highp vec4 o_color; program.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT));
glUseProgram(program);
ASSERT_GL_NO_ERROR();
uniform highp vec4 u_color; MultipleRenderTargetTest(program);
void main (void) }
// Testing coherent extension with multiple render target using inout array
TEST_P(FramebufferFetchES31, MultipleRenderTargetWithInoutArray_Coherent)
{ {
o_color = u_color; ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
})"; setWhichExtension(COHERENT);
constexpr char kFS2[] = R"(#version 310 es GLProgram program;
#extension GL_EXT_shader_framebuffer_fetch_non_coherent : require program.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT));
glUseProgram(program);
ASSERT_GL_NO_ERROR();
layout(noncoherent, location = 0) inout highp vec4 o_color; MultipleRenderTargetTest(program);
}
uniform highp vec4 u_color; // Test coherent extension with multiple draw
void main (void) TEST_P(FramebufferFetchES31, MultipleDraw_Coherent)
{ {
o_color += u_color; ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
})"; setWhichExtension(COHERENT);
GLProgram programVert, programNonFetch, programFetch;
const char *sourceArray[3] = {kVS, kFS1, kFS2};
GLShader vertShader(GL_VERTEX_SHADER); GLProgram program;
glShaderSource(vertShader, 1, &sourceArray[0], nullptr); program.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
glCompileShader(vertShader); glUseProgram(program);
glProgramParameteri(programVert, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(programVert, vertShader);
glLinkProgram(programVert);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
GLShader fragShader1(GL_FRAGMENT_SHADER); MultipleDrawTest(program);
glShaderSource(fragShader1, 1, &sourceArray[1], nullptr); }
glCompileShader(fragShader1);
glProgramParameteri(programNonFetch, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(programNonFetch, fragShader1);
glLinkProgram(programNonFetch);
ASSERT_GL_NO_ERROR();
GLShader fragShader2(GL_FRAGMENT_SHADER); // Test non-coherent extension with multiple draw
glShaderSource(fragShader2, 1, &sourceArray[2], nullptr); TEST_P(FramebufferFetchES31, MultipleDraw_NonCoherent)
glCompileShader(fragShader2); {
glProgramParameteri(programFetch, GL_PROGRAM_SEPARABLE, GL_TRUE); ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
glAttachShader(programFetch, fragShader2); setWhichExtension(NON_COHERENT);
glLinkProgram(programFetch);
ASSERT_GL_NO_ERROR();
GLProgramPipeline pipeline1, pipeline2, pipeline3, pipeline4; GLProgram program;
glUseProgramStages(pipeline1, GL_VERTEX_SHADER_BIT, programVert); program.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
glUseProgramStages(pipeline1, GL_FRAGMENT_SHADER_BIT, programNonFetch); glUseProgram(program);
glBindProgramPipeline(pipeline1);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
GLFramebuffer framebuffer; MultipleDrawTest(program);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); }
std::vector<GLColor> greenColor(kViewportWidth * kViewportHeight, GLColor::green);
GLTexture colorBufferTex;
glBindTexture(GL_TEXTURE_2D, colorBufferTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kViewportWidth, kViewportHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, greenColor.data());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTex, 0);
// Testing coherent extension with the order of non-fetch program and fetch program
TEST_P(FramebufferFetchES31, DrawNonFetchDrawFetch_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
GLProgram programNonFetch, programFetch;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glActiveShaderProgram(pipeline1, programNonFetch); DrawNonFetchDrawFetchTest(programNonFetch, programFetch);
float colorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f}; }
GLint colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color");
glUniform4fv(colorLocationNonFetch, 1, colorRed); // Testing non-coherent extension with the order of non-fetch program and fetch program
TEST_P(FramebufferFetchES31, DrawNonFetchDrawFetch_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
GLProgram programNonFetch, programFetch;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glActiveShaderProgram(pipeline1, programVert); DrawNonFetchDrawFetchTest(programNonFetch, programFetch);
GLint positionLocation = glGetAttribLocation(programVert, "a_position"); }
render(positionLocation, GL_FALSE);
// Testing coherent extension with the order of fetch program and non-fetch program
TEST_P(FramebufferFetchES31, DrawFetchDrawNonFetch_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
GLProgram programNonFetch, programFetch;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); DrawFetchDrawNonFetchTest(programNonFetch, programFetch);
}
// Testing non-coherent extension with the order of fetch program and non-fetch program
TEST_P(FramebufferFetchES31, DrawFetchDrawNonFetch_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
glUseProgramStages(pipeline2, GL_VERTEX_SHADER_BIT, programVert); GLProgram programNonFetch, programFetch;
glUseProgramStages(pipeline2, GL_FRAGMENT_SHADER_BIT, programFetch); programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
glBindProgramPipeline(pipeline2); programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_1ATTACHMENT));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glActiveShaderProgram(pipeline2, programFetch); DrawFetchDrawNonFetchTest(programNonFetch, programFetch);
float colorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f}; }
GLint colorLocationFetch = glGetUniformLocation(programFetch, "u_color");
glUniform4fv(colorLocationFetch, 1, colorGreen);
render(positionLocation, GL_TRUE); // Testing coherent extension with the order of non-fetch program and fetch program with
// different attachments
TEST_P(FramebufferFetchES31, DrawNonFetchDrawFetchWithDifferentAttachments_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
GLProgram programNonFetch, programFetch;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT1));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); DrawNonFetchDrawFetchWithDifferentAttachmentsTest(programNonFetch, programFetch);
}
// Testing non-coherent extension with the order of non-fetch program and fetch program with
// different attachments
TEST_P(FramebufferFetchES31, DrawNonFetchDrawFetchWithDifferentAttachments_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
glUseProgramStages(pipeline3, GL_VERTEX_SHADER_BIT, programVert); GLProgram programNonFetch, programFetch;
glUseProgramStages(pipeline3, GL_FRAGMENT_SHADER_BIT, programNonFetch); programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
glBindProgramPipeline(pipeline3); programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT1));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glActiveShaderProgram(pipeline3, programNonFetch); DrawNonFetchDrawFetchWithDifferentAttachmentsTest(programNonFetch, programFetch);
colorLocationNonFetch = glGetUniformLocation(programNonFetch, "u_color"); }
glUniform4fv(colorLocationNonFetch, 1, colorRed);
// Testing coherent extension with the order of non-fetch program and fetch with different
// programs
TEST_P(FramebufferFetchES31, DrawNonFetchDrawFetchWithDifferentPrograms_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
GLProgram programNonFetch, programFetch1, programFetch2;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch1.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT1));
programFetch2.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT2));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
render(positionLocation, GL_FALSE); DrawNonFetchDrawFetchWithDifferentProgramsTest(programNonFetch, programFetch1, programFetch2);
}
// Testing non-coherent extension with the order of non-fetch program and fetch with different
// programs
TEST_P(FramebufferFetchES31, DrawNonFetchDrawFetchWithDifferentPrograms_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
GLProgram programNonFetch, programFetch1, programFetch2;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch1.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT1));
programFetch2.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT2));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); DrawNonFetchDrawFetchWithDifferentProgramsTest(programNonFetch, programFetch1, programFetch2);
}
// Testing coherent extension with the order of draw fetch, blit and draw fetch
TEST_P(FramebufferFetchES31, DrawFetchBlitDrawFetch_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
glUseProgramStages(pipeline4, GL_VERTEX_SHADER_BIT, programVert); GLProgram programNonFetch, programFetch;
glUseProgramStages(pipeline4, GL_FRAGMENT_SHADER_BIT, programFetch); programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
glBindProgramPipeline(pipeline4); programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT1));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glActiveShaderProgram(pipeline4, programFetch); DrawFetchBlitDrawFetchTest(programNonFetch, programFetch);
colorLocationFetch = glGetUniformLocation(programFetch, "u_color"); }
glUniform4fv(colorLocationFetch, 1, colorGreen);
render(positionLocation, GL_TRUE); // Testing non-coherent extension with the order of draw fetch, blit and draw fetch
TEST_P(FramebufferFetchES31, DrawFetchBlitDrawFetch_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
GLProgram programNonFetch, programFetch;
programNonFetch.makeRaster(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT));
programFetch.makeRaster(k310VS, getFragmentShader(GLSL310_4ATTACHMENT_DIFFERENT1));
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::yellow); DrawFetchBlitDrawFetchTest(programNonFetch, programFetch);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0); // Testing coherent extension with program pipeline
TEST_P(FramebufferFetchES31, ProgramPipeline_Coherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch"));
setWhichExtension(COHERENT);
ProgramPipelineTest(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT),
getFragmentShader(GLSL310_1ATTACHMENT));
}
// Testing non-coherent extension with program pipeline
TEST_P(FramebufferFetchES31, ProgramPipeline_NonCoherent)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
setWhichExtension(NON_COHERENT);
ProgramPipelineTest(k310VS, getFragmentShader(GLSL310_NO_FETCH_1ATTACHMENT),
getFragmentShader(GLSL310_1ATTACHMENT));
} }
// TODO: http://anglebug.com/5792 // TODO: http://anglebug.com/5792
TEST_P(FramebufferFetchNonCoherentES31, DISABLED_UniformUsageCombinations) TEST_P(FramebufferFetchES31, DISABLED_UniformUsageCombinations)
{ {
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent")); ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
...@@ -1346,7 +1552,7 @@ void main() ...@@ -1346,7 +1552,7 @@ void main()
// Testing that binding the location value using GLES API is conflicted to the location value of the // Testing that binding the location value using GLES API is conflicted to the location value of the
// fragment inout. // fragment inout.
TEST_P(FramebufferFetchNonCoherentES31, FixedUniformLocation) TEST_P(FramebufferFetchES31, FixedUniformLocation)
{ {
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent")); ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch_non_coherent"));
...@@ -1399,6 +1605,6 @@ void main (void) ...@@ -1399,6 +1605,6 @@ void main (void)
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferFetchNonCoherentES31); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferFetchES31);
ANGLE_INSTANTIATE_TEST_ES31(FramebufferFetchNonCoherentES31); ANGLE_INSTANTIATE_TEST_ES31(FramebufferFetchES31);
} // namespace angle } // namespace angle
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