blob: 52a1e0fb0be340aa4406093a0b9cc582cd49a313 [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
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -070087 const GLint levels = 5;
88 for (GLint i = 0; i < levels; i++)
Geoff Lang95663912015-04-02 15:54:45 -040089 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -070090 GLsizei size = 1 << ((levels - 1) - i);
91 glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
Geoff Lang95663912015-04-02 15:54:45 -040092 }
93
94 EXPECT_GL_NO_ERROR();
95
96 GLuint fbo = 0;
97 glGenFramebuffers(1, &fbo);
98 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
99 EXPECT_GL_NO_ERROR();
100
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700101 for (GLint i = 0; i < levels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400102 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700103 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i);
Geoff Lang95663912015-04-02 15:54:45 -0400104
105 if (i > 0 && !renderToMipmapSupported)
106 {
107 EXPECT_GL_ERROR(GL_INVALID_VALUE);
108 }
109 else
110 {
111 EXPECT_GL_NO_ERROR();
112 EXPECT_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER), GLenum(GL_FRAMEBUFFER_COMPLETE));
113 }
114 }
115
116 glDeleteFramebuffers(1, &fbo);
117 glDeleteTextures(1, &tex);
118}
119
120// 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 -0400121TEST_P(FramebufferRenderMipmapTest, RenderToMipmap)
Geoff Lang95663912015-04-02 15:54:45 -0400122{
Geoff Lang1a0847c2015-04-08 13:49:31 -0400123 // TODO(geofflang): Figure out why this is broken on Intel OpenGL
Jamie Madill518b9fa2016-03-02 11:26:02 -0500124 if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
Geoff Lang1a0847c2015-04-08 13:49:31 -0400125 {
126 std::cout << "Test skipped on Intel OpenGL." << std::endl;
127 return;
128 }
129
Geoff Lang95663912015-04-02 15:54:45 -0400130 bool renderToMipmapSupported = extensionEnabled("GL_OES_fbo_render_mipmap") || getClientVersion() > 2;
131 if (!renderToMipmapSupported)
132 {
133 std::cout << "Test skipped because GL_OES_fbo_render_mipmap or ES3 is not available." << std::endl;
134 return;
135 }
136
137 const GLfloat levelColors[] =
138 {
139 1.0f, 0.0f, 0.0f, 1.0f,
140 0.0f, 1.0f, 0.0f, 1.0f,
141 0.0f, 0.0f, 1.0f, 1.0f,
142 1.0f, 1.0f, 0.0f, 1.0f,
143 1.0f, 0.0f, 1.0f, 1.0f,
144 0.0f, 1.0f, 1.0f, 1.0f,
145 };
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700146 const GLint testLevels = static_cast<GLint>(ArraySize(levelColors) / 4);
Geoff Lang95663912015-04-02 15:54:45 -0400147
148 GLuint tex = 0;
149 glGenTextures(1, &tex);
150 glBindTexture(GL_TEXTURE_2D, tex);
151
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700152 for (GLint i = 0; i < testLevels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400153 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700154 GLsizei size = 1 << ((testLevels - 1) - i);
155 glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
Geoff Lang95663912015-04-02 15:54:45 -0400156 }
157
158 EXPECT_GL_NO_ERROR();
159
160 GLuint fbo = 0;
161 glGenFramebuffers(1, &fbo);
162 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
163 EXPECT_GL_NO_ERROR();
164
165 // Render to the levels of the texture with different colors
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700166 for (GLint i = 0; i < testLevels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400167 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700168 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i);
Geoff Lang95663912015-04-02 15:54:45 -0400169 EXPECT_GL_NO_ERROR();
170
171 glUseProgram(mProgram);
172 glUniform4fv(mColorLocation, 1, levelColors + (i * 4));
173
174 drawQuad(mProgram, "position", 0.5f);
175 EXPECT_GL_NO_ERROR();
176 }
177
178 // Test that the levels of the texture are correct
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700179 for (GLint i = 0; i < testLevels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400180 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700181 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i);
Geoff Lang95663912015-04-02 15:54:45 -0400182 EXPECT_GL_NO_ERROR();
183
184 const GLfloat *color = levelColors + (i * 4);
185 EXPECT_PIXEL_EQ(0, 0, color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255);
186 }
187
188 glDeleteFramebuffers(1, &fbo);
189 glDeleteTextures(1, &tex);
190
191 EXPECT_GL_NO_ERROR();
192}
Jamie Madillfa05f602015-05-07 13:47:11 -0400193
194// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -0500195ANGLE_INSTANTIATE_TEST(FramebufferRenderMipmapTest,
196 ES2_D3D9(),
197 ES2_D3D11(),
198 ES3_D3D11(),
199 ES2_OPENGL(),
200 ES3_OPENGL(),
201 ES2_OPENGLES(),
202 ES3_OPENGLES());