blob: ad68542af1c889c223a7ee88fb9b16a23ce76e64 [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
Jamie Madill14718762016-09-06 15:56:54 -04007#include "common/mathutil.h"
Corentin Wallezd3970de2015-05-14 11:07:48 -04008#include "test_utils/ANGLETest.h"
Olli Etuaho989cac32016-06-08 16:18:49 -07009#include "test_utils/gl_raii.h"
Jamie Madillf67115c2014-04-22 13:14:05 -040010
Jamie Madillfa05f602015-05-07 13:47:11 -040011using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070012
Jamie Madillfa05f602015-05-07 13:47:11 -040013namespace
14{
15
Mohan Maiya6caa2652019-09-11 08:06:13 -070016constexpr GLuint kPixelTolerance = 1u;
17constexpr GLfloat kPixelTolerance32F = 0.01f;
Mohan Maiya8f1169e2019-06-27 15:32:32 -070018
Vincent Lang25ab4512016-05-13 18:13:59 +020019// Take a pixel, and reset the components not covered by the format to default
Geoff Langf607c602016-09-21 11:46:48 -040020// values. In particular, the default value for the alpha component is 255
Vincent Lang25ab4512016-05-13 18:13:59 +020021// (1.0 as unsigned normalized fixed point value).
Mohan Maiya6caa2652019-09-11 08:06:13 -070022// For legacy formats, the components may be reordered to match the color that
23// would be created if a pixel of that format was initialized from the given color
Geoff Langf607c602016-09-21 11:46:48 -040024GLColor SliceFormatColor(GLenum format, GLColor full)
Vincent Lang25ab4512016-05-13 18:13:59 +020025{
26 switch (format)
27 {
28 case GL_RED:
Geoff Langf607c602016-09-21 11:46:48 -040029 return GLColor(full.R, 0, 0, 255u);
Vincent Lang25ab4512016-05-13 18:13:59 +020030 case GL_RG:
Geoff Langf607c602016-09-21 11:46:48 -040031 return GLColor(full.R, full.G, 0, 255u);
Vincent Lang25ab4512016-05-13 18:13:59 +020032 case GL_RGB:
Geoff Langf607c602016-09-21 11:46:48 -040033 return GLColor(full.R, full.G, full.B, 255u);
Vincent Lang25ab4512016-05-13 18:13:59 +020034 case GL_RGBA:
35 return full;
Mohan Maiya6caa2652019-09-11 08:06:13 -070036 case GL_LUMINANCE:
37 return GLColor(full.R, full.R, full.R, 255u);
38 case GL_ALPHA:
39 return GLColor(0, 0, 0, full.R);
40 case GL_LUMINANCE_ALPHA:
41 return GLColor(full.R, full.R, full.R, full.G);
Vincent Lang25ab4512016-05-13 18:13:59 +020042 default:
Jamie Madille1faacb2016-12-13 12:42:14 -050043 EXPECT_TRUE(false);
Geoff Langf607c602016-09-21 11:46:48 -040044 return GLColor::white;
Vincent Lang25ab4512016-05-13 18:13:59 +020045 }
Vincent Lang25ab4512016-05-13 18:13:59 +020046}
47
Mohan Maiya6caa2652019-09-11 08:06:13 -070048// As above, for 32F colors
49GLColor32F SliceFormatColor32F(GLenum format, GLColor32F full)
50{
51 switch (format)
52 {
53 case GL_RED:
54 return GLColor32F(full.R, 0.0f, 0.0f, 1.0f);
55 case GL_RG:
56 return GLColor32F(full.R, full.G, 0.0f, 1.0f);
57 case GL_RGB:
58 return GLColor32F(full.R, full.G, full.B, 1.0f);
59 case GL_RGBA:
60 return full;
61 case GL_LUMINANCE:
62 return GLColor32F(full.R, full.R, full.R, 1.0f);
63 case GL_ALPHA:
64 return GLColor32F(0.0f, 0.0f, 0.0f, full.R);
65 case GL_LUMINANCE_ALPHA:
66 return GLColor32F(full.R, full.R, full.R, full.G);
67 default:
68 EXPECT_TRUE(false);
69 return GLColor32F(1.0f, 1.0f, 1.0f, 1.0f);
70 }
71}
72
Olli Etuaho4a8329f2016-01-11 17:12:57 +020073class TexCoordDrawTest : public ANGLETest
Jamie Madillf67115c2014-04-22 13:14:05 -040074{
Jamie Madillbc393df2015-01-29 13:46:07 -050075 protected:
Olli Etuaho51f1c0f2016-01-13 16:16:24 +020076 TexCoordDrawTest() : ANGLETest(), mProgram(0), mFramebuffer(0), mFramebufferColorTexture(0)
Jamie Madillf67115c2014-04-22 13:14:05 -040077 {
78 setWindowWidth(128);
79 setWindowHeight(128);
80 setConfigRedBits(8);
81 setConfigGreenBits(8);
82 setConfigBlueBits(8);
83 setConfigAlphaBits(8);
84 }
85
Jamie Madill35cd7332018-12-02 12:03:33 -050086 virtual const char *getVertexShaderSource()
Jamie Madillf67115c2014-04-22 13:14:05 -040087 {
Jamie Madill35cd7332018-12-02 12:03:33 -050088 return R"(precision highp float;
89attribute vec4 position;
90varying vec2 texcoord;
Geoff Langc41e42d2014-04-28 10:58:16 -040091
Jamie Madill35cd7332018-12-02 12:03:33 -050092void main()
93{
94 gl_Position = vec4(position.xy, 0.0, 1.0);
95 texcoord = (position.xy * 0.5) + 0.5;
96})";
Olli Etuaho4a8329f2016-01-11 17:12:57 +020097 }
Geoff Langc41e42d2014-04-28 10:58:16 -040098
Jamie Madill35cd7332018-12-02 12:03:33 -050099 virtual const char *getFragmentShaderSource() = 0;
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200100
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300101 virtual void setUpProgram()
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200102 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500103 const char *vertexShaderSource = getVertexShaderSource();
104 const char *fragmentShaderSource = getFragmentShaderSource();
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200105
106 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
107 ASSERT_NE(0u, mProgram);
108 ASSERT_GL_NO_ERROR();
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300109 }
110
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400111 void testSetUp() override { setUpFramebuffer(); }
Olli Etuaho51f1c0f2016-01-13 16:16:24 +0200112
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400113 void testTearDown() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200114 {
Olli Etuaho51f1c0f2016-01-13 16:16:24 +0200115 glBindFramebuffer(GL_FRAMEBUFFER, 0);
116 glDeleteFramebuffers(1, &mFramebuffer);
117 glDeleteTextures(1, &mFramebufferColorTexture);
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200118 glDeleteProgram(mProgram);
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200119 }
120
Olli Etuaho51f1c0f2016-01-13 16:16:24 +0200121 void setUpFramebuffer()
122 {
123 // We use an FBO to work around an issue where the default framebuffer applies SRGB
124 // conversion (particularly known to happen incorrectly on Intel GL drivers). It's not
125 // clear whether this issue can even be fixed on all backends. For example GLES 3.0.4 spec
126 // section 4.4 says that the format of the default framebuffer is entirely up to the window
127 // system, so it might be SRGB, and GLES 3.0 doesn't have a "FRAMEBUFFER_SRGB" to turn off
128 // SRGB conversion like desktop GL does.
129 // TODO(oetuaho): Get rid of this if the underlying issue is fixed.
130 glGenFramebuffers(1, &mFramebuffer);
131 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
132
133 glGenTextures(1, &mFramebufferColorTexture);
134 glBindTexture(GL_TEXTURE_2D, mFramebufferColorTexture);
135 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
136 GL_UNSIGNED_BYTE, nullptr);
137 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
138 mFramebufferColorTexture, 0);
139 ASSERT_GL_NO_ERROR();
140 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
141 glBindTexture(GL_TEXTURE_2D, 0);
142 }
143
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200144 // Returns the created texture ID.
145 GLuint create2DTexture()
146 {
147 GLuint texture2D;
148 glGenTextures(1, &texture2D);
149 glBindTexture(GL_TEXTURE_2D, texture2D);
Yunchao Hef81ce4a2017-04-24 10:49:17 +0800150 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200151 EXPECT_GL_NO_ERROR();
152 return texture2D;
153 }
154
155 GLuint mProgram;
Olli Etuaho51f1c0f2016-01-13 16:16:24 +0200156 GLuint mFramebuffer;
157
158 private:
159 GLuint mFramebufferColorTexture;
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200160};
161
162class Texture2DTest : public TexCoordDrawTest
163{
164 protected:
165 Texture2DTest() : TexCoordDrawTest(), mTexture2D(0), mTexture2DUniformLocation(-1) {}
166
Jamie Madill35cd7332018-12-02 12:03:33 -0500167 const char *getFragmentShaderSource() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200168 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500169 return R"(precision highp float;
170uniform sampler2D tex;
171varying vec2 texcoord;
Geoff Langc41e42d2014-04-28 10:58:16 -0400172
Jamie Madill35cd7332018-12-02 12:03:33 -0500173void main()
174{
175 gl_FragColor = texture2D(tex, texcoord);
176})";
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200177 }
Geoff Langc41e42d2014-04-28 10:58:16 -0400178
Olli Etuaho96963162016-03-21 11:54:33 +0200179 virtual const char *getTextureUniformName() { return "tex"; }
180
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300181 void setUpProgram() override
182 {
183 TexCoordDrawTest::setUpProgram();
184 mTexture2DUniformLocation = glGetUniformLocation(mProgram, getTextureUniformName());
185 ASSERT_NE(-1, mTexture2DUniformLocation);
186 }
187
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400188 void testSetUp() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200189 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400190 TexCoordDrawTest::testSetUp();
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200191 mTexture2D = create2DTexture();
Jamie Madilld4cfa572014-07-08 10:00:32 -0400192
Jamie Madill9aca0592014-10-06 16:26:59 -0400193 ASSERT_GL_NO_ERROR();
Jamie Madillf67115c2014-04-22 13:14:05 -0400194 }
195
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400196 void testTearDown() override
Jamie Madillf67115c2014-04-22 13:14:05 -0400197 {
Jamie Madilld4cfa572014-07-08 10:00:32 -0400198 glDeleteTextures(1, &mTexture2D);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400199 TexCoordDrawTest::testTearDown();
Jamie Madillf67115c2014-04-22 13:14:05 -0400200 }
201
Jamie Madillbc393df2015-01-29 13:46:07 -0500202 // Tests CopyTexSubImage with floating point textures of various formats.
203 void testFloatCopySubImage(int sourceImageChannels, int destImageChannels)
204 {
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300205 setUpProgram();
206
Martin Radev1be913c2016-07-11 17:59:16 +0300207 if (getClientMajorVersion() < 3)
Geoff Langfbfa47c2015-03-31 11:26:00 -0400208 {
Jamie Madillb8149072019-04-30 16:14:44 -0400209 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
210 !IsGLExtensionEnabled("GL_OES_texture_float"));
Geoff Langc4e93662017-05-01 10:45:59 -0400211
Yunchao He9550c602018-02-13 14:47:05 +0800212 ANGLE_SKIP_TEST_IF((sourceImageChannels < 3 || destImageChannels < 3) &&
Jamie Madillb8149072019-04-30 16:14:44 -0400213 !IsGLExtensionEnabled("GL_EXT_texture_rg"));
Geoff Langfbfa47c2015-03-31 11:26:00 -0400214
Yunchao He9550c602018-02-13 14:47:05 +0800215 ANGLE_SKIP_TEST_IF(destImageChannels == 3 &&
Jamie Madillb8149072019-04-30 16:14:44 -0400216 !IsGLExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgb"));
Geoff Lang677bb6f2017-04-05 12:40:40 -0400217
Yunchao He9550c602018-02-13 14:47:05 +0800218 ANGLE_SKIP_TEST_IF(destImageChannels == 4 &&
Jamie Madillb8149072019-04-30 16:14:44 -0400219 !IsGLExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgba"));
Geoff Lang677bb6f2017-04-05 12:40:40 -0400220
Yunchao He9550c602018-02-13 14:47:05 +0800221 ANGLE_SKIP_TEST_IF(destImageChannels <= 2);
Geoff Lang677bb6f2017-04-05 12:40:40 -0400222 }
223 else
224 {
Jamie Madillb8149072019-04-30 16:14:44 -0400225 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_color_buffer_float"));
Geoff Lang677bb6f2017-04-05 12:40:40 -0400226
Yunchao He9550c602018-02-13 14:47:05 +0800227 ANGLE_SKIP_TEST_IF(destImageChannels == 3 &&
Jamie Madillb8149072019-04-30 16:14:44 -0400228 !IsGLExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgb"));
Geoff Langfbfa47c2015-03-31 11:26:00 -0400229 }
230
Jamie Madill50cf2be2018-06-15 09:46:57 -0400231 // clang-format off
Jamie Madillbc393df2015-01-29 13:46:07 -0500232 GLfloat sourceImageData[4][16] =
233 {
234 { // R
235 1.0f,
236 0.0f,
237 0.0f,
238 1.0f
239 },
240 { // RG
241 1.0f, 0.0f,
242 0.0f, 1.0f,
243 0.0f, 0.0f,
244 1.0f, 1.0f
245 },
246 { // RGB
247 1.0f, 0.0f, 0.0f,
248 0.0f, 1.0f, 0.0f,
249 0.0f, 0.0f, 1.0f,
250 1.0f, 1.0f, 0.0f
251 },
252 { // RGBA
253 1.0f, 0.0f, 0.0f, 1.0f,
254 0.0f, 1.0f, 0.0f, 1.0f,
255 0.0f, 0.0f, 1.0f, 1.0f,
256 1.0f, 1.0f, 0.0f, 1.0f
257 },
258 };
Jamie Madill50cf2be2018-06-15 09:46:57 -0400259 // clang-format on
Jamie Madillbc393df2015-01-29 13:46:07 -0500260
Jamie Madill50cf2be2018-06-15 09:46:57 -0400261 GLenum imageFormats[] = {
Jamie Madillb980c562018-11-27 11:34:27 -0500262 GL_R32F,
263 GL_RG32F,
264 GL_RGB32F,
265 GL_RGBA32F,
Jamie Madillbc393df2015-01-29 13:46:07 -0500266 };
267
Jamie Madill50cf2be2018-06-15 09:46:57 -0400268 GLenum sourceUnsizedFormats[] = {
Jamie Madillb980c562018-11-27 11:34:27 -0500269 GL_RED,
270 GL_RG,
271 GL_RGB,
272 GL_RGBA,
Jamie Madillbc393df2015-01-29 13:46:07 -0500273 };
274
275 GLuint textures[2];
276
277 glGenTextures(2, textures);
278
Jamie Madill50cf2be2018-06-15 09:46:57 -0400279 GLfloat *imageData = sourceImageData[sourceImageChannels - 1];
280 GLenum sourceImageFormat = imageFormats[sourceImageChannels - 1];
Jamie Madillbc393df2015-01-29 13:46:07 -0500281 GLenum sourceUnsizedFormat = sourceUnsizedFormats[sourceImageChannels - 1];
Jamie Madill50cf2be2018-06-15 09:46:57 -0400282 GLenum destImageFormat = imageFormats[destImageChannels - 1];
Jamie Madillbc393df2015-01-29 13:46:07 -0500283
284 glBindTexture(GL_TEXTURE_2D, textures[0]);
Geoff Langc4e93662017-05-01 10:45:59 -0400285 if (getClientMajorVersion() >= 3)
286 {
287 glTexStorage2D(GL_TEXTURE_2D, 1, sourceImageFormat, 2, 2);
288 }
289 else
290 {
291 glTexStorage2DEXT(GL_TEXTURE_2D, 1, sourceImageFormat, 2, 2);
292 }
Jamie Madillbc393df2015-01-29 13:46:07 -0500293 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
294 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
295 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, sourceUnsizedFormat, GL_FLOAT, imageData);
296
Jamie Madillb8149072019-04-30 16:14:44 -0400297 if (sourceImageChannels < 3 && !IsGLExtensionEnabled("GL_EXT_texture_rg"))
Jamie Madillbc393df2015-01-29 13:46:07 -0500298 {
299 // This is not supported
300 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
301 }
302 else
303 {
304 ASSERT_GL_NO_ERROR();
305 }
306
307 GLuint fbo;
308 glGenFramebuffers(1, &fbo);
309 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
310 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
311
312 glBindTexture(GL_TEXTURE_2D, textures[1]);
Geoff Langc4e93662017-05-01 10:45:59 -0400313 if (getClientMajorVersion() >= 3)
314 {
315 glTexStorage2D(GL_TEXTURE_2D, 1, destImageFormat, 2, 2);
316 }
317 else
318 {
319 glTexStorage2DEXT(GL_TEXTURE_2D, 1, destImageFormat, 2, 2);
320 }
Jamie Madillbc393df2015-01-29 13:46:07 -0500321 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
322 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
323
324 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2);
325 ASSERT_GL_NO_ERROR();
326
327 glBindFramebuffer(GL_FRAMEBUFFER, 0);
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200328 drawQuad(mProgram, "position", 0.5f);
Jamie Madillbc393df2015-01-29 13:46:07 -0500329
330 int testImageChannels = std::min(sourceImageChannels, destImageChannels);
331
Olli Etuahoa314b612016-03-10 16:43:00 +0200332 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
Jamie Madillbc393df2015-01-29 13:46:07 -0500333 if (testImageChannels > 1)
334 {
335 EXPECT_PIXEL_EQ(getWindowHeight() - 1, 0, 0, 255, 0, 255);
336 EXPECT_PIXEL_EQ(getWindowHeight() - 1, getWindowWidth() - 1, 255, 255, 0, 255);
337 if (testImageChannels > 2)
338 {
339 EXPECT_PIXEL_EQ(0, getWindowWidth() - 1, 0, 0, 255, 255);
340 }
341 }
342
343 glDeleteFramebuffers(1, &fbo);
344 glDeleteTextures(2, textures);
345
346 ASSERT_GL_NO_ERROR();
347 }
348
Jamie Madilld4cfa572014-07-08 10:00:32 -0400349 GLuint mTexture2D;
Jamie Madilld4cfa572014-07-08 10:00:32 -0400350 GLint mTexture2DUniformLocation;
Jamie Madillf67115c2014-04-22 13:14:05 -0400351};
352
Olli Etuahoa7416ff2016-01-18 12:22:55 +0200353class Texture2DTestES3 : public Texture2DTest
354{
355 protected:
356 Texture2DTestES3() : Texture2DTest() {}
357
Jamie Madill35cd7332018-12-02 12:03:33 -0500358 const char *getVertexShaderSource() override
Olli Etuahoa7416ff2016-01-18 12:22:55 +0200359 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500360 return "#version 300 es\n"
361 "out vec2 texcoord;\n"
362 "in vec4 position;\n"
363 "void main()\n"
364 "{\n"
365 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
366 " texcoord = (position.xy * 0.5) + 0.5;\n"
367 "}\n";
Olli Etuahoa7416ff2016-01-18 12:22:55 +0200368 }
369
Jamie Madill35cd7332018-12-02 12:03:33 -0500370 const char *getFragmentShaderSource() override
Olli Etuahoa7416ff2016-01-18 12:22:55 +0200371 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500372 return "#version 300 es\n"
373 "precision highp float;\n"
374 "uniform highp sampler2D tex;\n"
375 "in vec2 texcoord;\n"
376 "out vec4 fragColor;\n"
377 "void main()\n"
378 "{\n"
379 " fragColor = texture(tex, texcoord);\n"
380 "}\n";
Olli Etuahoa7416ff2016-01-18 12:22:55 +0200381 }
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300382
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400383 void testSetUp() override
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300384 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400385 Texture2DTest::testSetUp();
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300386 setUpProgram();
387 }
Olli Etuahoa7416ff2016-01-18 12:22:55 +0200388};
389
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200390class Texture2DIntegerAlpha1TestES3 : public Texture2DTest
391{
392 protected:
393 Texture2DIntegerAlpha1TestES3() : Texture2DTest() {}
394
Jamie Madill35cd7332018-12-02 12:03:33 -0500395 const char *getVertexShaderSource() override
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200396 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500397 return "#version 300 es\n"
398 "out vec2 texcoord;\n"
399 "in vec4 position;\n"
400 "void main()\n"
401 "{\n"
402 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
403 " texcoord = (position.xy * 0.5) + 0.5;\n"
404 "}\n";
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200405 }
406
Jamie Madill35cd7332018-12-02 12:03:33 -0500407 const char *getFragmentShaderSource() override
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200408 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500409 return "#version 300 es\n"
410 "precision highp float;\n"
411 "uniform highp isampler2D tex;\n"
412 "in vec2 texcoord;\n"
413 "out vec4 fragColor;\n"
414 "void main()\n"
415 "{\n"
416 " vec4 green = vec4(0, 1, 0, 1);\n"
417 " vec4 black = vec4(0, 0, 0, 0);\n"
418 " fragColor = (texture(tex, texcoord).a == 1) ? green : black;\n"
419 "}\n";
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200420 }
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300421
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400422 void testSetUp() override
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300423 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400424 Texture2DTest::testSetUp();
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300425 setUpProgram();
426 }
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200427};
428
429class Texture2DUnsignedIntegerAlpha1TestES3 : public Texture2DTest
430{
431 protected:
432 Texture2DUnsignedIntegerAlpha1TestES3() : Texture2DTest() {}
433
Jamie Madill35cd7332018-12-02 12:03:33 -0500434 const char *getVertexShaderSource() override
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200435 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500436 return "#version 300 es\n"
437 "out vec2 texcoord;\n"
438 "in vec4 position;\n"
439 "void main()\n"
440 "{\n"
441 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
442 " texcoord = (position.xy * 0.5) + 0.5;\n"
443 "}\n";
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200444 }
445
Jamie Madill35cd7332018-12-02 12:03:33 -0500446 const char *getFragmentShaderSource() override
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200447 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500448 return "#version 300 es\n"
449 "precision highp float;\n"
450 "uniform highp usampler2D tex;\n"
451 "in vec2 texcoord;\n"
452 "out vec4 fragColor;\n"
453 "void main()\n"
454 "{\n"
455 " vec4 green = vec4(0, 1, 0, 1);\n"
456 " vec4 black = vec4(0, 0, 0, 0);\n"
457 " fragColor = (texture(tex, texcoord).a == 1u) ? green : black;\n"
458 "}\n";
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200459 }
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300460
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400461 void testSetUp() override
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300462 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400463 Texture2DTest::testSetUp();
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300464 setUpProgram();
465 }
Olli Etuaho6ee394a2016-02-18 13:30:09 +0200466};
467
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200468class Texture2DTestWithDrawScale : public Texture2DTest
Jamie Madill2453dbc2015-07-14 11:35:42 -0400469{
470 protected:
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200471 Texture2DTestWithDrawScale() : Texture2DTest(), mDrawScaleUniformLocation(-1) {}
472
Jamie Madill35cd7332018-12-02 12:03:33 -0500473 const char *getVertexShaderSource() override
Jamie Madill2453dbc2015-07-14 11:35:42 -0400474 {
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300475 return
476 R"(precision highp float;
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200477 attribute vec4 position;
478 varying vec2 texcoord;
479
480 uniform vec2 drawScale;
481
482 void main()
483 {
484 gl_Position = vec4(position.xy * drawScale, 0.0, 1.0);
485 texcoord = (position.xy * 0.5) + 0.5;
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300486 })";
Jamie Madill2453dbc2015-07-14 11:35:42 -0400487 }
488
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400489 void testSetUp() override
Jamie Madill2453dbc2015-07-14 11:35:42 -0400490 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400491 Texture2DTest::testSetUp();
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300492
493 setUpProgram();
494
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200495 mDrawScaleUniformLocation = glGetUniformLocation(mProgram, "drawScale");
496 ASSERT_NE(-1, mDrawScaleUniformLocation);
Jamie Madill2453dbc2015-07-14 11:35:42 -0400497
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200498 glUseProgram(mProgram);
499 glUniform2f(mDrawScaleUniformLocation, 1.0f, 1.0f);
500 glUseProgram(0);
501 ASSERT_GL_NO_ERROR();
502 }
503
504 GLint mDrawScaleUniformLocation;
505};
506
Olli Etuaho4644a202016-01-12 15:12:53 +0200507class Sampler2DAsFunctionParameterTest : public Texture2DTest
508{
509 protected:
510 Sampler2DAsFunctionParameterTest() : Texture2DTest() {}
511
Jamie Madill35cd7332018-12-02 12:03:33 -0500512 const char *getFragmentShaderSource() override
Olli Etuaho4644a202016-01-12 15:12:53 +0200513 {
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300514 return
515 R"(precision highp float;
Olli Etuaho4644a202016-01-12 15:12:53 +0200516 uniform sampler2D tex;
517 varying vec2 texcoord;
518
519 vec4 computeFragColor(sampler2D aTex)
520 {
521 return texture2D(aTex, texcoord);
522 }
523
524 void main()
525 {
526 gl_FragColor = computeFragColor(tex);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300527 })";
Olli Etuaho4644a202016-01-12 15:12:53 +0200528 }
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300529
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400530 void testSetUp() override
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300531 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400532 Texture2DTest::testSetUp();
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300533 setUpProgram();
534 }
Olli Etuaho4644a202016-01-12 15:12:53 +0200535};
536
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200537class TextureCubeTest : public TexCoordDrawTest
538{
539 protected:
540 TextureCubeTest()
541 : TexCoordDrawTest(),
542 mTexture2D(0),
543 mTextureCube(0),
544 mTexture2DUniformLocation(-1),
545 mTextureCubeUniformLocation(-1)
Jamie Madillb980c562018-11-27 11:34:27 -0500546 {}
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200547
Jamie Madill35cd7332018-12-02 12:03:33 -0500548 const char *getFragmentShaderSource() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200549 {
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300550 return
551 R"(precision highp float;
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200552 uniform sampler2D tex2D;
553 uniform samplerCube texCube;
554 varying vec2 texcoord;
555
556 void main()
557 {
558 gl_FragColor = texture2D(tex2D, texcoord);
559 gl_FragColor += textureCube(texCube, vec3(texcoord, 0));
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300560 })";
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200561 }
562
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400563 void testSetUp() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200564 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400565 TexCoordDrawTest::testSetUp();
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200566
567 glGenTextures(1, &mTextureCube);
568 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
Geoff Langc4e93662017-05-01 10:45:59 -0400569 for (GLenum face = 0; face < 6; face++)
570 {
571 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, 1, 1, 0, GL_RGBA,
572 GL_UNSIGNED_BYTE, nullptr);
573 }
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200574 EXPECT_GL_NO_ERROR();
575
576 mTexture2D = create2DTexture();
577
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300578 setUpProgram();
579
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200580 mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D");
581 ASSERT_NE(-1, mTexture2DUniformLocation);
582 mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
583 ASSERT_NE(-1, mTextureCubeUniformLocation);
584 }
585
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400586 void testTearDown() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200587 {
588 glDeleteTextures(1, &mTextureCube);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400589 TexCoordDrawTest::testTearDown();
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200590 }
591
592 GLuint mTexture2D;
593 GLuint mTextureCube;
594 GLint mTexture2DUniformLocation;
595 GLint mTextureCubeUniformLocation;
596};
597
Martin Radev7e2c0d32017-09-15 14:25:42 +0300598class TextureCubeTestES3 : public ANGLETest
599{
600 protected:
601 TextureCubeTestES3() {}
602};
603
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200604class SamplerArrayTest : public TexCoordDrawTest
605{
606 protected:
607 SamplerArrayTest()
608 : TexCoordDrawTest(),
609 mTexture2DA(0),
610 mTexture2DB(0),
611 mTexture0UniformLocation(-1),
612 mTexture1UniformLocation(-1)
Jamie Madillb980c562018-11-27 11:34:27 -0500613 {}
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200614
Jamie Madill35cd7332018-12-02 12:03:33 -0500615 const char *getFragmentShaderSource() override
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200616 {
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300617 return
618 R"(precision mediump float;
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200619 uniform highp sampler2D tex2DArray[2];
620 varying vec2 texcoord;
621 void main()
622 {
623 gl_FragColor = texture2D(tex2DArray[0], texcoord);
624 gl_FragColor += texture2D(tex2DArray[1], texcoord);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300625 })";
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200626 }
627
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400628 void testSetUp() override
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200629 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400630 TexCoordDrawTest::testSetUp();
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200631
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300632 setUpProgram();
633
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200634 mTexture0UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[0]");
635 ASSERT_NE(-1, mTexture0UniformLocation);
636 mTexture1UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[1]");
637 ASSERT_NE(-1, mTexture1UniformLocation);
638
639 mTexture2DA = create2DTexture();
640 mTexture2DB = create2DTexture();
641 ASSERT_GL_NO_ERROR();
642 }
643
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400644 void testTearDown() override
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200645 {
646 glDeleteTextures(1, &mTexture2DA);
647 glDeleteTextures(1, &mTexture2DB);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400648 TexCoordDrawTest::testTearDown();
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200649 }
650
651 void testSamplerArrayDraw()
652 {
653 GLubyte texData[4];
654 texData[0] = 0;
655 texData[1] = 60;
656 texData[2] = 0;
657 texData[3] = 255;
658
659 glActiveTexture(GL_TEXTURE0);
660 glBindTexture(GL_TEXTURE_2D, mTexture2DA);
661 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
662
663 texData[1] = 120;
664 glActiveTexture(GL_TEXTURE1);
665 glBindTexture(GL_TEXTURE_2D, mTexture2DB);
666 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
667 EXPECT_GL_ERROR(GL_NO_ERROR);
668
669 glUseProgram(mProgram);
670 glUniform1i(mTexture0UniformLocation, 0);
671 glUniform1i(mTexture1UniformLocation, 1);
672 drawQuad(mProgram, "position", 0.5f);
673 EXPECT_GL_NO_ERROR();
674
675 EXPECT_PIXEL_NEAR(0, 0, 0, 180, 0, 255, 2);
676 }
677
678 GLuint mTexture2DA;
679 GLuint mTexture2DB;
680 GLint mTexture0UniformLocation;
681 GLint mTexture1UniformLocation;
682};
683
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200684class SamplerArrayAsFunctionParameterTest : public SamplerArrayTest
685{
686 protected:
687 SamplerArrayAsFunctionParameterTest() : SamplerArrayTest() {}
688
Jamie Madill35cd7332018-12-02 12:03:33 -0500689 const char *getFragmentShaderSource() override
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200690 {
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300691 return
692 R"(precision mediump float;
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200693 uniform highp sampler2D tex2DArray[2];
694 varying vec2 texcoord;
695
696 vec4 computeFragColor(highp sampler2D aTex2DArray[2])
697 {
698 return texture2D(aTex2DArray[0], texcoord) + texture2D(aTex2DArray[1], texcoord);
699 }
700
701 void main()
702 {
703 gl_FragColor = computeFragColor(tex2DArray);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300704 })";
Olli Etuaho2173db3d2016-01-12 13:55:14 +0200705 }
706};
707
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200708class Texture2DArrayTestES3 : public TexCoordDrawTest
709{
710 protected:
711 Texture2DArrayTestES3() : TexCoordDrawTest(), m2DArrayTexture(0), mTextureArrayLocation(-1) {}
712
Jamie Madill35cd7332018-12-02 12:03:33 -0500713 const char *getVertexShaderSource() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200714 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500715 return "#version 300 es\n"
716 "out vec2 texcoord;\n"
717 "in vec4 position;\n"
718 "void main()\n"
719 "{\n"
720 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
721 " texcoord = (position.xy * 0.5) + 0.5;\n"
722 "}\n";
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200723 }
Jamie Madill2453dbc2015-07-14 11:35:42 -0400724
Jamie Madill35cd7332018-12-02 12:03:33 -0500725 const char *getFragmentShaderSource() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200726 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500727 return "#version 300 es\n"
728 "precision highp float;\n"
729 "uniform highp sampler2DArray tex2DArray;\n"
730 "in vec2 texcoord;\n"
731 "out vec4 fragColor;\n"
732 "void main()\n"
733 "{\n"
734 " fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.y, 0.0));\n"
735 "}\n";
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200736 }
Jamie Madill2453dbc2015-07-14 11:35:42 -0400737
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400738 void testSetUp() override
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200739 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400740 TexCoordDrawTest::testSetUp();
Jamie Madill2453dbc2015-07-14 11:35:42 -0400741
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300742 setUpProgram();
743
Olli Etuaho4a8329f2016-01-11 17:12:57 +0200744 mTextureArrayLocation = glGetUniformLocation(mProgram, "tex2DArray");
Jamie Madill2453dbc2015-07-14 11:35:42 -0400745 ASSERT_NE(-1, mTextureArrayLocation);
746
747 glGenTextures(1, &m2DArrayTexture);
748 ASSERT_GL_NO_ERROR();
749 }
750
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400751 void testTearDown() override
Jamie Madill2453dbc2015-07-14 11:35:42 -0400752 {
753 glDeleteTextures(1, &m2DArrayTexture);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400754 TexCoordDrawTest::testTearDown();
Jamie Madill2453dbc2015-07-14 11:35:42 -0400755 }
756
757 GLuint m2DArrayTexture;
Jamie Madill2453dbc2015-07-14 11:35:42 -0400758 GLint mTextureArrayLocation;
759};
760
Olli Etuahobce743a2016-01-15 17:18:28 +0200761class TextureSizeTextureArrayTest : public TexCoordDrawTest
762{
763 protected:
764 TextureSizeTextureArrayTest()
765 : TexCoordDrawTest(),
766 mTexture2DA(0),
767 mTexture2DB(0),
768 mTexture0Location(-1),
769 mTexture1Location(-1)
Jamie Madillb980c562018-11-27 11:34:27 -0500770 {}
Olli Etuahobce743a2016-01-15 17:18:28 +0200771
Jamie Madill35cd7332018-12-02 12:03:33 -0500772 const char *getVertexShaderSource() override { return essl3_shaders::vs::Simple(); }
Olli Etuahobce743a2016-01-15 17:18:28 +0200773
Jamie Madill35cd7332018-12-02 12:03:33 -0500774 const char *getFragmentShaderSource() override
Olli Etuahobce743a2016-01-15 17:18:28 +0200775 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500776 return "#version 300 es\n"
777 "precision highp float;\n"
778 "uniform highp sampler2D tex2DArray[2];\n"
779 "out vec4 fragColor;\n"
780 "void main()\n"
781 "{\n"
782 " float red = float(textureSize(tex2DArray[0], 0).x) / 255.0;\n"
783 " float green = float(textureSize(tex2DArray[1], 0).x) / 255.0;\n"
784 " fragColor = vec4(red, green, 0.0, 1.0);\n"
785 "}\n";
Olli Etuahobce743a2016-01-15 17:18:28 +0200786 }
787
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400788 void testSetUp() override
Olli Etuahobce743a2016-01-15 17:18:28 +0200789 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400790 TexCoordDrawTest::testSetUp();
Olli Etuahobce743a2016-01-15 17:18:28 +0200791
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300792 setUpProgram();
793
Olli Etuahobce743a2016-01-15 17:18:28 +0200794 mTexture0Location = glGetUniformLocation(mProgram, "tex2DArray[0]");
795 ASSERT_NE(-1, mTexture0Location);
796 mTexture1Location = glGetUniformLocation(mProgram, "tex2DArray[1]");
797 ASSERT_NE(-1, mTexture1Location);
798
799 mTexture2DA = create2DTexture();
800 mTexture2DB = create2DTexture();
801 ASSERT_GL_NO_ERROR();
802 }
803
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400804 void testTearDown() override
Olli Etuahobce743a2016-01-15 17:18:28 +0200805 {
806 glDeleteTextures(1, &mTexture2DA);
807 glDeleteTextures(1, &mTexture2DB);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400808 TexCoordDrawTest::testTearDown();
Olli Etuahobce743a2016-01-15 17:18:28 +0200809 }
810
811 GLuint mTexture2DA;
812 GLuint mTexture2DB;
813 GLint mTexture0Location;
814 GLint mTexture1Location;
815};
816
Olli Etuahoa314b612016-03-10 16:43:00 +0200817class Texture3DTestES3 : public TexCoordDrawTest
818{
819 protected:
820 Texture3DTestES3() : TexCoordDrawTest(), mTexture3D(0), mTexture3DUniformLocation(-1) {}
821
Jamie Madill35cd7332018-12-02 12:03:33 -0500822 const char *getVertexShaderSource() override
Olli Etuahoa314b612016-03-10 16:43:00 +0200823 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500824 return "#version 300 es\n"
825 "out vec2 texcoord;\n"
826 "in vec4 position;\n"
827 "void main()\n"
828 "{\n"
829 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
830 " texcoord = (position.xy * 0.5) + 0.5;\n"
831 "}\n";
Olli Etuahoa314b612016-03-10 16:43:00 +0200832 }
833
Jamie Madill35cd7332018-12-02 12:03:33 -0500834 const char *getFragmentShaderSource() override
Olli Etuahoa314b612016-03-10 16:43:00 +0200835 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500836 return "#version 300 es\n"
837 "precision highp float;\n"
838 "uniform highp sampler3D tex3D;\n"
839 "in vec2 texcoord;\n"
840 "out vec4 fragColor;\n"
841 "void main()\n"
842 "{\n"
843 " fragColor = texture(tex3D, vec3(texcoord, 0.0));\n"
844 "}\n";
Olli Etuahoa314b612016-03-10 16:43:00 +0200845 }
846
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400847 void testSetUp() override
Olli Etuahoa314b612016-03-10 16:43:00 +0200848 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400849 TexCoordDrawTest::testSetUp();
Olli Etuahoa314b612016-03-10 16:43:00 +0200850
851 glGenTextures(1, &mTexture3D);
852
853 setUpProgram();
854
855 mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D");
856 ASSERT_NE(-1, mTexture3DUniformLocation);
857 }
858
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400859 void testTearDown() override
Olli Etuahoa314b612016-03-10 16:43:00 +0200860 {
861 glDeleteTextures(1, &mTexture3D);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400862 TexCoordDrawTest::testTearDown();
Olli Etuahoa314b612016-03-10 16:43:00 +0200863 }
864
865 GLuint mTexture3D;
866 GLint mTexture3DUniformLocation;
867};
868
Olli Etuaho1a679902016-01-14 12:21:47 +0200869class ShadowSamplerPlusSampler3DTestES3 : public TexCoordDrawTest
870{
871 protected:
872 ShadowSamplerPlusSampler3DTestES3()
873 : TexCoordDrawTest(),
874 mTextureShadow(0),
875 mTexture3D(0),
876 mTextureShadowUniformLocation(-1),
877 mTexture3DUniformLocation(-1),
878 mDepthRefUniformLocation(-1)
Jamie Madillb980c562018-11-27 11:34:27 -0500879 {}
Olli Etuaho1a679902016-01-14 12:21:47 +0200880
Jamie Madill35cd7332018-12-02 12:03:33 -0500881 const char *getVertexShaderSource() override
Olli Etuaho1a679902016-01-14 12:21:47 +0200882 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500883 return "#version 300 es\n"
884 "out vec2 texcoord;\n"
885 "in vec4 position;\n"
886 "void main()\n"
887 "{\n"
888 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
889 " texcoord = (position.xy * 0.5) + 0.5;\n"
890 "}\n";
Olli Etuaho1a679902016-01-14 12:21:47 +0200891 }
892
Jamie Madill35cd7332018-12-02 12:03:33 -0500893 const char *getFragmentShaderSource() override
Olli Etuaho1a679902016-01-14 12:21:47 +0200894 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500895 return "#version 300 es\n"
896 "precision highp float;\n"
897 "uniform highp sampler2DShadow tex2DShadow;\n"
898 "uniform highp sampler3D tex3D;\n"
899 "in vec2 texcoord;\n"
900 "uniform float depthRef;\n"
901 "out vec4 fragColor;\n"
902 "void main()\n"
903 "{\n"
904 " fragColor = vec4(texture(tex2DShadow, vec3(texcoord, depthRef)) * 0.5);\n"
905 " fragColor += texture(tex3D, vec3(texcoord, 0.0));\n"
906 "}\n";
Olli Etuaho1a679902016-01-14 12:21:47 +0200907 }
908
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400909 void testSetUp() override
Olli Etuaho1a679902016-01-14 12:21:47 +0200910 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400911 TexCoordDrawTest::testSetUp();
Olli Etuaho1a679902016-01-14 12:21:47 +0200912
913 glGenTextures(1, &mTexture3D);
914
915 glGenTextures(1, &mTextureShadow);
916 glBindTexture(GL_TEXTURE_2D, mTextureShadow);
917 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
918
Olli Etuahoa1c917f2016-04-06 13:50:03 +0300919 setUpProgram();
920
Olli Etuaho1a679902016-01-14 12:21:47 +0200921 mTextureShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow");
922 ASSERT_NE(-1, mTextureShadowUniformLocation);
923 mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D");
924 ASSERT_NE(-1, mTexture3DUniformLocation);
925 mDepthRefUniformLocation = glGetUniformLocation(mProgram, "depthRef");
926 ASSERT_NE(-1, mDepthRefUniformLocation);
927 }
928
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400929 void testTearDown() override
Olli Etuaho1a679902016-01-14 12:21:47 +0200930 {
931 glDeleteTextures(1, &mTextureShadow);
932 glDeleteTextures(1, &mTexture3D);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400933 TexCoordDrawTest::testTearDown();
Olli Etuaho1a679902016-01-14 12:21:47 +0200934 }
935
936 GLuint mTextureShadow;
937 GLuint mTexture3D;
938 GLint mTextureShadowUniformLocation;
939 GLint mTexture3DUniformLocation;
940 GLint mDepthRefUniformLocation;
941};
942
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200943class SamplerTypeMixTestES3 : public TexCoordDrawTest
944{
945 protected:
946 SamplerTypeMixTestES3()
947 : TexCoordDrawTest(),
948 mTexture2D(0),
949 mTextureCube(0),
950 mTexture2DShadow(0),
951 mTextureCubeShadow(0),
952 mTexture2DUniformLocation(-1),
953 mTextureCubeUniformLocation(-1),
954 mTexture2DShadowUniformLocation(-1),
955 mTextureCubeShadowUniformLocation(-1),
956 mDepthRefUniformLocation(-1)
Jamie Madillb980c562018-11-27 11:34:27 -0500957 {}
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200958
Jamie Madill35cd7332018-12-02 12:03:33 -0500959 const char *getVertexShaderSource() override
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200960 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500961 return "#version 300 es\n"
962 "out vec2 texcoord;\n"
963 "in vec4 position;\n"
964 "void main()\n"
965 "{\n"
966 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
967 " texcoord = (position.xy * 0.5) + 0.5;\n"
968 "}\n";
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200969 }
970
Jamie Madill35cd7332018-12-02 12:03:33 -0500971 const char *getFragmentShaderSource() override
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200972 {
Jamie Madill35cd7332018-12-02 12:03:33 -0500973 return "#version 300 es\n"
974 "precision highp float;\n"
975 "uniform highp sampler2D tex2D;\n"
976 "uniform highp samplerCube texCube;\n"
977 "uniform highp sampler2DShadow tex2DShadow;\n"
978 "uniform highp samplerCubeShadow texCubeShadow;\n"
979 "in vec2 texcoord;\n"
980 "uniform float depthRef;\n"
981 "out vec4 fragColor;\n"
982 "void main()\n"
983 "{\n"
984 " fragColor = texture(tex2D, texcoord);\n"
985 " fragColor += texture(texCube, vec3(1.0, 0.0, 0.0));\n"
986 " fragColor += vec4(texture(tex2DShadow, vec3(texcoord, depthRef)) * 0.25);\n"
987 " fragColor += vec4(texture(texCubeShadow, vec4(1.0, 0.0, 0.0, depthRef)) * "
988 "0.125);\n"
989 "}\n";
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200990 }
991
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400992 void testSetUp() override
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200993 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -0400994 TexCoordDrawTest::testSetUp();
Olli Etuahoc8c99a02016-01-14 16:47:22 +0200995
996 glGenTextures(1, &mTexture2D);
997 glGenTextures(1, &mTextureCube);
998
999 glGenTextures(1, &mTexture2DShadow);
1000 glBindTexture(GL_TEXTURE_2D, mTexture2DShadow);
1001 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1002
1003 glGenTextures(1, &mTextureCubeShadow);
1004 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow);
1005 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1006
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001007 setUpProgram();
1008
Olli Etuahoc8c99a02016-01-14 16:47:22 +02001009 mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D");
1010 ASSERT_NE(-1, mTexture2DUniformLocation);
1011 mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
1012 ASSERT_NE(-1, mTextureCubeUniformLocation);
1013 mTexture2DShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow");
1014 ASSERT_NE(-1, mTexture2DShadowUniformLocation);
1015 mTextureCubeShadowUniformLocation = glGetUniformLocation(mProgram, "texCubeShadow");
1016 ASSERT_NE(-1, mTextureCubeShadowUniformLocation);
1017 mDepthRefUniformLocation = glGetUniformLocation(mProgram, "depthRef");
1018 ASSERT_NE(-1, mDepthRefUniformLocation);
1019
1020 ASSERT_GL_NO_ERROR();
1021 }
1022
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04001023 void testTearDown() override
Olli Etuahoc8c99a02016-01-14 16:47:22 +02001024 {
1025 glDeleteTextures(1, &mTexture2D);
1026 glDeleteTextures(1, &mTextureCube);
1027 glDeleteTextures(1, &mTexture2DShadow);
1028 glDeleteTextures(1, &mTextureCubeShadow);
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04001029 TexCoordDrawTest::testTearDown();
Olli Etuahoc8c99a02016-01-14 16:47:22 +02001030 }
1031
1032 GLuint mTexture2D;
1033 GLuint mTextureCube;
1034 GLuint mTexture2DShadow;
1035 GLuint mTextureCubeShadow;
1036 GLint mTexture2DUniformLocation;
1037 GLint mTextureCubeUniformLocation;
1038 GLint mTexture2DShadowUniformLocation;
1039 GLint mTextureCubeShadowUniformLocation;
1040 GLint mDepthRefUniformLocation;
1041};
1042
Olli Etuaho96963162016-03-21 11:54:33 +02001043class SamplerInStructTest : public Texture2DTest
1044{
1045 protected:
1046 SamplerInStructTest() : Texture2DTest() {}
1047
1048 const char *getTextureUniformName() override { return "us.tex"; }
1049
Jamie Madill35cd7332018-12-02 12:03:33 -05001050 const char *getFragmentShaderSource() override
Olli Etuaho96963162016-03-21 11:54:33 +02001051 {
Jamie Madill35cd7332018-12-02 12:03:33 -05001052 return "precision highp float;\n"
1053 "struct S\n"
1054 "{\n"
1055 " vec4 a;\n"
1056 " highp sampler2D tex;\n"
1057 "};\n"
1058 "uniform S us;\n"
1059 "varying vec2 texcoord;\n"
1060 "void main()\n"
1061 "{\n"
1062 " gl_FragColor = texture2D(us.tex, texcoord + us.a.x);\n"
1063 "}\n";
Olli Etuaho96963162016-03-21 11:54:33 +02001064 }
1065
1066 void runSamplerInStructTest()
1067 {
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001068 setUpProgram();
1069
Olli Etuaho96963162016-03-21 11:54:33 +02001070 glActiveTexture(GL_TEXTURE0);
1071 glBindTexture(GL_TEXTURE_2D, mTexture2D);
Olli Etuahoa314b612016-03-10 16:43:00 +02001072 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1073 &GLColor::green);
Olli Etuaho96963162016-03-21 11:54:33 +02001074 drawQuad(mProgram, "position", 0.5f);
Olli Etuahoa314b612016-03-10 16:43:00 +02001075 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Olli Etuaho96963162016-03-21 11:54:33 +02001076 }
1077};
1078
1079class SamplerInStructAsFunctionParameterTest : public SamplerInStructTest
1080{
1081 protected:
1082 SamplerInStructAsFunctionParameterTest() : SamplerInStructTest() {}
1083
Jamie Madill35cd7332018-12-02 12:03:33 -05001084 const char *getFragmentShaderSource() override
Olli Etuaho96963162016-03-21 11:54:33 +02001085 {
Jamie Madill35cd7332018-12-02 12:03:33 -05001086 return "precision highp float;\n"
1087 "struct S\n"
1088 "{\n"
1089 " vec4 a;\n"
1090 " highp sampler2D tex;\n"
1091 "};\n"
1092 "uniform S us;\n"
1093 "varying vec2 texcoord;\n"
1094 "vec4 sampleFrom(S s) {\n"
1095 " return texture2D(s.tex, texcoord + s.a.x);\n"
1096 "}\n"
1097 "void main()\n"
1098 "{\n"
1099 " gl_FragColor = sampleFrom(us);\n"
1100 "}\n";
Olli Etuaho96963162016-03-21 11:54:33 +02001101 }
1102};
1103
1104class SamplerInStructArrayAsFunctionParameterTest : public SamplerInStructTest
1105{
1106 protected:
1107 SamplerInStructArrayAsFunctionParameterTest() : SamplerInStructTest() {}
1108
1109 const char *getTextureUniformName() override { return "us[0].tex"; }
1110
Jamie Madill35cd7332018-12-02 12:03:33 -05001111 const char *getFragmentShaderSource() override
Olli Etuaho96963162016-03-21 11:54:33 +02001112 {
Jamie Madill35cd7332018-12-02 12:03:33 -05001113 return "precision highp float;\n"
1114 "struct S\n"
1115 "{\n"
1116 " vec4 a;\n"
1117 " highp sampler2D tex;\n"
1118 "};\n"
1119 "uniform S us[1];\n"
1120 "varying vec2 texcoord;\n"
1121 "vec4 sampleFrom(S s) {\n"
1122 " return texture2D(s.tex, texcoord + s.a.x);\n"
1123 "}\n"
1124 "void main()\n"
1125 "{\n"
1126 " gl_FragColor = sampleFrom(us[0]);\n"
1127 "}\n";
Olli Etuaho96963162016-03-21 11:54:33 +02001128 }
1129};
1130
1131class SamplerInNestedStructAsFunctionParameterTest : public SamplerInStructTest
1132{
1133 protected:
1134 SamplerInNestedStructAsFunctionParameterTest() : SamplerInStructTest() {}
1135
1136 const char *getTextureUniformName() override { return "us[0].sub.tex"; }
1137
Jamie Madill35cd7332018-12-02 12:03:33 -05001138 const char *getFragmentShaderSource() override
Olli Etuaho96963162016-03-21 11:54:33 +02001139 {
Jamie Madill35cd7332018-12-02 12:03:33 -05001140 return "precision highp float;\n"
1141 "struct SUB\n"
1142 "{\n"
1143 " vec4 a;\n"
1144 " highp sampler2D tex;\n"
1145 "};\n"
1146 "struct S\n"
1147 "{\n"
1148 " SUB sub;\n"
1149 "};\n"
1150 "uniform S us[1];\n"
1151 "varying vec2 texcoord;\n"
1152 "vec4 sampleFrom(SUB s) {\n"
1153 " return texture2D(s.tex, texcoord + s.a.x);\n"
1154 "}\n"
1155 "void main()\n"
1156 "{\n"
1157 " gl_FragColor = sampleFrom(us[0].sub);\n"
1158 "}\n";
Olli Etuaho96963162016-03-21 11:54:33 +02001159 }
1160};
1161
1162class SamplerInStructAndOtherVariableTest : public SamplerInStructTest
1163{
1164 protected:
1165 SamplerInStructAndOtherVariableTest() : SamplerInStructTest() {}
1166
Jamie Madill35cd7332018-12-02 12:03:33 -05001167 const char *getFragmentShaderSource() override
Olli Etuaho96963162016-03-21 11:54:33 +02001168 {
Jamie Madill35cd7332018-12-02 12:03:33 -05001169 return "precision highp float;\n"
1170 "struct S\n"
1171 "{\n"
1172 " vec4 a;\n"
1173 " highp sampler2D tex;\n"
1174 "};\n"
1175 "uniform S us;\n"
1176 "uniform float us_tex;\n"
1177 "varying vec2 texcoord;\n"
1178 "void main()\n"
1179 "{\n"
1180 " gl_FragColor = texture2D(us.tex, texcoord + us.a.x + us_tex);\n"
1181 "}\n";
Olli Etuaho96963162016-03-21 11:54:33 +02001182 }
1183};
1184
Anders Leinof6cbe442019-04-18 15:32:07 +03001185class Texture2DIntegerTestES3 : public Texture2DTest
1186{
1187 protected:
1188 Texture2DIntegerTestES3() : Texture2DTest() {}
1189
1190 const char *getVertexShaderSource() override
1191 {
1192 return "#version 300 es\n"
1193 "out vec2 texcoord;\n"
1194 "in vec4 position;\n"
1195 "void main()\n"
1196 "{\n"
1197 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1198 " texcoord = (position.xy * 0.5) + 0.5;\n"
1199 "}\n";
1200 }
1201
1202 const char *getFragmentShaderSource() override
1203 {
1204 return "#version 300 es\n"
1205 "precision highp float;\n"
1206 "precision highp usampler2D;\n"
1207 "uniform usampler2D tex;\n"
1208 "in vec2 texcoord;\n"
1209 "out vec4 fragColor;\n"
1210 "void main()\n"
1211 "{\n"
Anders Leino8224a582019-05-20 12:39:29 +03001212 " fragColor = vec4(texture(tex, texcoord))/255.0;\n"
Anders Leinof6cbe442019-04-18 15:32:07 +03001213 "}\n";
1214 }
1215};
1216
Anders Leino60cc7512019-05-06 09:25:27 +03001217class TextureCubeIntegerTestES3 : public TexCoordDrawTest
1218{
1219 protected:
1220 TextureCubeIntegerTestES3()
1221 : TexCoordDrawTest(), mTextureCube(0), mTextureCubeUniformLocation(-1)
1222 {}
1223
1224 const char *getVertexShaderSource() override
1225 {
1226 return "#version 300 es\n"
1227 "out vec2 texcoord;\n"
1228 "in vec4 position;\n"
1229 "void main()\n"
1230 "{\n"
1231 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1232 " texcoord = 0.5*position.xy;\n"
1233 "}\n";
1234 }
1235
1236 const char *getFragmentShaderSource() override
1237 {
1238 return "#version 300 es\n"
1239 "precision highp float;\n"
1240 "precision highp usamplerCube;\n"
1241 "uniform usamplerCube texCube;\n"
1242 "in vec2 texcoord;\n"
1243 "out vec4 fragColor;\n"
1244 "void main()\n"
1245 "{\n"
1246 " fragColor = vec4(texture(texCube, vec3(texcoord, 1)))/255.0;\n"
1247 "}\n";
1248 }
1249
1250 void testSetUp() override
1251 {
1252 TexCoordDrawTest::testSetUp();
1253 glGenTextures(1, &mTextureCube);
1254 setUpProgram();
1255
1256 mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
1257 ASSERT_NE(-1, mTextureCubeUniformLocation);
1258 }
1259
1260 void testTearDown() override
1261 {
1262 glDeleteTextures(1, &mTextureCube);
1263 TexCoordDrawTest::testTearDown();
1264 }
1265
1266 GLuint mTextureCube;
1267 GLint mTextureCubeUniformLocation;
1268};
1269
Anders Leinoe4452442019-05-09 13:29:49 +03001270class TextureCubeIntegerEdgeTestES3 : public TextureCubeIntegerTestES3
1271{
1272 protected:
1273 TextureCubeIntegerEdgeTestES3() : TextureCubeIntegerTestES3() {}
1274
1275 const char *getVertexShaderSource() override
1276 {
1277 return "#version 300 es\n"
1278 "out vec2 texcoord;\n"
1279 "in vec4 position;\n"
1280 "void main()\n"
1281 "{\n"
1282 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1283 " texcoord = position.xy;\n"
1284 "}\n";
1285 }
1286
1287 const char *getFragmentShaderSource() override
1288 {
1289 return "#version 300 es\n"
1290 "precision highp float;\n"
1291 "precision highp usamplerCube;\n"
1292 "uniform usamplerCube texCube;\n"
1293 "in vec2 texcoord;\n"
1294 "out vec4 fragColor;\n"
1295 "void main()\n"
1296 "{\n"
1297 " fragColor = vec4(texture(texCube, vec3(texcoord, 0)))/255.0;\n"
1298 "}\n";
1299 }
1300};
1301
Anders Leino1b6aded2019-05-20 12:56:34 +03001302class Texture2DIntegerProjectiveOffsetTestES3 : public Texture2DTest
1303{
1304 protected:
1305 Texture2DIntegerProjectiveOffsetTestES3() : Texture2DTest() {}
1306
1307 const char *getVertexShaderSource() override
1308 {
1309 return "#version 300 es\n"
1310 "out vec2 texcoord;\n"
1311 "in vec4 position;\n"
1312 "void main()\n"
1313 "{\n"
1314 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1315 " texcoord = 0.5*position.xy + vec2(0.5, 0.5);\n"
1316 "}\n";
1317 }
1318
1319 const char *getFragmentShaderSource() override
1320 {
1321 return "#version 300 es\n"
1322 "precision highp float;\n"
1323 "precision highp usampler2D;\n"
1324 "uniform usampler2D tex;\n"
1325 "in vec2 texcoord;\n"
1326 "out vec4 fragColor;\n"
1327 "void main()\n"
1328 "{\n"
1329 " fragColor = vec4(textureProjOffset(tex, vec3(texcoord, 1), ivec2(0,0), "
1330 "0.0))/255.0;\n"
1331 "}\n";
1332 }
1333};
1334
Anders Leino69d04932019-05-20 14:04:13 +03001335class Texture2DArrayIntegerTestES3 : public Texture2DArrayTestES3
1336{
1337 protected:
1338 Texture2DArrayIntegerTestES3() : Texture2DArrayTestES3() {}
1339
1340 const char *getVertexShaderSource() override
1341 {
1342 return "#version 300 es\n"
1343 "out vec2 texcoord;\n"
1344 "in vec4 position;\n"
1345 "void main()\n"
1346 "{\n"
1347 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1348 " texcoord = (position.xy * 0.5) + 0.5;\n"
1349 "}\n";
1350 }
1351
1352 const char *getFragmentShaderSource() override
1353 {
1354 return "#version 300 es\n"
1355 "precision highp float;\n"
1356 "uniform highp usampler2DArray tex2DArray;\n"
1357 "in vec2 texcoord;\n"
1358 "out vec4 fragColor;\n"
1359 "void main()\n"
1360 "{\n"
1361 " fragColor = vec4(texture(tex2DArray, vec3(texcoord.x, texcoord.y, "
1362 "0.0)))/255.0;\n"
1363 "}\n";
1364 }
1365};
1366
Anders Leino262e2822019-05-20 14:24:40 +03001367class Texture3DIntegerTestES3 : public Texture3DTestES3
1368{
1369 protected:
1370 Texture3DIntegerTestES3() : Texture3DTestES3() {}
1371
1372 const char *getVertexShaderSource() override
1373 {
1374 return "#version 300 es\n"
1375 "out vec2 texcoord;\n"
1376 "in vec4 position;\n"
1377 "void main()\n"
1378 "{\n"
1379 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1380 " texcoord = (position.xy * 0.5) + 0.5;\n"
1381 "}\n";
1382 }
1383
1384 const char *getFragmentShaderSource() override
1385 {
1386 return "#version 300 es\n"
1387 "precision highp float;\n"
1388 "uniform highp usampler3D tex3D;\n"
1389 "in vec2 texcoord;\n"
1390 "out vec4 fragColor;\n"
1391 "void main()\n"
1392 "{\n"
1393 " fragColor = vec4(texture(tex3D, vec3(texcoord, 0.0)))/255.0;\n"
1394 "}\n";
1395 }
1396};
1397
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001398TEST_P(Texture2DTest, NegativeAPISubImage)
Jamie Madillf67115c2014-04-22 13:14:05 -04001399{
Jamie Madilld4cfa572014-07-08 10:00:32 -04001400 glBindTexture(GL_TEXTURE_2D, mTexture2D);
Jamie Madillf67115c2014-04-22 13:14:05 -04001401 EXPECT_GL_ERROR(GL_NO_ERROR);
1402
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001403 setUpProgram();
1404
Jamie Madill50cf2be2018-06-15 09:46:57 -04001405 const GLubyte *pixels[20] = {0};
Jamie Madillf67115c2014-04-22 13:14:05 -04001406 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1407 EXPECT_GL_ERROR(GL_INVALID_VALUE);
Geoff Langc51642b2016-11-14 16:18:26 -05001408
Jamie Madillb8149072019-04-30 16:14:44 -04001409 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
Geoff Langc51642b2016-11-14 16:18:26 -05001410 {
1411 // Create a 1-level immutable texture.
1412 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
1413
1414 // Try calling sub image on the second level.
1415 glTexSubImage2D(GL_TEXTURE_2D, 1, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1416 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1417 }
Jamie Madillf67115c2014-04-22 13:14:05 -04001418}
Geoff Langc41e42d2014-04-28 10:58:16 -04001419
John Bauman18319182016-09-28 14:22:27 -07001420// Test that querying GL_TEXTURE_BINDING* doesn't cause an unexpected error.
1421TEST_P(Texture2DTest, QueryBinding)
1422{
1423 glBindTexture(GL_TEXTURE_2D, 0);
1424 EXPECT_GL_ERROR(GL_NO_ERROR);
1425
1426 GLint textureBinding;
1427 glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding);
1428 EXPECT_GL_NO_ERROR();
1429 EXPECT_EQ(0, textureBinding);
1430
1431 glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &textureBinding);
Jamie Madillb8149072019-04-30 16:14:44 -04001432 if (IsGLExtensionEnabled("GL_OES_EGL_image_external") ||
1433 IsGLExtensionEnabled("GL_NV_EGL_stream_consumer_external"))
John Bauman18319182016-09-28 14:22:27 -07001434 {
1435 EXPECT_GL_NO_ERROR();
1436 EXPECT_EQ(0, textureBinding);
1437 }
1438 else
1439 {
1440 EXPECT_GL_ERROR(GL_INVALID_ENUM);
1441 }
1442}
1443
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001444TEST_P(Texture2DTest, ZeroSizedUploads)
Geoff Langc41e42d2014-04-28 10:58:16 -04001445{
Jamie Madilld4cfa572014-07-08 10:00:32 -04001446 glBindTexture(GL_TEXTURE_2D, mTexture2D);
Geoff Langc41e42d2014-04-28 10:58:16 -04001447 EXPECT_GL_ERROR(GL_NO_ERROR);
1448
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001449 setUpProgram();
1450
Geoff Langc41e42d2014-04-28 10:58:16 -04001451 // Use the texture first to make sure it's in video memory
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001452 glUseProgram(mProgram);
Jamie Madilld4cfa572014-07-08 10:00:32 -04001453 glUniform1i(mTexture2DUniformLocation, 0);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001454 drawQuad(mProgram, "position", 0.5f);
Geoff Langc41e42d2014-04-28 10:58:16 -04001455
Jamie Madill50cf2be2018-06-15 09:46:57 -04001456 const GLubyte *pixel[4] = {0};
Geoff Langc41e42d2014-04-28 10:58:16 -04001457
1458 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
1459 EXPECT_GL_NO_ERROR();
1460
1461 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
1462 EXPECT_GL_NO_ERROR();
1463
1464 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
1465 EXPECT_GL_NO_ERROR();
1466}
Jamie Madilld4cfa572014-07-08 10:00:32 -04001467
1468// Test drawing with two texture types, to trigger an ANGLE bug in validation
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001469TEST_P(TextureCubeTest, CubeMapBug)
Jamie Madilld4cfa572014-07-08 10:00:32 -04001470{
1471 glActiveTexture(GL_TEXTURE0);
1472 glBindTexture(GL_TEXTURE_2D, mTexture2D);
1473 glActiveTexture(GL_TEXTURE1);
1474 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
1475 EXPECT_GL_ERROR(GL_NO_ERROR);
1476
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001477 glUseProgram(mProgram);
1478 glUniform1i(mTexture2DUniformLocation, 0);
1479 glUniform1i(mTextureCubeUniformLocation, 1);
1480 drawQuad(mProgram, "position", 0.5f);
Jamie Madilld4cfa572014-07-08 10:00:32 -04001481 EXPECT_GL_NO_ERROR();
1482}
Jamie Madill9aca0592014-10-06 16:26:59 -04001483
Olli Etuaho53a2da12016-01-11 15:43:32 +02001484// Test drawing with two texture types accessed from the same shader and check that the result of
1485// drawing is correct.
1486TEST_P(TextureCubeTest, CubeMapDraw)
1487{
1488 GLubyte texData[4];
1489 texData[0] = 0;
1490 texData[1] = 60;
1491 texData[2] = 0;
1492 texData[3] = 255;
1493
1494 glActiveTexture(GL_TEXTURE0);
1495 glBindTexture(GL_TEXTURE_2D, mTexture2D);
1496 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
1497
1498 glActiveTexture(GL_TEXTURE1);
1499 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
1500 texData[1] = 120;
1501 glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
1502 texData);
1503 EXPECT_GL_ERROR(GL_NO_ERROR);
1504
1505 glUseProgram(mProgram);
1506 glUniform1i(mTexture2DUniformLocation, 0);
1507 glUniform1i(mTextureCubeUniformLocation, 1);
1508 drawQuad(mProgram, "position", 0.5f);
1509 EXPECT_GL_NO_ERROR();
1510
1511 int px = getWindowWidth() - 1;
1512 int py = 0;
1513 EXPECT_PIXEL_NEAR(px, py, 0, 180, 0, 255, 2);
1514}
1515
Olli Etuaho4644a202016-01-12 15:12:53 +02001516TEST_P(Sampler2DAsFunctionParameterTest, Sampler2DAsFunctionParameter)
1517{
1518 glActiveTexture(GL_TEXTURE0);
1519 glBindTexture(GL_TEXTURE_2D, mTexture2D);
1520 GLubyte texData[4];
1521 texData[0] = 0;
1522 texData[1] = 128;
1523 texData[2] = 0;
1524 texData[3] = 255;
1525 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
1526 glUseProgram(mProgram);
1527 glUniform1i(mTexture2DUniformLocation, 0);
1528 drawQuad(mProgram, "position", 0.5f);
1529 EXPECT_GL_NO_ERROR();
1530
1531 EXPECT_PIXEL_NEAR(0, 0, 0, 128, 0, 255, 2);
1532}
1533
Olli Etuaho2173db3d2016-01-12 13:55:14 +02001534// Test drawing with two textures passed to the shader in a sampler array.
1535TEST_P(SamplerArrayTest, SamplerArrayDraw)
1536{
1537 testSamplerArrayDraw();
1538}
1539
1540// Test drawing with two textures passed to the shader in a sampler array which is passed to a
1541// user-defined function in the shader.
1542TEST_P(SamplerArrayAsFunctionParameterTest, SamplerArrayAsFunctionParameter)
1543{
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05001544 // TODO: Diagnose and fix. http://anglebug.com/2955
1545 ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
1546
Olli Etuaho2173db3d2016-01-12 13:55:14 +02001547 testSamplerArrayDraw();
1548}
1549
Jamie Madill9aca0592014-10-06 16:26:59 -04001550// Copy of a test in conformance/textures/texture-mips, to test generate mipmaps
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001551TEST_P(Texture2DTestWithDrawScale, MipmapsTwice)
Jamie Madill9aca0592014-10-06 16:26:59 -04001552{
1553 int px = getWindowWidth() / 2;
1554 int py = getWindowHeight() / 2;
1555
1556 glActiveTexture(GL_TEXTURE0);
1557 glBindTexture(GL_TEXTURE_2D, mTexture2D);
1558
Olli Etuahoa314b612016-03-10 16:43:00 +02001559 std::vector<GLColor> pixelsRed(16u * 16u, GLColor::red);
Jamie Madill9aca0592014-10-06 16:26:59 -04001560
Olli Etuahoa314b612016-03-10 16:43:00 +02001561 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelsRed.data());
Jamie Madill9aca0592014-10-06 16:26:59 -04001562 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
1563 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1564 glGenerateMipmap(GL_TEXTURE_2D);
1565
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001566 glUseProgram(mProgram);
Jamie Madill9aca0592014-10-06 16:26:59 -04001567 glUniform1i(mTexture2DUniformLocation, 0);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001568 glUniform2f(mDrawScaleUniformLocation, 0.0625f, 0.0625f);
1569 drawQuad(mProgram, "position", 0.5f);
Jamie Madill9aca0592014-10-06 16:26:59 -04001570 EXPECT_GL_NO_ERROR();
Olli Etuahoa314b612016-03-10 16:43:00 +02001571 EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red);
Jamie Madill9aca0592014-10-06 16:26:59 -04001572
Olli Etuahoa314b612016-03-10 16:43:00 +02001573 std::vector<GLColor> pixelsBlue(16u * 16u, GLColor::blue);
Jamie Madill9aca0592014-10-06 16:26:59 -04001574
Olli Etuahoa314b612016-03-10 16:43:00 +02001575 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1576 pixelsBlue.data());
Jamie Madill9aca0592014-10-06 16:26:59 -04001577 glGenerateMipmap(GL_TEXTURE_2D);
1578
Olli Etuahoa314b612016-03-10 16:43:00 +02001579 std::vector<GLColor> pixelsGreen(16u * 16u, GLColor::green);
Jamie Madill9aca0592014-10-06 16:26:59 -04001580
Olli Etuahoa314b612016-03-10 16:43:00 +02001581 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1582 pixelsGreen.data());
Jamie Madill9aca0592014-10-06 16:26:59 -04001583 glGenerateMipmap(GL_TEXTURE_2D);
1584
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001585 drawQuad(mProgram, "position", 0.5f);
Jamie Madill9aca0592014-10-06 16:26:59 -04001586
1587 EXPECT_GL_NO_ERROR();
Olli Etuahoa314b612016-03-10 16:43:00 +02001588 EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green);
Jamie Madill9aca0592014-10-06 16:26:59 -04001589}
Jamie Madillf8fccb32014-11-12 15:05:26 -05001590
Jamie Madilleb32a2e2014-12-10 14:27:53 -05001591// Test creating a FBO with a cube map render target, to test an ANGLE bug
1592// https://code.google.com/p/angleproject/issues/detail?id=849
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001593TEST_P(TextureCubeTest, CubeMapFBO)
Jamie Madilleb32a2e2014-12-10 14:27:53 -05001594{
Michael Spangd8506c72019-01-29 15:35:09 -05001595 // http://anglebug.com/3145
1596 ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
1597
Shahbaz Youssefi0c128e12019-03-25 23:50:14 -04001598 // http://anglebug.com/2822
1599 ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
1600
Jamie Madill3f3b3582018-09-14 10:38:44 -04001601 GLFramebuffer fbo;
Jamie Madilleb32a2e2014-12-10 14:27:53 -05001602 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1603
1604 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
Jamie Madill50cf2be2018-06-15 09:46:57 -04001605 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1606 mTextureCube, 0);
Jamie Madilleb32a2e2014-12-10 14:27:53 -05001607
Corentin Wallez322653b2015-06-17 18:33:56 +02001608 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Jamie Madilleb32a2e2014-12-10 14:27:53 -05001609 EXPECT_GL_NO_ERROR();
Jamie Madill3f3b3582018-09-14 10:38:44 -04001610
1611 // Test clearing the six mip faces individually.
1612 std::array<GLColor, 6> faceColors = {{GLColor::red, GLColor::green, GLColor::blue,
1613 GLColor::yellow, GLColor::cyan, GLColor::magenta}};
1614
1615 for (size_t faceIndex = 0; faceIndex < 6; ++faceIndex)
1616 {
1617 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
1618 GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, mTextureCube, 0);
1619
1620 Vector4 clearColorF = faceColors[faceIndex].toNormalizedVector();
1621 glClearColor(clearColorF.x(), clearColorF.y(), clearColorF.z(), clearColorF.w());
1622 glClear(GL_COLOR_BUFFER_BIT);
1623
1624 EXPECT_PIXEL_COLOR_EQ(0, 0, faceColors[faceIndex]);
1625 }
1626
1627 // Iterate the faces again to make sure the colors haven't changed.
1628 for (size_t faceIndex = 0; faceIndex < 6; ++faceIndex)
1629 {
1630 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
1631 GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, mTextureCube, 0);
1632 EXPECT_PIXEL_COLOR_EQ(0, 0, faceColors[faceIndex])
1633 << "face color " << faceIndex << " shouldn't change";
1634 }
1635}
1636
1637// Tests clearing a cube map with a scissor enabled.
1638TEST_P(TextureCubeTest, CubeMapFBOScissoredClear)
1639{
1640 // TODO(jie.a.chen): Diagnose and fix. http://anglebug.com/2822
1641 ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel() && IsWindows());
1642
Michael Spangd8506c72019-01-29 15:35:09 -05001643 // http://anglebug.com/3145
1644 ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
1645
Jamie Madill3f3b3582018-09-14 10:38:44 -04001646 constexpr size_t kSize = 16;
1647
1648 GLFramebuffer fbo;
1649 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1650 glViewport(0, 0, kSize, kSize);
1651
1652 GLTexture texcube;
1653 glBindTexture(GL_TEXTURE_CUBE_MAP, texcube);
1654 for (GLenum face = 0; face < 6; face++)
1655 {
1656 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA,
1657 GL_UNSIGNED_BYTE, nullptr);
1658 }
1659 ASSERT_GL_NO_ERROR();
1660
1661 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1662 texcube, 0);
1663
1664 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1665 ASSERT_GL_NO_ERROR();
1666
1667 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1668 glClear(GL_COLOR_BUFFER_BIT);
1669 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1670
1671 glEnable(GL_SCISSOR_TEST);
1672 glScissor(kSize / 2, 0, kSize / 2, kSize);
1673 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1674 glClear(GL_COLOR_BUFFER_BIT);
1675
1676 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1677 EXPECT_PIXEL_COLOR_EQ(kSize / 2 + 1, 0, GLColor::green);
1678
1679 ASSERT_GL_NO_ERROR();
Jamie Madilleb32a2e2014-12-10 14:27:53 -05001680}
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001681
Jamie Madill50cf2be2018-06-15 09:46:57 -04001682// Test that glTexSubImage2D works properly when glTexStorage2DEXT has initialized the image with a
1683// default color.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001684TEST_P(Texture2DTest, TexStorage)
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001685{
Jamie Madillb8149072019-04-30 16:14:44 -04001686 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
1687 !IsGLExtensionEnabled("GL_EXT_texture_storage"));
Geoff Langc4e93662017-05-01 10:45:59 -04001688
Jamie Madill50cf2be2018-06-15 09:46:57 -04001689 int width = getWindowWidth();
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001690 int height = getWindowHeight();
1691
1692 GLuint tex2D;
1693 glGenTextures(1, &tex2D);
1694 glActiveTexture(GL_TEXTURE0);
1695 glBindTexture(GL_TEXTURE_2D, tex2D);
1696
1697 // Fill with red
1698 std::vector<GLubyte> pixels(3 * 16 * 16);
1699 for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
1700 {
1701 pixels[pixelId * 3 + 0] = 255;
1702 pixels[pixelId * 3 + 1] = 0;
1703 pixels[pixelId * 3 + 2] = 0;
1704 }
1705
1706 // ANGLE internally uses RGBA as the DirectX format for RGB images
Jamie Madill50cf2be2018-06-15 09:46:57 -04001707 // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
1708 // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
Geoff Langc4e93662017-05-01 10:45:59 -04001709 if (getClientMajorVersion() >= 3)
1710 {
1711 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
1712 }
1713 else
1714 {
1715 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
1716 }
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001717
1718 // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
1719 // glTexSubImage2D should take into account that the image is dirty.
1720 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, pixels.data());
1721 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1722 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1723
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001724 setUpProgram();
1725
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001726 glUseProgram(mProgram);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001727 glUniform1i(mTexture2DUniformLocation, 0);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001728 drawQuad(mProgram, "position", 0.5f);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001729 glDeleteTextures(1, &tex2D);
1730 EXPECT_GL_NO_ERROR();
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001731 EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
Geoff Langfbfa47c2015-03-31 11:26:00 -04001732
1733 // Validate that the region of the texture without data has an alpha of 1.0
Jamie Madill05b35b22017-10-03 09:01:44 -04001734 angle::GLColor pixel = ReadColor(3 * width / 4, 3 * height / 4);
1735 EXPECT_EQ(255, pixel.A);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001736}
1737
Jamie Madill50cf2be2018-06-15 09:46:57 -04001738// Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2DEXT has
1739// initialized the image with a default color.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001740TEST_P(Texture2DTest, TexStorageWithPBO)
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001741{
Jamie Madillb8149072019-04-30 16:14:44 -04001742 if (IsGLExtensionEnabled("NV_pixel_buffer_object"))
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001743 {
Jamie Madill50cf2be2018-06-15 09:46:57 -04001744 int width = getWindowWidth();
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001745 int height = getWindowHeight();
1746
1747 GLuint tex2D;
1748 glGenTextures(1, &tex2D);
1749 glActiveTexture(GL_TEXTURE0);
1750 glBindTexture(GL_TEXTURE_2D, tex2D);
1751
1752 // Fill with red
1753 std::vector<GLubyte> pixels(3 * 16 * 16);
1754 for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
1755 {
1756 pixels[pixelId * 3 + 0] = 255;
1757 pixels[pixelId * 3 + 1] = 0;
1758 pixels[pixelId * 3 + 2] = 0;
1759 }
1760
1761 // Read 16x16 region from red backbuffer to PBO
1762 GLuint pbo;
1763 glGenBuffers(1, &pbo);
1764 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
1765 glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
1766
1767 // ANGLE internally uses RGBA as the DirectX format for RGB images
Jamie Madill50cf2be2018-06-15 09:46:57 -04001768 // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
1769 // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001770 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
1771
1772 // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
1773 // glTexSubImage2D should take into account that the image is dirty.
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001774 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001775 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1776 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1777
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001778 setUpProgram();
1779
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001780 glUseProgram(mProgram);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001781 glUniform1i(mTexture2DUniformLocation, 0);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001782 drawQuad(mProgram, "position", 0.5f);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001783 glDeleteTextures(1, &tex2D);
Olli Etuaho19d48db2016-01-13 14:43:21 +02001784 glDeleteBuffers(1, &pbo);
Gregoire Payen de La Garanderie88fe1ad2015-01-19 15:09:26 +00001785 EXPECT_GL_NO_ERROR();
1786 EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255);
1787 EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
1788 }
1789}
Jamie Madillbc393df2015-01-29 13:46:07 -05001790
Mohan Maiya6caa2652019-09-11 08:06:13 -07001791// Tests CopySubImage for float formats
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001792TEST_P(Texture2DTest, CopySubImageFloat_R_R)
Jamie Madillbc393df2015-01-29 13:46:07 -05001793{
1794 testFloatCopySubImage(1, 1);
1795}
1796
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001797TEST_P(Texture2DTest, CopySubImageFloat_RG_R)
Jamie Madillbc393df2015-01-29 13:46:07 -05001798{
1799 testFloatCopySubImage(2, 1);
1800}
1801
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001802TEST_P(Texture2DTest, CopySubImageFloat_RG_RG)
Jamie Madillbc393df2015-01-29 13:46:07 -05001803{
1804 testFloatCopySubImage(2, 2);
1805}
1806
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001807TEST_P(Texture2DTest, CopySubImageFloat_RGB_R)
Jamie Madillbc393df2015-01-29 13:46:07 -05001808{
1809 testFloatCopySubImage(3, 1);
1810}
1811
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001812TEST_P(Texture2DTest, CopySubImageFloat_RGB_RG)
Jamie Madillbc393df2015-01-29 13:46:07 -05001813{
1814 testFloatCopySubImage(3, 2);
1815}
1816
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001817TEST_P(Texture2DTest, CopySubImageFloat_RGB_RGB)
Jamie Madillbc393df2015-01-29 13:46:07 -05001818{
Yunchao He9550c602018-02-13 14:47:05 +08001819 // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/1346)
Mohan Maiya6caa2652019-09-11 08:06:13 -07001820 ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGL());
Corentin Wallez9e3c6152016-03-29 21:58:33 -04001821
Yunchao He9550c602018-02-13 14:47:05 +08001822 // Ignore SDK layers messages on D3D11 FL 9.3 (http://anglebug.com/1284)
1823 ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
Austin Kinrossd544cc92016-01-11 15:26:42 -08001824
Jamie Madillbc393df2015-01-29 13:46:07 -05001825 testFloatCopySubImage(3, 3);
1826}
1827
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001828TEST_P(Texture2DTest, CopySubImageFloat_RGBA_R)
Jamie Madillbc393df2015-01-29 13:46:07 -05001829{
1830 testFloatCopySubImage(4, 1);
1831}
1832
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001833TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RG)
Jamie Madillbc393df2015-01-29 13:46:07 -05001834{
1835 testFloatCopySubImage(4, 2);
1836}
1837
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001838TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RGB)
Jamie Madillbc393df2015-01-29 13:46:07 -05001839{
Yunchao He9550c602018-02-13 14:47:05 +08001840 // Ignore SDK layers messages on D3D11 FL 9.3 (http://anglebug.com/1284)
1841 ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
Austin Kinrossd544cc92016-01-11 15:26:42 -08001842
Jamie Madillbc393df2015-01-29 13:46:07 -05001843 testFloatCopySubImage(4, 3);
1844}
1845
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001846TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RGBA)
Jamie Madillbc393df2015-01-29 13:46:07 -05001847{
Yunchao He9550c602018-02-13 14:47:05 +08001848 // Ignore SDK layers messages on D3D11 FL 9.3 (http://anglebug.com/1284)
1849 ANGLE_SKIP_TEST_IF(IsD3D11_FL93());
Austin Kinrossd544cc92016-01-11 15:26:42 -08001850
Jamie Madillbc393df2015-01-29 13:46:07 -05001851 testFloatCopySubImage(4, 4);
1852}
Austin Kinross07285142015-03-26 11:36:16 -07001853
Jamie Madill50cf2be2018-06-15 09:46:57 -04001854// Port of
1855// https://www.khronos.org/registry/webgl/conformance-suites/1.0.3/conformance/textures/texture-npot.html
1856// Run against GL_ALPHA/UNSIGNED_BYTE format, to ensure that D3D11 Feature Level 9_3 correctly
1857// handles GL_ALPHA
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001858TEST_P(Texture2DTest, TextureNPOT_GL_ALPHA_UBYTE)
Austin Kinross07285142015-03-26 11:36:16 -07001859{
1860 const int npotTexSize = 5;
Jamie Madill50cf2be2018-06-15 09:46:57 -04001861 const int potTexSize = 4; // Should be less than npotTexSize
Austin Kinross07285142015-03-26 11:36:16 -07001862 GLuint tex2D;
1863
Jamie Madillb8149072019-04-30 16:14:44 -04001864 if (IsGLExtensionEnabled("GL_OES_texture_npot"))
Austin Kinross07285142015-03-26 11:36:16 -07001865 {
1866 // This test isn't applicable if texture_npot is enabled
1867 return;
1868 }
1869
Olli Etuahoa1c917f2016-04-06 13:50:03 +03001870 setUpProgram();
1871
Austin Kinross07285142015-03-26 11:36:16 -07001872 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1873
Austin Kinross5faa15b2016-01-11 13:32:48 -08001874 // Default unpack alignment is 4. The values of 'pixels' below needs it to be 1.
1875 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
1876
Austin Kinross07285142015-03-26 11:36:16 -07001877 glActiveTexture(GL_TEXTURE0);
1878 glGenTextures(1, &tex2D);
1879 glBindTexture(GL_TEXTURE_2D, tex2D);
1880
Till Rathmannc1551dc2018-08-15 17:04:49 +02001881 const std::vector<GLubyte> pixels(1 * npotTexSize * npotTexSize, 64);
Austin Kinross07285142015-03-26 11:36:16 -07001882
1883 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1884 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1885
1886 // Check that an NPOT texture not on level 0 generates INVALID_VALUE
Jamie Madill50cf2be2018-06-15 09:46:57 -04001887 glTexImage2D(GL_TEXTURE_2D, 1, GL_ALPHA, npotTexSize, npotTexSize, 0, GL_ALPHA,
1888 GL_UNSIGNED_BYTE, pixels.data());
Austin Kinross07285142015-03-26 11:36:16 -07001889 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1890
1891 // Check that an NPOT texture on level 0 succeeds
Jamie Madill50cf2be2018-06-15 09:46:57 -04001892 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, npotTexSize, npotTexSize, 0, GL_ALPHA,
1893 GL_UNSIGNED_BYTE, pixels.data());
Austin Kinross07285142015-03-26 11:36:16 -07001894 EXPECT_GL_NO_ERROR();
1895
1896 // Check that generateMipmap fails on NPOT
1897 glGenerateMipmap(GL_TEXTURE_2D);
1898 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1899
1900 // Check that nothing is drawn if filtering is not correct for NPOT
1901 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1902 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1903 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1904 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
1905 glClear(GL_COLOR_BUFFER_BIT);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001906 drawQuad(mProgram, "position", 1.0f);
Austin Kinross07285142015-03-26 11:36:16 -07001907 EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 255);
1908
1909 // NPOT texture with TEXTURE_MIN_FILTER not NEAREST or LINEAR should draw with 0,0,0,255
1910 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1911 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1912 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
1913 glClear(GL_COLOR_BUFFER_BIT);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001914 drawQuad(mProgram, "position", 1.0f);
Austin Kinross07285142015-03-26 11:36:16 -07001915 EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 255);
1916
1917 // NPOT texture with TEXTURE_MIN_FILTER set to LINEAR should draw
1918 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1919 glClear(GL_COLOR_BUFFER_BIT);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001920 drawQuad(mProgram, "position", 1.0f);
Austin Kinross07285142015-03-26 11:36:16 -07001921 EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 64);
1922
1923 // Check that glTexImage2D for POT texture succeeds
Jamie Madill50cf2be2018-06-15 09:46:57 -04001924 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, potTexSize, potTexSize, 0, GL_ALPHA, GL_UNSIGNED_BYTE,
1925 pixels.data());
Austin Kinross07285142015-03-26 11:36:16 -07001926 EXPECT_GL_NO_ERROR();
1927
1928 // Check that generateMipmap for an POT texture succeeds
1929 glGenerateMipmap(GL_TEXTURE_2D);
1930 EXPECT_GL_NO_ERROR();
1931
1932 // POT texture with TEXTURE_MIN_FILTER set to LINEAR_MIPMAP_LINEAR should draw
1933 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
1934 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1935 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1936 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
1937 glClear(GL_COLOR_BUFFER_BIT);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001938 drawQuad(mProgram, "position", 1.0f);
Austin Kinross07285142015-03-26 11:36:16 -07001939 EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 64);
1940 EXPECT_GL_NO_ERROR();
1941}
Jamie Madillfa05f602015-05-07 13:47:11 -04001942
Austin Kinross08528e12015-10-07 16:24:40 -07001943// Test to ensure that glTexSubImage2D always accepts data for non-power-of-two subregions.
1944// ANGLE previously rejected this if GL_OES_texture_npot wasn't active, which is incorrect.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02001945TEST_P(Texture2DTest, NPOTSubImageParameters)
Austin Kinross08528e12015-10-07 16:24:40 -07001946{
1947 glActiveTexture(GL_TEXTURE0);
1948 glBindTexture(GL_TEXTURE_2D, mTexture2D);
1949
1950 // Create an 8x8 (i.e. power-of-two) texture.
1951 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1952 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
1953 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1954 glGenerateMipmap(GL_TEXTURE_2D);
1955
1956 // Supply a 3x3 (i.e. non-power-of-two) subimage to the texture.
1957 // This should always work, even if GL_OES_texture_npot isn't active.
Geoff Langfb052642017-10-24 13:42:09 -04001958 std::array<GLColor, 3 * 3> data;
1959 glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 3, 3, GL_RGBA, GL_UNSIGNED_BYTE, data.data());
Austin Kinross08528e12015-10-07 16:24:40 -07001960
1961 EXPECT_GL_NO_ERROR();
1962}
1963
Geoff Lang3702d8c2019-04-08 13:44:06 -04001964// Regression test for http://crbug.com/949985 to make sure dirty bits are propagated up from
1965// TextureImpl and the texture is synced before being used in a draw call.
1966TEST_P(Texture2DTestES3, TextureImplPropogatesDirtyBits)
1967{
1968 ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL());
Yuly Novikove6b23e42019-04-10 17:19:15 -04001969 // Flaky hangs on Win10 AMD RX 550 GL. http://anglebug.com/3371
1970 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
Yuly Novikovbd4ff472019-07-19 22:08:17 +00001971 // D3D Debug device reports an error. http://anglebug.com/3501
1972 ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());
Cody Northrop988f7172019-09-30 15:52:37 -06001973 // TODO(cnorthrop): Needs triage on Vulkan backend. http://anglebug.com/3950
Cody Northropcb16fb52019-08-29 16:53:55 -06001974 ANGLE_SKIP_TEST_IF(IsVulkan());
Geoff Lang3702d8c2019-04-08 13:44:06 -04001975
1976 // The workaround in the GL backend required to trigger this bug generates driver warning
1977 // messages.
1978 ScopedIgnorePlatformMessages ignoreMessages;
1979
1980 setUpProgram();
1981 glUseProgram(mProgram);
1982 glActiveTexture(GL_TEXTURE0 + mTexture2DUniformLocation);
1983
1984 GLTexture dest;
1985 glBindTexture(GL_TEXTURE_2D, dest);
1986
1987 GLTexture source;
1988 glBindTexture(GL_TEXTURE_2D, source);
1989
1990 // Put data in mip 0 and 1
1991 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1992 GLColor::red.data());
1993 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1994 GLColor::green.data());
1995
1996 // Disable mipmapping so source is complete
1997 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1998 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1999
2000 // Force the dirty bits to be synchronized in source
2001 drawQuad(mProgram, "position", 1.0f);
2002
2003 // Copy from mip 1 of the source. In the GL backend this internally sets the base level to mip
2004 // 1 and sets a dirty bit.
2005 glCopyTextureCHROMIUM(source, 1, GL_TEXTURE_2D, dest, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE,
2006 GL_FALSE, GL_FALSE);
2007
2008 // Draw again, assertions are generated if the texture has internal dirty bits at draw time
2009 drawQuad(mProgram, "position", 1.0f);
2010}
2011
Geoff Lang6f691fb2019-04-25 11:01:52 -04002012// This test case changes the base level of a texture that's attached to a framebuffer, clears every
2013// level to green, and then samples the texture when rendering. Test is taken from
2014// https://www.khronos.org/registry/webgl/sdk/tests/conformance2/rendering/framebuffer-texture-changing-base-level.html
2015TEST_P(Texture2DTestES3, FramebufferTextureChangingBaselevel)
2016{
2017 // TODO(geofflang): Investigate on D3D11. http://anglebug.com/2291
2018 ANGLE_SKIP_TEST_IF(IsD3D11());
2019
Cody Northrop988f7172019-09-30 15:52:37 -06002020 // TODO(cnorthrop): Framebuffer level support. http://anglebug.com/3184
Cody Northropcb16fb52019-08-29 16:53:55 -06002021 ANGLE_SKIP_TEST_IF(IsVulkan());
2022
Geoff Lang6f691fb2019-04-25 11:01:52 -04002023 setUpProgram();
2024
2025 constexpr GLint width = 8;
2026 constexpr GLint height = 4;
2027
2028 GLTexture texture;
2029 glBindTexture(GL_TEXTURE_2D, texture);
2030 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2031 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2032 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2033 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2034
2035 // Create all mipmap levels for the texture from level 0 to the 1x1 pixel level.
2036 GLint level = 0;
2037 GLint levelW = width;
2038 GLint levelH = height;
2039 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelW, levelH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2040 nullptr);
2041 while (levelW > 1 || levelH > 1)
2042 {
2043 ++level;
2044 levelW = static_cast<GLint>(std::max(1.0, std::floor(width / std::pow(2, level))));
2045 levelH = static_cast<GLint>(std::max(1.0, std::floor(height / std::pow(2, level))));
2046 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelW, levelH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2047 nullptr);
2048 }
2049
2050 // Clear each level of the texture using an FBO. Change the base level to match the level used
2051 // for the FBO on each iteration.
2052 GLFramebuffer fbo;
2053 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2054 level = 0;
2055 levelW = width;
2056 levelH = height;
2057 while (levelW > 1 || levelH > 1)
2058 {
2059 levelW = static_cast<GLint>(std::floor(width / std::pow(2, level)));
2060 levelH = static_cast<GLint>(std::floor(height / std::pow(2, level)));
2061
2062 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level);
2063 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, level);
2064
2065 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2066 EXPECT_GL_NO_ERROR();
2067
2068 glClearColor(0, 1, 0, 1);
2069 glClear(GL_COLOR_BUFFER_BIT);
2070
2071 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2072
2073 ++level;
2074 }
2075
2076 glBindFramebuffer(GL_FRAMEBUFFER, 0);
2077 glViewport(0, 0, 16, 16);
2078 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2079
2080 drawQuad(mProgram, "position", 0.5f);
2081
2082 EXPECT_GL_NO_ERROR();
2083 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2084}
2085
Olli Etuahoa7416ff2016-01-18 12:22:55 +02002086// Test to check that texture completeness is determined correctly when the texture base level is
2087// greater than 0, and also that level 0 is not sampled when base level is greater than 0.
2088TEST_P(Texture2DTestES3, DrawWithBaseLevel1)
2089{
2090 glActiveTexture(GL_TEXTURE0);
2091 glBindTexture(GL_TEXTURE_2D, mTexture2D);
Olli Etuahoa314b612016-03-10 16:43:00 +02002092
2093 std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
2094 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
2095 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2096 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2097 texDataGreen.data());
2098 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2099 texDataGreen.data());
Olli Etuahoa7416ff2016-01-18 12:22:55 +02002100 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2101 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2102 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2103
2104 EXPECT_GL_NO_ERROR();
2105
2106 drawQuad(mProgram, "position", 0.5f);
2107
Olli Etuahoa314b612016-03-10 16:43:00 +02002108 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2109}
2110
2111// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
2112// have images defined.
2113TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeUndefined)
2114{
Yunchao He9550c602018-02-13 14:47:05 +08002115 // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array.
2116 ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
2117
Olli Etuahoa314b612016-03-10 16:43:00 +02002118 glActiveTexture(GL_TEXTURE0);
2119 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2120 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2121 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2122 texDataGreen.data());
2123 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2124 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2125 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2126 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2127
2128 EXPECT_GL_NO_ERROR();
2129
2130 drawQuad(mProgram, "position", 0.5f);
2131
2132 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2133}
2134
Olli Etuahoe8528d82016-05-16 17:50:52 +03002135// Test that drawing works correctly when level 0 is undefined and base level is 1.
2136TEST_P(Texture2DTestES3, DrawWithLevelZeroUndefined)
2137{
Yunchao He9550c602018-02-13 14:47:05 +08002138 // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array.
2139 ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
2140
Olli Etuahoe8528d82016-05-16 17:50:52 +03002141 glActiveTexture(GL_TEXTURE0);
2142 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2143 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2144 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2145 texDataGreen.data());
2146 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2147 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2148 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2149 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
2150
2151 EXPECT_GL_NO_ERROR();
2152
2153 // Texture is incomplete.
2154 drawQuad(mProgram, "position", 0.5f);
2155 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2156
2157 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2158 texDataGreen.data());
2159
2160 // Texture is now complete.
2161 drawQuad(mProgram, "position", 0.5f);
2162 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2163}
2164
Olli Etuahoa314b612016-03-10 16:43:00 +02002165// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
2166// dimensions that don't fit the images inside the range.
2167// GLES 3.0.4 section 3.8.13 Texture completeness
2168TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
2169{
Olli Etuahoa314b612016-03-10 16:43:00 +02002170 glActiveTexture(GL_TEXTURE0);
2171 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2172 std::vector<GLColor> texDataRed(8u * 8u, GLColor::red);
2173 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2174 std::vector<GLColor> texDataCyan(2u * 2u, GLColor::cyan);
2175
2176 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2177 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2178
2179 // Two levels that are initially unused.
2180 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
2181 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2182 texDataCyan.data());
2183
2184 // One level that is used - only this level should affect completeness.
2185 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2186 texDataGreen.data());
2187
2188 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2189 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2190
2191 EXPECT_GL_NO_ERROR();
2192
2193 drawQuad(mProgram, "position", 0.5f);
2194
2195 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2196
Yunchao He2f23f352018-02-11 22:11:37 +08002197 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
Olli Etuahoa314b612016-03-10 16:43:00 +02002198
2199 // Switch the level that is being used to the cyan level 2.
2200 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
2201 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
2202
2203 EXPECT_GL_NO_ERROR();
2204
2205 drawQuad(mProgram, "position", 0.5f);
2206
2207 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2208}
2209
2210// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
2211// have images defined.
2212TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeUndefined)
2213{
Olli Etuahoa314b612016-03-10 16:43:00 +02002214 glActiveTexture(GL_TEXTURE0);
2215 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2216 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2217 glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2218 texDataGreen.data());
2219 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2220 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2221 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
2222 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
2223
2224 EXPECT_GL_NO_ERROR();
2225
2226 drawQuad(mProgram, "position", 0.5f);
2227
2228 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2229}
2230
2231// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
2232// dimensions that don't fit the images inside the range.
2233// GLES 3.0.4 section 3.8.13 Texture completeness
2234TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
2235{
Yuly Novikovc5da7992019-06-27 12:57:13 -04002236 // Crashes on Intel Ubuntu 19.04 Mesa 19.0.2 GL. http://anglebug.com/2782
2237 ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsDesktopOpenGL());
2238
Olli Etuahoa314b612016-03-10 16:43:00 +02002239 glActiveTexture(GL_TEXTURE0);
2240 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2241 std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red);
2242 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2243 std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan);
2244
2245 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2246 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2247
2248 // Two levels that are initially unused.
2249 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2250 texDataRed.data());
2251 glTexImage3D(GL_TEXTURE_3D, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2252 texDataCyan.data());
2253
2254 // One level that is used - only this level should affect completeness.
2255 glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2256 texDataGreen.data());
2257
2258 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
2259 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
2260
2261 EXPECT_GL_NO_ERROR();
2262
2263 drawQuad(mProgram, "position", 0.5f);
2264
2265 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2266
Yunchao He2f23f352018-02-11 22:11:37 +08002267 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
Olli Etuahoa314b612016-03-10 16:43:00 +02002268
2269 // Switch the level that is being used to the cyan level 2.
2270 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 2);
2271 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 2);
2272
2273 EXPECT_GL_NO_ERROR();
2274
2275 drawQuad(mProgram, "position", 0.5f);
2276
2277 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2278}
2279
2280// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
2281// have images defined.
2282TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeUndefined)
2283{
Olli Etuahoa314b612016-03-10 16:43:00 +02002284 glActiveTexture(GL_TEXTURE0);
2285 glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
2286 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2287 glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2288 texDataGreen.data());
2289 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2290 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2291 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
2292 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
2293
2294 EXPECT_GL_NO_ERROR();
2295
2296 drawQuad(mProgram, "position", 0.5f);
2297
2298 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2299}
2300
2301// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
2302// dimensions that don't fit the images inside the range.
2303// GLES 3.0.4 section 3.8.13 Texture completeness
2304TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
2305{
Corentin Wallez566c2e32019-08-28 18:37:58 +02002306 // TODO(crbug.com/998505): Test failing on Android FYI Release (NVIDIA Shield TV)
2307 ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
2308
Olli Etuahoa314b612016-03-10 16:43:00 +02002309 glActiveTexture(GL_TEXTURE0);
2310 glBindTexture(GL_TEXTURE_3D, m2DArrayTexture);
2311 std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red);
2312 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2313 std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan);
2314
2315 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2316 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2317
2318 // Two levels that are initially unused.
2319 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2320 texDataRed.data());
2321 glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2322 texDataCyan.data());
2323
2324 // One level that is used - only this level should affect completeness.
2325 glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2326 texDataGreen.data());
2327
2328 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
2329 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
2330
2331 EXPECT_GL_NO_ERROR();
2332
2333 drawQuad(mProgram, "position", 0.5f);
2334
2335 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2336
Yunchao He2f23f352018-02-11 22:11:37 +08002337 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
2338
Olli Etuahoa314b612016-03-10 16:43:00 +02002339 // Switch the level that is being used to the cyan level 2.
2340 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 2);
2341 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 2);
2342
2343 EXPECT_GL_NO_ERROR();
2344
2345 drawQuad(mProgram, "position", 0.5f);
2346
2347 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2348}
2349
2350// Test that texture completeness is updated if texture max level changes.
2351// GLES 3.0.4 section 3.8.13 Texture completeness
2352TEST_P(Texture2DTestES3, TextureCompletenessChangesWithMaxLevel)
2353{
Olli Etuahoa314b612016-03-10 16:43:00 +02002354 glActiveTexture(GL_TEXTURE0);
2355 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2356 std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green);
2357
2358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2359 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2360
2361 // A level that is initially unused.
2362 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2363 texDataGreen.data());
2364
2365 // One level that is initially used - only this level should affect completeness.
2366 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2367 texDataGreen.data());
2368
2369 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2370 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2371
2372 EXPECT_GL_NO_ERROR();
2373
2374 drawQuad(mProgram, "position", 0.5f);
2375
2376 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2377
2378 // Switch the max level to level 1. The levels within the used range now have inconsistent
2379 // dimensions and the texture should be incomplete.
2380 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2381
2382 EXPECT_GL_NO_ERROR();
2383
2384 drawQuad(mProgram, "position", 0.5f);
2385
2386 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2387}
2388
2389// Test that 3D texture completeness is updated if texture max level changes.
2390// GLES 3.0.4 section 3.8.13 Texture completeness
2391TEST_P(Texture3DTestES3, Texture3DCompletenessChangesWithMaxLevel)
2392{
Olli Etuahoa314b612016-03-10 16:43:00 +02002393 glActiveTexture(GL_TEXTURE0);
2394 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2395 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2396
2397 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2398 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2399
2400 // A level that is initially unused.
2401 glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2402 texDataGreen.data());
2403
2404 // One level that is initially used - only this level should affect completeness.
2405 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2406 texDataGreen.data());
2407
2408 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
2409 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
2410
2411 EXPECT_GL_NO_ERROR();
2412
2413 drawQuad(mProgram, "position", 0.5f);
2414
2415 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2416
2417 // Switch the max level to level 1. The levels within the used range now have inconsistent
2418 // dimensions and the texture should be incomplete.
2419 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
2420
2421 EXPECT_GL_NO_ERROR();
2422
2423 drawQuad(mProgram, "position", 0.5f);
2424
2425 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2426}
2427
2428// Test that texture completeness is updated if texture base level changes.
2429// GLES 3.0.4 section 3.8.13 Texture completeness
2430TEST_P(Texture2DTestES3, TextureCompletenessChangesWithBaseLevel)
2431{
Olli Etuahoa314b612016-03-10 16:43:00 +02002432 glActiveTexture(GL_TEXTURE0);
2433 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2434 std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green);
2435
2436 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2437 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2438
2439 // Two levels that are initially unused.
2440 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2441 texDataGreen.data());
2442 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2443 texDataGreen.data());
2444
2445 // One level that is initially used - only this level should affect completeness.
2446 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2447 texDataGreen.data());
2448
2449 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
2450 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
2451
2452 EXPECT_GL_NO_ERROR();
2453
2454 drawQuad(mProgram, "position", 0.5f);
2455
2456 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2457
2458 // Switch the base level to level 1. The levels within the used range now have inconsistent
2459 // dimensions and the texture should be incomplete.
2460 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2461
2462 EXPECT_GL_NO_ERROR();
2463
2464 drawQuad(mProgram, "position", 0.5f);
2465
2466 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2467}
2468
2469// Test that texture is not complete if base level is greater than max level.
2470// GLES 3.0.4 section 3.8.13 Texture completeness
2471TEST_P(Texture2DTestES3, TextureBaseLevelGreaterThanMaxLevel)
2472{
Olli Etuahoa314b612016-03-10 16:43:00 +02002473 glActiveTexture(GL_TEXTURE0);
2474 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2475
2476 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2477 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2478
2479 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
2480
2481 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
2482 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2483
2484 EXPECT_GL_NO_ERROR();
2485
2486 drawQuad(mProgram, "position", 0.5f);
2487
2488 // Texture should be incomplete.
2489 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2490}
2491
2492// Test that immutable texture base level and max level are clamped.
2493// GLES 3.0.4 section 3.8.10 subsection Mipmapping
2494TEST_P(Texture2DTestES3, ImmutableTextureBaseLevelOutOfRange)
2495{
Olli Etuahoa314b612016-03-10 16:43:00 +02002496 glActiveTexture(GL_TEXTURE0);
2497 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2498
2499 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2500 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2501
2502 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
2503
2504 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
2505
2506 // For immutable-format textures, base level should be clamped to [0, levels - 1], and max level
2507 // should be clamped to [base_level, levels - 1].
2508 // GLES 3.0.4 section 3.8.10 subsection Mipmapping
2509 // In the case of this test, those rules make the effective base level and max level 0.
2510 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
2511 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000);
2512
2513 EXPECT_GL_NO_ERROR();
2514
2515 drawQuad(mProgram, "position", 0.5f);
2516
2517 // Texture should be complete.
2518 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2519}
2520
Olli Etuaho87fc71c2016-05-11 14:25:21 +03002521// Test that changing base level works when it affects the format of the texture.
2522TEST_P(Texture2DTestES3, TextureFormatChangesWithBaseLevel)
2523{
Corentin Wallez7f00d332019-08-28 15:19:16 +02002524 // TODO(crbug.com/998505): Test failing on Android FYI Release (NVIDIA Shield TV)
2525 ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
2526
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002527 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsDesktopOpenGL());
Yunchao He9550c602018-02-13 14:47:05 +08002528
2529 // Observed incorrect rendering on AMD OpenGL.
2530 ANGLE_SKIP_TEST_IF(IsAMD() && IsDesktopOpenGL());
Olli Etuaho87fc71c2016-05-11 14:25:21 +03002531
2532 glActiveTexture(GL_TEXTURE0);
2533 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2534 std::vector<GLColor> texDataCyan(4u * 4u, GLColor::cyan);
2535 std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
2536
2537 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2538 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2539
2540 // RGBA8 level that's initially unused.
2541 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2542 texDataCyan.data());
2543
2544 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2545 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2546
2547 // RG8 level that's initially used, with consistent dimensions with level 0 but a different
2548 // format. It reads green channel data from the green and alpha channels of texDataGreen
2549 // (this is a bit hacky but works).
2550 glTexImage2D(GL_TEXTURE_2D, 1, GL_RG8, 2, 2, 0, GL_RG, GL_UNSIGNED_BYTE, texDataGreen.data());
2551
2552 EXPECT_GL_NO_ERROR();
2553
2554 drawQuad(mProgram, "position", 0.5f);
2555
2556 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2557
2558 // Switch the texture to use the cyan level 0 with the RGBA format.
2559 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2560 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2561
2562 EXPECT_GL_NO_ERROR();
2563
2564 drawQuad(mProgram, "position", 0.5f);
2565
2566 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2567}
2568
Olli Etuahoa314b612016-03-10 16:43:00 +02002569// Test that setting a texture image works when base level is out of range.
2570TEST_P(Texture2DTestES3, SetImageWhenBaseLevelOutOfRange)
2571{
2572 glActiveTexture(GL_TEXTURE0);
2573 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2574
2575 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2576 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2577
2578 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
2579 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000);
2580
2581 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
2582
2583 EXPECT_GL_NO_ERROR();
2584
2585 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2586
2587 drawQuad(mProgram, "position", 0.5f);
2588
2589 // Texture should be complete.
2590 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Olli Etuahoa7416ff2016-01-18 12:22:55 +02002591}
2592
Jamie Madill50cf2be2018-06-15 09:46:57 -04002593// In the D3D11 renderer, we need to initialize some texture formats, to fill empty channels. EG
2594// RBA->RGBA8, with 1.0 in the alpha channel. This test covers a bug where redefining array textures
2595// with these formats does not work as expected.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002596TEST_P(Texture2DArrayTestES3, RedefineInittableArray)
Jamie Madill2453dbc2015-07-14 11:35:42 -04002597{
2598 std::vector<GLubyte> pixelData;
2599 for (size_t count = 0; count < 5000; count++)
2600 {
2601 pixelData.push_back(0u);
2602 pixelData.push_back(255u);
2603 pixelData.push_back(0u);
2604 }
2605
2606 glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002607 glUseProgram(mProgram);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002608 glUniform1i(mTextureArrayLocation, 0);
2609
2610 // The first draw worked correctly.
Jamie Madill50cf2be2018-06-15 09:46:57 -04002611 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
2612 &pixelData[0]);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002613
2614 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2615 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2616 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
2617 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002618 drawQuad(mProgram, "position", 1.0f);
Olli Etuahoa314b612016-03-10 16:43:00 +02002619 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002620
2621 // The dimension of the respecification must match the original exactly to trigger the bug.
Jamie Madill50cf2be2018-06-15 09:46:57 -04002622 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
2623 &pixelData[0]);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002624 drawQuad(mProgram, "position", 1.0f);
Olli Etuahoa314b612016-03-10 16:43:00 +02002625 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002626
2627 ASSERT_GL_NO_ERROR();
2628}
2629
Olli Etuaho1a679902016-01-14 12:21:47 +02002630// Test shadow sampler and regular non-shadow sampler coexisting in the same shader.
2631// This test is needed especially to confirm that sampler registers get assigned correctly on
2632// the HLSL backend even when there's a mix of different HLSL sampler and texture types.
2633TEST_P(ShadowSamplerPlusSampler3DTestES3, ShadowSamplerPlusSampler3DDraw)
2634{
2635 glActiveTexture(GL_TEXTURE0);
2636 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2637 GLubyte texData[4];
2638 texData[0] = 0;
2639 texData[1] = 60;
2640 texData[2] = 0;
2641 texData[3] = 255;
2642 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
2643
2644 glActiveTexture(GL_TEXTURE1);
2645 glBindTexture(GL_TEXTURE_2D, mTextureShadow);
2646 GLfloat depthTexData[1];
2647 depthTexData[0] = 0.5f;
2648 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
2649 depthTexData);
2650
2651 glUseProgram(mProgram);
2652 glUniform1f(mDepthRefUniformLocation, 0.3f);
2653 glUniform1i(mTexture3DUniformLocation, 0);
2654 glUniform1i(mTextureShadowUniformLocation, 1);
2655
2656 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
2657 drawQuad(mProgram, "position", 0.5f);
2658 EXPECT_GL_NO_ERROR();
2659 // The shader writes 0.5 * <comparison result (1.0)> + <texture color>
2660 EXPECT_PIXEL_NEAR(0, 0, 128, 188, 128, 255, 2);
2661
2662 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GREATER);
2663 drawQuad(mProgram, "position", 0.5f);
2664 EXPECT_GL_NO_ERROR();
2665 // The shader writes 0.5 * <comparison result (0.0)> + <texture color>
2666 EXPECT_PIXEL_NEAR(0, 0, 0, 60, 0, 255, 2);
2667}
2668
Olli Etuahoc8c99a02016-01-14 16:47:22 +02002669// Test multiple different sampler types in the same shader.
2670// This test makes sure that even if sampler / texture registers get grouped together based on type
2671// or otherwise get shuffled around in the HLSL backend of the shader translator, the D3D renderer
2672// still has the right register index information for each ESSL sampler.
2673// The tested ESSL samplers have the following types in D3D11 HLSL:
2674// sampler2D: Texture2D + SamplerState
2675// samplerCube: TextureCube + SamplerState
2676// sampler2DShadow: Texture2D + SamplerComparisonState
2677// samplerCubeShadow: TextureCube + SamplerComparisonState
2678TEST_P(SamplerTypeMixTestES3, SamplerTypeMixDraw)
2679{
Cody Northrop988f7172019-09-30 15:52:37 -06002680 // TODO(cnorthrop): Requires non-color staging buffer support. http://anglebug.com/3949
Cody Northropcb16fb52019-08-29 16:53:55 -06002681 ANGLE_SKIP_TEST_IF(IsVulkan());
2682
Olli Etuahoc8c99a02016-01-14 16:47:22 +02002683 glActiveTexture(GL_TEXTURE0);
2684 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2685 GLubyte texData[4];
2686 texData[0] = 0;
2687 texData[1] = 0;
2688 texData[2] = 120;
2689 texData[3] = 255;
2690 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
2691
2692 glActiveTexture(GL_TEXTURE1);
2693 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
2694 texData[0] = 0;
2695 texData[1] = 90;
2696 texData[2] = 0;
2697 texData[3] = 255;
2698 glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1);
2699 glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2700 texData);
2701
2702 glActiveTexture(GL_TEXTURE2);
2703 glBindTexture(GL_TEXTURE_2D, mTexture2DShadow);
2704 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
2705 GLfloat depthTexData[1];
2706 depthTexData[0] = 0.5f;
2707 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
2708 depthTexData);
2709
2710 glActiveTexture(GL_TEXTURE3);
2711 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow);
2712 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
2713 depthTexData[0] = 0.2f;
2714 glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_DEPTH_COMPONENT32F, 1, 1);
2715 glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT,
2716 depthTexData);
2717
2718 EXPECT_GL_NO_ERROR();
2719
2720 glUseProgram(mProgram);
2721 glUniform1f(mDepthRefUniformLocation, 0.3f);
2722 glUniform1i(mTexture2DUniformLocation, 0);
2723 glUniform1i(mTextureCubeUniformLocation, 1);
2724 glUniform1i(mTexture2DShadowUniformLocation, 2);
2725 glUniform1i(mTextureCubeShadowUniformLocation, 3);
2726
2727 drawQuad(mProgram, "position", 0.5f);
2728 EXPECT_GL_NO_ERROR();
2729 // The shader writes:
2730 // <texture 2d color> +
2731 // <cube map color> +
2732 // 0.25 * <comparison result (1.0)> +
2733 // 0.125 * <comparison result (0.0)>
2734 EXPECT_PIXEL_NEAR(0, 0, 64, 154, 184, 255, 2);
2735}
2736
Olli Etuahobce743a2016-01-15 17:18:28 +02002737// Test different base levels on textures accessed through the same sampler array.
2738// Calling textureSize() on the samplers hits the D3D sampler metadata workaround.
2739TEST_P(TextureSizeTextureArrayTest, BaseLevelVariesInTextureArray)
2740{
Yunchao He9550c602018-02-13 14:47:05 +08002741 ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
2742
Olli Etuahobce743a2016-01-15 17:18:28 +02002743 glActiveTexture(GL_TEXTURE0);
2744 glBindTexture(GL_TEXTURE_2D, mTexture2DA);
2745 GLsizei size = 64;
2746 for (GLint level = 0; level < 7; ++level)
2747 {
2748 ASSERT_LT(0, size);
2749 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2750 nullptr);
2751 size = size / 2;
2752 }
2753 ASSERT_EQ(0, size);
2754 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2755
2756 glActiveTexture(GL_TEXTURE1);
2757 glBindTexture(GL_TEXTURE_2D, mTexture2DB);
2758 size = 128;
2759 for (GLint level = 0; level < 8; ++level)
2760 {
2761 ASSERT_LT(0, size);
2762 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2763 nullptr);
2764 size = size / 2;
2765 }
2766 ASSERT_EQ(0, size);
2767 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
2768 EXPECT_GL_NO_ERROR();
2769
2770 glUseProgram(mProgram);
2771 glUniform1i(mTexture0Location, 0);
2772 glUniform1i(mTexture1Location, 1);
2773
Olli Etuaho5804dc82018-04-13 14:11:46 +03002774 drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
Olli Etuahobce743a2016-01-15 17:18:28 +02002775 EXPECT_GL_NO_ERROR();
2776 // Red channel: width of level 1 of texture A: 32.
2777 // Green channel: width of level 3 of texture B: 16.
2778 EXPECT_PIXEL_NEAR(0, 0, 32, 16, 0, 255, 2);
2779}
2780
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002781// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2782// ES 3.0.4 table 3.24
2783TEST_P(Texture2DTestES3, TextureRGBImplicitAlpha1)
2784{
2785 glActiveTexture(GL_TEXTURE0);
2786 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2787 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
2788 EXPECT_GL_NO_ERROR();
2789
2790 drawQuad(mProgram, "position", 0.5f);
2791
2792 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2793}
2794
2795// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2796// ES 3.0.4 table 3.24
Luc Ferron5164b792018-03-06 09:10:12 -05002797TEST_P(Texture2DTest, TextureLuminanceImplicitAlpha1)
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002798{
Luc Ferron5164b792018-03-06 09:10:12 -05002799 setUpProgram();
2800
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002801 glActiveTexture(GL_TEXTURE0);
2802 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2803 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
2804 EXPECT_GL_NO_ERROR();
2805
2806 drawQuad(mProgram, "position", 0.5f);
2807
2808 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2809}
2810
Luc Ferron5164b792018-03-06 09:10:12 -05002811// Validate that every component of the pixel will be equal to the luminance value we've set
2812// and that the alpha channel will be 1 (or 255 to be exact).
2813TEST_P(Texture2DTest, TextureLuminanceRGBSame)
2814{
2815 setUpProgram();
2816
2817 glActiveTexture(GL_TEXTURE0);
2818 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2819 uint8_t pixel = 50;
2820 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &pixel);
2821 EXPECT_GL_NO_ERROR();
2822
2823 drawQuad(mProgram, "position", 0.5f);
2824
2825 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(pixel, pixel, pixel, 255));
2826}
2827
2828// Validate that every component of the pixel will be equal to the luminance value we've set
2829// and that the alpha channel will be the second component.
2830TEST_P(Texture2DTest, TextureLuminanceAlphaRGBSame)
2831{
2832 setUpProgram();
2833
2834 glActiveTexture(GL_TEXTURE0);
2835 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2836 uint8_t pixel[] = {50, 25};
2837 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
2838 GL_UNSIGNED_BYTE, pixel);
2839 EXPECT_GL_NO_ERROR();
2840
2841 drawQuad(mProgram, "position", 0.5f);
2842
2843 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(pixel[0], pixel[0], pixel[0], pixel[1]));
2844}
2845
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002846// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2847// ES 3.0.4 table 3.24
Luc Ferron5164b792018-03-06 09:10:12 -05002848TEST_P(Texture2DTest, TextureLuminance32ImplicitAlpha1)
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002849{
Jamie Madillb8149072019-04-30 16:14:44 -04002850 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
Luc Ferrond8c632c2018-04-10 12:31:44 -04002851 ANGLE_SKIP_TEST_IF(IsD3D9());
2852 ANGLE_SKIP_TEST_IF(IsVulkan());
Luc Ferron5164b792018-03-06 09:10:12 -05002853
2854 setUpProgram();
2855
Luc Ferrond8c632c2018-04-10 12:31:44 -04002856 glActiveTexture(GL_TEXTURE0);
2857 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2858 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_FLOAT, nullptr);
2859 EXPECT_GL_NO_ERROR();
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002860
Luc Ferrond8c632c2018-04-10 12:31:44 -04002861 drawQuad(mProgram, "position", 0.5f);
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002862
Luc Ferrond8c632c2018-04-10 12:31:44 -04002863 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002864}
2865
2866// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2867// ES 3.0.4 table 3.24
Luc Ferron5164b792018-03-06 09:10:12 -05002868TEST_P(Texture2DTest, TextureLuminance16ImplicitAlpha1)
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002869{
Jamie Madillb8149072019-04-30 16:14:44 -04002870 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
Luc Ferrond8c632c2018-04-10 12:31:44 -04002871 ANGLE_SKIP_TEST_IF(IsD3D9());
2872 ANGLE_SKIP_TEST_IF(IsVulkan());
Luc Ferrond8c632c2018-04-10 12:31:44 -04002873 // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1420 is fixed
2874 ANGLE_SKIP_TEST_IF(IsAndroid() && IsAdreno() && IsOpenGLES());
Luc Ferron5164b792018-03-06 09:10:12 -05002875
Luc Ferrond8c632c2018-04-10 12:31:44 -04002876 setUpProgram();
Luc Ferron5164b792018-03-06 09:10:12 -05002877
Luc Ferrond8c632c2018-04-10 12:31:44 -04002878 glActiveTexture(GL_TEXTURE0);
2879 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2880 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, nullptr);
2881 EXPECT_GL_NO_ERROR();
Yunchao He9550c602018-02-13 14:47:05 +08002882
Luc Ferrond8c632c2018-04-10 12:31:44 -04002883 drawQuad(mProgram, "position", 0.5f);
Yuly Novikovafcec832016-06-21 22:19:51 -04002884
Luc Ferrond8c632c2018-04-10 12:31:44 -04002885 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002886}
2887
2888// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2889// ES 3.0.4 table 3.24
2890TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB8UIImplicitAlpha1)
2891{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002892 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2893
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002894 glActiveTexture(GL_TEXTURE0);
2895 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2896 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, nullptr);
2897 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2898 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2899 EXPECT_GL_NO_ERROR();
2900
2901 drawQuad(mProgram, "position", 0.5f);
2902
2903 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2904}
2905
2906// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2907// ES 3.0.4 table 3.24
2908TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB8IImplicitAlpha1)
2909{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002910 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2911
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002912 glActiveTexture(GL_TEXTURE0);
2913 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2914
2915 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8I, 1, 1, 0, GL_RGB_INTEGER, GL_BYTE, nullptr);
2916 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2917 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2918 EXPECT_GL_NO_ERROR();
2919
2920 drawQuad(mProgram, "position", 0.5f);
2921
2922 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2923}
2924
2925// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2926// ES 3.0.4 table 3.24
2927TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB16UIImplicitAlpha1)
2928{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002929 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2930
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002931 glActiveTexture(GL_TEXTURE0);
2932 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2933 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, nullptr);
2934 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2935 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2936 EXPECT_GL_NO_ERROR();
2937
2938 drawQuad(mProgram, "position", 0.5f);
2939
2940 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2941}
2942
2943// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2944// ES 3.0.4 table 3.24
2945TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB16IImplicitAlpha1)
2946{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002947 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2948
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002949 glActiveTexture(GL_TEXTURE0);
2950 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2951 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16I, 1, 1, 0, GL_RGB_INTEGER, GL_SHORT, nullptr);
2952 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2953 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2954 EXPECT_GL_NO_ERROR();
2955
2956 drawQuad(mProgram, "position", 0.5f);
2957
2958 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2959}
2960
2961// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2962// ES 3.0.4 table 3.24
2963TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB32UIImplicitAlpha1)
2964{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002965 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2966
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002967 glActiveTexture(GL_TEXTURE0);
2968 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2969 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, nullptr);
2970 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2971 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2972 EXPECT_GL_NO_ERROR();
2973
2974 drawQuad(mProgram, "position", 0.5f);
2975
2976 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2977}
2978
2979// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2980// ES 3.0.4 table 3.24
2981TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB32IImplicitAlpha1)
2982{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002983 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2984
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002985 glActiveTexture(GL_TEXTURE0);
2986 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2987 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32I, 1, 1, 0, GL_RGB_INTEGER, GL_INT, nullptr);
2988 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2989 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2990 EXPECT_GL_NO_ERROR();
2991
2992 drawQuad(mProgram, "position", 0.5f);
2993
2994 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2995}
2996
2997// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2998// ES 3.0.4 table 3.24
2999TEST_P(Texture2DTestES3, TextureRGBSNORMImplicitAlpha1)
3000{
3001 glActiveTexture(GL_TEXTURE0);
3002 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3003 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 1, 1, 0, GL_RGB, GL_BYTE, nullptr);
3004 EXPECT_GL_NO_ERROR();
3005
3006 drawQuad(mProgram, "position", 0.5f);
3007
3008 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3009}
3010
3011// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
3012// ES 3.0.4 table 3.24
3013TEST_P(Texture2DTestES3, TextureRGB9E5ImplicitAlpha1)
3014{
3015 glActiveTexture(GL_TEXTURE0);
3016 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3017 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB9_E5, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV,
3018 nullptr);
3019 EXPECT_GL_NO_ERROR();
3020
3021 drawQuad(mProgram, "position", 0.5f);
3022
3023 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3024}
3025
3026// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
3027// ES 3.0.4 table 3.24
3028TEST_P(Texture2DTestES3, TextureCOMPRESSEDRGB8ETC2ImplicitAlpha1)
3029{
Geoff Lang2a19c592019-08-23 14:10:24 -04003030 // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
3031 ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
Yuly Novikov49886892018-01-23 21:18:27 -05003032
Olli Etuaho6ee394a2016-02-18 13:30:09 +02003033 glActiveTexture(GL_TEXTURE0);
3034 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3035 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 1, 1, 0, 8, nullptr);
3036 EXPECT_GL_NO_ERROR();
3037
3038 drawQuad(mProgram, "position", 0.5f);
3039
3040 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3041}
3042
3043// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
3044// ES 3.0.4 table 3.24
3045TEST_P(Texture2DTestES3, TextureCOMPRESSEDSRGB8ETC2ImplicitAlpha1)
3046{
Geoff Lang2a19c592019-08-23 14:10:24 -04003047 // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
3048 ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
Yuly Novikov49886892018-01-23 21:18:27 -05003049
Olli Etuaho6ee394a2016-02-18 13:30:09 +02003050 glActiveTexture(GL_TEXTURE0);
3051 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3052 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ETC2, 1, 1, 0, 8, nullptr);
3053 EXPECT_GL_NO_ERROR();
3054
3055 drawQuad(mProgram, "position", 0.5f);
3056
3057 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3058}
3059
Olli Etuaho96963162016-03-21 11:54:33 +02003060// Use a sampler in a uniform struct.
3061TEST_P(SamplerInStructTest, SamplerInStruct)
3062{
3063 runSamplerInStructTest();
3064}
3065
3066// Use a sampler in a uniform struct that's passed as a function parameter.
3067TEST_P(SamplerInStructAsFunctionParameterTest, SamplerInStructAsFunctionParameter)
3068{
Yuly Novikovd18c0482019-04-04 19:56:43 -04003069 // Fails on Nexus 5X due to a driver bug. http://anglebug.com/1427
3070 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Geoff Lang8fcdf6e2016-09-16 10:45:30 -04003071
Olli Etuaho96963162016-03-21 11:54:33 +02003072 runSamplerInStructTest();
3073}
3074
3075// Use a sampler in a uniform struct array with a struct from the array passed as a function
3076// parameter.
3077TEST_P(SamplerInStructArrayAsFunctionParameterTest, SamplerInStructArrayAsFunctionParameter)
3078{
Yuly Novikovd18c0482019-04-04 19:56:43 -04003079 // Fails on Nexus 5X due to a driver bug. http://anglebug.com/1427
3080 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Yunchao He9550c602018-02-13 14:47:05 +08003081
Olli Etuaho96963162016-03-21 11:54:33 +02003082 runSamplerInStructTest();
3083}
3084
3085// Use a sampler in a struct inside a uniform struct with the nested struct passed as a function
3086// parameter.
3087TEST_P(SamplerInNestedStructAsFunctionParameterTest, SamplerInNestedStructAsFunctionParameter)
3088{
Yuly Novikovd18c0482019-04-04 19:56:43 -04003089 // Fails on Nexus 5X due to a driver bug. http://anglebug.com/1427
3090 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Yunchao He9550c602018-02-13 14:47:05 +08003091
Olli Etuaho96963162016-03-21 11:54:33 +02003092 runSamplerInStructTest();
3093}
3094
3095// Make sure that there isn't a name conflict between sampler extracted from a struct and a
3096// similarly named uniform.
3097TEST_P(SamplerInStructAndOtherVariableTest, SamplerInStructAndOtherVariable)
3098{
3099 runSamplerInStructTest();
3100}
3101
Shahbaz Youssefi962c2222019-02-20 15:43:41 -05003102// GL_EXT_texture_filter_anisotropic
3103class TextureAnisotropyTest : public Texture2DTest
3104{
3105 protected:
3106 void uploadTexture()
3107 {
3108 glActiveTexture(GL_TEXTURE0);
3109 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3110 GLColor texDataRed[1] = {GLColor::red};
3111 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed);
3112 EXPECT_GL_NO_ERROR();
3113 }
3114};
3115
3116// Tests that setting anisotropic filtering doesn't cause failures at draw time.
3117TEST_P(TextureAnisotropyTest, AnisotropyFunctional)
3118{
Jamie Madillb8149072019-04-30 16:14:44 -04003119 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_filter_anisotropic"));
Shahbaz Youssefi962c2222019-02-20 15:43:41 -05003120
3121 setUpProgram();
3122
3123 uploadTexture();
3124
3125 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3126 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3127 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f);
3128 EXPECT_GL_NO_ERROR();
3129
3130 drawQuad(mProgram, "position", 0.5f);
3131
3132 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3133 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3134 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::red);
3135}
3136
Till Rathmannb8543632018-10-02 19:46:14 +02003137// GL_OES_texture_border_clamp
3138class TextureBorderClampTest : public Texture2DTest
3139{
3140 protected:
3141 TextureBorderClampTest() : Texture2DTest() {}
3142
Jamie Madill35cd7332018-12-02 12:03:33 -05003143 const char *getVertexShaderSource() override
Till Rathmannb8543632018-10-02 19:46:14 +02003144 {
3145 return
3146 R"(precision highp float;
3147 attribute vec4 position;
3148 varying vec2 texcoord;
3149
3150 void main()
3151 {
3152 gl_Position = vec4(position.xy, 0.0, 1.0);
3153 // texcoords in [-0.5, 1.5]
3154 texcoord = (position.xy) + 0.5;
3155 })";
3156 }
3157
3158 void uploadTexture()
3159 {
3160 glActiveTexture(GL_TEXTURE0);
3161 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3162 std::vector<GLColor> texDataRed(1, GLColor::red);
3163 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3164 texDataRed.data());
3165 EXPECT_GL_NO_ERROR();
3166 }
3167};
3168
3169// Test if the color set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the texture in
3170// GL_CLAMP_TO_BORDER wrap mode (set with glTexParameter).
3171TEST_P(TextureBorderClampTest, TextureBorderClampFunctional)
3172{
Jamie Madillb8149072019-04-30 16:14:44 -04003173 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003174
3175 setUpProgram();
3176
3177 uploadTexture();
3178
3179 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3180 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3181 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3182 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3183 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3184 EXPECT_GL_NO_ERROR();
3185
3186 drawQuad(mProgram, "position", 0.5f);
3187
3188 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3189 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3190 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3191}
3192
3193// Test reading back GL_TEXTURE_BORDER_COLOR by glGetTexParameter.
3194TEST_P(TextureBorderClampTest, TextureBorderClampFunctional2)
3195{
Jamie Madillb8149072019-04-30 16:14:44 -04003196 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003197
3198 glActiveTexture(GL_TEXTURE0);
3199 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3200
3201 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3202
3203 GLint colorFixedPoint[4] = {0};
3204 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorFixedPoint);
3205 constexpr GLint colorGreenFixedPoint[4] = {0, std::numeric_limits<GLint>::max(), 0,
3206 std::numeric_limits<GLint>::max()};
3207 EXPECT_EQ(colorFixedPoint[0], colorGreenFixedPoint[0]);
3208 EXPECT_EQ(colorFixedPoint[1], colorGreenFixedPoint[1]);
3209 EXPECT_EQ(colorFixedPoint[2], colorGreenFixedPoint[2]);
3210 EXPECT_EQ(colorFixedPoint[3], colorGreenFixedPoint[3]);
3211
3212 constexpr GLint colorBlueFixedPoint[4] = {0, 0, std::numeric_limits<GLint>::max(),
3213 std::numeric_limits<GLint>::max()};
3214 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorBlueFixedPoint);
3215
3216 GLfloat color[4] = {0.0f};
3217 glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);
3218 EXPECT_EQ(color[0], kFloatBlue.R);
3219 EXPECT_EQ(color[1], kFloatBlue.G);
3220 EXPECT_EQ(color[2], kFloatBlue.B);
3221 EXPECT_EQ(color[3], kFloatBlue.A);
3222}
3223
3224// Test GL_TEXTURE_BORDER_COLOR parameter validation at glTexParameter.
3225TEST_P(TextureBorderClampTest, TextureBorderClampValidation)
3226{
Jamie Madillb8149072019-04-30 16:14:44 -04003227 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003228
3229 glActiveTexture(GL_TEXTURE0);
3230 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3231
3232 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 1.0f);
3233 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3234
3235 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, std::numeric_limits<GLint>::max());
3236 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3237
3238 glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3239 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3240
3241 GLint colorInt[4] = {0};
3242 glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, colorInt);
3243 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3244
3245 if (getClientMajorVersion() < 3)
3246 {
3247 glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
3248 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3249 glGetTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
3250 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3251
3252 GLuint colorUInt[4] = {0};
3253 glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
3254 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3255 glGetTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
3256 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3257
3258 GLSampler sampler;
3259 glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
3260 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3261 glGetSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
3262 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3263
3264 glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
3265 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3266 glGetSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
3267 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3268 }
3269}
3270
3271class TextureBorderClampTestES3 : public TextureBorderClampTest
3272{
3273 protected:
3274 TextureBorderClampTestES3() : TextureBorderClampTest() {}
3275};
3276
3277// Test if the color set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the texture in
3278// GL_CLAMP_TO_BORDER wrap mode (set with glSamplerParameter).
3279TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Functional)
3280{
Jamie Madillb8149072019-04-30 16:14:44 -04003281 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003282
3283 setUpProgram();
3284
3285 uploadTexture();
3286
3287 GLSampler sampler;
3288 glBindSampler(0, sampler);
3289 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3290 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3291 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3292 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3293 glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3294 EXPECT_GL_NO_ERROR();
3295
3296 drawQuad(mProgram, "position", 0.5f);
3297
3298 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3299 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3300 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3301}
3302
3303// Test reading back GL_TEXTURE_BORDER_COLOR by glGetSamplerParameter.
3304TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Functional2)
3305{
Jamie Madillb8149072019-04-30 16:14:44 -04003306 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003307
3308 glActiveTexture(GL_TEXTURE0);
3309
3310 GLSampler sampler;
3311 glBindSampler(0, sampler);
3312
3313 glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3314
3315 GLint colorFixedPoint[4] = {0};
3316 glGetSamplerParameteriv(sampler, GL_TEXTURE_BORDER_COLOR, colorFixedPoint);
3317 constexpr GLint colorGreenFixedPoint[4] = {0, std::numeric_limits<GLint>::max(), 0,
3318 std::numeric_limits<GLint>::max()};
3319 EXPECT_EQ(colorFixedPoint[0], colorGreenFixedPoint[0]);
3320 EXPECT_EQ(colorFixedPoint[1], colorGreenFixedPoint[1]);
3321 EXPECT_EQ(colorFixedPoint[2], colorGreenFixedPoint[2]);
3322 EXPECT_EQ(colorFixedPoint[3], colorGreenFixedPoint[3]);
3323
3324 constexpr GLint colorBlueFixedPoint[4] = {0, 0, std::numeric_limits<GLint>::max(),
3325 std::numeric_limits<GLint>::max()};
3326 glSamplerParameteriv(sampler, GL_TEXTURE_BORDER_COLOR, colorBlueFixedPoint);
3327
3328 GLfloat color[4] = {0.0f};
3329 glGetSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, color);
3330 EXPECT_EQ(color[0], kFloatBlue.R);
3331 EXPECT_EQ(color[1], kFloatBlue.G);
3332 EXPECT_EQ(color[2], kFloatBlue.B);
3333 EXPECT_EQ(color[3], kFloatBlue.A);
3334
3335 constexpr GLint colorSomewhatRedInt[4] = {500000, 0, 0, std::numeric_limits<GLint>::max()};
3336 glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorSomewhatRedInt);
3337 GLint colorInt[4] = {0};
3338 glGetSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
3339 EXPECT_EQ(colorInt[0], colorSomewhatRedInt[0]);
3340 EXPECT_EQ(colorInt[1], colorSomewhatRedInt[1]);
3341 EXPECT_EQ(colorInt[2], colorSomewhatRedInt[2]);
3342 EXPECT_EQ(colorInt[3], colorSomewhatRedInt[3]);
3343
3344 constexpr GLuint colorSomewhatRedUInt[4] = {500000, 0, 0, std::numeric_limits<GLuint>::max()};
3345 glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorSomewhatRedUInt);
3346 GLuint colorUInt[4] = {0};
3347 glGetSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
3348 EXPECT_EQ(colorUInt[0], colorSomewhatRedUInt[0]);
3349 EXPECT_EQ(colorUInt[1], colorSomewhatRedUInt[1]);
3350 EXPECT_EQ(colorUInt[2], colorSomewhatRedUInt[2]);
3351 EXPECT_EQ(colorUInt[3], colorSomewhatRedUInt[3]);
3352
3353 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3354
3355 constexpr GLint colorSomewhatGreenInt[4] = {0, 500000, 0, std::numeric_limits<GLint>::max()};
3356 glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorSomewhatGreenInt);
3357 glGetTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
3358 EXPECT_EQ(colorInt[0], colorSomewhatGreenInt[0]);
3359 EXPECT_EQ(colorInt[1], colorSomewhatGreenInt[1]);
3360 EXPECT_EQ(colorInt[2], colorSomewhatGreenInt[2]);
3361 EXPECT_EQ(colorInt[3], colorSomewhatGreenInt[3]);
3362
3363 constexpr GLuint colorSomewhatGreenUInt[4] = {0, 500000, 0, std::numeric_limits<GLuint>::max()};
3364 glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorSomewhatGreenUInt);
3365 glGetTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
3366 EXPECT_EQ(colorUInt[0], colorSomewhatGreenUInt[0]);
3367 EXPECT_EQ(colorUInt[1], colorSomewhatGreenUInt[1]);
3368 EXPECT_EQ(colorUInt[2], colorSomewhatGreenUInt[2]);
3369 EXPECT_EQ(colorUInt[3], colorSomewhatGreenUInt[3]);
3370}
3371
3372// Test GL_TEXTURE_BORDER_COLOR parameter validation at glSamplerParameter.
3373TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Validation)
3374{
Jamie Madillb8149072019-04-30 16:14:44 -04003375 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003376
3377 glActiveTexture(GL_TEXTURE0);
3378
3379 GLSampler sampler;
3380 glBindSampler(0, sampler);
3381
3382 glSamplerParameterf(sampler, GL_TEXTURE_BORDER_COLOR, 1.0f);
3383 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3384
3385 glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, std::numeric_limits<GLint>::max());
3386 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3387}
3388
3389class TextureBorderClampIntegerTestES3 : public Texture2DTest
3390{
3391 protected:
3392 TextureBorderClampIntegerTestES3() : Texture2DTest(), isUnsignedIntTest(false) {}
3393
Jamie Madill35cd7332018-12-02 12:03:33 -05003394 const char *getVertexShaderSource() override
Till Rathmannb8543632018-10-02 19:46:14 +02003395 {
3396 return
3397 R"(#version 300 es
3398 out vec2 texcoord;
3399 in vec4 position;
3400
3401 void main()
3402 {
3403 gl_Position = vec4(position.xy, 0.0, 1.0);
3404 // texcoords in [-0.5, 1.5]
3405 texcoord = (position.xy) + 0.5;
3406 })";
3407 }
3408
Jamie Madillba319ba2018-12-29 10:29:33 -05003409 const char *getFragmentShaderSource() override
Till Rathmannb8543632018-10-02 19:46:14 +02003410 {
Jamie Madill35cd7332018-12-02 12:03:33 -05003411 if (isUnsignedIntTest)
3412 {
3413 return "#version 300 es\n"
3414 "precision highp float;\n"
3415 "uniform highp usampler2D tex;\n"
3416 "in vec2 texcoord;\n"
3417 "out vec4 fragColor;\n"
Till Rathmannb8543632018-10-02 19:46:14 +02003418
Jamie Madill35cd7332018-12-02 12:03:33 -05003419 "void main()\n"
3420 "{\n"
3421 "vec4 red = vec4(1.0, 0.0, 0.0, 1.0);\n"
3422 "vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
3423 "fragColor = (texture(tex, texcoord).r == 150u)"
3424 " ? green : red;\n"
3425 "}\n";
3426 }
3427 else
3428 {
3429 return "#version 300 es\n"
3430 "precision highp float;\n"
3431 "uniform highp isampler2D tex;\n"
3432 "in vec2 texcoord;\n"
3433 "out vec4 fragColor;\n"
3434
3435 "void main()\n"
3436 "{\n"
3437 "vec4 red = vec4(1.0, 0.0, 0.0, 1.0);\n"
3438 "vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
3439 "fragColor = (texture(tex, texcoord).r == -50)"
3440 " ? green : red;\n"
3441 "}\n";
3442 }
Till Rathmannb8543632018-10-02 19:46:14 +02003443 }
3444
3445 void uploadTexture()
3446 {
3447 glActiveTexture(GL_TEXTURE0);
3448 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3449 if (isUnsignedIntTest)
3450 {
3451 std::vector<GLubyte> texData(4, 100);
3452 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 1, 1, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
3453 texData.data());
3454 }
3455 else
3456 {
3457 std::vector<GLbyte> texData(4, 100);
3458 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, 1, 1, 0, GL_RGBA_INTEGER, GL_BYTE,
3459 texData.data());
3460 }
3461 EXPECT_GL_NO_ERROR();
3462 }
3463
3464 bool isUnsignedIntTest;
3465};
3466
3467// Test if the integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the
3468// integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIivOES).
3469TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampInteger)
3470{
Yuly Novikov1dbbc7b2019-07-31 17:49:39 -04003471 // Fails on Win10 FYI x64 Release (AMD RX 550). http://anglebug.com/3760
3472 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
3473
Jamie Madillb8149072019-04-30 16:14:44 -04003474 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003475
3476 setUpProgram();
3477
3478 uploadTexture();
3479
3480 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3481 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3482 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3483 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3484
3485 constexpr GLint borderColor[4] = {-50, -50, -50, -50};
3486 glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3487
3488 EXPECT_GL_NO_ERROR();
3489
3490 drawQuad(mProgram, "position", 0.5f);
3491
3492 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3493 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3494 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3495}
3496
3497// Test if the integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the
3498// integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIivOES).
3499TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampInteger2)
3500{
Yuly Novikov1dbbc7b2019-07-31 17:49:39 -04003501 // Fails on Win10 FYI x64 Release (AMD RX 550). http://anglebug.com/3760
3502 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
3503
Jamie Madillb8149072019-04-30 16:14:44 -04003504 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003505
3506 setUpProgram();
3507
3508 uploadTexture();
3509
3510 GLSampler sampler;
3511 glBindSampler(0, sampler);
3512 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3513 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3514 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3515 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3516
3517 constexpr GLint borderColor[4] = {-50, -50, -50, -50};
3518 glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, borderColor);
3519
3520 EXPECT_GL_NO_ERROR();
3521
3522 drawQuad(mProgram, "position", 0.5f);
3523
3524 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3525 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3526 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3527}
3528
3529// Test if the unsigned integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside
3530// of the unsigned integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIuivOES).
3531TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampIntegerUnsigned)
3532{
Jamie Madillb8149072019-04-30 16:14:44 -04003533 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003534
3535 isUnsignedIntTest = true;
3536
3537 setUpProgram();
3538
3539 uploadTexture();
3540
3541 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3542 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3543 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3544 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3545
3546 constexpr GLuint borderColor[4] = {150, 150, 150, 150};
3547 glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3548
3549 EXPECT_GL_NO_ERROR();
3550
3551 drawQuad(mProgram, "position", 0.5f);
3552
3553 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3554 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3555 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3556}
3557
3558// Test if the unsigned integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside
3559// of the unsigned integer texture in GL_CLAMP_TO_BORDER wrap mode (set with
3560// glSamplerParameterIuivOES).
3561TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampIntegerUnsigned2)
3562{
Jamie Madillb8149072019-04-30 16:14:44 -04003563 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003564
3565 isUnsignedIntTest = true;
3566
3567 setUpProgram();
3568
3569 uploadTexture();
3570
3571 GLSampler sampler;
3572 glBindSampler(0, sampler);
3573 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3574 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3575 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3576 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3577
3578 constexpr GLuint borderColor[4] = {150, 150, 150, 150};
3579 glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, borderColor);
3580
3581 EXPECT_GL_NO_ERROR();
3582
3583 drawQuad(mProgram, "position", 0.5f);
3584
3585 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3586 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3587 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3588}
3589
3590// ~GL_OES_texture_border_clamp
3591
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003592class TextureLimitsTest : public ANGLETest
3593{
3594 protected:
3595 struct RGBA8
3596 {
3597 uint8_t R, G, B, A;
3598 };
3599
3600 TextureLimitsTest()
3601 : mProgram(0), mMaxVertexTextures(0), mMaxFragmentTextures(0), mMaxCombinedTextures(0)
3602 {
3603 setWindowWidth(128);
3604 setWindowHeight(128);
3605 setConfigRedBits(8);
3606 setConfigGreenBits(8);
3607 setConfigBlueBits(8);
3608 setConfigAlphaBits(8);
3609 }
3610
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003611 void testSetUp() override
Jamie Madill0fdb9562018-09-17 17:18:43 -04003612 {
Jamie Madill0fdb9562018-09-17 17:18:43 -04003613 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &mMaxVertexTextures);
3614 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mMaxFragmentTextures);
3615 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mMaxCombinedTextures);
3616
3617 ASSERT_GL_NO_ERROR();
3618 }
3619
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003620 void testTearDown() override
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003621 {
3622 if (mProgram != 0)
3623 {
3624 glDeleteProgram(mProgram);
3625 mProgram = 0;
3626
3627 if (!mTextures.empty())
3628 {
3629 glDeleteTextures(static_cast<GLsizei>(mTextures.size()), &mTextures[0]);
3630 }
3631 }
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003632 }
3633
3634 void compileProgramWithTextureCounts(const std::string &vertexPrefix,
3635 GLint vertexTextureCount,
3636 GLint vertexActiveTextureCount,
3637 const std::string &fragPrefix,
3638 GLint fragmentTextureCount,
3639 GLint fragmentActiveTextureCount)
3640 {
3641 std::stringstream vertexShaderStr;
3642 vertexShaderStr << "attribute vec2 position;\n"
3643 << "varying vec4 color;\n"
3644 << "varying vec2 texCoord;\n";
3645
3646 for (GLint textureIndex = 0; textureIndex < vertexTextureCount; ++textureIndex)
3647 {
3648 vertexShaderStr << "uniform sampler2D " << vertexPrefix << textureIndex << ";\n";
3649 }
3650
3651 vertexShaderStr << "void main() {\n"
3652 << " gl_Position = vec4(position, 0, 1);\n"
3653 << " texCoord = (position * 0.5) + 0.5;\n"
3654 << " color = vec4(0);\n";
3655
3656 for (GLint textureIndex = 0; textureIndex < vertexActiveTextureCount; ++textureIndex)
3657 {
3658 vertexShaderStr << " color += texture2D(" << vertexPrefix << textureIndex
3659 << ", texCoord);\n";
3660 }
3661
3662 vertexShaderStr << "}";
3663
3664 std::stringstream fragmentShaderStr;
3665 fragmentShaderStr << "varying mediump vec4 color;\n"
3666 << "varying mediump vec2 texCoord;\n";
3667
3668 for (GLint textureIndex = 0; textureIndex < fragmentTextureCount; ++textureIndex)
3669 {
3670 fragmentShaderStr << "uniform sampler2D " << fragPrefix << textureIndex << ";\n";
3671 }
3672
3673 fragmentShaderStr << "void main() {\n"
3674 << " gl_FragColor = color;\n";
3675
3676 for (GLint textureIndex = 0; textureIndex < fragmentActiveTextureCount; ++textureIndex)
3677 {
3678 fragmentShaderStr << " gl_FragColor += texture2D(" << fragPrefix << textureIndex
3679 << ", texCoord);\n";
3680 }
3681
3682 fragmentShaderStr << "}";
3683
3684 const std::string &vertexShaderSource = vertexShaderStr.str();
3685 const std::string &fragmentShaderSource = fragmentShaderStr.str();
3686
Jamie Madill35cd7332018-12-02 12:03:33 -05003687 mProgram = CompileProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str());
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003688 }
3689
3690 RGBA8 getPixel(GLint texIndex)
3691 {
3692 RGBA8 pixel = {static_cast<uint8_t>(texIndex & 0x7u), static_cast<uint8_t>(texIndex >> 3),
3693 0, 255u};
3694 return pixel;
3695 }
3696
3697 void initTextures(GLint tex2DCount, GLint texCubeCount)
3698 {
3699 GLint totalCount = tex2DCount + texCubeCount;
3700 mTextures.assign(totalCount, 0);
3701 glGenTextures(totalCount, &mTextures[0]);
3702 ASSERT_GL_NO_ERROR();
3703
3704 std::vector<RGBA8> texData(16 * 16);
3705
3706 GLint texIndex = 0;
3707 for (; texIndex < tex2DCount; ++texIndex)
3708 {
3709 texData.assign(texData.size(), getPixel(texIndex));
3710 glActiveTexture(GL_TEXTURE0 + texIndex);
3711 glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]);
3712 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3713 &texData[0]);
3714 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3715 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3716 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3717 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3718 }
3719
3720 ASSERT_GL_NO_ERROR();
3721
3722 for (; texIndex < texCubeCount; ++texIndex)
3723 {
3724 texData.assign(texData.size(), getPixel(texIndex));
3725 glActiveTexture(GL_TEXTURE0 + texIndex);
3726 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[texIndex]);
3727 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3728 GL_UNSIGNED_BYTE, &texData[0]);
3729 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3730 GL_UNSIGNED_BYTE, &texData[0]);
3731 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3732 GL_UNSIGNED_BYTE, &texData[0]);
3733 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3734 GL_UNSIGNED_BYTE, &texData[0]);
3735 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3736 GL_UNSIGNED_BYTE, &texData[0]);
3737 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3738 GL_UNSIGNED_BYTE, &texData[0]);
3739 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3740 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3741 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3742 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3743 }
3744
3745 ASSERT_GL_NO_ERROR();
3746 }
3747
3748 void testWithTextures(GLint vertexTextureCount,
3749 const std::string &vertexTexturePrefix,
3750 GLint fragmentTextureCount,
3751 const std::string &fragmentTexturePrefix)
3752 {
3753 // Generate textures
3754 initTextures(vertexTextureCount + fragmentTextureCount, 0);
3755
3756 glUseProgram(mProgram);
3757 RGBA8 expectedSum = {0};
3758 for (GLint texIndex = 0; texIndex < vertexTextureCount; ++texIndex)
3759 {
3760 std::stringstream uniformNameStr;
3761 uniformNameStr << vertexTexturePrefix << texIndex;
3762 const std::string &uniformName = uniformNameStr.str();
Jamie Madill50cf2be2018-06-15 09:46:57 -04003763 GLint location = glGetUniformLocation(mProgram, uniformName.c_str());
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003764 ASSERT_NE(-1, location);
3765
3766 glUniform1i(location, texIndex);
3767 RGBA8 contribution = getPixel(texIndex);
3768 expectedSum.R += contribution.R;
3769 expectedSum.G += contribution.G;
3770 }
3771
3772 for (GLint texIndex = 0; texIndex < fragmentTextureCount; ++texIndex)
3773 {
3774 std::stringstream uniformNameStr;
3775 uniformNameStr << fragmentTexturePrefix << texIndex;
3776 const std::string &uniformName = uniformNameStr.str();
Jamie Madill50cf2be2018-06-15 09:46:57 -04003777 GLint location = glGetUniformLocation(mProgram, uniformName.c_str());
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003778 ASSERT_NE(-1, location);
3779
3780 glUniform1i(location, texIndex + vertexTextureCount);
3781 RGBA8 contribution = getPixel(texIndex + vertexTextureCount);
3782 expectedSum.R += contribution.R;
3783 expectedSum.G += contribution.G;
3784 }
3785
3786 ASSERT_GE(256u, expectedSum.G);
3787
3788 drawQuad(mProgram, "position", 0.5f);
3789 ASSERT_GL_NO_ERROR();
3790 EXPECT_PIXEL_EQ(0, 0, expectedSum.R, expectedSum.G, 0, 255);
3791 }
3792
3793 GLuint mProgram;
3794 std::vector<GLuint> mTextures;
3795 GLint mMaxVertexTextures;
3796 GLint mMaxFragmentTextures;
3797 GLint mMaxCombinedTextures;
3798};
3799
3800// Test rendering with the maximum vertex texture units.
3801TEST_P(TextureLimitsTest, MaxVertexTextures)
3802{
3803 compileProgramWithTextureCounts("tex", mMaxVertexTextures, mMaxVertexTextures, "tex", 0, 0);
3804 ASSERT_NE(0u, mProgram);
3805 ASSERT_GL_NO_ERROR();
3806
3807 testWithTextures(mMaxVertexTextures, "tex", 0, "tex");
3808}
3809
3810// Test rendering with the maximum fragment texture units.
3811TEST_P(TextureLimitsTest, MaxFragmentTextures)
3812{
3813 compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures, mMaxFragmentTextures);
3814 ASSERT_NE(0u, mProgram);
3815 ASSERT_GL_NO_ERROR();
3816
3817 testWithTextures(mMaxFragmentTextures, "tex", 0, "tex");
3818}
3819
3820// Test rendering with maximum combined texture units.
3821TEST_P(TextureLimitsTest, MaxCombinedTextures)
3822{
3823 GLint vertexTextures = mMaxVertexTextures;
3824
3825 if (vertexTextures + mMaxFragmentTextures > mMaxCombinedTextures)
3826 {
3827 vertexTextures = mMaxCombinedTextures - mMaxFragmentTextures;
3828 }
3829
3830 compileProgramWithTextureCounts("vtex", vertexTextures, vertexTextures, "ftex",
3831 mMaxFragmentTextures, mMaxFragmentTextures);
3832 ASSERT_NE(0u, mProgram);
3833 ASSERT_GL_NO_ERROR();
3834
3835 testWithTextures(vertexTextures, "vtex", mMaxFragmentTextures, "ftex");
3836}
3837
3838// Negative test for exceeding the number of vertex textures
3839TEST_P(TextureLimitsTest, ExcessiveVertexTextures)
3840{
3841 compileProgramWithTextureCounts("tex", mMaxVertexTextures + 1, mMaxVertexTextures + 1, "tex", 0,
3842 0);
3843 ASSERT_EQ(0u, mProgram);
3844}
3845
3846// Negative test for exceeding the number of fragment textures
3847TEST_P(TextureLimitsTest, ExcessiveFragmentTextures)
3848{
3849 compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 1,
3850 mMaxFragmentTextures + 1);
3851 ASSERT_EQ(0u, mProgram);
3852}
3853
3854// Test active vertex textures under the limit, but excessive textures specified.
3855TEST_P(TextureLimitsTest, MaxActiveVertexTextures)
3856{
3857 compileProgramWithTextureCounts("tex", mMaxVertexTextures + 4, mMaxVertexTextures, "tex", 0, 0);
3858 ASSERT_NE(0u, mProgram);
3859 ASSERT_GL_NO_ERROR();
3860
3861 testWithTextures(mMaxVertexTextures, "tex", 0, "tex");
3862}
3863
3864// Test active fragment textures under the limit, but excessive textures specified.
3865TEST_P(TextureLimitsTest, MaxActiveFragmentTextures)
3866{
3867 compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 4,
3868 mMaxFragmentTextures);
3869 ASSERT_NE(0u, mProgram);
3870 ASSERT_GL_NO_ERROR();
3871
3872 testWithTextures(0, "tex", mMaxFragmentTextures, "tex");
3873}
3874
3875// Negative test for pointing two sampler uniforms of different types to the same texture.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02003876// GLES 2.0.25 section 2.10.4 page 39.
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003877TEST_P(TextureLimitsTest, TextureTypeConflict)
3878{
Jamie Madill35cd7332018-12-02 12:03:33 -05003879 constexpr char kVS[] =
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003880 "attribute vec2 position;\n"
3881 "varying float color;\n"
3882 "uniform sampler2D tex2D;\n"
3883 "uniform samplerCube texCube;\n"
3884 "void main() {\n"
3885 " gl_Position = vec4(position, 0, 1);\n"
3886 " vec2 texCoord = (position * 0.5) + 0.5;\n"
3887 " color = texture2D(tex2D, texCoord).x;\n"
3888 " color += textureCube(texCube, vec3(texCoord, 0)).x;\n"
3889 "}";
Jamie Madill35cd7332018-12-02 12:03:33 -05003890 constexpr char kFS[] =
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003891 "varying mediump float color;\n"
3892 "void main() {\n"
3893 " gl_FragColor = vec4(color, 0, 0, 1);\n"
3894 "}";
3895
Jamie Madill35cd7332018-12-02 12:03:33 -05003896 mProgram = CompileProgram(kVS, kFS);
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003897 ASSERT_NE(0u, mProgram);
3898
3899 initTextures(1, 0);
3900
3901 glUseProgram(mProgram);
3902 GLint tex2DLocation = glGetUniformLocation(mProgram, "tex2D");
3903 ASSERT_NE(-1, tex2DLocation);
3904 GLint texCubeLocation = glGetUniformLocation(mProgram, "texCube");
3905 ASSERT_NE(-1, texCubeLocation);
3906
3907 glUniform1i(tex2DLocation, 0);
3908 glUniform1i(texCubeLocation, 0);
3909 ASSERT_GL_NO_ERROR();
3910
3911 drawQuad(mProgram, "position", 0.5f);
3912 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3913}
3914
Vincent Lang25ab4512016-05-13 18:13:59 +02003915class Texture2DNorm16TestES3 : public Texture2DTestES3
3916{
3917 protected:
3918 Texture2DNorm16TestES3() : Texture2DTestES3(), mTextures{0, 0, 0}, mFBO(0), mRenderbuffer(0) {}
3919
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003920 void testSetUp() override
Vincent Lang25ab4512016-05-13 18:13:59 +02003921 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003922 Texture2DTestES3::testSetUp();
Vincent Lang25ab4512016-05-13 18:13:59 +02003923
3924 glActiveTexture(GL_TEXTURE0);
3925 glGenTextures(3, mTextures);
3926 glGenFramebuffers(1, &mFBO);
3927 glGenRenderbuffers(1, &mRenderbuffer);
3928
3929 for (size_t textureIndex = 0; textureIndex < 3; textureIndex++)
3930 {
3931 glBindTexture(GL_TEXTURE_2D, mTextures[textureIndex]);
3932 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3933 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3934 }
3935
3936 glBindTexture(GL_TEXTURE_2D, 0);
3937
3938 ASSERT_GL_NO_ERROR();
3939 }
3940
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003941 void testTearDown() override
Vincent Lang25ab4512016-05-13 18:13:59 +02003942 {
3943 glDeleteTextures(3, mTextures);
3944 glDeleteFramebuffers(1, &mFBO);
3945 glDeleteRenderbuffers(1, &mRenderbuffer);
3946
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003947 Texture2DTestES3::testTearDown();
Vincent Lang25ab4512016-05-13 18:13:59 +02003948 }
3949
3950 void testNorm16Texture(GLint internalformat, GLenum format, GLenum type)
3951 {
Geoff Langf607c602016-09-21 11:46:48 -04003952 GLushort pixelValue = (type == GL_SHORT) ? 0x7FFF : 0x6A35;
3953 GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue};
Vincent Lang25ab4512016-05-13 18:13:59 +02003954
3955 setUpProgram();
3956
3957 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
3958 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0],
3959 0);
3960
3961 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3962 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16_EXT, 1, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT, nullptr);
3963
3964 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
Geoff Langf607c602016-09-21 11:46:48 -04003965 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
Vincent Lang25ab4512016-05-13 18:13:59 +02003966
3967 EXPECT_GL_NO_ERROR();
3968
3969 drawQuad(mProgram, "position", 0.5f);
3970
Geoff Langf607c602016-09-21 11:46:48 -04003971 GLubyte expectedValue = (type == GL_SHORT) ? 0xFF : static_cast<GLubyte>(pixelValue >> 8);
Vincent Lang25ab4512016-05-13 18:13:59 +02003972
Jamie Madill50cf2be2018-06-15 09:46:57 -04003973 EXPECT_PIXEL_COLOR_EQ(0, 0,
3974 SliceFormatColor(format, GLColor(expectedValue, expectedValue,
3975 expectedValue, expectedValue)));
Vincent Lang25ab4512016-05-13 18:13:59 +02003976
3977 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3978
3979 ASSERT_GL_NO_ERROR();
3980 }
3981
3982 void testNorm16Render(GLint internalformat, GLenum format, GLenum type)
3983 {
Jamie Madill50cf2be2018-06-15 09:46:57 -04003984 GLushort pixelValue = 0x6A35;
Geoff Langf607c602016-09-21 11:46:48 -04003985 GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue};
Vincent Lang25ab4512016-05-13 18:13:59 +02003986
3987 setUpProgram();
3988
3989 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3990 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, nullptr);
3991
3992 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
3993 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
3994 0);
3995
3996 glBindTexture(GL_TEXTURE_2D, mTextures[2]);
Geoff Langf607c602016-09-21 11:46:48 -04003997 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
Vincent Lang25ab4512016-05-13 18:13:59 +02003998
3999 EXPECT_GL_NO_ERROR();
4000
4001 drawQuad(mProgram, "position", 0.5f);
4002
Geoff Langf607c602016-09-21 11:46:48 -04004003 GLubyte expectedValue = static_cast<GLubyte>(pixelValue >> 8);
Jamie Madill50cf2be2018-06-15 09:46:57 -04004004 EXPECT_PIXEL_COLOR_EQ(0, 0,
4005 SliceFormatColor(format, GLColor(expectedValue, expectedValue,
4006 expectedValue, expectedValue)));
Vincent Lang25ab4512016-05-13 18:13:59 +02004007
4008 glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
4009 glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
4010 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
4011 mRenderbuffer);
4012 glBindRenderbuffer(GL_RENDERBUFFER, 0);
4013 EXPECT_GL_NO_ERROR();
4014
4015 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
4016 glClear(GL_COLOR_BUFFER_BIT);
4017
4018 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
4019
Geoff Langf607c602016-09-21 11:46:48 -04004020 EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor::white));
Vincent Lang25ab4512016-05-13 18:13:59 +02004021
4022 glBindFramebuffer(GL_FRAMEBUFFER, 0);
4023
4024 ASSERT_GL_NO_ERROR();
4025 }
4026
4027 GLuint mTextures[3];
4028 GLuint mFBO;
4029 GLuint mRenderbuffer;
4030};
4031
4032// Test texture formats enabled by the GL_EXT_texture_norm16 extension.
4033TEST_P(Texture2DNorm16TestES3, TextureNorm16Test)
4034{
Jamie Madillb8149072019-04-30 16:14:44 -04004035 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
Vincent Lang25ab4512016-05-13 18:13:59 +02004036
4037 testNorm16Texture(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
4038 testNorm16Texture(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
4039 testNorm16Texture(GL_RGB16_EXT, GL_RGB, GL_UNSIGNED_SHORT);
4040 testNorm16Texture(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
4041 testNorm16Texture(GL_R16_SNORM_EXT, GL_RED, GL_SHORT);
4042 testNorm16Texture(GL_RG16_SNORM_EXT, GL_RG, GL_SHORT);
4043 testNorm16Texture(GL_RGB16_SNORM_EXT, GL_RGB, GL_SHORT);
4044 testNorm16Texture(GL_RGBA16_SNORM_EXT, GL_RGBA, GL_SHORT);
4045
4046 testNorm16Render(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
4047 testNorm16Render(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
4048 testNorm16Render(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
4049}
4050
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004051class Texture2DRGTest : public Texture2DTest
4052{
4053 protected:
4054 Texture2DRGTest()
4055 : Texture2DTest(), mRenderableTexture(0), mTestTexture(0), mFBO(0), mRenderbuffer(0)
4056 {}
4057
4058 void testSetUp() override
4059 {
4060 Texture2DTest::testSetUp();
4061
4062 glActiveTexture(GL_TEXTURE0);
4063 glGenTextures(1, &mRenderableTexture);
4064 glGenTextures(1, &mTestTexture);
4065 glGenFramebuffers(1, &mFBO);
4066 glGenRenderbuffers(1, &mRenderbuffer);
4067
4068 glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
Mohan Maiya6caa2652019-09-11 08:06:13 -07004069 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4070 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004071 glBindTexture(GL_TEXTURE_2D, mTestTexture);
Mohan Maiya6caa2652019-09-11 08:06:13 -07004072 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4073 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004074
4075 glBindTexture(GL_TEXTURE_2D, 0);
4076
4077 setUpProgram();
4078 glUseProgram(mProgram);
4079 glUniform1i(mTexture2DUniformLocation, 0);
4080
4081 ASSERT_GL_NO_ERROR();
4082 }
4083
4084 void testTearDown() override
4085 {
4086 glDeleteTextures(1, &mRenderableTexture);
4087 glDeleteTextures(1, &mTestTexture);
4088 glDeleteFramebuffers(1, &mFBO);
4089 glDeleteRenderbuffers(1, &mRenderbuffer);
4090
4091 Texture2DTest::testTearDown();
4092 }
4093
4094 void setupFormatTextures(GLenum internalformat, GLenum format, GLenum type, GLvoid *imageData)
4095 {
4096 glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
4097 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4098
4099 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4100 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
4101 mRenderableTexture, 0);
4102
4103 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4104 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
4105
4106 EXPECT_GL_NO_ERROR();
4107 }
4108
4109 void testRGTexture(GLColor expectedColor)
4110 {
4111 drawQuad(mProgram, "position", 0.5f);
4112
4113 EXPECT_GL_NO_ERROR();
4114 EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, kPixelTolerance);
4115 }
4116
4117 void testRGRender(GLenum internalformat, GLenum format)
4118 {
4119 glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
4120 glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
4121 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
4122 mRenderbuffer);
4123 glBindRenderbuffer(GL_RENDERBUFFER, 0);
4124 EXPECT_GL_NO_ERROR();
4125
4126 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
4127 glClear(GL_COLOR_BUFFER_BIT);
4128
4129 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
4130
4131 ASSERT_GL_NO_ERROR();
4132 EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor(255u, 255u, 255u, 255u)));
4133 }
4134
4135 GLuint mRenderableTexture;
4136 GLuint mTestTexture;
4137 GLuint mFBO;
4138 GLuint mRenderbuffer;
4139};
4140
4141// Test unorm texture formats enabled by the GL_EXT_texture_rg extension.
4142TEST_P(Texture2DRGTest, TextureRGUNormTest)
4143{
4144 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
4145
4146 GLubyte pixelValue = 0xab;
4147 GLubyte imageData[] = {pixelValue, pixelValue};
4148
4149 setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_UNSIGNED_BYTE, imageData);
4150 testRGTexture(
4151 SliceFormatColor(GL_RED_EXT, GLColor(pixelValue, pixelValue, pixelValue, pixelValue)));
4152 testRGRender(GL_R8_EXT, GL_RED_EXT);
4153
4154 setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_UNSIGNED_BYTE, imageData);
4155 testRGTexture(
4156 SliceFormatColor(GL_RG_EXT, GLColor(pixelValue, pixelValue, pixelValue, pixelValue)));
4157 testRGRender(GL_RG8_EXT, GL_RG_EXT);
4158}
4159
4160// Test float texture formats enabled by the GL_EXT_texture_rg extension.
4161TEST_P(Texture2DRGTest, TextureRGFloatTest)
4162{
4163 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
4164 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4165
4166 GLfloat pixelValue = 0.54321;
4167 GLfloat imageData[] = {pixelValue, pixelValue};
4168
4169 GLubyte expectedValue = static_cast<GLubyte>(pixelValue * 255.0f);
4170 GLColor expectedColor = GLColor(expectedValue, expectedValue, expectedValue, expectedValue);
4171
4172 setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_FLOAT, imageData);
4173 testRGTexture(SliceFormatColor(GL_RED_EXT, expectedColor));
4174
4175 setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_FLOAT, imageData);
4176 testRGTexture(SliceFormatColor(GL_RG_EXT, expectedColor));
4177}
4178
4179// Test half-float texture formats enabled by the GL_EXT_texture_rg extension.
Mohan Maiya6caa2652019-09-11 08:06:13 -07004180TEST_P(Texture2DRGTest, TextureRGHalfFloatTest)
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004181{
4182 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
4183 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4184
4185 GLfloat pixelValueFloat = 0.543f;
4186 GLhalf pixelValue = 0x3858;
4187 GLhalf imageData[] = {pixelValue, pixelValue};
4188
4189 GLubyte expectedValue = static_cast<GLubyte>(pixelValueFloat * 255.0f);
4190 GLColor expectedColor = GLColor(expectedValue, expectedValue, expectedValue, expectedValue);
4191
4192 setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES, imageData);
4193 testRGTexture(SliceFormatColor(GL_RED_EXT, expectedColor));
4194
4195 setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_HALF_FLOAT_OES, imageData);
4196 testRGTexture(SliceFormatColor(GL_RG_EXT, expectedColor));
4197}
4198
Mohan Maiya6caa2652019-09-11 08:06:13 -07004199class Texture2DFloatTest : public Texture2DTest
4200{
4201 protected:
4202 Texture2DFloatTest()
4203 : Texture2DTest(), mRenderableTexture(0), mTestTexture(0), mFBO(0), mRenderbuffer(0)
4204 {}
4205
4206 void testSetUp() override
4207 {
4208 Texture2DTest::testSetUp();
4209
4210 glActiveTexture(GL_TEXTURE0);
4211 glGenTextures(1, &mRenderableTexture);
4212 glGenTextures(1, &mTestTexture);
4213 glGenFramebuffers(1, &mFBO);
4214 glGenRenderbuffers(1, &mRenderbuffer);
4215
4216 setUpProgram();
4217 glUseProgram(mProgram);
4218 glUniform1i(mTexture2DUniformLocation, 0);
4219
4220 glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
4221 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4222
4223 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4224 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
4225 mRenderableTexture, 0);
4226
4227 ASSERT_GL_NO_ERROR();
4228 }
4229
4230 void testTearDown() override
4231 {
4232 glDeleteTextures(1, &mRenderableTexture);
4233 glDeleteTextures(1, &mTestTexture);
4234 glDeleteFramebuffers(1, &mFBO);
4235 glDeleteRenderbuffers(1, &mRenderbuffer);
4236
4237 Texture2DTest::testTearDown();
4238 }
4239
4240 void testFloatTextureSample(GLenum internalFormat, GLenum format, GLenum type)
4241 {
4242 constexpr GLfloat imageDataFloat[] = {
4243 0.2f,
4244 0.3f,
4245 0.4f,
4246 0.5f,
4247 };
4248 constexpr GLhalf imageDataHalf[] = {
4249 0x3266,
4250 0x34CD,
4251 0x3666,
4252 0x3800,
4253 };
4254 GLColor expectedValue;
4255 for (int i = 0; i < 4; i++)
4256 {
4257 expectedValue[i] = static_cast<GLubyte>(imageDataFloat[i] * 255.0f);
4258 }
4259
4260 const GLvoid *imageData;
4261 switch (type)
4262 {
4263 case GL_FLOAT:
4264 imageData = imageDataFloat;
4265 break;
4266 case GL_HALF_FLOAT:
4267 case GL_HALF_FLOAT_OES:
4268 imageData = imageDataHalf;
4269 break;
4270 default:
4271 imageData = nullptr;
4272 }
4273 ASSERT(imageData != nullptr);
4274
4275 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4276 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, imageData);
4277
4278 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4279 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4280
4281 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4282 drawQuad(mProgram, "position", 0.5f);
4283
4284 EXPECT_GL_NO_ERROR();
4285 EXPECT_PIXEL_COLOR_NEAR(0, 0, SliceFormatColor(format, expectedValue), kPixelTolerance);
4286 }
4287
4288 void testFloatTextureLinear(GLenum internalFormat, GLenum format, GLenum type)
4289 {
4290 int numComponents;
4291 switch (format)
4292 {
4293 case GL_RGBA:
4294 numComponents = 4;
4295 break;
4296 case GL_RGB:
4297 numComponents = 3;
4298 break;
4299 case GL_LUMINANCE_ALPHA:
4300 numComponents = 2;
4301 break;
4302 case GL_LUMINANCE:
4303 case GL_ALPHA:
4304 numComponents = 1;
4305 break;
4306 default:
4307 numComponents = 0;
4308 }
4309 ASSERT(numComponents > 0);
4310
4311 constexpr GLfloat pixelIntensitiesFloat[] = {0.0f, 1.0f, 0.0f, 1.0f};
4312 constexpr GLhalf pixelIntensitiesHalf[] = {0x0000, 0x3C00, 0x0000, 0x3C00};
4313
4314 GLfloat imageDataFloat[16];
4315 GLhalf imageDataHalf[16];
4316 for (int i = 0; i < 4; i++)
4317 {
4318 for (int c = 0; c < numComponents; c++)
4319 {
4320 imageDataFloat[i * numComponents + c] = pixelIntensitiesFloat[i];
4321 imageDataHalf[i * numComponents + c] = pixelIntensitiesHalf[i];
4322 }
4323 }
4324
4325 const GLvoid *imageData;
4326 switch (type)
4327 {
4328 case GL_FLOAT:
4329 imageData = imageDataFloat;
4330 break;
4331 case GL_HALF_FLOAT:
4332 case GL_HALF_FLOAT_OES:
4333 imageData = imageDataHalf;
4334 break;
4335 default:
4336 imageData = nullptr;
4337 }
4338 ASSERT(imageData != nullptr);
4339
4340 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4341 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 2, 2, 0, format, type, imageData);
4342
4343 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4344 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4345
4346 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4347 drawQuad(mProgram, "position", 0.5f);
4348
4349 EXPECT_GL_NO_ERROR();
4350 // Source texture contains 2 black pixels and 2 white pixels, we sample in the center so we
4351 // should expect the final value to be gray (halfway in-between)
4352 EXPECT_PIXEL_COLOR_NEAR(0, 0, SliceFormatColor(format, GLColor(127u, 127u, 127u, 127u)),
4353 kPixelTolerance);
4354 }
4355
4356 bool performFloatTextureRender(GLenum internalFormat,
4357 GLenum renderBufferFormat,
4358 GLenum format,
4359 GLenum type)
4360 {
4361 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4362 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, nullptr);
4363 glBindTexture(GL_TEXTURE_2D, 0);
4364
4365 glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
4366 glRenderbufferStorage(GL_RENDERBUFFER, renderBufferFormat, 1, 1);
4367 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
4368 mRenderbuffer);
4369 glBindRenderbuffer(GL_RENDERBUFFER, 0);
4370 EXPECT_GL_NO_ERROR();
4371
4372 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
4373 {
4374 return false;
4375 }
4376
4377 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4378
4379 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
4380 glClear(GL_COLOR_BUFFER_BIT);
4381
4382 EXPECT_GL_NO_ERROR();
4383 return true;
4384 }
4385
4386 GLuint mRenderableTexture;
4387 GLuint mTestTexture;
4388 GLuint mFBO;
4389 GLuint mRenderbuffer;
4390};
4391
4392class Texture2DFloatTestES3 : public Texture2DFloatTest
4393{
4394 protected:
4395 void testFloatTextureRender(GLenum internalFormat, GLenum format, GLenum type)
4396 {
4397 bool framebufferComplete =
4398 performFloatTextureRender(internalFormat, internalFormat, format, type);
4399 EXPECT_TRUE(framebufferComplete);
4400 EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
4401 SliceFormatColor32F(format, GLColor32F(1.0f, 1.0f, 1.0f, 1.0f)),
4402 kPixelTolerance32F);
4403 }
4404};
4405
4406class Texture2DFloatTestES2 : public Texture2DFloatTest
4407{
4408 protected:
4409 bool checkFloatTextureRender(GLenum renderBufferFormat, GLenum format, GLenum type)
4410 {
4411 bool framebufferComplete =
4412 performFloatTextureRender(format, renderBufferFormat, format, type);
4413
4414 if (!framebufferComplete)
4415 {
4416 return false;
4417 }
4418
4419 EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
4420 SliceFormatColor32F(format, GLColor32F(1.0f, 1.0f, 1.0f, 1.0f)),
4421 kPixelTolerance32F);
4422 return true;
4423 }
4424};
4425
4426// Test texture sampling for ES3 float texture formats
4427TEST_P(Texture2DFloatTestES3, TextureFloatSampleBasicTest)
4428{
4429 testFloatTextureSample(GL_RGBA32F, GL_RGBA, GL_FLOAT);
4430 testFloatTextureSample(GL_RGB32F, GL_RGB, GL_FLOAT);
4431}
4432
4433// Test texture sampling for ES2 float texture formats
4434TEST_P(Texture2DFloatTestES2, TextureFloatSampleBasicTest)
4435{
4436 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4437 testFloatTextureSample(GL_RGBA, GL_RGBA, GL_FLOAT);
4438 testFloatTextureSample(GL_RGB, GL_RGB, GL_FLOAT);
4439}
4440
4441// Test texture sampling for ES3 half float texture formats
4442TEST_P(Texture2DFloatTestES3, TextureHalfFloatSampleBasicTest)
4443{
4444 testFloatTextureSample(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
4445 testFloatTextureSample(GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
4446}
4447
4448// Test texture sampling for ES2 half float texture formats
4449TEST_P(Texture2DFloatTestES2, TextureHalfFloatSampleBasicTest)
4450{
4451 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4452 testFloatTextureSample(GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES);
4453 testFloatTextureSample(GL_RGB, GL_RGB, GL_HALF_FLOAT_OES);
4454}
4455
4456// Test texture sampling for legacy GLES 2.0 float texture formats in ES3
4457TEST_P(Texture2DFloatTestES3, TextureFloatSampleLegacyTest)
4458{
4459 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4460
4461 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4462 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4463 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4464
4465 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4466 {
4467 testFloatTextureSample(GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT);
4468 testFloatTextureSample(GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT);
4469 testFloatTextureSample(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT);
4470 }
4471}
4472
4473// Test texture sampling for legacy GLES 2.0 float texture formats in ES2
4474TEST_P(Texture2DFloatTestES2, TextureFloatSampleLegacyTest)
4475{
4476 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4477
4478 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4479 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4480 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4481}
4482
4483// Test texture sampling for legacy GLES 2.0 half float texture formats in ES3
4484TEST_P(Texture2DFloatTestES3, TextureHalfFloatSampleLegacyTest)
4485{
4486 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4487
4488 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4489 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4490 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4491
4492 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4493 {
4494 testFloatTextureSample(GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT);
4495 testFloatTextureSample(GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT);
4496 testFloatTextureSample(GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT);
4497 }
4498}
4499// Test texture sampling for legacy GLES 2.0 half float texture formats in ES2
4500TEST_P(Texture2DFloatTestES2, TextureHalfFloatSampleLegacyTest)
4501{
4502 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4503
4504 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4505 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4506 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4507}
4508
4509// Test linear sampling for ES3 32F formats
4510TEST_P(Texture2DFloatTestES3, TextureFloatLinearTest)
4511{
4512 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4513
4514 testFloatTextureLinear(GL_RGBA32F, GL_RGBA, GL_FLOAT);
4515 testFloatTextureLinear(GL_RGB32F, GL_RGB, GL_FLOAT);
4516}
4517// Test linear sampling for ES2 32F formats
4518TEST_P(Texture2DFloatTestES2, TextureFloatLinearTest)
4519{
4520 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4521
4522 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4523
4524 testFloatTextureLinear(GL_RGBA, GL_RGBA, GL_FLOAT);
4525}
4526
4527// Test linear sampling for ES3 16F formats
4528TEST_P(Texture2DFloatTestES3, TextureHalfFloatLinearTest)
4529{
4530 // Half float formats must be linearly filterable in GLES 3.0 core
4531 testFloatTextureLinear(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
4532 testFloatTextureLinear(GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
4533}
4534// Test linear sampling for ES2 16F formats
4535TEST_P(Texture2DFloatTestES2, TextureHalfFloatLinearTest)
4536{
4537 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
4538 testFloatTextureLinear(GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES);
4539 testFloatTextureLinear(GL_RGB, GL_RGB, GL_HALF_FLOAT_OES);
4540}
4541
4542// Test linear sampling for legacy GLES 2.0 32F formats in ES3
4543TEST_P(Texture2DFloatTestES3, TextureFloatLinearLegacyTest)
4544{
4545 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4546 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4547
4548 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4549 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4550 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4551
4552 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4553 {
4554 testFloatTextureLinear(GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT);
4555 testFloatTextureLinear(GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT);
4556 testFloatTextureLinear(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT);
4557 }
4558}
4559// Test linear sampling for legacy GLES 2.0 32F formats in ES2
4560TEST_P(Texture2DFloatTestES2, TextureFloatLinearLegacyTest)
4561{
4562 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4563 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4564
4565 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4566 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4567 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4568}
4569
4570// Test linear sampling for legacy GLES 2.0 16F formats in ES3
4571TEST_P(Texture2DFloatTestES3, TextureHalfFloatLinearLegacyTest)
4572{
4573 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4574 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
4575
4576 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4577 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4578 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4579
4580 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4581 {
4582 testFloatTextureLinear(GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT);
4583 testFloatTextureLinear(GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT);
4584 testFloatTextureLinear(GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT);
4585 }
4586}
4587// Test linear sampling for legacy GLES 2.0 16F formats in ES2
4588TEST_P(Texture2DFloatTestES2, TextureHalfFloatLinearLegacyTest)
4589{
4590 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4591 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
4592
4593 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4594 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4595 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4596}
4597
4598// Test color-renderability for ES3 float and half float textures
4599TEST_P(Texture2DFloatTestES3, TextureFloatRenderTest)
4600{
4601 // EXT_color_buffer_float covers float, half float, and 11-11-10 float formats
4602 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
4603
4604 testFloatTextureRender(GL_R32F, GL_RED, GL_FLOAT);
4605 testFloatTextureRender(GL_RG32F, GL_RG, GL_FLOAT);
4606 testFloatTextureRender(GL_RGBA32F, GL_RGBA, GL_FLOAT);
4607
4608 testFloatTextureRender(GL_R16F, GL_RED, GL_HALF_FLOAT);
4609 testFloatTextureRender(GL_RG16F, GL_RG, GL_HALF_FLOAT);
4610 testFloatTextureRender(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
4611
4612 testFloatTextureRender(GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT);
4613}
4614
4615// Test color-renderability for ES2 half float textures
4616TEST_P(Texture2DFloatTestES2, TextureFloatRenderTest)
4617{
4618 // EXT_color_buffer_half_float requires at least one format to be renderable, but does not
4619 // require a specific one
4620 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_half_float"));
Zhenyao Mo20bb47d2019-09-16 12:55:30 -07004621 // https://crbug.com/1003971
4622 ANGLE_SKIP_TEST_IF(IsOzone());
Mohan Maiya6caa2652019-09-11 08:06:13 -07004623
4624 bool atLeastOneSupported = false;
4625
4626 if (IsGLExtensionEnabled("GL_OES_texture_half_float") ||
4627 IsGLExtensionEnabled("GL_OES_texture_half_float"))
4628 {
4629 atLeastOneSupported |= checkFloatTextureRender(GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES);
4630 atLeastOneSupported |= checkFloatTextureRender(GL_RG16F_EXT, GL_RG_EXT, GL_HALF_FLOAT_OES);
4631 }
4632 if (IsGLExtensionEnabled("GL_OES_texture_half_float"))
4633 {
4634 atLeastOneSupported |= checkFloatTextureRender(GL_RGB16F_EXT, GL_RGB, GL_HALF_FLOAT_OES);
4635
4636 // If OES_texture_half_float is supported, then RGBA half float textures must be renderable
4637 bool rgbaSupported = checkFloatTextureRender(GL_RGBA16F_EXT, GL_RGBA, GL_HALF_FLOAT_OES);
4638 EXPECT_TRUE(rgbaSupported);
4639 atLeastOneSupported |= rgbaSupported;
4640 }
4641
4642 EXPECT_TRUE(atLeastOneSupported);
4643}
4644
Olli Etuaho95faa232016-06-07 14:01:53 -07004645// Test that UNPACK_SKIP_IMAGES doesn't have an effect on 2D texture uploads.
4646// GLES 3.0.4 section 3.8.3.
4647TEST_P(Texture2DTestES3, UnpackSkipImages2D)
4648{
Yuly Novikovd18c0482019-04-04 19:56:43 -04004649 // Crashes on Nexus 5X due to a driver bug. http://anglebug.com/1429
4650 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Olli Etuaho95faa232016-06-07 14:01:53 -07004651
4652 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4653 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4654 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4655 ASSERT_GL_NO_ERROR();
4656
4657 // SKIP_IMAGES should not have an effect on uploading 2D textures
4658 glPixelStorei(GL_UNPACK_SKIP_IMAGES, 1000);
4659 ASSERT_GL_NO_ERROR();
4660
4661 std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
4662
4663 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4664 pixelsGreen.data());
4665 ASSERT_GL_NO_ERROR();
4666
4667 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE,
4668 pixelsGreen.data());
4669 ASSERT_GL_NO_ERROR();
4670
4671 glUseProgram(mProgram);
4672 drawQuad(mProgram, "position", 0.5f);
4673 ASSERT_GL_NO_ERROR();
4674
4675 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4676}
4677
Olli Etuaho989cac32016-06-08 16:18:49 -07004678// Test that skip defined in unpack parameters is taken into account when determining whether
4679// unpacking source extends outside unpack buffer bounds.
4680TEST_P(Texture2DTestES3, UnpackSkipPixelsOutOfBounds)
4681{
4682 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4683 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4684 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4685 ASSERT_GL_NO_ERROR();
4686
4687 GLBuffer buf;
4688 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf.get());
4689 std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
4690 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
4691 GL_DYNAMIC_COPY);
4692 ASSERT_GL_NO_ERROR();
4693
4694 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4695 ASSERT_GL_NO_ERROR();
4696
4697 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 1);
4698 ASSERT_GL_NO_ERROR();
4699
4700 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4701 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
4702
4703 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
4704 glPixelStorei(GL_UNPACK_SKIP_ROWS, 1);
4705 ASSERT_GL_NO_ERROR();
4706
4707 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4708 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
4709}
4710
Olli Etuaho218cf9e2016-05-20 13:55:24 +03004711// Test that unpacking rows that overlap in a pixel unpack buffer works as expected.
4712TEST_P(Texture2DTestES3, UnpackOverlappingRowsFromUnpackBuffer)
4713{
Yunchao He9550c602018-02-13 14:47:05 +08004714 ANGLE_SKIP_TEST_IF(IsD3D11());
4715
4716 // Incorrect rendering results seen on OSX AMD.
4717 ANGLE_SKIP_TEST_IF(IsOSX() && IsAMD());
Olli Etuaho218cf9e2016-05-20 13:55:24 +03004718
4719 const GLuint width = 8u;
4720 const GLuint height = 8u;
4721 const GLuint unpackRowLength = 5u;
4722 const GLuint unpackSkipPixels = 1u;
4723
4724 setWindowWidth(width);
4725 setWindowHeight(height);
4726
4727 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4728 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4729 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4730 ASSERT_GL_NO_ERROR();
4731
4732 GLBuffer buf;
4733 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf.get());
4734 std::vector<GLColor> pixelsGreen((height - 1u) * unpackRowLength + width + unpackSkipPixels,
4735 GLColor::green);
4736
4737 for (GLuint skippedPixel = 0u; skippedPixel < unpackSkipPixels; ++skippedPixel)
4738 {
4739 pixelsGreen[skippedPixel] = GLColor(255, 0, 0, 255);
4740 }
4741
4742 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
4743 GL_DYNAMIC_COPY);
4744 ASSERT_GL_NO_ERROR();
4745
4746 glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength);
4747 glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackSkipPixels);
4748 ASSERT_GL_NO_ERROR();
4749
4750 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4751 ASSERT_GL_NO_ERROR();
4752
4753 glUseProgram(mProgram);
4754 drawQuad(mProgram, "position", 0.5f);
4755 ASSERT_GL_NO_ERROR();
4756
4757 GLuint windowPixelCount = getWindowWidth() * getWindowHeight();
4758 std::vector<GLColor> actual(windowPixelCount, GLColor::black);
4759 glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
4760 actual.data());
4761 std::vector<GLColor> expected(windowPixelCount, GLColor::green);
4762 EXPECT_EQ(expected, actual);
4763}
4764
Jamie Madill9e3d7aa2016-09-02 15:19:43 -04004765template <typename T>
4766T UNorm(double value)
4767{
4768 return static_cast<T>(value * static_cast<double>(std::numeric_limits<T>::max()));
4769}
4770
4771// Test rendering a depth texture with mipmaps.
4772TEST_P(Texture2DTestES3, DepthTexturesWithMipmaps)
4773{
Zhenyao Moe520d7c2017-01-13 13:46:49 -08004774 // TODO(cwallez) this is failing on Intel Win7 OpenGL.
4775 // TODO(zmo) this is faling on Win Intel HD 530 Debug.
Jiawei Shaoaf0f31d2018-09-27 15:42:31 +08004776 // http://anglebug.com/1706
4777 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
Corentin Walleze731d8a2016-09-07 10:56:25 -04004778
Jamie Madill24980272019-04-03 09:03:51 -04004779 // Seems to fail on AMD D3D11. Possibly driver bug. http://anglebug.com/3342
4780 ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsD3D11());
4781
Cody Northrop988f7172019-09-30 15:52:37 -06004782 // TODO(cnorthrop): Also failing on Vulkan/Windows/AMD. http://anglebug.com/3950
Cody Northropcb16fb52019-08-29 16:53:55 -06004783 ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsVulkan());
4784
Jamie Madill9e3d7aa2016-09-02 15:19:43 -04004785 const int size = getWindowWidth();
4786
4787 auto dim = [size](int level) { return size >> level; };
Jamie Madill14718762016-09-06 15:56:54 -04004788 int levels = gl::log2(size);
Jamie Madill9e3d7aa2016-09-02 15:19:43 -04004789
4790 glActiveTexture(GL_TEXTURE0);
4791 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4792 glTexStorage2D(GL_TEXTURE_2D, levels, GL_DEPTH_COMPONENT24, size, size);
4793 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
4794 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4795 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4796 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4797 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
4798 ASSERT_GL_NO_ERROR();
4799
4800 glUseProgram(mProgram);
4801 glUniform1i(mTexture2DUniformLocation, 0);
4802
4803 std::vector<unsigned char> expected;
4804
4805 for (int level = 0; level < levels; ++level)
4806 {
4807 double value = (static_cast<double>(level) / static_cast<double>(levels - 1));
4808 expected.push_back(UNorm<unsigned char>(value));
4809
4810 int levelDim = dim(level);
4811
4812 ASSERT_GT(levelDim, 0);
4813
4814 std::vector<unsigned int> initData(levelDim * levelDim, UNorm<unsigned int>(value));
4815 glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, levelDim, levelDim, GL_DEPTH_COMPONENT,
4816 GL_UNSIGNED_INT, initData.data());
4817 }
4818 ASSERT_GL_NO_ERROR();
4819
4820 for (int level = 0; level < levels; ++level)
4821 {
4822 glViewport(0, 0, dim(level), dim(level));
4823 drawQuad(mProgram, "position", 0.5f);
4824 GLColor actual = ReadColor(0, 0);
4825 EXPECT_NEAR(expected[level], actual.R, 10u);
4826 }
4827
4828 ASSERT_GL_NO_ERROR();
4829}
4830
Courtney Goeltzenleuchter1f2782e2019-08-29 14:19:23 -06004831class Texture2DDepthTest : public Texture2DTest
4832{
4833 protected:
4834 Texture2DDepthTest() : Texture2DTest() {}
4835
4836 const char *getVertexShaderSource() override
4837 {
4838 return "attribute vec4 vPosition;\n"
4839 "void main() {\n"
4840 " gl_Position = vPosition;\n"
4841 "}\n";
4842 }
4843
4844 const char *getFragmentShaderSource() override
4845 {
4846 return "precision mediump float;\n"
4847 "uniform sampler2D ShadowMap;"
4848 "void main() {\n"
4849 " vec4 shadow_value = texture2D(ShadowMap, vec2(0.5, 0.5));"
4850 " if (shadow_value.x == shadow_value.z && shadow_value.x != 0.0) {"
4851 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
4852 " } else {"
4853 " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
4854 " }"
4855 "}\n";
4856 }
4857
4858 bool checkTexImageFormatSupport(GLenum format, GLenum internalformat, GLenum type)
4859 {
4860 EXPECT_GL_NO_ERROR();
4861
4862 GLTexture tex;
4863 glBindTexture(GL_TEXTURE_2D, tex);
4864 glTexImage2D(GL_TEXTURE_2D, 0, format, 1, 1, 0, format, type, nullptr);
4865
4866 return (glGetError() == GL_NO_ERROR);
4867 }
4868
4869 void testBehavior(bool useSizedComponent)
4870 {
4871 int w = getWindowWidth();
4872 int h = getWindowHeight();
4873 GLuint format = GL_DEPTH_COMPONENT;
4874 GLuint internalFormat = GL_DEPTH_COMPONENT;
4875
4876 if (useSizedComponent)
4877 {
4878 internalFormat = GL_DEPTH_COMPONENT24;
4879 }
4880
4881 GLFramebuffer fbo;
4882 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4883 ASSERT_GL_NO_ERROR();
4884
4885 GLTexture depthTexture;
4886 glBindTexture(GL_TEXTURE_2D, depthTexture);
4887 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4888 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4889 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4890 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4891
4892 TexCoordDrawTest::setUpProgram();
4893 GLint shadowMapLocation = glGetUniformLocation(mProgram, "ShadowMap");
4894 ASSERT_NE(-1, shadowMapLocation);
4895
4896 GLint positionLocation = glGetAttribLocation(mProgram, "vPosition");
4897 ASSERT_NE(-1, positionLocation);
4898
4899 ANGLE_SKIP_TEST_IF(!checkTexImageFormatSupport(format, internalFormat, GL_UNSIGNED_INT));
4900 glBindTexture(GL_TEXTURE_2D, depthTexture);
4901 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, w, h, 0, format, GL_UNSIGNED_INT, nullptr);
4902 ASSERT_GL_NO_ERROR();
4903
4904 // try adding a color buffer.
4905 GLuint colorTex = 0;
4906 glGenTextures(1, &colorTex);
4907 glBindTexture(GL_TEXTURE_2D, colorTex);
4908 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4909 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4910 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4911 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4912 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4913 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4914 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
4915 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4916 ASSERT_GL_NO_ERROR();
4917
4918 glViewport(0, 0, w, h);
4919 // Fill depthTexture with 0.75
4920 glClearDepthf(0.75);
4921 glClear(GL_DEPTH_BUFFER_BIT);
4922
4923 // Revert to normal framebuffer to test depth shader
4924 glBindFramebuffer(GL_FRAMEBUFFER, 0);
4925 glViewport(0, 0, w, h);
4926 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
4927 glClearDepthf(0.0f);
4928 ASSERT_GL_NO_ERROR();
4929
4930 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
4931 ASSERT_GL_NO_ERROR();
4932
4933 glActiveTexture(GL_TEXTURE0);
4934 glBindTexture(GL_TEXTURE_2D, depthTexture);
4935
4936 glUseProgram(mProgram);
4937 ASSERT_GL_NO_ERROR();
4938
4939 glUniform1i(shadowMapLocation, 0);
4940
4941 const GLfloat gTriangleVertices[] = {-0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f};
4942
4943 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices);
4944 ASSERT_GL_NO_ERROR();
4945 glEnableVertexAttribArray(positionLocation);
4946 ASSERT_GL_NO_ERROR();
4947 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
4948 ASSERT_GL_NO_ERROR();
4949
4950 GLuint pixels[1];
4951 glReadPixels(w / 2, h / 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
4952 ASSERT_GL_NO_ERROR();
4953
4954 // The GLES 3.x spec says that the depth texture sample can be found in the RED component.
4955 // However, the OES_depth_texture indicates that the depth value is treated as luminance and
4956 // is in all the color components. Multiple implementations implement a workaround that
4957 // follows the OES_depth_texture behavior if the internalformat given at glTexImage2D was a
4958 // unsized format (e.g. DEPTH_COMPONENT) and the GLES 3.x behavior if it was a sized
4959 // internalformat such as GL_DEPTH_COMPONENT24. The shader will write out a different color
4960 // depending on if it sees the texture sample in only the RED component.
4961 if (useSizedComponent)
4962 {
4963 ASSERT_NE(pixels[0], 0xff0000ff);
4964 }
4965 else
4966 {
4967 ASSERT_EQ(pixels[0], 0xff0000ff);
4968 }
4969
4970 glBindFramebuffer(GL_FRAMEBUFFER, 0);
4971 glDeleteProgram(mProgram);
4972 }
4973};
4974
4975// Test depth texture compatibility with OES_depth_texture. Uses unsized internformat.
4976TEST_P(Texture2DDepthTest, DepthTextureES2Compatibility)
4977{
4978 ANGLE_SKIP_TEST_IF(IsD3D11());
4979 ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
4980
4981 // When the depth texture is specified with unsized internalformat implementations follow
4982 // OES_depth_texture behavior. Otherwise they follow GLES 3.0 behavior.
4983 testBehavior(false);
4984}
4985
4986// Test depth texture compatibility with GLES3 using sized internalformat.
4987TEST_P(Texture2DDepthTest, DepthTextureES3Compatibility)
4988{
4989 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4990
4991 testBehavior(true);
4992}
4993
Jamie Madill7ffdda92016-09-08 13:26:51 -04004994// Tests unpacking into the unsized GL_ALPHA format.
4995TEST_P(Texture2DTestES3, UnsizedAlphaUnpackBuffer)
4996{
Jamie Madill7ffdda92016-09-08 13:26:51 -04004997 // Initialize the texure.
4998 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4999 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, getWindowWidth(), getWindowHeight(), 0, GL_ALPHA,
5000 GL_UNSIGNED_BYTE, nullptr);
5001 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5002 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5003
5004 std::vector<GLubyte> bufferData(getWindowWidth() * getWindowHeight(), 127);
5005
5006 // Pull in the color data from the unpack buffer.
Jamie Madill2e600342016-09-19 13:56:40 -04005007 GLBuffer unpackBuffer;
Jamie Madill7ffdda92016-09-08 13:26:51 -04005008 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
5009 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer.get());
5010 glBufferData(GL_PIXEL_UNPACK_BUFFER, getWindowWidth() * getWindowHeight(), bufferData.data(),
5011 GL_STATIC_DRAW);
5012
5013 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth(), getWindowHeight(), GL_ALPHA,
5014 GL_UNSIGNED_BYTE, nullptr);
5015
5016 // Clear to a weird color to make sure we're drawing something.
5017 glClearColor(0.5f, 0.8f, 1.0f, 0.2f);
5018 glClear(GL_COLOR_BUFFER_BIT);
5019
5020 // Draw with the alpha texture and verify.
5021 drawQuad(mProgram, "position", 0.5f);
Jamie Madill7ffdda92016-09-08 13:26:51 -04005022
5023 ASSERT_GL_NO_ERROR();
5024 EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 127, 1);
5025}
5026
Jamie Madill2e600342016-09-19 13:56:40 -04005027// Ensure stale unpack data doesn't propagate in D3D11.
5028TEST_P(Texture2DTestES3, StaleUnpackData)
5029{
5030 // Init unpack buffer.
5031 GLsizei pixelCount = getWindowWidth() * getWindowHeight() / 2;
5032 std::vector<GLColor> pixels(pixelCount, GLColor::red);
5033
5034 GLBuffer unpackBuffer;
5035 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
5036 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer.get());
5037 GLsizei bufferSize = pixelCount * sizeof(GLColor);
5038 glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, pixels.data(), GL_STATIC_DRAW);
5039
5040 // Create from unpack buffer.
5041 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5042 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth() / 2, getWindowHeight() / 2, 0,
5043 GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5044 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5045 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5046
5047 drawQuad(mProgram, "position", 0.5f);
5048
5049 ASSERT_GL_NO_ERROR();
5050 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5051
5052 // Fill unpack with green, recreating buffer.
5053 pixels.assign(getWindowWidth() * getWindowHeight(), GLColor::green);
5054 GLsizei size2 = getWindowWidth() * getWindowHeight() * sizeof(GLColor);
5055 glBufferData(GL_PIXEL_UNPACK_BUFFER, size2, pixels.data(), GL_STATIC_DRAW);
5056
5057 // Reinit texture with green.
5058 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GL_RGBA,
5059 GL_UNSIGNED_BYTE, nullptr);
5060
5061 drawQuad(mProgram, "position", 0.5f);
5062
5063 ASSERT_GL_NO_ERROR();
5064 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5065}
5066
Geoff Langfb7685f2017-11-13 11:44:11 -05005067// Ensure that texture parameters passed as floats that are converted to ints are rounded before
5068// validating they are less than 0.
5069TEST_P(Texture2DTestES3, TextureBaseMaxLevelRoundingValidation)
5070{
5071 GLTexture texture;
5072 glBindTexture(GL_TEXTURE_2D, texture);
5073
5074 // Use a negative number that will round to zero when converted to an integer
5075 // According to the spec(2.3.1 Data Conversion For State - Setting Commands):
5076 // "Validation of values performed by state-setting commands is performed after conversion,
5077 // unless specified otherwise for a specific command."
5078 GLfloat param = -7.30157126e-07f;
5079 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, param);
5080 EXPECT_GL_NO_ERROR();
5081
5082 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, param);
5083 EXPECT_GL_NO_ERROR();
5084}
5085
Jamie Madillf097e232016-11-05 00:44:15 -04005086// This test covers a D3D format redefinition bug for 3D textures. The base level format was not
5087// being properly checked, and the texture storage of the previous texture format was persisting.
5088// This would result in an ASSERT in debug and incorrect rendering in release.
5089// See http://anglebug.com/1609 and WebGL 2 test conformance2/misc/views-with-offsets.html.
5090TEST_P(Texture3DTestES3, FormatRedefinitionBug)
5091{
5092 GLTexture tex;
5093 glBindTexture(GL_TEXTURE_3D, tex.get());
5094 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5095
5096 GLFramebuffer framebuffer;
5097 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
5098 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex.get(), 0, 0);
5099
5100 glCheckFramebufferStatus(GL_FRAMEBUFFER);
5101
5102 std::vector<uint8_t> pixelData(100, 0);
5103
5104 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB565, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, nullptr);
5105 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 1, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
5106 pixelData.data());
5107
5108 ASSERT_GL_NO_ERROR();
5109}
5110
Corentin Wallezd2627992017-04-28 17:17:03 -04005111// Test basic pixel unpack buffer OOB checks when uploading to a 2D or 3D texture
5112TEST_P(Texture3DTestES3, BasicUnpackBufferOOB)
5113{
5114 // 2D tests
5115 {
5116 GLTexture tex;
5117 glBindTexture(GL_TEXTURE_2D, tex.get());
5118
5119 GLBuffer pbo;
5120 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo.get());
5121
5122 // Test OOB
5123 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 - 1, nullptr, GL_STATIC_DRAW);
5124 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5125 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
5126
5127 // Test OOB
5128 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2, nullptr, GL_STATIC_DRAW);
5129 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5130 ASSERT_GL_NO_ERROR();
5131 }
5132
5133 // 3D tests
5134 {
5135 GLTexture tex;
5136 glBindTexture(GL_TEXTURE_3D, tex.get());
5137
5138 GLBuffer pbo;
5139 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo.get());
5140
5141 // Test OOB
5142 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 * 2 - 1, nullptr,
5143 GL_STATIC_DRAW);
5144 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5145 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
5146
5147 // Test OOB
5148 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 * 2, nullptr, GL_STATIC_DRAW);
5149 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5150 ASSERT_GL_NO_ERROR();
5151 }
5152}
5153
Jamie Madill3ed60422017-09-07 11:32:52 -04005154// Tests behaviour with a single texture and multiple sampler objects.
5155TEST_P(Texture2DTestES3, SingleTextureMultipleSamplers)
5156{
5157 GLint maxTextureUnits = 0;
5158 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
5159 ANGLE_SKIP_TEST_IF(maxTextureUnits < 4);
5160
5161 constexpr int kSize = 16;
5162
5163 // Make a single-level texture, fill it with red.
5164 std::vector<GLColor> redColors(kSize * kSize, GLColor::red);
5165 GLTexture tex;
5166 glBindTexture(GL_TEXTURE_2D, tex);
5167 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5168 redColors.data());
5169 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5171
5172 // Simple sanity check.
5173 draw2DTexturedQuad(0.5f, 1.0f, true);
5174 ASSERT_GL_NO_ERROR();
5175 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5176
5177 // Bind texture to unit 1 with a sampler object making it incomplete.
5178 GLSampler sampler;
5179 glBindSampler(0, sampler);
5180 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5181 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5182
5183 // Make a mipmap texture, fill it with blue.
5184 std::vector<GLColor> blueColors(kSize * kSize, GLColor::blue);
5185 GLTexture mipmapTex;
5186 glBindTexture(GL_TEXTURE_2D, mipmapTex);
5187 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5188 blueColors.data());
5189 glGenerateMipmap(GL_TEXTURE_2D);
5190
5191 // Draw with the sampler, expect blue.
5192 draw2DTexturedQuad(0.5f, 1.0f, true);
5193 ASSERT_GL_NO_ERROR();
5194 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5195
5196 // Simple multitexturing program.
Jamie Madill35cd7332018-12-02 12:03:33 -05005197 constexpr char kVS[] =
Jamie Madill3ed60422017-09-07 11:32:52 -04005198 "#version 300 es\n"
5199 "in vec2 position;\n"
5200 "out vec2 texCoord;\n"
5201 "void main()\n"
5202 "{\n"
5203 " gl_Position = vec4(position, 0, 1);\n"
5204 " texCoord = position * 0.5 + vec2(0.5);\n"
5205 "}";
Jamie Madill35cd7332018-12-02 12:03:33 -05005206
5207 constexpr char kFS[] =
Jamie Madill3ed60422017-09-07 11:32:52 -04005208 "#version 300 es\n"
5209 "precision mediump float;\n"
5210 "in vec2 texCoord;\n"
5211 "uniform sampler2D tex1;\n"
5212 "uniform sampler2D tex2;\n"
5213 "uniform sampler2D tex3;\n"
5214 "uniform sampler2D tex4;\n"
5215 "out vec4 color;\n"
5216 "void main()\n"
5217 "{\n"
5218 " color = (texture(tex1, texCoord) + texture(tex2, texCoord) \n"
5219 " + texture(tex3, texCoord) + texture(tex4, texCoord)) * 0.25;\n"
5220 "}";
5221
Jamie Madill35cd7332018-12-02 12:03:33 -05005222 ANGLE_GL_PROGRAM(program, kVS, kFS);
Jamie Madill3ed60422017-09-07 11:32:52 -04005223
5224 std::array<GLint, 4> texLocations = {
5225 {glGetUniformLocation(program, "tex1"), glGetUniformLocation(program, "tex2"),
5226 glGetUniformLocation(program, "tex3"), glGetUniformLocation(program, "tex4")}};
5227 for (GLint location : texLocations)
5228 {
5229 ASSERT_NE(-1, location);
5230 }
5231
5232 // Init the uniform data.
5233 glUseProgram(program);
5234 for (GLint location = 0; location < 4; ++location)
5235 {
5236 glUniform1i(texLocations[location], location);
5237 }
5238
5239 // Initialize four samplers
5240 GLSampler samplers[4];
5241
5242 // 0: non-mipped.
5243 glBindSampler(0, samplers[0]);
5244 glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5245 glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5246
5247 // 1: mipped.
5248 glBindSampler(1, samplers[1]);
5249 glSamplerParameteri(samplers[1], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5250 glSamplerParameteri(samplers[1], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5251
5252 // 2: non-mipped.
5253 glBindSampler(2, samplers[2]);
5254 glSamplerParameteri(samplers[2], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5255 glSamplerParameteri(samplers[2], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5256
5257 // 3: mipped.
5258 glBindSampler(3, samplers[3]);
5259 glSamplerParameteri(samplers[3], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5260 glSamplerParameteri(samplers[3], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5261
5262 // Bind two blue mipped textures and two single layer textures, should all draw.
5263 glActiveTexture(GL_TEXTURE0);
5264 glBindTexture(GL_TEXTURE_2D, tex);
5265
5266 glActiveTexture(GL_TEXTURE1);
5267 glBindTexture(GL_TEXTURE_2D, mipmapTex);
5268
5269 glActiveTexture(GL_TEXTURE2);
5270 glBindTexture(GL_TEXTURE_2D, tex);
5271
5272 glActiveTexture(GL_TEXTURE3);
5273 glBindTexture(GL_TEXTURE_2D, mipmapTex);
5274
5275 ASSERT_GL_NO_ERROR();
5276
5277 drawQuad(program, "position", 0.5f);
5278 ASSERT_GL_NO_ERROR();
5279 EXPECT_PIXEL_NEAR(0, 0, 128, 0, 128, 255, 2);
5280
5281 // Bind four single layer textures, two should be incomplete.
5282 glActiveTexture(GL_TEXTURE1);
5283 glBindTexture(GL_TEXTURE_2D, tex);
5284
5285 glActiveTexture(GL_TEXTURE3);
5286 glBindTexture(GL_TEXTURE_2D, tex);
5287
5288 drawQuad(program, "position", 0.5f);
5289 ASSERT_GL_NO_ERROR();
5290 EXPECT_PIXEL_NEAR(0, 0, 128, 0, 0, 255, 2);
5291}
5292
Martin Radev7e2c0d32017-09-15 14:25:42 +03005293// The test is added to cover http://anglebug.com/2153. Cubemap completeness checks used to start
5294// always at level 0 instead of the base level resulting in an incomplete texture if the faces at
5295// level 0 are not created. The test creates a cubemap texture, specifies the images only for mip
5296// level 1 filled with white color, updates the base level to be 1 and renders a quad. The program
5297// samples the cubemap using a direction vector (1,1,1).
5298TEST_P(TextureCubeTestES3, SpecifyAndSampleFromBaseLevel1)
5299{
Yunchao He2f23f352018-02-11 22:11:37 +08005300 // Check http://anglebug.com/2155.
5301 ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA());
5302
Jamie Madill35cd7332018-12-02 12:03:33 -05005303 constexpr char kVS[] =
Martin Radev7e2c0d32017-09-15 14:25:42 +03005304 R"(#version 300 es
Olli Etuahoa20af6d2017-09-18 13:32:29 +03005305 precision mediump float;
5306 in vec3 pos;
5307 void main() {
5308 gl_Position = vec4(pos, 1.0);
5309 })";
Martin Radev7e2c0d32017-09-15 14:25:42 +03005310
Jamie Madill35cd7332018-12-02 12:03:33 -05005311 constexpr char kFS[] =
Martin Radev7e2c0d32017-09-15 14:25:42 +03005312 R"(#version 300 es
Olli Etuahoa20af6d2017-09-18 13:32:29 +03005313 precision mediump float;
5314 out vec4 color;
5315 uniform samplerCube uTex;
5316 void main(){
5317 color = texture(uTex, vec3(1.0));
5318 })";
Jamie Madill35cd7332018-12-02 12:03:33 -05005319
5320 ANGLE_GL_PROGRAM(program, kVS, kFS);
Martin Radev7e2c0d32017-09-15 14:25:42 +03005321 glUseProgram(program);
5322
5323 glUniform1i(glGetUniformLocation(program, "uTex"), 0);
5324 glActiveTexture(GL_TEXTURE0);
5325
5326 GLTexture cubeTex;
5327 glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex);
5328
5329 const int kFaceWidth = 1;
5330 const int kFaceHeight = 1;
5331 std::vector<uint32_t> texData(kFaceWidth * kFaceHeight, 0xFFFFFFFF);
5332 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5333 GL_UNSIGNED_BYTE, texData.data());
5334 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5335 GL_UNSIGNED_BYTE, texData.data());
5336 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5337 GL_UNSIGNED_BYTE, texData.data());
5338 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5339 GL_UNSIGNED_BYTE, texData.data());
5340 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5341 GL_UNSIGNED_BYTE, texData.data());
5342 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5343 GL_UNSIGNED_BYTE, texData.data());
5344 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5345 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5346 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
5347 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
5348 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);
5349 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1);
5350
5351 drawQuad(program, "pos", 0.5f, 1.0f, true);
5352 ASSERT_GL_NO_ERROR();
5353
5354 EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white);
5355}
5356
Jiawei Shao3c43b4d2018-02-23 11:08:28 +08005357// Verify that using negative texture base level and max level generates GL_INVALID_VALUE.
5358TEST_P(Texture2DTestES3, NegativeTextureBaseLevelAndMaxLevel)
5359{
5360 GLuint texture = create2DTexture();
5361
5362 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, -1);
5363 EXPECT_GL_ERROR(GL_INVALID_VALUE);
5364
5365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, -1);
5366 EXPECT_GL_ERROR(GL_INVALID_VALUE);
5367
5368 glDeleteTextures(1, &texture);
5369 EXPECT_GL_NO_ERROR();
5370}
5371
Olli Etuaho023371b2018-04-24 17:43:32 +03005372// Test setting base level after calling generateMipmap on a LUMA texture.
5373// Covers http://anglebug.com/2498
5374TEST_P(Texture2DTestES3, GenerateMipmapAndBaseLevelLUMA)
5375{
5376 glActiveTexture(GL_TEXTURE0);
5377 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5378
5379 constexpr const GLsizei kWidth = 8;
5380 constexpr const GLsizei kHeight = 8;
5381 std::array<GLubyte, kWidth * kHeight * 2> whiteData;
5382 whiteData.fill(255u);
5383
5384 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, kWidth, kHeight, 0, GL_LUMINANCE_ALPHA,
5385 GL_UNSIGNED_BYTE, whiteData.data());
5386 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
5387 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
5388 glGenerateMipmap(GL_TEXTURE_2D);
5389 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5390 EXPECT_GL_NO_ERROR();
5391
5392 drawQuad(mProgram, "position", 0.5f);
5393 EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white);
5394}
5395
Till Rathmannc1551dc2018-08-15 17:04:49 +02005396// Covers a bug in the D3D11 backend: http://anglebug.com/2772
5397// When using a sampler the texture was created as if it has mipmaps,
5398// regardless what you specified in GL_TEXTURE_MIN_FILTER via
5399// glSamplerParameteri() -- mistakenly the default value
5400// GL_NEAREST_MIPMAP_LINEAR or the value set via glTexParameteri() was
5401// evaluated.
5402// If you didn't provide mipmaps and didn't let the driver generate them
5403// this led to not sampling your texture data when minification occurred.
5404TEST_P(Texture2DTestES3, MinificationWithSamplerNoMipmapping)
5405{
Cody Northrop988f7172019-09-30 15:52:37 -06005406 // TODO: Triage this failure on Vulkan: http://anglebug.com/3950
Cody Northropcb16fb52019-08-29 16:53:55 -06005407 ANGLE_SKIP_TEST_IF(IsVulkan());
5408
Jamie Madill35cd7332018-12-02 12:03:33 -05005409 constexpr char kVS[] =
Till Rathmannc1551dc2018-08-15 17:04:49 +02005410 "#version 300 es\n"
5411 "out vec2 texcoord;\n"
5412 "in vec4 position;\n"
5413 "void main()\n"
5414 "{\n"
5415 " gl_Position = vec4(position.xy * 0.1, 0.0, 1.0);\n"
5416 " texcoord = (position.xy * 0.5) + 0.5;\n"
5417 "}\n";
5418
Jamie Madill35cd7332018-12-02 12:03:33 -05005419 constexpr char kFS[] =
Till Rathmannc1551dc2018-08-15 17:04:49 +02005420 "#version 300 es\n"
5421 "precision highp float;\n"
5422 "uniform highp sampler2D tex;\n"
5423 "in vec2 texcoord;\n"
5424 "out vec4 fragColor;\n"
5425 "void main()\n"
5426 "{\n"
5427 " fragColor = texture(tex, texcoord);\n"
5428 "}\n";
Jamie Madill35cd7332018-12-02 12:03:33 -05005429
5430 ANGLE_GL_PROGRAM(program, kVS, kFS);
Till Rathmannc1551dc2018-08-15 17:04:49 +02005431
5432 GLSampler sampler;
5433 glBindSampler(0, sampler);
5434 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
5435 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
5436
5437 glActiveTexture(GL_TEXTURE0);
5438 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5439
5440 const GLsizei texWidth = getWindowWidth();
5441 const GLsizei texHeight = getWindowHeight();
5442 const std::vector<GLColor> whiteData(texWidth * texHeight, GLColor::white);
5443
5444 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5445 whiteData.data());
5446 EXPECT_GL_NO_ERROR();
5447
5448 drawQuad(program, "position", 0.5f);
5449 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, angle::GLColor::white);
5450}
5451
Anders Leinof6cbe442019-04-18 15:32:07 +03005452// Draw a quad with an integer texture with a non-zero base level, and test that the color of the
5453// texture is output.
5454TEST_P(Texture2DIntegerTestES3, IntegerTextureNonZeroBaseLevel)
5455{
Yuly Novikovd2683452019-05-23 16:11:19 -04005456 // http://anglebug.com/3478
5457 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
5458
Anders Leinof6cbe442019-04-18 15:32:07 +03005459 glActiveTexture(GL_TEXTURE0);
5460 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5461 int width = getWindowWidth();
5462 int height = getWindowHeight();
5463 GLColor color = GLColor::green;
5464 std::vector<GLColor> pixels(width * height, color);
5465 GLint baseLevel = 1;
5466 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, baseLevel);
5467 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5468 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5469 glTexImage2D(GL_TEXTURE_2D, baseLevel, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER,
5470 GL_UNSIGNED_BYTE, pixels.data());
5471
5472 setUpProgram();
5473 glUseProgram(mProgram);
5474 glUniform1i(mTexture2DUniformLocation, 0);
5475 drawQuad(mProgram, "position", 0.5f);
5476
5477 EXPECT_GL_NO_ERROR();
5478 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5479 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5480}
5481
Anders Leino60cc7512019-05-06 09:25:27 +03005482// Draw a quad with an integer cube texture with a non-zero base level, and test that the color of
5483// the texture is output.
5484TEST_P(TextureCubeIntegerTestES3, IntegerCubeTextureNonZeroBaseLevel)
5485{
5486 // All output checks returned black, rather than the texture color.
5487 ANGLE_SKIP_TEST_IF(IsOSX() && IsOpenGL());
5488
5489 glActiveTexture(GL_TEXTURE0);
5490
5491 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
5492 GLint baseLevel = 1;
5493 int width = getWindowWidth();
5494 int height = getWindowHeight();
5495 GLColor color = GLColor::green;
5496 std::vector<GLColor> pixels(width * height, color);
5497 for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
5498 {
5499 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, baseLevel, GL_RGBA8UI, width,
5500 height, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
5501 EXPECT_GL_NO_ERROR();
5502 }
5503 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, baseLevel);
5504 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5505 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5506
5507 glUseProgram(mProgram);
5508 glUniform1i(mTextureCubeUniformLocation, 0);
5509 drawQuad(mProgram, "position", 0.5f);
5510
5511 EXPECT_GL_NO_ERROR();
5512 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5513 EXPECT_PIXEL_COLOR_EQ(width - 1, 0, color);
5514 EXPECT_PIXEL_COLOR_EQ(0, height - 1, color);
5515 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5516}
5517
Anders Leinoe4452442019-05-09 13:29:49 +03005518// This test sets up a cube map with four distincly colored MIP levels.
5519// The size of the texture and the geometry is chosen such that levels 1 or 2 should be chosen at
5520// the corners of the screen.
5521TEST_P(TextureCubeIntegerEdgeTestES3, IntegerCubeTextureCorner)
5522{
5523 glActiveTexture(GL_TEXTURE0);
5524
5525 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
5526 int width = getWindowWidth();
5527 int height = getWindowHeight();
5528 ASSERT_EQ(width, height);
5529 GLColor color[4] = {GLColor::white, GLColor::green, GLColor::blue, GLColor::red};
5530 for (GLint level = 0; level < 4; level++)
5531 {
5532 for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
5533 {
5534 int levelWidth = (2 * width) >> level;
5535 int levelHeight = (2 * height) >> level;
5536 std::vector<GLColor> pixels(levelWidth * levelHeight, color[level]);
5537 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, GL_RGBA8UI, levelWidth,
5538 levelHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
5539 EXPECT_GL_NO_ERROR();
5540 }
5541 }
5542 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5543 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5544 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 3);
5545
5546 glUseProgram(mProgram);
5547 glUniform1i(mTextureCubeUniformLocation, 0);
5548 drawQuad(mProgram, "position", 0.5f);
5549
5550 ASSERT_GL_NO_ERROR();
5551 // Check that we do not read from levels 0 or 3. Levels 1 and 2 are both acceptable.
5552 EXPECT_EQ(ReadColor(0, 0).R, 0);
5553 EXPECT_EQ(ReadColor(width - 1, 0).R, 0);
5554 EXPECT_EQ(ReadColor(0, height - 1).R, 0);
5555 EXPECT_EQ(ReadColor(width - 1, height - 1).R, 0);
5556}
5557
Anders Leino1b6aded2019-05-20 12:56:34 +03005558// Draw a quad with an integer texture with a non-zero base level, and test that the color of the
5559// texture is output.
5560TEST_P(Texture2DIntegerProjectiveOffsetTestES3, NonZeroBaseLevel)
5561{
Jamie Madill29ac2742019-05-28 15:53:00 -04005562 // Fails on AMD: http://crbug.com/967796
Jamie Madill06055b52019-05-29 14:31:42 -04005563 ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsOpenGL());
Jamie Madill29ac2742019-05-28 15:53:00 -04005564
Anders Leino1b6aded2019-05-20 12:56:34 +03005565 glActiveTexture(GL_TEXTURE0);
5566 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5567 int width = getWindowWidth();
5568 int height = getWindowHeight();
5569 GLColor color = GLColor::green;
5570 std::vector<GLColor> pixels(width * height, color);
5571 GLint baseLevel = 1;
5572 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, baseLevel);
5573 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5574 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5575 glTexImage2D(GL_TEXTURE_2D, baseLevel, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER,
5576 GL_UNSIGNED_BYTE, pixels.data());
5577
5578 setUpProgram();
5579 glUseProgram(mProgram);
5580 glUniform1i(mTexture2DUniformLocation, 0);
5581 drawQuad(mProgram, "position", 0.5f);
5582
5583 EXPECT_GL_NO_ERROR();
5584 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5585 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5586}
5587
Anders Leino69d04932019-05-20 14:04:13 +03005588// Draw a quad with an integer texture with a non-zero base level, and test that the color of the
5589// texture is output.
5590TEST_P(Texture2DArrayIntegerTestES3, NonZeroBaseLevel)
5591{
5592 glActiveTexture(GL_TEXTURE0);
5593 glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
5594 int width = getWindowWidth();
5595 int height = getWindowHeight();
5596 int depth = 2;
5597 GLColor color = GLColor::green;
5598 std::vector<GLColor> pixels(width * height * depth, color);
5599 GLint baseLevel = 1;
5600 glTexImage3D(GL_TEXTURE_2D_ARRAY, baseLevel, GL_RGBA8UI, width, height, depth, 0,
5601 GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
5602 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, baseLevel);
5603 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5604 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5605
5606 drawQuad(mProgram, "position", 0.5f);
5607
5608 EXPECT_GL_NO_ERROR();
5609 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5610 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5611}
5612
Anders Leino262e2822019-05-20 14:24:40 +03005613// Draw a quad with an integer 3D texture with a non-zero base level, and test that the color of the
5614// texture is output.
5615TEST_P(Texture3DIntegerTestES3, NonZeroBaseLevel)
5616{
5617 glActiveTexture(GL_TEXTURE0);
5618 glBindTexture(GL_TEXTURE_3D, mTexture3D);
5619 int width = getWindowWidth();
5620 int height = getWindowHeight();
5621 int depth = 2;
5622 GLColor color = GLColor::green;
5623 std::vector<GLColor> pixels(width * height * depth, color);
5624 GLint baseLevel = 1;
5625 glTexImage3D(GL_TEXTURE_3D, baseLevel, GL_RGBA8UI, width, height, depth, 0, GL_RGBA_INTEGER,
5626 GL_UNSIGNED_BYTE, pixels.data());
5627 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, baseLevel);
5628 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5629 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5630
5631 drawQuad(mProgram, "position", 0.5f);
5632
5633 EXPECT_GL_NO_ERROR();
5634 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5635 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5636}
5637
Jamie Madill50cf2be2018-06-15 09:46:57 -04005638// Use this to select which configurations (e.g. which renderer, which GLES major version) these
5639// tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -05005640ANGLE_INSTANTIATE_TEST(Texture2DTest,
5641 ES2_D3D9(),
5642 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005643 ES2_OPENGL(),
Luc Ferron5164b792018-03-06 09:10:12 -05005644 ES2_OPENGLES(),
5645 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005646ANGLE_INSTANTIATE_TEST(TextureCubeTest,
5647 ES2_D3D9(),
5648 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005649 ES2_OPENGL(),
Luc Ferronaf883622018-06-08 15:57:31 -04005650 ES2_OPENGLES(),
5651 ES2_VULKAN());
Olli Etuaho51f1c0f2016-01-13 16:16:24 +02005652ANGLE_INSTANTIATE_TEST(Texture2DTestWithDrawScale,
5653 ES2_D3D9(),
5654 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005655 ES2_OPENGL(),
Luc Ferronaf883622018-06-08 15:57:31 -04005656 ES2_OPENGLES(),
5657 ES2_VULKAN());
Olli Etuaho51f1c0f2016-01-13 16:16:24 +02005658ANGLE_INSTANTIATE_TEST(Sampler2DAsFunctionParameterTest,
5659 ES2_D3D9(),
5660 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005661 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005662 ES2_OPENGLES(),
5663 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005664ANGLE_INSTANTIATE_TEST(SamplerArrayTest,
5665 ES2_D3D9(),
5666 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005667 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005668 ES2_OPENGLES(),
5669 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005670ANGLE_INSTANTIATE_TEST(SamplerArrayAsFunctionParameterTest,
5671 ES2_D3D9(),
5672 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005673 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005674 ES2_OPENGLES(),
5675 ES2_VULKAN());
Cody Northropcb16fb52019-08-29 16:53:55 -06005676ANGLE_INSTANTIATE_TEST(Texture2DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
5677ANGLE_INSTANTIATE_TEST(Texture3DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
James Dong8bb6baa2019-06-18 15:30:16 -06005678ANGLE_INSTANTIATE_TEST(Texture2DIntegerAlpha1TestES3,
5679 ES3_D3D11(),
5680 ES3_OPENGL(),
5681 ES3_OPENGLES(),
5682 ES3_VULKAN());
Olli Etuaho6ee394a2016-02-18 13:30:09 +02005683ANGLE_INSTANTIATE_TEST(Texture2DUnsignedIntegerAlpha1TestES3,
5684 ES3_D3D11(),
5685 ES3_OPENGL(),
James Dong8bb6baa2019-06-18 15:30:16 -06005686 ES3_OPENGLES(),
5687 ES3_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005688ANGLE_INSTANTIATE_TEST(ShadowSamplerPlusSampler3DTestES3,
5689 ES3_D3D11(),
5690 ES3_OPENGL(),
5691 ES3_OPENGLES());
James Dong8bb6baa2019-06-18 15:30:16 -06005692ANGLE_INSTANTIATE_TEST(SamplerTypeMixTestES3,
5693 ES3_D3D11(),
5694 ES3_OPENGL(),
5695 ES3_OPENGLES(),
5696 ES3_VULKAN());
Cody Northropcb16fb52019-08-29 16:53:55 -06005697ANGLE_INSTANTIATE_TEST(Texture2DArrayTestES3,
5698 ES3_D3D11(),
5699 ES3_OPENGL(),
5700 ES3_OPENGLES(),
5701 ES3_VULKAN());
Olli Etuahobce743a2016-01-15 17:18:28 +02005702ANGLE_INSTANTIATE_TEST(TextureSizeTextureArrayTest, ES3_D3D11(), ES3_OPENGL());
Olli Etuaho96963162016-03-21 11:54:33 +02005703ANGLE_INSTANTIATE_TEST(SamplerInStructTest,
5704 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005705 ES2_D3D9(),
5706 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005707 ES2_OPENGLES(),
5708 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005709ANGLE_INSTANTIATE_TEST(SamplerInStructAsFunctionParameterTest,
5710 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005711 ES2_D3D9(),
5712 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005713 ES2_OPENGLES(),
5714 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005715ANGLE_INSTANTIATE_TEST(SamplerInStructArrayAsFunctionParameterTest,
5716 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005717 ES2_D3D9(),
5718 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005719 ES2_OPENGLES(),
5720 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005721ANGLE_INSTANTIATE_TEST(SamplerInNestedStructAsFunctionParameterTest,
5722 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005723 ES2_D3D9(),
5724 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005725 ES2_OPENGLES(),
5726 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005727ANGLE_INSTANTIATE_TEST(SamplerInStructAndOtherVariableTest,
5728 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005729 ES2_D3D9(),
5730 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005731 ES2_OPENGLES(),
5732 ES2_VULKAN());
Shahbaz Youssefi962c2222019-02-20 15:43:41 -05005733ANGLE_INSTANTIATE_TEST(TextureAnisotropyTest,
5734 ES2_D3D11(),
5735 ES2_D3D9(),
5736 ES2_OPENGL(),
5737 ES2_OPENGLES(),
5738 ES2_VULKAN());
Till Rathmannb8543632018-10-02 19:46:14 +02005739ANGLE_INSTANTIATE_TEST(TextureBorderClampTest,
5740 ES2_D3D11(),
5741 ES2_D3D9(),
5742 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005743 ES2_OPENGLES(),
5744 ES2_VULKAN());
Till Rathmannb8543632018-10-02 19:46:14 +02005745ANGLE_INSTANTIATE_TEST(TextureBorderClampTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
5746ANGLE_INSTANTIATE_TEST(TextureBorderClampIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Luc Ferronaf883622018-06-08 15:57:31 -04005747ANGLE_INSTANTIATE_TEST(TextureLimitsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
Vincent Lang25ab4512016-05-13 18:13:59 +02005748ANGLE_INSTANTIATE_TEST(Texture2DNorm16TestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Mohan Maiya8f1169e2019-06-27 15:32:32 -07005749ANGLE_INSTANTIATE_TEST(Texture2DRGTest,
5750 ES2_D3D11(),
5751 ES3_D3D11(),
5752 ES2_OPENGL(),
5753 ES3_OPENGL(),
5754 ES2_OPENGLES(),
5755 ES3_OPENGLES(),
5756 ES2_VULKAN(),
5757 ES3_VULKAN());
Mohan Maiya6caa2652019-09-11 08:06:13 -07005758ANGLE_INSTANTIATE_TEST(Texture2DFloatTestES3,
5759 ES3_D3D11(),
5760 ES3_OPENGL(),
5761 ES3_OPENGLES(),
5762 ES3_VULKAN());
5763ANGLE_INSTANTIATE_TEST(Texture2DFloatTestES2,
5764 ES2_D3D11(),
5765 ES2_OPENGL(),
5766 ES2_OPENGLES(),
5767 ES2_VULKAN());
Cody Northropcb16fb52019-08-29 16:53:55 -06005768ANGLE_INSTANTIATE_TEST(TextureCubeTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
5769ANGLE_INSTANTIATE_TEST(Texture2DIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
5770ANGLE_INSTANTIATE_TEST(TextureCubeIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
Anders Leinoe4452442019-05-09 13:29:49 +03005771ANGLE_INSTANTIATE_TEST(TextureCubeIntegerEdgeTestES3, ES3_D3D11(), ES3_OPENGL());
Cody Northropcb16fb52019-08-29 16:53:55 -06005772ANGLE_INSTANTIATE_TEST(Texture2DIntegerProjectiveOffsetTestES3,
5773 ES3_D3D11(),
5774 ES3_OPENGL(),
5775 ES3_VULKAN());
5776ANGLE_INSTANTIATE_TEST(Texture2DArrayIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
5777ANGLE_INSTANTIATE_TEST(Texture3DIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
Courtney Goeltzenleuchter1f2782e2019-08-29 14:19:23 -06005778ANGLE_INSTANTIATE_TEST(Texture2DDepthTest,
5779 ES2_D3D9(),
5780 ES2_D3D11(),
5781 ES2_OPENGL(),
5782 ES2_OPENGLES(),
5783 ES2_VULKAN(),
5784 ES3_VULKAN());
Jamie Madillfa05f602015-05-07 13:47:11 -04005785
Jamie Madill7ffdda92016-09-08 13:26:51 -04005786} // anonymous namespace