blob: b58c48dda731679ba2d3735c633b2b5a7e8e60c6 [file] [log] [blame]
Jamie Madillfa05f602015-05-07 13:47:11 -04001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Corentin Wallezd3970de2015-05-14 11:07:48 -04007#include "test_utils/ANGLETest.h"
Geoff Lang95663912015-04-02 15:54:45 -04008
Jamie Madillfa05f602015-05-07 13:47:11 -04009using namespace angle;
Geoff Lang95663912015-04-02 15:54:45 -040010
Geoff Lang95663912015-04-02 15:54:45 -040011class FramebufferRenderMipmapTest : public ANGLETest
12{
Jamie Madillfa05f602015-05-07 13:47:11 -040013 protected:
14 FramebufferRenderMipmapTest()
Geoff Lang95663912015-04-02 15:54:45 -040015 {
16 setWindowWidth(256);
17 setWindowHeight(256);
18 setConfigRedBits(8);
19 setConfigGreenBits(8);
20 setConfigBlueBits(8);
21 setConfigAlphaBits(8);
22 }
23
24 virtual void SetUp()
25 {
26 ANGLETest::SetUp();
27
28 const std::string vsSource = SHADER_SOURCE
29 (
30 attribute highp vec4 position;
31 void main(void)
32 {
33 gl_Position = position;
34 }
35 );
36
37 const std::string fsSource = SHADER_SOURCE
38 (
39 uniform highp vec4 color;
40 void main(void)
41 {
42 gl_FragColor = color;
43 }
44 );
45
46 mProgram = CompileProgram(vsSource, fsSource);
47 if (mProgram == 0)
48 {
49 FAIL() << "shader compilation failed.";
50 }
51
52 mColorLocation = glGetUniformLocation(mProgram, "color");
53
54 glUseProgram(mProgram);
55
56 glClearColor(0, 0, 0, 0);
57 glClearDepthf(0.0);
58 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
59
60 glEnable(GL_BLEND);
61 glDisable(GL_DEPTH_TEST);
62
63 ASSERT_GL_NO_ERROR();
64 }
65
66 virtual void TearDown()
67 {
68 glDeleteProgram(mProgram);
69
70 ANGLETest::TearDown();
71 }
72
73 GLuint mProgram;
74 GLint mColorLocation;
75};
76
77// Validate that if we are in ES3 or GL_OES_fbo_render_mipmap exists, there are no validation errors
78// when using a non-zero level in glFramebufferTexture2D.
Jamie Madillfa05f602015-05-07 13:47:11 -040079TEST_P(FramebufferRenderMipmapTest, Validation)
Geoff Lang95663912015-04-02 15:54:45 -040080{
81 bool renderToMipmapSupported = extensionEnabled("GL_OES_fbo_render_mipmap") || getClientVersion() > 2;
82
83 GLuint tex = 0;
84 glGenTextures(1, &tex);
85 glBindTexture(GL_TEXTURE_2D, tex);
86
87 const size_t levels = 5;
88 for (size_t i = 0; i < levels; i++)
89 {
90 size_t size = 1 << ((levels - 1) - i);
Cooper Partin4d61f7e2015-08-12 10:56:50 -070091 glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(i), GL_RGBA, static_cast<GLsizei>(size),
92 static_cast<GLsizei>(size), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
Geoff Lang95663912015-04-02 15:54:45 -040093 }
94
95 EXPECT_GL_NO_ERROR();
96
97 GLuint fbo = 0;
98 glGenFramebuffers(1, &fbo);
99 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
100 EXPECT_GL_NO_ERROR();
101
102 for (size_t i = 0; i < levels; i++)
103 {
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700104 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex,
105 static_cast<GLint>(i));
Geoff Lang95663912015-04-02 15:54:45 -0400106
107 if (i > 0 && !renderToMipmapSupported)
108 {
109 EXPECT_GL_ERROR(GL_INVALID_VALUE);
110 }
111 else
112 {
113 EXPECT_GL_NO_ERROR();
114 EXPECT_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER), GLenum(GL_FRAMEBUFFER_COMPLETE));
115 }
116 }
117
118 glDeleteFramebuffers(1, &fbo);
119 glDeleteTextures(1, &tex);
120}
121
122// Render to various levels of a texture and check that they have the correct color data via ReadPixels
Jamie Madillfa05f602015-05-07 13:47:11 -0400123TEST_P(FramebufferRenderMipmapTest, RenderToMipmap)
Geoff Lang95663912015-04-02 15:54:45 -0400124{
Geoff Lang1a0847c2015-04-08 13:49:31 -0400125 // TODO(geofflang): Figure out why this is broken on Intel OpenGL
126 if (isIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
127 {
128 std::cout << "Test skipped on Intel OpenGL." << std::endl;
129 return;
130 }
131
Geoff Lang95663912015-04-02 15:54:45 -0400132 bool renderToMipmapSupported = extensionEnabled("GL_OES_fbo_render_mipmap") || getClientVersion() > 2;
133 if (!renderToMipmapSupported)
134 {
135 std::cout << "Test skipped because GL_OES_fbo_render_mipmap or ES3 is not available." << std::endl;
136 return;
137 }
138
139 const GLfloat levelColors[] =
140 {
141 1.0f, 0.0f, 0.0f, 1.0f,
142 0.0f, 1.0f, 0.0f, 1.0f,
143 0.0f, 0.0f, 1.0f, 1.0f,
144 1.0f, 1.0f, 0.0f, 1.0f,
145 1.0f, 0.0f, 1.0f, 1.0f,
146 0.0f, 1.0f, 1.0f, 1.0f,
147 };
148 const size_t testLevels = ArraySize(levelColors) / 4;
149
150 GLuint tex = 0;
151 glGenTextures(1, &tex);
152 glBindTexture(GL_TEXTURE_2D, tex);
153
154 for (size_t i = 0; i < testLevels; i++)
155 {
156 size_t size = 1 << ((testLevels - 1) - i);
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700157 glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(i), GL_RGBA, static_cast<GLsizei>(size),
158 static_cast<GLsizei>(size), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
Geoff Lang95663912015-04-02 15:54:45 -0400159 }
160
161 EXPECT_GL_NO_ERROR();
162
163 GLuint fbo = 0;
164 glGenFramebuffers(1, &fbo);
165 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
166 EXPECT_GL_NO_ERROR();
167
168 // Render to the levels of the texture with different colors
169 for (size_t i = 0; i < testLevels; i++)
170 {
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700171 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex,
172 static_cast<GLint>(i));
Geoff Lang95663912015-04-02 15:54:45 -0400173 EXPECT_GL_NO_ERROR();
174
175 glUseProgram(mProgram);
176 glUniform4fv(mColorLocation, 1, levelColors + (i * 4));
177
178 drawQuad(mProgram, "position", 0.5f);
179 EXPECT_GL_NO_ERROR();
180 }
181
182 // Test that the levels of the texture are correct
183 for (size_t i = 0; i < testLevels; i++)
184 {
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700185 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex,
186 static_cast<GLint>(i));
Geoff Lang95663912015-04-02 15:54:45 -0400187 EXPECT_GL_NO_ERROR();
188
189 const GLfloat *color = levelColors + (i * 4);
190 EXPECT_PIXEL_EQ(0, 0, color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255);
191 }
192
193 glDeleteFramebuffers(1, &fbo);
194 glDeleteTextures(1, &tex);
195
196 EXPECT_GL_NO_ERROR();
197}
Jamie Madillfa05f602015-05-07 13:47:11 -0400198
199// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
200ANGLE_INSTANTIATE_TEST(FramebufferRenderMipmapTest, ES2_D3D9(), ES2_D3D11(), ES3_D3D11(), ES2_OPENGL(), ES3_OPENGL());