3 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
4 typedef ::testing::Types<TFT<Gles::Two, Rend::D3D9>, TFT<Gles::Two, Rend::D3D11>> TestFixtureTypes;
5 TYPED_TEST_CASE(BlendMinMaxTest, TestFixtureTypes);
8 class BlendMinMaxTest : public ANGLETest
11 BlendMinMaxTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
16 setConfigGreenBits(8);
18 setConfigAlphaBits(8);
19 setConfigDepthBits(24);
30 static GLubyte getExpected(bool blendMin, float curColor, GLubyte prevColor)
32 GLubyte curAsUbyte = (curColor * std::numeric_limits<GLubyte>::max()) + 0.5f;
33 return blendMin ? std::min<GLubyte>(curAsUbyte, prevColor) : std::max<GLubyte>(curAsUbyte, prevColor);
38 const size_t colorCount = 1024;
39 Color colors[colorCount];
40 for (size_t i = 0; i < colorCount; i++)
42 for (size_t j = 0; j < 4; j++)
44 colors[i].values[j] = (rand() % 255) / 255.0f;
49 for (size_t i = 0; i < colorCount; i++)
51 const Color &color = colors[i];
52 glUseProgram(mProgram);
53 glUniform4f(mColorLocation, color.values[0], color.values[1], color.values[2], color.values[3]);
55 bool blendMin = (rand() % 2 == 0);
56 glBlendEquation(blendMin ? GL_MIN : GL_MAX);
58 drawQuad(mProgram, "aPosition", 0.5f);
63 getExpected(blendMin, color.values[0], prevColor[0]),
64 getExpected(blendMin, color.values[1], prevColor[1]),
65 getExpected(blendMin, color.values[2], prevColor[2]),
66 getExpected(blendMin, color.values[3], prevColor[3]));
69 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, prevColor);
77 const std::string testVertexShaderSource = SHADER_SOURCE
79 attribute highp vec4 aPosition;
83 gl_Position = aPosition;
87 const std::string testFragmentShaderSource = SHADER_SOURCE
89 uniform highp vec4 color;
96 mProgram = CompileProgram(testVertexShaderSource, testFragmentShaderSource);
99 FAIL() << "shader compilation failed.";
102 mColorLocation = glGetUniformLocation(mProgram, "color");
104 glUseProgram(mProgram);
106 glClearColor(0, 0, 0, 0);
108 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
111 glDisable(GL_DEPTH_TEST);
114 void SetUpFramebuffer(GLenum colorFormat)
116 glGenFramebuffers(1, &mFramebuffer);
117 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
118 glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
120 glGenRenderbuffers(1, &mColorRenderbuffer);
121 glBindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
122 glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, getWindowWidth(), getWindowHeight());
123 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mColorRenderbuffer);
125 ASSERT_GL_NO_ERROR();
128 virtual void TearDown()
130 glDeleteProgram(mProgram);
131 glDeleteFramebuffers(1, &mFramebuffer);
132 glDeleteRenderbuffers(1, &mColorRenderbuffer);
134 ANGLETest::TearDown();
138 GLint mColorLocation;
141 GLuint mColorRenderbuffer;
144 TYPED_TEST(BlendMinMaxTest, RGBA8)
146 SetUpFramebuffer(GL_RGBA8);
150 TYPED_TEST(BlendMinMaxTest, RGBA32f)
152 SetUpFramebuffer(GL_RGBA32F);
156 TYPED_TEST(BlendMinMaxTest, RGBA16F)
158 SetUpFramebuffer(GL_RGBA16F);