blob: 660b6d64ecc8cd31b154602b3fb6a53f8b28788e [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{
Martin Radev1be913c2016-07-11 17:59:16 +030081 bool renderToMipmapSupported =
82 extensionEnabled("GL_OES_fbo_render_mipmap") || getClientMajorVersion() > 2;
Geoff Lang95663912015-04-02 15:54:45 -040083
84 GLuint tex = 0;
85 glGenTextures(1, &tex);
86 glBindTexture(GL_TEXTURE_2D, tex);
87
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -070088 const GLint levels = 5;
89 for (GLint i = 0; i < levels; i++)
Geoff Lang95663912015-04-02 15:54:45 -040090 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -070091 GLsizei size = 1 << ((levels - 1) - i);
Yunchao Hef81ce4a2017-04-24 10:49:17 +080092 glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
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
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700102 for (GLint i = 0; i < levels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400103 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700104 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i);
Geoff Lang95663912015-04-02 15:54:45 -0400105
106 if (i > 0 && !renderToMipmapSupported)
107 {
108 EXPECT_GL_ERROR(GL_INVALID_VALUE);
109 }
110 else
111 {
112 EXPECT_GL_NO_ERROR();
113 EXPECT_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER), GLenum(GL_FRAMEBUFFER_COMPLETE));
114 }
115 }
116
117 glDeleteFramebuffers(1, &fbo);
118 glDeleteTextures(1, &tex);
119}
120
121// 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 -0400122TEST_P(FramebufferRenderMipmapTest, RenderToMipmap)
Geoff Lang95663912015-04-02 15:54:45 -0400123{
Geoff Lang1a0847c2015-04-08 13:49:31 -0400124 // TODO(geofflang): Figure out why this is broken on Intel OpenGL
Jamie Madill518b9fa2016-03-02 11:26:02 -0500125 if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
Geoff Lang1a0847c2015-04-08 13:49:31 -0400126 {
127 std::cout << "Test skipped on Intel OpenGL." << std::endl;
128 return;
129 }
130
Martin Radev1be913c2016-07-11 17:59:16 +0300131 bool renderToMipmapSupported =
132 extensionEnabled("GL_OES_fbo_render_mipmap") || getClientMajorVersion() > 2;
Geoff Lang95663912015-04-02 15:54:45 -0400133 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 };
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700148 const GLint testLevels = static_cast<GLint>(ArraySize(levelColors) / 4);
Geoff Lang95663912015-04-02 15:54:45 -0400149
150 GLuint tex = 0;
151 glGenTextures(1, &tex);
152 glBindTexture(GL_TEXTURE_2D, tex);
153
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700154 for (GLint i = 0; i < testLevels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400155 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700156 GLsizei size = 1 << ((testLevels - 1) - i);
Yunchao Hef81ce4a2017-04-24 10:49:17 +0800157 glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
Geoff Lang95663912015-04-02 15:54:45 -0400158 }
159
160 EXPECT_GL_NO_ERROR();
161
162 GLuint fbo = 0;
163 glGenFramebuffers(1, &fbo);
164 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
165 EXPECT_GL_NO_ERROR();
166
167 // Render to the levels of the texture with different colors
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700168 for (GLint i = 0; i < testLevels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400169 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700170 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i);
Geoff Lang95663912015-04-02 15:54:45 -0400171 EXPECT_GL_NO_ERROR();
172
173 glUseProgram(mProgram);
174 glUniform4fv(mColorLocation, 1, levelColors + (i * 4));
175
176 drawQuad(mProgram, "position", 0.5f);
177 EXPECT_GL_NO_ERROR();
178 }
179
180 // Test that the levels of the texture are correct
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700181 for (GLint i = 0; i < testLevels; i++)
Geoff Lang95663912015-04-02 15:54:45 -0400182 {
Bruce Dawsone2fcf5c2016-03-30 11:27:12 -0700183 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i);
Geoff Lang95663912015-04-02 15:54:45 -0400184 EXPECT_GL_NO_ERROR();
185
186 const GLfloat *color = levelColors + (i * 4);
187 EXPECT_PIXEL_EQ(0, 0, color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255);
188 }
189
190 glDeleteFramebuffers(1, &fbo);
191 glDeleteTextures(1, &tex);
192
193 EXPECT_GL_NO_ERROR();
194}
Jamie Madillfa05f602015-05-07 13:47:11 -0400195
196// 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 -0500197ANGLE_INSTANTIATE_TEST(FramebufferRenderMipmapTest,
198 ES2_D3D9(),
199 ES2_D3D11(),
200 ES3_D3D11(),
201 ES2_OPENGL(),
202 ES3_OPENGL(),
203 ES2_OPENGLES(),
204 ES3_OPENGLES());