blob: 75817e8945668c71af22270fe07be25599fc44ea [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());
Geoff Lang3702d8c2019-04-08 13:44:06 -04001973
1974 // The workaround in the GL backend required to trigger this bug generates driver warning
1975 // messages.
1976 ScopedIgnorePlatformMessages ignoreMessages;
1977
1978 setUpProgram();
1979 glUseProgram(mProgram);
1980 glActiveTexture(GL_TEXTURE0 + mTexture2DUniformLocation);
1981
1982 GLTexture dest;
1983 glBindTexture(GL_TEXTURE_2D, dest);
1984
1985 GLTexture source;
1986 glBindTexture(GL_TEXTURE_2D, source);
1987
1988 // Put data in mip 0 and 1
1989 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1990 GLColor::red.data());
1991 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1992 GLColor::green.data());
1993
1994 // Disable mipmapping so source is complete
1995 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1996 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1997
1998 // Force the dirty bits to be synchronized in source
1999 drawQuad(mProgram, "position", 1.0f);
2000
2001 // Copy from mip 1 of the source. In the GL backend this internally sets the base level to mip
2002 // 1 and sets a dirty bit.
2003 glCopyTextureCHROMIUM(source, 1, GL_TEXTURE_2D, dest, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE,
2004 GL_FALSE, GL_FALSE);
2005
2006 // Draw again, assertions are generated if the texture has internal dirty bits at draw time
2007 drawQuad(mProgram, "position", 1.0f);
2008}
2009
Geoff Lang6f691fb2019-04-25 11:01:52 -04002010// This test case changes the base level of a texture that's attached to a framebuffer, clears every
2011// level to green, and then samples the texture when rendering. Test is taken from
2012// https://www.khronos.org/registry/webgl/sdk/tests/conformance2/rendering/framebuffer-texture-changing-base-level.html
2013TEST_P(Texture2DTestES3, FramebufferTextureChangingBaselevel)
2014{
2015 // TODO(geofflang): Investigate on D3D11. http://anglebug.com/2291
2016 ANGLE_SKIP_TEST_IF(IsD3D11());
2017
2018 setUpProgram();
2019
2020 constexpr GLint width = 8;
2021 constexpr GLint height = 4;
2022
2023 GLTexture texture;
2024 glBindTexture(GL_TEXTURE_2D, texture);
2025 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2026 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2027 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2028 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2029
2030 // Create all mipmap levels for the texture from level 0 to the 1x1 pixel level.
2031 GLint level = 0;
2032 GLint levelW = width;
2033 GLint levelH = height;
2034 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelW, levelH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2035 nullptr);
2036 while (levelW > 1 || levelH > 1)
2037 {
2038 ++level;
2039 levelW = static_cast<GLint>(std::max(1.0, std::floor(width / std::pow(2, level))));
2040 levelH = static_cast<GLint>(std::max(1.0, std::floor(height / std::pow(2, level))));
2041 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelW, levelH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2042 nullptr);
2043 }
2044
2045 // Clear each level of the texture using an FBO. Change the base level to match the level used
2046 // for the FBO on each iteration.
2047 GLFramebuffer fbo;
2048 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2049 level = 0;
2050 levelW = width;
2051 levelH = height;
2052 while (levelW > 1 || levelH > 1)
2053 {
2054 levelW = static_cast<GLint>(std::floor(width / std::pow(2, level)));
2055 levelH = static_cast<GLint>(std::floor(height / std::pow(2, level)));
2056
2057 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level);
2058 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, level);
2059
2060 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2061 EXPECT_GL_NO_ERROR();
2062
2063 glClearColor(0, 1, 0, 1);
2064 glClear(GL_COLOR_BUFFER_BIT);
2065
2066 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2067
2068 ++level;
2069 }
2070
2071 glBindFramebuffer(GL_FRAMEBUFFER, 0);
2072 glViewport(0, 0, 16, 16);
2073 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2074
2075 drawQuad(mProgram, "position", 0.5f);
2076
2077 EXPECT_GL_NO_ERROR();
2078 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2079}
2080
Olli Etuahoa7416ff2016-01-18 12:22:55 +02002081// Test to check that texture completeness is determined correctly when the texture base level is
2082// greater than 0, and also that level 0 is not sampled when base level is greater than 0.
2083TEST_P(Texture2DTestES3, DrawWithBaseLevel1)
2084{
2085 glActiveTexture(GL_TEXTURE0);
2086 glBindTexture(GL_TEXTURE_2D, mTexture2D);
Olli Etuahoa314b612016-03-10 16:43:00 +02002087
2088 std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
2089 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
2090 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2091 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2092 texDataGreen.data());
2093 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2094 texDataGreen.data());
Olli Etuahoa7416ff2016-01-18 12:22:55 +02002095 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2096 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2097 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2098
2099 EXPECT_GL_NO_ERROR();
2100
2101 drawQuad(mProgram, "position", 0.5f);
2102
Olli Etuahoa314b612016-03-10 16:43:00 +02002103 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2104}
2105
2106// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
2107// have images defined.
2108TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeUndefined)
2109{
Yunchao He9550c602018-02-13 14:47:05 +08002110 // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array.
2111 ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
2112
Olli Etuahoa314b612016-03-10 16:43:00 +02002113 glActiveTexture(GL_TEXTURE0);
2114 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2115 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2116 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2117 texDataGreen.data());
2118 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2119 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2120 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2121 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2122
2123 EXPECT_GL_NO_ERROR();
2124
2125 drawQuad(mProgram, "position", 0.5f);
2126
2127 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2128}
2129
Olli Etuahoe8528d82016-05-16 17:50:52 +03002130// Test that drawing works correctly when level 0 is undefined and base level is 1.
2131TEST_P(Texture2DTestES3, DrawWithLevelZeroUndefined)
2132{
Yunchao He9550c602018-02-13 14:47:05 +08002133 // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array.
2134 ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
2135
Olli Etuahoe8528d82016-05-16 17:50:52 +03002136 glActiveTexture(GL_TEXTURE0);
2137 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2138 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2139 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2140 texDataGreen.data());
2141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2142 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2143 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2144 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
2145
2146 EXPECT_GL_NO_ERROR();
2147
2148 // Texture is incomplete.
2149 drawQuad(mProgram, "position", 0.5f);
2150 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2151
2152 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2153 texDataGreen.data());
2154
2155 // Texture is now complete.
2156 drawQuad(mProgram, "position", 0.5f);
2157 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2158}
2159
Olli Etuahoa314b612016-03-10 16:43:00 +02002160// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
2161// dimensions that don't fit the images inside the range.
2162// GLES 3.0.4 section 3.8.13 Texture completeness
2163TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
2164{
Olli Etuahoa314b612016-03-10 16:43:00 +02002165 glActiveTexture(GL_TEXTURE0);
2166 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2167 std::vector<GLColor> texDataRed(8u * 8u, GLColor::red);
2168 std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
2169 std::vector<GLColor> texDataCyan(2u * 2u, GLColor::cyan);
2170
2171 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2172 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2173
2174 // Two levels that are initially unused.
2175 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
2176 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2177 texDataCyan.data());
2178
2179 // One level that is used - only this level should affect completeness.
2180 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2181 texDataGreen.data());
2182
2183 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2184 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2185
2186 EXPECT_GL_NO_ERROR();
2187
2188 drawQuad(mProgram, "position", 0.5f);
2189
2190 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2191
Yunchao He2f23f352018-02-11 22:11:37 +08002192 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
Olli Etuahoa314b612016-03-10 16:43:00 +02002193
2194 // Switch the level that is being used to the cyan level 2.
2195 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
2196 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
2197
2198 EXPECT_GL_NO_ERROR();
2199
2200 drawQuad(mProgram, "position", 0.5f);
2201
2202 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2203}
2204
2205// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
2206// have images defined.
2207TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeUndefined)
2208{
Olli Etuahoa314b612016-03-10 16:43:00 +02002209 glActiveTexture(GL_TEXTURE0);
2210 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2211 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2212 glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2213 texDataGreen.data());
2214 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2215 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2216 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
2217 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
2218
2219 EXPECT_GL_NO_ERROR();
2220
2221 drawQuad(mProgram, "position", 0.5f);
2222
2223 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2224}
2225
2226// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
2227// dimensions that don't fit the images inside the range.
2228// GLES 3.0.4 section 3.8.13 Texture completeness
2229TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
2230{
Yuly Novikovc5da7992019-06-27 12:57:13 -04002231 // Crashes on Intel Ubuntu 19.04 Mesa 19.0.2 GL. http://anglebug.com/2782
2232 ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsDesktopOpenGL());
2233
Olli Etuahoa314b612016-03-10 16:43:00 +02002234 glActiveTexture(GL_TEXTURE0);
2235 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2236 std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red);
2237 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2238 std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan);
2239
2240 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2241 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2242
2243 // Two levels that are initially unused.
2244 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2245 texDataRed.data());
2246 glTexImage3D(GL_TEXTURE_3D, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2247 texDataCyan.data());
2248
2249 // One level that is used - only this level should affect completeness.
2250 glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2251 texDataGreen.data());
2252
2253 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
2254 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
2255
2256 EXPECT_GL_NO_ERROR();
2257
2258 drawQuad(mProgram, "position", 0.5f);
2259
2260 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2261
Yunchao He2f23f352018-02-11 22:11:37 +08002262 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
Olli Etuahoa314b612016-03-10 16:43:00 +02002263
2264 // Switch the level that is being used to the cyan level 2.
2265 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 2);
2266 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 2);
2267
2268 EXPECT_GL_NO_ERROR();
2269
2270 drawQuad(mProgram, "position", 0.5f);
2271
2272 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2273}
2274
2275// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
2276// have images defined.
2277TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeUndefined)
2278{
Olli Etuahoa314b612016-03-10 16:43:00 +02002279 glActiveTexture(GL_TEXTURE0);
2280 glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
2281 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2282 glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2283 texDataGreen.data());
2284 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2285 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2286 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
2287 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
2288
2289 EXPECT_GL_NO_ERROR();
2290
2291 drawQuad(mProgram, "position", 0.5f);
2292
2293 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2294}
2295
2296// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
2297// dimensions that don't fit the images inside the range.
2298// GLES 3.0.4 section 3.8.13 Texture completeness
2299TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
2300{
Corentin Wallez566c2e32019-08-28 18:37:58 +02002301 // TODO(crbug.com/998505): Test failing on Android FYI Release (NVIDIA Shield TV)
2302 ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
2303
Olli Etuahoa314b612016-03-10 16:43:00 +02002304 glActiveTexture(GL_TEXTURE0);
2305 glBindTexture(GL_TEXTURE_3D, m2DArrayTexture);
2306 std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red);
2307 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2308 std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan);
2309
2310 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2311 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2312
2313 // Two levels that are initially unused.
2314 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2315 texDataRed.data());
2316 glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2317 texDataCyan.data());
2318
2319 // One level that is used - only this level should affect completeness.
2320 glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2321 texDataGreen.data());
2322
2323 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
2324 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
2325
2326 EXPECT_GL_NO_ERROR();
2327
2328 drawQuad(mProgram, "position", 0.5f);
2329
2330 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2331
Yunchao He2f23f352018-02-11 22:11:37 +08002332 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
2333
Olli Etuahoa314b612016-03-10 16:43:00 +02002334 // Switch the level that is being used to the cyan level 2.
2335 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 2);
2336 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 2);
2337
2338 EXPECT_GL_NO_ERROR();
2339
2340 drawQuad(mProgram, "position", 0.5f);
2341
2342 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2343}
2344
2345// Test that texture completeness is updated if texture max level changes.
2346// GLES 3.0.4 section 3.8.13 Texture completeness
2347TEST_P(Texture2DTestES3, TextureCompletenessChangesWithMaxLevel)
2348{
Olli Etuahoa314b612016-03-10 16:43:00 +02002349 glActiveTexture(GL_TEXTURE0);
2350 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2351 std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green);
2352
2353 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2354 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2355
2356 // A level that is initially unused.
2357 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2358 texDataGreen.data());
2359
2360 // One level that is initially used - only this level should affect completeness.
2361 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2362 texDataGreen.data());
2363
2364 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2366
2367 EXPECT_GL_NO_ERROR();
2368
2369 drawQuad(mProgram, "position", 0.5f);
2370
2371 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2372
2373 // Switch the max level to level 1. The levels within the used range now have inconsistent
2374 // dimensions and the texture should be incomplete.
2375 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2376
2377 EXPECT_GL_NO_ERROR();
2378
2379 drawQuad(mProgram, "position", 0.5f);
2380
2381 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2382}
2383
2384// Test that 3D texture completeness is updated if texture max level changes.
2385// GLES 3.0.4 section 3.8.13 Texture completeness
2386TEST_P(Texture3DTestES3, Texture3DCompletenessChangesWithMaxLevel)
2387{
Olli Etuahoa314b612016-03-10 16:43:00 +02002388 glActiveTexture(GL_TEXTURE0);
2389 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2390 std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
2391
2392 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2393 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2394
2395 // A level that is initially unused.
2396 glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2397 texDataGreen.data());
2398
2399 // One level that is initially used - only this level should affect completeness.
2400 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2401 texDataGreen.data());
2402
2403 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
2404 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
2405
2406 EXPECT_GL_NO_ERROR();
2407
2408 drawQuad(mProgram, "position", 0.5f);
2409
2410 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2411
2412 // Switch the max level to level 1. The levels within the used range now have inconsistent
2413 // dimensions and the texture should be incomplete.
2414 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
2415
2416 EXPECT_GL_NO_ERROR();
2417
2418 drawQuad(mProgram, "position", 0.5f);
2419
2420 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2421}
2422
2423// Test that texture completeness is updated if texture base level changes.
2424// GLES 3.0.4 section 3.8.13 Texture completeness
2425TEST_P(Texture2DTestES3, TextureCompletenessChangesWithBaseLevel)
2426{
Olli Etuahoa314b612016-03-10 16:43:00 +02002427 glActiveTexture(GL_TEXTURE0);
2428 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2429 std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green);
2430
2431 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2432 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2433
2434 // Two levels that are initially unused.
2435 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2436 texDataGreen.data());
2437 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2438 texDataGreen.data());
2439
2440 // One level that is initially used - only this level should affect completeness.
2441 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2442 texDataGreen.data());
2443
2444 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
2445 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
2446
2447 EXPECT_GL_NO_ERROR();
2448
2449 drawQuad(mProgram, "position", 0.5f);
2450
2451 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2452
2453 // Switch the base level to level 1. The levels within the used range now have inconsistent
2454 // dimensions and the texture should be incomplete.
2455 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2456
2457 EXPECT_GL_NO_ERROR();
2458
2459 drawQuad(mProgram, "position", 0.5f);
2460
2461 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2462}
2463
2464// Test that texture is not complete if base level is greater than max level.
2465// GLES 3.0.4 section 3.8.13 Texture completeness
2466TEST_P(Texture2DTestES3, TextureBaseLevelGreaterThanMaxLevel)
2467{
Olli Etuahoa314b612016-03-10 16:43:00 +02002468 glActiveTexture(GL_TEXTURE0);
2469 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2470
2471 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2472 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2473
2474 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
2475
2476 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
2477 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2478
2479 EXPECT_GL_NO_ERROR();
2480
2481 drawQuad(mProgram, "position", 0.5f);
2482
2483 // Texture should be incomplete.
2484 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2485}
2486
2487// Test that immutable texture base level and max level are clamped.
2488// GLES 3.0.4 section 3.8.10 subsection Mipmapping
2489TEST_P(Texture2DTestES3, ImmutableTextureBaseLevelOutOfRange)
2490{
Olli Etuahoa314b612016-03-10 16:43:00 +02002491 glActiveTexture(GL_TEXTURE0);
2492 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2493
2494 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2495 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2496
2497 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
2498
2499 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
2500
2501 // For immutable-format textures, base level should be clamped to [0, levels - 1], and max level
2502 // should be clamped to [base_level, levels - 1].
2503 // GLES 3.0.4 section 3.8.10 subsection Mipmapping
2504 // In the case of this test, those rules make the effective base level and max level 0.
2505 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
2506 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000);
2507
2508 EXPECT_GL_NO_ERROR();
2509
2510 drawQuad(mProgram, "position", 0.5f);
2511
2512 // Texture should be complete.
2513 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2514}
2515
Olli Etuaho87fc71c2016-05-11 14:25:21 +03002516// Test that changing base level works when it affects the format of the texture.
2517TEST_P(Texture2DTestES3, TextureFormatChangesWithBaseLevel)
2518{
Corentin Wallez7f00d332019-08-28 15:19:16 +02002519 // TODO(crbug.com/998505): Test failing on Android FYI Release (NVIDIA Shield TV)
2520 ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
2521
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002522 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsDesktopOpenGL());
Yunchao He9550c602018-02-13 14:47:05 +08002523
2524 // Observed incorrect rendering on AMD OpenGL.
2525 ANGLE_SKIP_TEST_IF(IsAMD() && IsDesktopOpenGL());
Olli Etuaho87fc71c2016-05-11 14:25:21 +03002526
2527 glActiveTexture(GL_TEXTURE0);
2528 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2529 std::vector<GLColor> texDataCyan(4u * 4u, GLColor::cyan);
2530 std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
2531
2532 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2533 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2534
2535 // RGBA8 level that's initially unused.
2536 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2537 texDataCyan.data());
2538
2539 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2540 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2541
2542 // RG8 level that's initially used, with consistent dimensions with level 0 but a different
2543 // format. It reads green channel data from the green and alpha channels of texDataGreen
2544 // (this is a bit hacky but works).
2545 glTexImage2D(GL_TEXTURE_2D, 1, GL_RG8, 2, 2, 0, GL_RG, GL_UNSIGNED_BYTE, texDataGreen.data());
2546
2547 EXPECT_GL_NO_ERROR();
2548
2549 drawQuad(mProgram, "position", 0.5f);
2550
2551 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2552
2553 // Switch the texture to use the cyan level 0 with the RGBA format.
2554 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2555 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2556
2557 EXPECT_GL_NO_ERROR();
2558
2559 drawQuad(mProgram, "position", 0.5f);
2560
2561 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2562}
2563
Olli Etuahoa314b612016-03-10 16:43:00 +02002564// Test that setting a texture image works when base level is out of range.
2565TEST_P(Texture2DTestES3, SetImageWhenBaseLevelOutOfRange)
2566{
2567 glActiveTexture(GL_TEXTURE0);
2568 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2569
2570 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2571 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2572
2573 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
2574 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000);
2575
2576 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
2577
2578 EXPECT_GL_NO_ERROR();
2579
2580 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2581
2582 drawQuad(mProgram, "position", 0.5f);
2583
2584 // Texture should be complete.
2585 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Olli Etuahoa7416ff2016-01-18 12:22:55 +02002586}
2587
Jamie Madill50cf2be2018-06-15 09:46:57 -04002588// In the D3D11 renderer, we need to initialize some texture formats, to fill empty channels. EG
2589// RBA->RGBA8, with 1.0 in the alpha channel. This test covers a bug where redefining array textures
2590// with these formats does not work as expected.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002591TEST_P(Texture2DArrayTestES3, RedefineInittableArray)
Jamie Madill2453dbc2015-07-14 11:35:42 -04002592{
2593 std::vector<GLubyte> pixelData;
2594 for (size_t count = 0; count < 5000; count++)
2595 {
2596 pixelData.push_back(0u);
2597 pixelData.push_back(255u);
2598 pixelData.push_back(0u);
2599 }
2600
2601 glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002602 glUseProgram(mProgram);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002603 glUniform1i(mTextureArrayLocation, 0);
2604
2605 // The first draw worked correctly.
Jamie Madill50cf2be2018-06-15 09:46:57 -04002606 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
2607 &pixelData[0]);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002608
2609 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2610 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2611 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
2612 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002613 drawQuad(mProgram, "position", 1.0f);
Olli Etuahoa314b612016-03-10 16:43:00 +02002614 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002615
2616 // The dimension of the respecification must match the original exactly to trigger the bug.
Jamie Madill50cf2be2018-06-15 09:46:57 -04002617 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
2618 &pixelData[0]);
Olli Etuaho4a8329f2016-01-11 17:12:57 +02002619 drawQuad(mProgram, "position", 1.0f);
Olli Etuahoa314b612016-03-10 16:43:00 +02002620 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Jamie Madill2453dbc2015-07-14 11:35:42 -04002621
2622 ASSERT_GL_NO_ERROR();
2623}
2624
Olli Etuaho1a679902016-01-14 12:21:47 +02002625// Test shadow sampler and regular non-shadow sampler coexisting in the same shader.
2626// This test is needed especially to confirm that sampler registers get assigned correctly on
2627// the HLSL backend even when there's a mix of different HLSL sampler and texture types.
2628TEST_P(ShadowSamplerPlusSampler3DTestES3, ShadowSamplerPlusSampler3DDraw)
2629{
2630 glActiveTexture(GL_TEXTURE0);
2631 glBindTexture(GL_TEXTURE_3D, mTexture3D);
2632 GLubyte texData[4];
2633 texData[0] = 0;
2634 texData[1] = 60;
2635 texData[2] = 0;
2636 texData[3] = 255;
2637 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
2638
2639 glActiveTexture(GL_TEXTURE1);
2640 glBindTexture(GL_TEXTURE_2D, mTextureShadow);
2641 GLfloat depthTexData[1];
2642 depthTexData[0] = 0.5f;
2643 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
2644 depthTexData);
2645
2646 glUseProgram(mProgram);
2647 glUniform1f(mDepthRefUniformLocation, 0.3f);
2648 glUniform1i(mTexture3DUniformLocation, 0);
2649 glUniform1i(mTextureShadowUniformLocation, 1);
2650
2651 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
2652 drawQuad(mProgram, "position", 0.5f);
2653 EXPECT_GL_NO_ERROR();
2654 // The shader writes 0.5 * <comparison result (1.0)> + <texture color>
2655 EXPECT_PIXEL_NEAR(0, 0, 128, 188, 128, 255, 2);
2656
2657 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GREATER);
2658 drawQuad(mProgram, "position", 0.5f);
2659 EXPECT_GL_NO_ERROR();
2660 // The shader writes 0.5 * <comparison result (0.0)> + <texture color>
2661 EXPECT_PIXEL_NEAR(0, 0, 0, 60, 0, 255, 2);
2662}
2663
Olli Etuahoc8c99a02016-01-14 16:47:22 +02002664// Test multiple different sampler types in the same shader.
2665// This test makes sure that even if sampler / texture registers get grouped together based on type
2666// or otherwise get shuffled around in the HLSL backend of the shader translator, the D3D renderer
2667// still has the right register index information for each ESSL sampler.
2668// The tested ESSL samplers have the following types in D3D11 HLSL:
2669// sampler2D: Texture2D + SamplerState
2670// samplerCube: TextureCube + SamplerState
2671// sampler2DShadow: Texture2D + SamplerComparisonState
2672// samplerCubeShadow: TextureCube + SamplerComparisonState
2673TEST_P(SamplerTypeMixTestES3, SamplerTypeMixDraw)
2674{
2675 glActiveTexture(GL_TEXTURE0);
2676 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2677 GLubyte texData[4];
2678 texData[0] = 0;
2679 texData[1] = 0;
2680 texData[2] = 120;
2681 texData[3] = 255;
2682 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
2683
2684 glActiveTexture(GL_TEXTURE1);
2685 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
2686 texData[0] = 0;
2687 texData[1] = 90;
2688 texData[2] = 0;
2689 texData[3] = 255;
2690 glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1);
2691 glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2692 texData);
2693
2694 glActiveTexture(GL_TEXTURE2);
2695 glBindTexture(GL_TEXTURE_2D, mTexture2DShadow);
2696 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
2697 GLfloat depthTexData[1];
2698 depthTexData[0] = 0.5f;
2699 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
2700 depthTexData);
2701
2702 glActiveTexture(GL_TEXTURE3);
2703 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow);
2704 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
2705 depthTexData[0] = 0.2f;
2706 glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_DEPTH_COMPONENT32F, 1, 1);
2707 glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT,
2708 depthTexData);
2709
2710 EXPECT_GL_NO_ERROR();
2711
2712 glUseProgram(mProgram);
2713 glUniform1f(mDepthRefUniformLocation, 0.3f);
2714 glUniform1i(mTexture2DUniformLocation, 0);
2715 glUniform1i(mTextureCubeUniformLocation, 1);
2716 glUniform1i(mTexture2DShadowUniformLocation, 2);
2717 glUniform1i(mTextureCubeShadowUniformLocation, 3);
2718
2719 drawQuad(mProgram, "position", 0.5f);
2720 EXPECT_GL_NO_ERROR();
2721 // The shader writes:
2722 // <texture 2d color> +
2723 // <cube map color> +
2724 // 0.25 * <comparison result (1.0)> +
2725 // 0.125 * <comparison result (0.0)>
2726 EXPECT_PIXEL_NEAR(0, 0, 64, 154, 184, 255, 2);
2727}
2728
Olli Etuahobce743a2016-01-15 17:18:28 +02002729// Test different base levels on textures accessed through the same sampler array.
2730// Calling textureSize() on the samplers hits the D3D sampler metadata workaround.
2731TEST_P(TextureSizeTextureArrayTest, BaseLevelVariesInTextureArray)
2732{
Yunchao He9550c602018-02-13 14:47:05 +08002733 ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
2734
Olli Etuahobce743a2016-01-15 17:18:28 +02002735 glActiveTexture(GL_TEXTURE0);
2736 glBindTexture(GL_TEXTURE_2D, mTexture2DA);
2737 GLsizei size = 64;
2738 for (GLint level = 0; level < 7; ++level)
2739 {
2740 ASSERT_LT(0, size);
2741 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2742 nullptr);
2743 size = size / 2;
2744 }
2745 ASSERT_EQ(0, size);
2746 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2747
2748 glActiveTexture(GL_TEXTURE1);
2749 glBindTexture(GL_TEXTURE_2D, mTexture2DB);
2750 size = 128;
2751 for (GLint level = 0; level < 8; ++level)
2752 {
2753 ASSERT_LT(0, size);
2754 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2755 nullptr);
2756 size = size / 2;
2757 }
2758 ASSERT_EQ(0, size);
2759 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
2760 EXPECT_GL_NO_ERROR();
2761
2762 glUseProgram(mProgram);
2763 glUniform1i(mTexture0Location, 0);
2764 glUniform1i(mTexture1Location, 1);
2765
Olli Etuaho5804dc82018-04-13 14:11:46 +03002766 drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
Olli Etuahobce743a2016-01-15 17:18:28 +02002767 EXPECT_GL_NO_ERROR();
2768 // Red channel: width of level 1 of texture A: 32.
2769 // Green channel: width of level 3 of texture B: 16.
2770 EXPECT_PIXEL_NEAR(0, 0, 32, 16, 0, 255, 2);
2771}
2772
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002773// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2774// ES 3.0.4 table 3.24
2775TEST_P(Texture2DTestES3, TextureRGBImplicitAlpha1)
2776{
2777 glActiveTexture(GL_TEXTURE0);
2778 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2779 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
2780 EXPECT_GL_NO_ERROR();
2781
2782 drawQuad(mProgram, "position", 0.5f);
2783
2784 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2785}
2786
2787// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2788// ES 3.0.4 table 3.24
Luc Ferron5164b792018-03-06 09:10:12 -05002789TEST_P(Texture2DTest, TextureLuminanceImplicitAlpha1)
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002790{
Luc Ferron5164b792018-03-06 09:10:12 -05002791 setUpProgram();
2792
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002793 glActiveTexture(GL_TEXTURE0);
2794 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2795 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
2796 EXPECT_GL_NO_ERROR();
2797
2798 drawQuad(mProgram, "position", 0.5f);
2799
2800 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2801}
2802
Luc Ferron5164b792018-03-06 09:10:12 -05002803// Validate that every component of the pixel will be equal to the luminance value we've set
2804// and that the alpha channel will be 1 (or 255 to be exact).
2805TEST_P(Texture2DTest, TextureLuminanceRGBSame)
2806{
2807 setUpProgram();
2808
2809 glActiveTexture(GL_TEXTURE0);
2810 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2811 uint8_t pixel = 50;
2812 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &pixel);
2813 EXPECT_GL_NO_ERROR();
2814
2815 drawQuad(mProgram, "position", 0.5f);
2816
2817 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(pixel, pixel, pixel, 255));
2818}
2819
2820// Validate that every component of the pixel will be equal to the luminance value we've set
2821// and that the alpha channel will be the second component.
2822TEST_P(Texture2DTest, TextureLuminanceAlphaRGBSame)
2823{
2824 setUpProgram();
2825
2826 glActiveTexture(GL_TEXTURE0);
2827 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2828 uint8_t pixel[] = {50, 25};
2829 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
2830 GL_UNSIGNED_BYTE, pixel);
2831 EXPECT_GL_NO_ERROR();
2832
2833 drawQuad(mProgram, "position", 0.5f);
2834
2835 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(pixel[0], pixel[0], pixel[0], pixel[1]));
2836}
2837
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002838// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2839// ES 3.0.4 table 3.24
Luc Ferron5164b792018-03-06 09:10:12 -05002840TEST_P(Texture2DTest, TextureLuminance32ImplicitAlpha1)
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002841{
Jamie Madillb8149072019-04-30 16:14:44 -04002842 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
Luc Ferrond8c632c2018-04-10 12:31:44 -04002843 ANGLE_SKIP_TEST_IF(IsD3D9());
2844 ANGLE_SKIP_TEST_IF(IsVulkan());
Luc Ferron5164b792018-03-06 09:10:12 -05002845
2846 setUpProgram();
2847
Luc Ferrond8c632c2018-04-10 12:31:44 -04002848 glActiveTexture(GL_TEXTURE0);
2849 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2850 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_FLOAT, nullptr);
2851 EXPECT_GL_NO_ERROR();
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002852
Luc Ferrond8c632c2018-04-10 12:31:44 -04002853 drawQuad(mProgram, "position", 0.5f);
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002854
Luc Ferrond8c632c2018-04-10 12:31:44 -04002855 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002856}
2857
2858// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2859// ES 3.0.4 table 3.24
Luc Ferron5164b792018-03-06 09:10:12 -05002860TEST_P(Texture2DTest, TextureLuminance16ImplicitAlpha1)
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002861{
Jamie Madillb8149072019-04-30 16:14:44 -04002862 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
Luc Ferrond8c632c2018-04-10 12:31:44 -04002863 ANGLE_SKIP_TEST_IF(IsD3D9());
2864 ANGLE_SKIP_TEST_IF(IsVulkan());
Luc Ferrond8c632c2018-04-10 12:31:44 -04002865 // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1420 is fixed
2866 ANGLE_SKIP_TEST_IF(IsAndroid() && IsAdreno() && IsOpenGLES());
Luc Ferron5164b792018-03-06 09:10:12 -05002867
Luc Ferrond8c632c2018-04-10 12:31:44 -04002868 setUpProgram();
Luc Ferron5164b792018-03-06 09:10:12 -05002869
Luc Ferrond8c632c2018-04-10 12:31:44 -04002870 glActiveTexture(GL_TEXTURE0);
2871 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2872 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, nullptr);
2873 EXPECT_GL_NO_ERROR();
Yunchao He9550c602018-02-13 14:47:05 +08002874
Luc Ferrond8c632c2018-04-10 12:31:44 -04002875 drawQuad(mProgram, "position", 0.5f);
Yuly Novikovafcec832016-06-21 22:19:51 -04002876
Luc Ferrond8c632c2018-04-10 12:31:44 -04002877 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002878}
2879
2880// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2881// ES 3.0.4 table 3.24
2882TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB8UIImplicitAlpha1)
2883{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002884 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2885
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002886 glActiveTexture(GL_TEXTURE0);
2887 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2888 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, nullptr);
2889 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2890 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2891 EXPECT_GL_NO_ERROR();
2892
2893 drawQuad(mProgram, "position", 0.5f);
2894
2895 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2896}
2897
2898// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2899// ES 3.0.4 table 3.24
2900TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB8IImplicitAlpha1)
2901{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002902 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2903
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002904 glActiveTexture(GL_TEXTURE0);
2905 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2906
2907 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8I, 1, 1, 0, GL_RGB_INTEGER, GL_BYTE, nullptr);
2908 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2909 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2910 EXPECT_GL_NO_ERROR();
2911
2912 drawQuad(mProgram, "position", 0.5f);
2913
2914 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2915}
2916
2917// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2918// ES 3.0.4 table 3.24
2919TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB16UIImplicitAlpha1)
2920{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002921 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2922
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002923 glActiveTexture(GL_TEXTURE0);
2924 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2925 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, nullptr);
2926 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2927 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2928 EXPECT_GL_NO_ERROR();
2929
2930 drawQuad(mProgram, "position", 0.5f);
2931
2932 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2933}
2934
2935// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2936// ES 3.0.4 table 3.24
2937TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB16IImplicitAlpha1)
2938{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002939 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2940
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002941 glActiveTexture(GL_TEXTURE0);
2942 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2943 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16I, 1, 1, 0, GL_RGB_INTEGER, GL_SHORT, nullptr);
2944 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2945 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2946 EXPECT_GL_NO_ERROR();
2947
2948 drawQuad(mProgram, "position", 0.5f);
2949
2950 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2951}
2952
2953// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2954// ES 3.0.4 table 3.24
2955TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB32UIImplicitAlpha1)
2956{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002957 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2958
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002959 glActiveTexture(GL_TEXTURE0);
2960 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2961 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, nullptr);
2962 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2963 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2964 EXPECT_GL_NO_ERROR();
2965
2966 drawQuad(mProgram, "position", 0.5f);
2967
2968 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2969}
2970
2971// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2972// ES 3.0.4 table 3.24
2973TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB32IImplicitAlpha1)
2974{
Yunchao He8e5ba8b2018-02-05 17:52:27 +08002975 ANGLE_SKIP_TEST_IF(IsIntel() && IsOSX());
2976
Olli Etuaho6ee394a2016-02-18 13:30:09 +02002977 glActiveTexture(GL_TEXTURE0);
2978 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2979 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32I, 1, 1, 0, GL_RGB_INTEGER, GL_INT, nullptr);
2980 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2981 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2982 EXPECT_GL_NO_ERROR();
2983
2984 drawQuad(mProgram, "position", 0.5f);
2985
2986 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
2987}
2988
2989// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
2990// ES 3.0.4 table 3.24
2991TEST_P(Texture2DTestES3, TextureRGBSNORMImplicitAlpha1)
2992{
2993 glActiveTexture(GL_TEXTURE0);
2994 glBindTexture(GL_TEXTURE_2D, mTexture2D);
2995 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 1, 1, 0, GL_RGB, GL_BYTE, nullptr);
2996 EXPECT_GL_NO_ERROR();
2997
2998 drawQuad(mProgram, "position", 0.5f);
2999
3000 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3001}
3002
3003// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
3004// ES 3.0.4 table 3.24
3005TEST_P(Texture2DTestES3, TextureRGB9E5ImplicitAlpha1)
3006{
3007 glActiveTexture(GL_TEXTURE0);
3008 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3009 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB9_E5, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV,
3010 nullptr);
3011 EXPECT_GL_NO_ERROR();
3012
3013 drawQuad(mProgram, "position", 0.5f);
3014
3015 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3016}
3017
3018// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
3019// ES 3.0.4 table 3.24
3020TEST_P(Texture2DTestES3, TextureCOMPRESSEDRGB8ETC2ImplicitAlpha1)
3021{
Geoff Lang2a19c592019-08-23 14:10:24 -04003022 // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
3023 ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
Yuly Novikov49886892018-01-23 21:18:27 -05003024
Olli Etuaho6ee394a2016-02-18 13:30:09 +02003025 glActiveTexture(GL_TEXTURE0);
3026 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3027 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 1, 1, 0, 8, nullptr);
3028 EXPECT_GL_NO_ERROR();
3029
3030 drawQuad(mProgram, "position", 0.5f);
3031
3032 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3033}
3034
3035// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
3036// ES 3.0.4 table 3.24
3037TEST_P(Texture2DTestES3, TextureCOMPRESSEDSRGB8ETC2ImplicitAlpha1)
3038{
Geoff Lang2a19c592019-08-23 14:10:24 -04003039 // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
3040 ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
Yuly Novikov49886892018-01-23 21:18:27 -05003041
Olli Etuaho6ee394a2016-02-18 13:30:09 +02003042 glActiveTexture(GL_TEXTURE0);
3043 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3044 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ETC2, 1, 1, 0, 8, nullptr);
3045 EXPECT_GL_NO_ERROR();
3046
3047 drawQuad(mProgram, "position", 0.5f);
3048
3049 EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
3050}
3051
Olli Etuaho96963162016-03-21 11:54:33 +02003052// Use a sampler in a uniform struct.
3053TEST_P(SamplerInStructTest, SamplerInStruct)
3054{
3055 runSamplerInStructTest();
3056}
3057
3058// Use a sampler in a uniform struct that's passed as a function parameter.
3059TEST_P(SamplerInStructAsFunctionParameterTest, SamplerInStructAsFunctionParameter)
3060{
Yuly Novikovd18c0482019-04-04 19:56:43 -04003061 // Fails on Nexus 5X due to a driver bug. http://anglebug.com/1427
3062 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Geoff Lang8fcdf6e2016-09-16 10:45:30 -04003063
Olli Etuaho96963162016-03-21 11:54:33 +02003064 runSamplerInStructTest();
3065}
3066
3067// Use a sampler in a uniform struct array with a struct from the array passed as a function
3068// parameter.
3069TEST_P(SamplerInStructArrayAsFunctionParameterTest, SamplerInStructArrayAsFunctionParameter)
3070{
Yuly Novikovd18c0482019-04-04 19:56:43 -04003071 // Fails on Nexus 5X due to a driver bug. http://anglebug.com/1427
3072 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Yunchao He9550c602018-02-13 14:47:05 +08003073
Olli Etuaho96963162016-03-21 11:54:33 +02003074 runSamplerInStructTest();
3075}
3076
3077// Use a sampler in a struct inside a uniform struct with the nested struct passed as a function
3078// parameter.
3079TEST_P(SamplerInNestedStructAsFunctionParameterTest, SamplerInNestedStructAsFunctionParameter)
3080{
Yuly Novikovd18c0482019-04-04 19:56:43 -04003081 // Fails on Nexus 5X due to a driver bug. http://anglebug.com/1427
3082 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Yunchao He9550c602018-02-13 14:47:05 +08003083
Olli Etuaho96963162016-03-21 11:54:33 +02003084 runSamplerInStructTest();
3085}
3086
3087// Make sure that there isn't a name conflict between sampler extracted from a struct and a
3088// similarly named uniform.
3089TEST_P(SamplerInStructAndOtherVariableTest, SamplerInStructAndOtherVariable)
3090{
3091 runSamplerInStructTest();
3092}
3093
Shahbaz Youssefi962c2222019-02-20 15:43:41 -05003094// GL_EXT_texture_filter_anisotropic
3095class TextureAnisotropyTest : public Texture2DTest
3096{
3097 protected:
3098 void uploadTexture()
3099 {
3100 glActiveTexture(GL_TEXTURE0);
3101 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3102 GLColor texDataRed[1] = {GLColor::red};
3103 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed);
3104 EXPECT_GL_NO_ERROR();
3105 }
3106};
3107
3108// Tests that setting anisotropic filtering doesn't cause failures at draw time.
3109TEST_P(TextureAnisotropyTest, AnisotropyFunctional)
3110{
Jamie Madillb8149072019-04-30 16:14:44 -04003111 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_filter_anisotropic"));
Shahbaz Youssefi962c2222019-02-20 15:43:41 -05003112
3113 setUpProgram();
3114
3115 uploadTexture();
3116
3117 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3118 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3119 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f);
3120 EXPECT_GL_NO_ERROR();
3121
3122 drawQuad(mProgram, "position", 0.5f);
3123
3124 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3125 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3126 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::red);
3127}
3128
Till Rathmannb8543632018-10-02 19:46:14 +02003129// GL_OES_texture_border_clamp
3130class TextureBorderClampTest : public Texture2DTest
3131{
3132 protected:
3133 TextureBorderClampTest() : Texture2DTest() {}
3134
Jamie Madill35cd7332018-12-02 12:03:33 -05003135 const char *getVertexShaderSource() override
Till Rathmannb8543632018-10-02 19:46:14 +02003136 {
3137 return
3138 R"(precision highp float;
3139 attribute vec4 position;
3140 varying vec2 texcoord;
3141
3142 void main()
3143 {
3144 gl_Position = vec4(position.xy, 0.0, 1.0);
3145 // texcoords in [-0.5, 1.5]
3146 texcoord = (position.xy) + 0.5;
3147 })";
3148 }
3149
3150 void uploadTexture()
3151 {
3152 glActiveTexture(GL_TEXTURE0);
3153 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3154 std::vector<GLColor> texDataRed(1, GLColor::red);
3155 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3156 texDataRed.data());
3157 EXPECT_GL_NO_ERROR();
3158 }
3159};
3160
3161// Test if the color set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the texture in
3162// GL_CLAMP_TO_BORDER wrap mode (set with glTexParameter).
3163TEST_P(TextureBorderClampTest, TextureBorderClampFunctional)
3164{
Jamie Madillb8149072019-04-30 16:14:44 -04003165 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003166
3167 setUpProgram();
3168
3169 uploadTexture();
3170
3171 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3172 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3173 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3174 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3175 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3176 EXPECT_GL_NO_ERROR();
3177
3178 drawQuad(mProgram, "position", 0.5f);
3179
3180 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3181 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3182 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3183}
3184
3185// Test reading back GL_TEXTURE_BORDER_COLOR by glGetTexParameter.
3186TEST_P(TextureBorderClampTest, TextureBorderClampFunctional2)
3187{
Jamie Madillb8149072019-04-30 16:14:44 -04003188 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003189
3190 glActiveTexture(GL_TEXTURE0);
3191 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3192
3193 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3194
3195 GLint colorFixedPoint[4] = {0};
3196 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorFixedPoint);
3197 constexpr GLint colorGreenFixedPoint[4] = {0, std::numeric_limits<GLint>::max(), 0,
3198 std::numeric_limits<GLint>::max()};
3199 EXPECT_EQ(colorFixedPoint[0], colorGreenFixedPoint[0]);
3200 EXPECT_EQ(colorFixedPoint[1], colorGreenFixedPoint[1]);
3201 EXPECT_EQ(colorFixedPoint[2], colorGreenFixedPoint[2]);
3202 EXPECT_EQ(colorFixedPoint[3], colorGreenFixedPoint[3]);
3203
3204 constexpr GLint colorBlueFixedPoint[4] = {0, 0, std::numeric_limits<GLint>::max(),
3205 std::numeric_limits<GLint>::max()};
3206 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorBlueFixedPoint);
3207
3208 GLfloat color[4] = {0.0f};
3209 glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);
3210 EXPECT_EQ(color[0], kFloatBlue.R);
3211 EXPECT_EQ(color[1], kFloatBlue.G);
3212 EXPECT_EQ(color[2], kFloatBlue.B);
3213 EXPECT_EQ(color[3], kFloatBlue.A);
3214}
3215
3216// Test GL_TEXTURE_BORDER_COLOR parameter validation at glTexParameter.
3217TEST_P(TextureBorderClampTest, TextureBorderClampValidation)
3218{
Jamie Madillb8149072019-04-30 16:14:44 -04003219 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003220
3221 glActiveTexture(GL_TEXTURE0);
3222 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3223
3224 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 1.0f);
3225 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3226
3227 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, std::numeric_limits<GLint>::max());
3228 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3229
3230 glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3231 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3232
3233 GLint colorInt[4] = {0};
3234 glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, colorInt);
3235 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3236
3237 if (getClientMajorVersion() < 3)
3238 {
3239 glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
3240 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3241 glGetTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
3242 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3243
3244 GLuint colorUInt[4] = {0};
3245 glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
3246 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3247 glGetTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
3248 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3249
3250 GLSampler sampler;
3251 glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
3252 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3253 glGetSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
3254 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3255
3256 glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
3257 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3258 glGetSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
3259 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3260 }
3261}
3262
3263class TextureBorderClampTestES3 : public TextureBorderClampTest
3264{
3265 protected:
3266 TextureBorderClampTestES3() : TextureBorderClampTest() {}
3267};
3268
3269// Test if the color set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the texture in
3270// GL_CLAMP_TO_BORDER wrap mode (set with glSamplerParameter).
3271TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Functional)
3272{
Jamie Madillb8149072019-04-30 16:14:44 -04003273 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003274
3275 setUpProgram();
3276
3277 uploadTexture();
3278
3279 GLSampler sampler;
3280 glBindSampler(0, sampler);
3281 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3282 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3283 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3284 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3285 glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3286 EXPECT_GL_NO_ERROR();
3287
3288 drawQuad(mProgram, "position", 0.5f);
3289
3290 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3291 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3292 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3293}
3294
3295// Test reading back GL_TEXTURE_BORDER_COLOR by glGetSamplerParameter.
3296TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Functional2)
3297{
Jamie Madillb8149072019-04-30 16:14:44 -04003298 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003299
3300 glActiveTexture(GL_TEXTURE0);
3301
3302 GLSampler sampler;
3303 glBindSampler(0, sampler);
3304
3305 glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
3306
3307 GLint colorFixedPoint[4] = {0};
3308 glGetSamplerParameteriv(sampler, GL_TEXTURE_BORDER_COLOR, colorFixedPoint);
3309 constexpr GLint colorGreenFixedPoint[4] = {0, std::numeric_limits<GLint>::max(), 0,
3310 std::numeric_limits<GLint>::max()};
3311 EXPECT_EQ(colorFixedPoint[0], colorGreenFixedPoint[0]);
3312 EXPECT_EQ(colorFixedPoint[1], colorGreenFixedPoint[1]);
3313 EXPECT_EQ(colorFixedPoint[2], colorGreenFixedPoint[2]);
3314 EXPECT_EQ(colorFixedPoint[3], colorGreenFixedPoint[3]);
3315
3316 constexpr GLint colorBlueFixedPoint[4] = {0, 0, std::numeric_limits<GLint>::max(),
3317 std::numeric_limits<GLint>::max()};
3318 glSamplerParameteriv(sampler, GL_TEXTURE_BORDER_COLOR, colorBlueFixedPoint);
3319
3320 GLfloat color[4] = {0.0f};
3321 glGetSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, color);
3322 EXPECT_EQ(color[0], kFloatBlue.R);
3323 EXPECT_EQ(color[1], kFloatBlue.G);
3324 EXPECT_EQ(color[2], kFloatBlue.B);
3325 EXPECT_EQ(color[3], kFloatBlue.A);
3326
3327 constexpr GLint colorSomewhatRedInt[4] = {500000, 0, 0, std::numeric_limits<GLint>::max()};
3328 glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorSomewhatRedInt);
3329 GLint colorInt[4] = {0};
3330 glGetSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
3331 EXPECT_EQ(colorInt[0], colorSomewhatRedInt[0]);
3332 EXPECT_EQ(colorInt[1], colorSomewhatRedInt[1]);
3333 EXPECT_EQ(colorInt[2], colorSomewhatRedInt[2]);
3334 EXPECT_EQ(colorInt[3], colorSomewhatRedInt[3]);
3335
3336 constexpr GLuint colorSomewhatRedUInt[4] = {500000, 0, 0, std::numeric_limits<GLuint>::max()};
3337 glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorSomewhatRedUInt);
3338 GLuint colorUInt[4] = {0};
3339 glGetSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
3340 EXPECT_EQ(colorUInt[0], colorSomewhatRedUInt[0]);
3341 EXPECT_EQ(colorUInt[1], colorSomewhatRedUInt[1]);
3342 EXPECT_EQ(colorUInt[2], colorSomewhatRedUInt[2]);
3343 EXPECT_EQ(colorUInt[3], colorSomewhatRedUInt[3]);
3344
3345 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3346
3347 constexpr GLint colorSomewhatGreenInt[4] = {0, 500000, 0, std::numeric_limits<GLint>::max()};
3348 glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorSomewhatGreenInt);
3349 glGetTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
3350 EXPECT_EQ(colorInt[0], colorSomewhatGreenInt[0]);
3351 EXPECT_EQ(colorInt[1], colorSomewhatGreenInt[1]);
3352 EXPECT_EQ(colorInt[2], colorSomewhatGreenInt[2]);
3353 EXPECT_EQ(colorInt[3], colorSomewhatGreenInt[3]);
3354
3355 constexpr GLuint colorSomewhatGreenUInt[4] = {0, 500000, 0, std::numeric_limits<GLuint>::max()};
3356 glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorSomewhatGreenUInt);
3357 glGetTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
3358 EXPECT_EQ(colorUInt[0], colorSomewhatGreenUInt[0]);
3359 EXPECT_EQ(colorUInt[1], colorSomewhatGreenUInt[1]);
3360 EXPECT_EQ(colorUInt[2], colorSomewhatGreenUInt[2]);
3361 EXPECT_EQ(colorUInt[3], colorSomewhatGreenUInt[3]);
3362}
3363
3364// Test GL_TEXTURE_BORDER_COLOR parameter validation at glSamplerParameter.
3365TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Validation)
3366{
Jamie Madillb8149072019-04-30 16:14:44 -04003367 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003368
3369 glActiveTexture(GL_TEXTURE0);
3370
3371 GLSampler sampler;
3372 glBindSampler(0, sampler);
3373
3374 glSamplerParameterf(sampler, GL_TEXTURE_BORDER_COLOR, 1.0f);
3375 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3376
3377 glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, std::numeric_limits<GLint>::max());
3378 EXPECT_GL_ERROR(GL_INVALID_ENUM);
3379}
3380
3381class TextureBorderClampIntegerTestES3 : public Texture2DTest
3382{
3383 protected:
3384 TextureBorderClampIntegerTestES3() : Texture2DTest(), isUnsignedIntTest(false) {}
3385
Jamie Madill35cd7332018-12-02 12:03:33 -05003386 const char *getVertexShaderSource() override
Till Rathmannb8543632018-10-02 19:46:14 +02003387 {
3388 return
3389 R"(#version 300 es
3390 out vec2 texcoord;
3391 in vec4 position;
3392
3393 void main()
3394 {
3395 gl_Position = vec4(position.xy, 0.0, 1.0);
3396 // texcoords in [-0.5, 1.5]
3397 texcoord = (position.xy) + 0.5;
3398 })";
3399 }
3400
Jamie Madillba319ba2018-12-29 10:29:33 -05003401 const char *getFragmentShaderSource() override
Till Rathmannb8543632018-10-02 19:46:14 +02003402 {
Jamie Madill35cd7332018-12-02 12:03:33 -05003403 if (isUnsignedIntTest)
3404 {
3405 return "#version 300 es\n"
3406 "precision highp float;\n"
3407 "uniform highp usampler2D tex;\n"
3408 "in vec2 texcoord;\n"
3409 "out vec4 fragColor;\n"
Till Rathmannb8543632018-10-02 19:46:14 +02003410
Jamie Madill35cd7332018-12-02 12:03:33 -05003411 "void main()\n"
3412 "{\n"
3413 "vec4 red = vec4(1.0, 0.0, 0.0, 1.0);\n"
3414 "vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
3415 "fragColor = (texture(tex, texcoord).r == 150u)"
3416 " ? green : red;\n"
3417 "}\n";
3418 }
3419 else
3420 {
3421 return "#version 300 es\n"
3422 "precision highp float;\n"
3423 "uniform highp isampler2D tex;\n"
3424 "in vec2 texcoord;\n"
3425 "out vec4 fragColor;\n"
3426
3427 "void main()\n"
3428 "{\n"
3429 "vec4 red = vec4(1.0, 0.0, 0.0, 1.0);\n"
3430 "vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
3431 "fragColor = (texture(tex, texcoord).r == -50)"
3432 " ? green : red;\n"
3433 "}\n";
3434 }
Till Rathmannb8543632018-10-02 19:46:14 +02003435 }
3436
3437 void uploadTexture()
3438 {
3439 glActiveTexture(GL_TEXTURE0);
3440 glBindTexture(GL_TEXTURE_2D, mTexture2D);
3441 if (isUnsignedIntTest)
3442 {
3443 std::vector<GLubyte> texData(4, 100);
3444 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 1, 1, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
3445 texData.data());
3446 }
3447 else
3448 {
3449 std::vector<GLbyte> texData(4, 100);
3450 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, 1, 1, 0, GL_RGBA_INTEGER, GL_BYTE,
3451 texData.data());
3452 }
3453 EXPECT_GL_NO_ERROR();
3454 }
3455
3456 bool isUnsignedIntTest;
3457};
3458
3459// Test if the integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the
3460// integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIivOES).
3461TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampInteger)
3462{
Yuly Novikov1dbbc7b2019-07-31 17:49:39 -04003463 // Fails on Win10 FYI x64 Release (AMD RX 550). http://anglebug.com/3760
3464 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
3465
Jamie Madillb8149072019-04-30 16:14:44 -04003466 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003467
3468 setUpProgram();
3469
3470 uploadTexture();
3471
3472 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3473 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3474 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3475 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3476
3477 constexpr GLint borderColor[4] = {-50, -50, -50, -50};
3478 glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3479
3480 EXPECT_GL_NO_ERROR();
3481
3482 drawQuad(mProgram, "position", 0.5f);
3483
3484 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3485 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3486 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3487}
3488
3489// Test if the integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the
3490// integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIivOES).
3491TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampInteger2)
3492{
Yuly Novikov1dbbc7b2019-07-31 17:49:39 -04003493 // Fails on Win10 FYI x64 Release (AMD RX 550). http://anglebug.com/3760
3494 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
3495
Jamie Madillb8149072019-04-30 16:14:44 -04003496 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003497
3498 setUpProgram();
3499
3500 uploadTexture();
3501
3502 GLSampler sampler;
3503 glBindSampler(0, sampler);
3504 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3505 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3506 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3507 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3508
3509 constexpr GLint borderColor[4] = {-50, -50, -50, -50};
3510 glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, borderColor);
3511
3512 EXPECT_GL_NO_ERROR();
3513
3514 drawQuad(mProgram, "position", 0.5f);
3515
3516 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3517 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3518 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3519}
3520
3521// Test if the unsigned integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside
3522// of the unsigned integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIuivOES).
3523TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampIntegerUnsigned)
3524{
Jamie Madillb8149072019-04-30 16:14:44 -04003525 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003526
3527 isUnsignedIntTest = true;
3528
3529 setUpProgram();
3530
3531 uploadTexture();
3532
3533 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3534 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3535 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3536 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3537
3538 constexpr GLuint borderColor[4] = {150, 150, 150, 150};
3539 glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3540
3541 EXPECT_GL_NO_ERROR();
3542
3543 drawQuad(mProgram, "position", 0.5f);
3544
3545 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3546 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3547 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3548}
3549
3550// Test if the unsigned integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside
3551// of the unsigned integer texture in GL_CLAMP_TO_BORDER wrap mode (set with
3552// glSamplerParameterIuivOES).
3553TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampIntegerUnsigned2)
3554{
Jamie Madillb8149072019-04-30 16:14:44 -04003555 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
Till Rathmannb8543632018-10-02 19:46:14 +02003556
3557 isUnsignedIntTest = true;
3558
3559 setUpProgram();
3560
3561 uploadTexture();
3562
3563 GLSampler sampler;
3564 glBindSampler(0, sampler);
3565 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
3566 glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
3567 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3568 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3569
3570 constexpr GLuint borderColor[4] = {150, 150, 150, 150};
3571 glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, borderColor);
3572
3573 EXPECT_GL_NO_ERROR();
3574
3575 drawQuad(mProgram, "position", 0.5f);
3576
3577 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3578 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3579 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
3580}
3581
3582// ~GL_OES_texture_border_clamp
3583
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003584class TextureLimitsTest : public ANGLETest
3585{
3586 protected:
3587 struct RGBA8
3588 {
3589 uint8_t R, G, B, A;
3590 };
3591
3592 TextureLimitsTest()
3593 : mProgram(0), mMaxVertexTextures(0), mMaxFragmentTextures(0), mMaxCombinedTextures(0)
3594 {
3595 setWindowWidth(128);
3596 setWindowHeight(128);
3597 setConfigRedBits(8);
3598 setConfigGreenBits(8);
3599 setConfigBlueBits(8);
3600 setConfigAlphaBits(8);
3601 }
3602
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003603 void testSetUp() override
Jamie Madill0fdb9562018-09-17 17:18:43 -04003604 {
Jamie Madill0fdb9562018-09-17 17:18:43 -04003605 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &mMaxVertexTextures);
3606 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mMaxFragmentTextures);
3607 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mMaxCombinedTextures);
3608
3609 ASSERT_GL_NO_ERROR();
3610 }
3611
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003612 void testTearDown() override
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003613 {
3614 if (mProgram != 0)
3615 {
3616 glDeleteProgram(mProgram);
3617 mProgram = 0;
3618
3619 if (!mTextures.empty())
3620 {
3621 glDeleteTextures(static_cast<GLsizei>(mTextures.size()), &mTextures[0]);
3622 }
3623 }
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003624 }
3625
3626 void compileProgramWithTextureCounts(const std::string &vertexPrefix,
3627 GLint vertexTextureCount,
3628 GLint vertexActiveTextureCount,
3629 const std::string &fragPrefix,
3630 GLint fragmentTextureCount,
3631 GLint fragmentActiveTextureCount)
3632 {
3633 std::stringstream vertexShaderStr;
3634 vertexShaderStr << "attribute vec2 position;\n"
3635 << "varying vec4 color;\n"
3636 << "varying vec2 texCoord;\n";
3637
3638 for (GLint textureIndex = 0; textureIndex < vertexTextureCount; ++textureIndex)
3639 {
3640 vertexShaderStr << "uniform sampler2D " << vertexPrefix << textureIndex << ";\n";
3641 }
3642
3643 vertexShaderStr << "void main() {\n"
3644 << " gl_Position = vec4(position, 0, 1);\n"
3645 << " texCoord = (position * 0.5) + 0.5;\n"
3646 << " color = vec4(0);\n";
3647
3648 for (GLint textureIndex = 0; textureIndex < vertexActiveTextureCount; ++textureIndex)
3649 {
3650 vertexShaderStr << " color += texture2D(" << vertexPrefix << textureIndex
3651 << ", texCoord);\n";
3652 }
3653
3654 vertexShaderStr << "}";
3655
3656 std::stringstream fragmentShaderStr;
3657 fragmentShaderStr << "varying mediump vec4 color;\n"
3658 << "varying mediump vec2 texCoord;\n";
3659
3660 for (GLint textureIndex = 0; textureIndex < fragmentTextureCount; ++textureIndex)
3661 {
3662 fragmentShaderStr << "uniform sampler2D " << fragPrefix << textureIndex << ";\n";
3663 }
3664
3665 fragmentShaderStr << "void main() {\n"
3666 << " gl_FragColor = color;\n";
3667
3668 for (GLint textureIndex = 0; textureIndex < fragmentActiveTextureCount; ++textureIndex)
3669 {
3670 fragmentShaderStr << " gl_FragColor += texture2D(" << fragPrefix << textureIndex
3671 << ", texCoord);\n";
3672 }
3673
3674 fragmentShaderStr << "}";
3675
3676 const std::string &vertexShaderSource = vertexShaderStr.str();
3677 const std::string &fragmentShaderSource = fragmentShaderStr.str();
3678
Jamie Madill35cd7332018-12-02 12:03:33 -05003679 mProgram = CompileProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str());
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003680 }
3681
3682 RGBA8 getPixel(GLint texIndex)
3683 {
3684 RGBA8 pixel = {static_cast<uint8_t>(texIndex & 0x7u), static_cast<uint8_t>(texIndex >> 3),
3685 0, 255u};
3686 return pixel;
3687 }
3688
3689 void initTextures(GLint tex2DCount, GLint texCubeCount)
3690 {
3691 GLint totalCount = tex2DCount + texCubeCount;
3692 mTextures.assign(totalCount, 0);
3693 glGenTextures(totalCount, &mTextures[0]);
3694 ASSERT_GL_NO_ERROR();
3695
3696 std::vector<RGBA8> texData(16 * 16);
3697
3698 GLint texIndex = 0;
3699 for (; texIndex < tex2DCount; ++texIndex)
3700 {
3701 texData.assign(texData.size(), getPixel(texIndex));
3702 glActiveTexture(GL_TEXTURE0 + texIndex);
3703 glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]);
3704 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3705 &texData[0]);
3706 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3707 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3708 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3709 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3710 }
3711
3712 ASSERT_GL_NO_ERROR();
3713
3714 for (; texIndex < texCubeCount; ++texIndex)
3715 {
3716 texData.assign(texData.size(), getPixel(texIndex));
3717 glActiveTexture(GL_TEXTURE0 + texIndex);
3718 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[texIndex]);
3719 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3720 GL_UNSIGNED_BYTE, &texData[0]);
3721 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3722 GL_UNSIGNED_BYTE, &texData[0]);
3723 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3724 GL_UNSIGNED_BYTE, &texData[0]);
3725 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3726 GL_UNSIGNED_BYTE, &texData[0]);
3727 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3728 GL_UNSIGNED_BYTE, &texData[0]);
3729 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
3730 GL_UNSIGNED_BYTE, &texData[0]);
3731 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3732 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3733 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3734 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3735 }
3736
3737 ASSERT_GL_NO_ERROR();
3738 }
3739
3740 void testWithTextures(GLint vertexTextureCount,
3741 const std::string &vertexTexturePrefix,
3742 GLint fragmentTextureCount,
3743 const std::string &fragmentTexturePrefix)
3744 {
3745 // Generate textures
3746 initTextures(vertexTextureCount + fragmentTextureCount, 0);
3747
3748 glUseProgram(mProgram);
3749 RGBA8 expectedSum = {0};
3750 for (GLint texIndex = 0; texIndex < vertexTextureCount; ++texIndex)
3751 {
3752 std::stringstream uniformNameStr;
3753 uniformNameStr << vertexTexturePrefix << texIndex;
3754 const std::string &uniformName = uniformNameStr.str();
Jamie Madill50cf2be2018-06-15 09:46:57 -04003755 GLint location = glGetUniformLocation(mProgram, uniformName.c_str());
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003756 ASSERT_NE(-1, location);
3757
3758 glUniform1i(location, texIndex);
3759 RGBA8 contribution = getPixel(texIndex);
3760 expectedSum.R += contribution.R;
3761 expectedSum.G += contribution.G;
3762 }
3763
3764 for (GLint texIndex = 0; texIndex < fragmentTextureCount; ++texIndex)
3765 {
3766 std::stringstream uniformNameStr;
3767 uniformNameStr << fragmentTexturePrefix << texIndex;
3768 const std::string &uniformName = uniformNameStr.str();
Jamie Madill50cf2be2018-06-15 09:46:57 -04003769 GLint location = glGetUniformLocation(mProgram, uniformName.c_str());
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003770 ASSERT_NE(-1, location);
3771
3772 glUniform1i(location, texIndex + vertexTextureCount);
3773 RGBA8 contribution = getPixel(texIndex + vertexTextureCount);
3774 expectedSum.R += contribution.R;
3775 expectedSum.G += contribution.G;
3776 }
3777
3778 ASSERT_GE(256u, expectedSum.G);
3779
3780 drawQuad(mProgram, "position", 0.5f);
3781 ASSERT_GL_NO_ERROR();
3782 EXPECT_PIXEL_EQ(0, 0, expectedSum.R, expectedSum.G, 0, 255);
3783 }
3784
3785 GLuint mProgram;
3786 std::vector<GLuint> mTextures;
3787 GLint mMaxVertexTextures;
3788 GLint mMaxFragmentTextures;
3789 GLint mMaxCombinedTextures;
3790};
3791
3792// Test rendering with the maximum vertex texture units.
3793TEST_P(TextureLimitsTest, MaxVertexTextures)
3794{
3795 compileProgramWithTextureCounts("tex", mMaxVertexTextures, mMaxVertexTextures, "tex", 0, 0);
3796 ASSERT_NE(0u, mProgram);
3797 ASSERT_GL_NO_ERROR();
3798
3799 testWithTextures(mMaxVertexTextures, "tex", 0, "tex");
3800}
3801
3802// Test rendering with the maximum fragment texture units.
3803TEST_P(TextureLimitsTest, MaxFragmentTextures)
3804{
3805 compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures, mMaxFragmentTextures);
3806 ASSERT_NE(0u, mProgram);
3807 ASSERT_GL_NO_ERROR();
3808
3809 testWithTextures(mMaxFragmentTextures, "tex", 0, "tex");
3810}
3811
3812// Test rendering with maximum combined texture units.
3813TEST_P(TextureLimitsTest, MaxCombinedTextures)
3814{
3815 GLint vertexTextures = mMaxVertexTextures;
3816
3817 if (vertexTextures + mMaxFragmentTextures > mMaxCombinedTextures)
3818 {
3819 vertexTextures = mMaxCombinedTextures - mMaxFragmentTextures;
3820 }
3821
3822 compileProgramWithTextureCounts("vtex", vertexTextures, vertexTextures, "ftex",
3823 mMaxFragmentTextures, mMaxFragmentTextures);
3824 ASSERT_NE(0u, mProgram);
3825 ASSERT_GL_NO_ERROR();
3826
3827 testWithTextures(vertexTextures, "vtex", mMaxFragmentTextures, "ftex");
3828}
3829
3830// Negative test for exceeding the number of vertex textures
3831TEST_P(TextureLimitsTest, ExcessiveVertexTextures)
3832{
3833 compileProgramWithTextureCounts("tex", mMaxVertexTextures + 1, mMaxVertexTextures + 1, "tex", 0,
3834 0);
3835 ASSERT_EQ(0u, mProgram);
3836}
3837
3838// Negative test for exceeding the number of fragment textures
3839TEST_P(TextureLimitsTest, ExcessiveFragmentTextures)
3840{
3841 compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 1,
3842 mMaxFragmentTextures + 1);
3843 ASSERT_EQ(0u, mProgram);
3844}
3845
3846// Test active vertex textures under the limit, but excessive textures specified.
3847TEST_P(TextureLimitsTest, MaxActiveVertexTextures)
3848{
3849 compileProgramWithTextureCounts("tex", mMaxVertexTextures + 4, mMaxVertexTextures, "tex", 0, 0);
3850 ASSERT_NE(0u, mProgram);
3851 ASSERT_GL_NO_ERROR();
3852
3853 testWithTextures(mMaxVertexTextures, "tex", 0, "tex");
3854}
3855
3856// Test active fragment textures under the limit, but excessive textures specified.
3857TEST_P(TextureLimitsTest, MaxActiveFragmentTextures)
3858{
3859 compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 4,
3860 mMaxFragmentTextures);
3861 ASSERT_NE(0u, mProgram);
3862 ASSERT_GL_NO_ERROR();
3863
3864 testWithTextures(0, "tex", mMaxFragmentTextures, "tex");
3865}
3866
3867// Negative test for pointing two sampler uniforms of different types to the same texture.
Olli Etuaho4a8329f2016-01-11 17:12:57 +02003868// GLES 2.0.25 section 2.10.4 page 39.
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003869TEST_P(TextureLimitsTest, TextureTypeConflict)
3870{
Jamie Madill35cd7332018-12-02 12:03:33 -05003871 constexpr char kVS[] =
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003872 "attribute vec2 position;\n"
3873 "varying float color;\n"
3874 "uniform sampler2D tex2D;\n"
3875 "uniform samplerCube texCube;\n"
3876 "void main() {\n"
3877 " gl_Position = vec4(position, 0, 1);\n"
3878 " vec2 texCoord = (position * 0.5) + 0.5;\n"
3879 " color = texture2D(tex2D, texCoord).x;\n"
3880 " color += textureCube(texCube, vec3(texCoord, 0)).x;\n"
3881 "}";
Jamie Madill35cd7332018-12-02 12:03:33 -05003882 constexpr char kFS[] =
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003883 "varying mediump float color;\n"
3884 "void main() {\n"
3885 " gl_FragColor = vec4(color, 0, 0, 1);\n"
3886 "}";
3887
Jamie Madill35cd7332018-12-02 12:03:33 -05003888 mProgram = CompileProgram(kVS, kFS);
Jamie Madill3d3d2f22015-09-23 16:47:51 -04003889 ASSERT_NE(0u, mProgram);
3890
3891 initTextures(1, 0);
3892
3893 glUseProgram(mProgram);
3894 GLint tex2DLocation = glGetUniformLocation(mProgram, "tex2D");
3895 ASSERT_NE(-1, tex2DLocation);
3896 GLint texCubeLocation = glGetUniformLocation(mProgram, "texCube");
3897 ASSERT_NE(-1, texCubeLocation);
3898
3899 glUniform1i(tex2DLocation, 0);
3900 glUniform1i(texCubeLocation, 0);
3901 ASSERT_GL_NO_ERROR();
3902
3903 drawQuad(mProgram, "position", 0.5f);
3904 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
3905}
3906
Vincent Lang25ab4512016-05-13 18:13:59 +02003907class Texture2DNorm16TestES3 : public Texture2DTestES3
3908{
3909 protected:
3910 Texture2DNorm16TestES3() : Texture2DTestES3(), mTextures{0, 0, 0}, mFBO(0), mRenderbuffer(0) {}
3911
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003912 void testSetUp() override
Vincent Lang25ab4512016-05-13 18:13:59 +02003913 {
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003914 Texture2DTestES3::testSetUp();
Vincent Lang25ab4512016-05-13 18:13:59 +02003915
3916 glActiveTexture(GL_TEXTURE0);
3917 glGenTextures(3, mTextures);
3918 glGenFramebuffers(1, &mFBO);
3919 glGenRenderbuffers(1, &mRenderbuffer);
3920
3921 for (size_t textureIndex = 0; textureIndex < 3; textureIndex++)
3922 {
3923 glBindTexture(GL_TEXTURE_2D, mTextures[textureIndex]);
3924 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3925 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3926 }
3927
3928 glBindTexture(GL_TEXTURE_2D, 0);
3929
3930 ASSERT_GL_NO_ERROR();
3931 }
3932
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003933 void testTearDown() override
Vincent Lang25ab4512016-05-13 18:13:59 +02003934 {
3935 glDeleteTextures(3, mTextures);
3936 glDeleteFramebuffers(1, &mFBO);
3937 glDeleteRenderbuffers(1, &mRenderbuffer);
3938
Jamie Madill5cbaa3f2019-05-07 15:49:22 -04003939 Texture2DTestES3::testTearDown();
Vincent Lang25ab4512016-05-13 18:13:59 +02003940 }
3941
3942 void testNorm16Texture(GLint internalformat, GLenum format, GLenum type)
3943 {
Geoff Langf607c602016-09-21 11:46:48 -04003944 GLushort pixelValue = (type == GL_SHORT) ? 0x7FFF : 0x6A35;
3945 GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue};
Vincent Lang25ab4512016-05-13 18:13:59 +02003946
3947 setUpProgram();
3948
3949 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
3950 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0],
3951 0);
3952
3953 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3954 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16_EXT, 1, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT, nullptr);
3955
3956 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
Geoff Langf607c602016-09-21 11:46:48 -04003957 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
Vincent Lang25ab4512016-05-13 18:13:59 +02003958
3959 EXPECT_GL_NO_ERROR();
3960
3961 drawQuad(mProgram, "position", 0.5f);
3962
Geoff Langf607c602016-09-21 11:46:48 -04003963 GLubyte expectedValue = (type == GL_SHORT) ? 0xFF : static_cast<GLubyte>(pixelValue >> 8);
Vincent Lang25ab4512016-05-13 18:13:59 +02003964
Jamie Madill50cf2be2018-06-15 09:46:57 -04003965 EXPECT_PIXEL_COLOR_EQ(0, 0,
3966 SliceFormatColor(format, GLColor(expectedValue, expectedValue,
3967 expectedValue, expectedValue)));
Vincent Lang25ab4512016-05-13 18:13:59 +02003968
3969 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3970
3971 ASSERT_GL_NO_ERROR();
3972 }
3973
3974 void testNorm16Render(GLint internalformat, GLenum format, GLenum type)
3975 {
Jamie Madill50cf2be2018-06-15 09:46:57 -04003976 GLushort pixelValue = 0x6A35;
Geoff Langf607c602016-09-21 11:46:48 -04003977 GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue};
Vincent Lang25ab4512016-05-13 18:13:59 +02003978
3979 setUpProgram();
3980
3981 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3982 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, nullptr);
3983
3984 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
3985 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
3986 0);
3987
3988 glBindTexture(GL_TEXTURE_2D, mTextures[2]);
Geoff Langf607c602016-09-21 11:46:48 -04003989 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
Vincent Lang25ab4512016-05-13 18:13:59 +02003990
3991 EXPECT_GL_NO_ERROR();
3992
3993 drawQuad(mProgram, "position", 0.5f);
3994
Geoff Langf607c602016-09-21 11:46:48 -04003995 GLubyte expectedValue = static_cast<GLubyte>(pixelValue >> 8);
Jamie Madill50cf2be2018-06-15 09:46:57 -04003996 EXPECT_PIXEL_COLOR_EQ(0, 0,
3997 SliceFormatColor(format, GLColor(expectedValue, expectedValue,
3998 expectedValue, expectedValue)));
Vincent Lang25ab4512016-05-13 18:13:59 +02003999
4000 glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
4001 glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
4002 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
4003 mRenderbuffer);
4004 glBindRenderbuffer(GL_RENDERBUFFER, 0);
4005 EXPECT_GL_NO_ERROR();
4006
4007 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
4008 glClear(GL_COLOR_BUFFER_BIT);
4009
4010 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
4011
Geoff Langf607c602016-09-21 11:46:48 -04004012 EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor::white));
Vincent Lang25ab4512016-05-13 18:13:59 +02004013
4014 glBindFramebuffer(GL_FRAMEBUFFER, 0);
4015
4016 ASSERT_GL_NO_ERROR();
4017 }
4018
4019 GLuint mTextures[3];
4020 GLuint mFBO;
4021 GLuint mRenderbuffer;
4022};
4023
4024// Test texture formats enabled by the GL_EXT_texture_norm16 extension.
4025TEST_P(Texture2DNorm16TestES3, TextureNorm16Test)
4026{
Jamie Madillb8149072019-04-30 16:14:44 -04004027 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
Vincent Lang25ab4512016-05-13 18:13:59 +02004028
4029 testNorm16Texture(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
4030 testNorm16Texture(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
4031 testNorm16Texture(GL_RGB16_EXT, GL_RGB, GL_UNSIGNED_SHORT);
4032 testNorm16Texture(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
4033 testNorm16Texture(GL_R16_SNORM_EXT, GL_RED, GL_SHORT);
4034 testNorm16Texture(GL_RG16_SNORM_EXT, GL_RG, GL_SHORT);
4035 testNorm16Texture(GL_RGB16_SNORM_EXT, GL_RGB, GL_SHORT);
4036 testNorm16Texture(GL_RGBA16_SNORM_EXT, GL_RGBA, GL_SHORT);
4037
4038 testNorm16Render(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
4039 testNorm16Render(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
4040 testNorm16Render(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
4041}
4042
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004043class Texture2DRGTest : public Texture2DTest
4044{
4045 protected:
4046 Texture2DRGTest()
4047 : Texture2DTest(), mRenderableTexture(0), mTestTexture(0), mFBO(0), mRenderbuffer(0)
4048 {}
4049
4050 void testSetUp() override
4051 {
4052 Texture2DTest::testSetUp();
4053
4054 glActiveTexture(GL_TEXTURE0);
4055 glGenTextures(1, &mRenderableTexture);
4056 glGenTextures(1, &mTestTexture);
4057 glGenFramebuffers(1, &mFBO);
4058 glGenRenderbuffers(1, &mRenderbuffer);
4059
4060 glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
Mohan Maiya6caa2652019-09-11 08:06:13 -07004061 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4062 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004063 glBindTexture(GL_TEXTURE_2D, mTestTexture);
Mohan Maiya6caa2652019-09-11 08:06:13 -07004064 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4065 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004066
4067 glBindTexture(GL_TEXTURE_2D, 0);
4068
4069 setUpProgram();
4070 glUseProgram(mProgram);
4071 glUniform1i(mTexture2DUniformLocation, 0);
4072
4073 ASSERT_GL_NO_ERROR();
4074 }
4075
4076 void testTearDown() override
4077 {
4078 glDeleteTextures(1, &mRenderableTexture);
4079 glDeleteTextures(1, &mTestTexture);
4080 glDeleteFramebuffers(1, &mFBO);
4081 glDeleteRenderbuffers(1, &mRenderbuffer);
4082
4083 Texture2DTest::testTearDown();
4084 }
4085
4086 void setupFormatTextures(GLenum internalformat, GLenum format, GLenum type, GLvoid *imageData)
4087 {
4088 glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
4089 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4090
4091 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4092 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
4093 mRenderableTexture, 0);
4094
4095 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4096 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
4097
4098 EXPECT_GL_NO_ERROR();
4099 }
4100
4101 void testRGTexture(GLColor expectedColor)
4102 {
4103 drawQuad(mProgram, "position", 0.5f);
4104
4105 EXPECT_GL_NO_ERROR();
4106 EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, kPixelTolerance);
4107 }
4108
4109 void testRGRender(GLenum internalformat, GLenum format)
4110 {
4111 glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
4112 glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
4113 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
4114 mRenderbuffer);
4115 glBindRenderbuffer(GL_RENDERBUFFER, 0);
4116 EXPECT_GL_NO_ERROR();
4117
4118 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
4119 glClear(GL_COLOR_BUFFER_BIT);
4120
4121 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
4122
4123 ASSERT_GL_NO_ERROR();
4124 EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor(255u, 255u, 255u, 255u)));
4125 }
4126
4127 GLuint mRenderableTexture;
4128 GLuint mTestTexture;
4129 GLuint mFBO;
4130 GLuint mRenderbuffer;
4131};
4132
4133// Test unorm texture formats enabled by the GL_EXT_texture_rg extension.
4134TEST_P(Texture2DRGTest, TextureRGUNormTest)
4135{
4136 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
4137
4138 GLubyte pixelValue = 0xab;
4139 GLubyte imageData[] = {pixelValue, pixelValue};
4140
4141 setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_UNSIGNED_BYTE, imageData);
4142 testRGTexture(
4143 SliceFormatColor(GL_RED_EXT, GLColor(pixelValue, pixelValue, pixelValue, pixelValue)));
4144 testRGRender(GL_R8_EXT, GL_RED_EXT);
4145
4146 setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_UNSIGNED_BYTE, imageData);
4147 testRGTexture(
4148 SliceFormatColor(GL_RG_EXT, GLColor(pixelValue, pixelValue, pixelValue, pixelValue)));
4149 testRGRender(GL_RG8_EXT, GL_RG_EXT);
4150}
4151
4152// Test float texture formats enabled by the GL_EXT_texture_rg extension.
4153TEST_P(Texture2DRGTest, TextureRGFloatTest)
4154{
4155 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
4156 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4157
4158 GLfloat pixelValue = 0.54321;
4159 GLfloat imageData[] = {pixelValue, pixelValue};
4160
4161 GLubyte expectedValue = static_cast<GLubyte>(pixelValue * 255.0f);
4162 GLColor expectedColor = GLColor(expectedValue, expectedValue, expectedValue, expectedValue);
4163
4164 setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_FLOAT, imageData);
4165 testRGTexture(SliceFormatColor(GL_RED_EXT, expectedColor));
4166
4167 setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_FLOAT, imageData);
4168 testRGTexture(SliceFormatColor(GL_RG_EXT, expectedColor));
4169}
4170
4171// Test half-float texture formats enabled by the GL_EXT_texture_rg extension.
Mohan Maiya6caa2652019-09-11 08:06:13 -07004172TEST_P(Texture2DRGTest, TextureRGHalfFloatTest)
Mohan Maiya8f1169e2019-06-27 15:32:32 -07004173{
4174 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
4175 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4176
4177 GLfloat pixelValueFloat = 0.543f;
4178 GLhalf pixelValue = 0x3858;
4179 GLhalf imageData[] = {pixelValue, pixelValue};
4180
4181 GLubyte expectedValue = static_cast<GLubyte>(pixelValueFloat * 255.0f);
4182 GLColor expectedColor = GLColor(expectedValue, expectedValue, expectedValue, expectedValue);
4183
4184 setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES, imageData);
4185 testRGTexture(SliceFormatColor(GL_RED_EXT, expectedColor));
4186
4187 setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_HALF_FLOAT_OES, imageData);
4188 testRGTexture(SliceFormatColor(GL_RG_EXT, expectedColor));
4189}
4190
Mohan Maiya6caa2652019-09-11 08:06:13 -07004191class Texture2DFloatTest : public Texture2DTest
4192{
4193 protected:
4194 Texture2DFloatTest()
4195 : Texture2DTest(), mRenderableTexture(0), mTestTexture(0), mFBO(0), mRenderbuffer(0)
4196 {}
4197
4198 void testSetUp() override
4199 {
4200 Texture2DTest::testSetUp();
4201
4202 glActiveTexture(GL_TEXTURE0);
4203 glGenTextures(1, &mRenderableTexture);
4204 glGenTextures(1, &mTestTexture);
4205 glGenFramebuffers(1, &mFBO);
4206 glGenRenderbuffers(1, &mRenderbuffer);
4207
4208 setUpProgram();
4209 glUseProgram(mProgram);
4210 glUniform1i(mTexture2DUniformLocation, 0);
4211
4212 glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
4213 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4214
4215 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4216 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
4217 mRenderableTexture, 0);
4218
4219 ASSERT_GL_NO_ERROR();
4220 }
4221
4222 void testTearDown() override
4223 {
4224 glDeleteTextures(1, &mRenderableTexture);
4225 glDeleteTextures(1, &mTestTexture);
4226 glDeleteFramebuffers(1, &mFBO);
4227 glDeleteRenderbuffers(1, &mRenderbuffer);
4228
4229 Texture2DTest::testTearDown();
4230 }
4231
4232 void testFloatTextureSample(GLenum internalFormat, GLenum format, GLenum type)
4233 {
4234 constexpr GLfloat imageDataFloat[] = {
4235 0.2f,
4236 0.3f,
4237 0.4f,
4238 0.5f,
4239 };
4240 constexpr GLhalf imageDataHalf[] = {
4241 0x3266,
4242 0x34CD,
4243 0x3666,
4244 0x3800,
4245 };
4246 GLColor expectedValue;
4247 for (int i = 0; i < 4; i++)
4248 {
4249 expectedValue[i] = static_cast<GLubyte>(imageDataFloat[i] * 255.0f);
4250 }
4251
4252 const GLvoid *imageData;
4253 switch (type)
4254 {
4255 case GL_FLOAT:
4256 imageData = imageDataFloat;
4257 break;
4258 case GL_HALF_FLOAT:
4259 case GL_HALF_FLOAT_OES:
4260 imageData = imageDataHalf;
4261 break;
4262 default:
4263 imageData = nullptr;
4264 }
4265 ASSERT(imageData != nullptr);
4266
4267 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4268 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, imageData);
4269
4270 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4271 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4272
4273 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4274 drawQuad(mProgram, "position", 0.5f);
4275
4276 EXPECT_GL_NO_ERROR();
4277 EXPECT_PIXEL_COLOR_NEAR(0, 0, SliceFormatColor(format, expectedValue), kPixelTolerance);
4278 }
4279
4280 void testFloatTextureLinear(GLenum internalFormat, GLenum format, GLenum type)
4281 {
4282 int numComponents;
4283 switch (format)
4284 {
4285 case GL_RGBA:
4286 numComponents = 4;
4287 break;
4288 case GL_RGB:
4289 numComponents = 3;
4290 break;
4291 case GL_LUMINANCE_ALPHA:
4292 numComponents = 2;
4293 break;
4294 case GL_LUMINANCE:
4295 case GL_ALPHA:
4296 numComponents = 1;
4297 break;
4298 default:
4299 numComponents = 0;
4300 }
4301 ASSERT(numComponents > 0);
4302
4303 constexpr GLfloat pixelIntensitiesFloat[] = {0.0f, 1.0f, 0.0f, 1.0f};
4304 constexpr GLhalf pixelIntensitiesHalf[] = {0x0000, 0x3C00, 0x0000, 0x3C00};
4305
4306 GLfloat imageDataFloat[16];
4307 GLhalf imageDataHalf[16];
4308 for (int i = 0; i < 4; i++)
4309 {
4310 for (int c = 0; c < numComponents; c++)
4311 {
4312 imageDataFloat[i * numComponents + c] = pixelIntensitiesFloat[i];
4313 imageDataHalf[i * numComponents + c] = pixelIntensitiesHalf[i];
4314 }
4315 }
4316
4317 const GLvoid *imageData;
4318 switch (type)
4319 {
4320 case GL_FLOAT:
4321 imageData = imageDataFloat;
4322 break;
4323 case GL_HALF_FLOAT:
4324 case GL_HALF_FLOAT_OES:
4325 imageData = imageDataHalf;
4326 break;
4327 default:
4328 imageData = nullptr;
4329 }
4330 ASSERT(imageData != nullptr);
4331
4332 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4333 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 2, 2, 0, format, type, imageData);
4334
4335 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4336 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4337
4338 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4339 drawQuad(mProgram, "position", 0.5f);
4340
4341 EXPECT_GL_NO_ERROR();
4342 // Source texture contains 2 black pixels and 2 white pixels, we sample in the center so we
4343 // should expect the final value to be gray (halfway in-between)
4344 EXPECT_PIXEL_COLOR_NEAR(0, 0, SliceFormatColor(format, GLColor(127u, 127u, 127u, 127u)),
4345 kPixelTolerance);
4346 }
4347
4348 bool performFloatTextureRender(GLenum internalFormat,
4349 GLenum renderBufferFormat,
4350 GLenum format,
4351 GLenum type)
4352 {
4353 glBindTexture(GL_TEXTURE_2D, mTestTexture);
4354 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, nullptr);
4355 glBindTexture(GL_TEXTURE_2D, 0);
4356
4357 glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
4358 glRenderbufferStorage(GL_RENDERBUFFER, renderBufferFormat, 1, 1);
4359 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
4360 mRenderbuffer);
4361 glBindRenderbuffer(GL_RENDERBUFFER, 0);
4362 EXPECT_GL_NO_ERROR();
4363
4364 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
4365 {
4366 return false;
4367 }
4368
4369 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
4370
4371 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
4372 glClear(GL_COLOR_BUFFER_BIT);
4373
4374 EXPECT_GL_NO_ERROR();
4375 return true;
4376 }
4377
4378 GLuint mRenderableTexture;
4379 GLuint mTestTexture;
4380 GLuint mFBO;
4381 GLuint mRenderbuffer;
4382};
4383
4384class Texture2DFloatTestES3 : public Texture2DFloatTest
4385{
4386 protected:
4387 void testFloatTextureRender(GLenum internalFormat, GLenum format, GLenum type)
4388 {
4389 bool framebufferComplete =
4390 performFloatTextureRender(internalFormat, internalFormat, format, type);
4391 EXPECT_TRUE(framebufferComplete);
4392 EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
4393 SliceFormatColor32F(format, GLColor32F(1.0f, 1.0f, 1.0f, 1.0f)),
4394 kPixelTolerance32F);
4395 }
4396};
4397
4398class Texture2DFloatTestES2 : public Texture2DFloatTest
4399{
4400 protected:
4401 bool checkFloatTextureRender(GLenum renderBufferFormat, GLenum format, GLenum type)
4402 {
4403 bool framebufferComplete =
4404 performFloatTextureRender(format, renderBufferFormat, format, type);
4405
4406 if (!framebufferComplete)
4407 {
4408 return false;
4409 }
4410
4411 EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
4412 SliceFormatColor32F(format, GLColor32F(1.0f, 1.0f, 1.0f, 1.0f)),
4413 kPixelTolerance32F);
4414 return true;
4415 }
4416};
4417
4418// Test texture sampling for ES3 float texture formats
4419TEST_P(Texture2DFloatTestES3, TextureFloatSampleBasicTest)
4420{
4421 testFloatTextureSample(GL_RGBA32F, GL_RGBA, GL_FLOAT);
4422 testFloatTextureSample(GL_RGB32F, GL_RGB, GL_FLOAT);
4423}
4424
4425// Test texture sampling for ES2 float texture formats
4426TEST_P(Texture2DFloatTestES2, TextureFloatSampleBasicTest)
4427{
4428 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4429 testFloatTextureSample(GL_RGBA, GL_RGBA, GL_FLOAT);
4430 testFloatTextureSample(GL_RGB, GL_RGB, GL_FLOAT);
4431}
4432
4433// Test texture sampling for ES3 half float texture formats
4434TEST_P(Texture2DFloatTestES3, TextureHalfFloatSampleBasicTest)
4435{
4436 testFloatTextureSample(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
4437 testFloatTextureSample(GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
4438}
4439
4440// Test texture sampling for ES2 half float texture formats
4441TEST_P(Texture2DFloatTestES2, TextureHalfFloatSampleBasicTest)
4442{
4443 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4444 testFloatTextureSample(GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES);
4445 testFloatTextureSample(GL_RGB, GL_RGB, GL_HALF_FLOAT_OES);
4446}
4447
4448// Test texture sampling for legacy GLES 2.0 float texture formats in ES3
4449TEST_P(Texture2DFloatTestES3, TextureFloatSampleLegacyTest)
4450{
4451 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4452
4453 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4454 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4455 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4456
4457 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4458 {
4459 testFloatTextureSample(GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT);
4460 testFloatTextureSample(GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT);
4461 testFloatTextureSample(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT);
4462 }
4463}
4464
4465// Test texture sampling for legacy GLES 2.0 float texture formats in ES2
4466TEST_P(Texture2DFloatTestES2, TextureFloatSampleLegacyTest)
4467{
4468 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4469
4470 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4471 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4472 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4473}
4474
4475// Test texture sampling for legacy GLES 2.0 half float texture formats in ES3
4476TEST_P(Texture2DFloatTestES3, TextureHalfFloatSampleLegacyTest)
4477{
4478 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4479
4480 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4481 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4482 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4483
4484 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4485 {
4486 testFloatTextureSample(GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT);
4487 testFloatTextureSample(GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT);
4488 testFloatTextureSample(GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT);
4489 }
4490}
4491// Test texture sampling for legacy GLES 2.0 half float texture formats in ES2
4492TEST_P(Texture2DFloatTestES2, TextureHalfFloatSampleLegacyTest)
4493{
4494 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4495
4496 testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4497 testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4498 testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4499}
4500
4501// Test linear sampling for ES3 32F formats
4502TEST_P(Texture2DFloatTestES3, TextureFloatLinearTest)
4503{
4504 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4505
4506 testFloatTextureLinear(GL_RGBA32F, GL_RGBA, GL_FLOAT);
4507 testFloatTextureLinear(GL_RGB32F, GL_RGB, GL_FLOAT);
4508}
4509// Test linear sampling for ES2 32F formats
4510TEST_P(Texture2DFloatTestES2, TextureFloatLinearTest)
4511{
4512 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4513
4514 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4515
4516 testFloatTextureLinear(GL_RGBA, GL_RGBA, GL_FLOAT);
4517}
4518
4519// Test linear sampling for ES3 16F formats
4520TEST_P(Texture2DFloatTestES3, TextureHalfFloatLinearTest)
4521{
4522 // Half float formats must be linearly filterable in GLES 3.0 core
4523 testFloatTextureLinear(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
4524 testFloatTextureLinear(GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
4525}
4526// Test linear sampling for ES2 16F formats
4527TEST_P(Texture2DFloatTestES2, TextureHalfFloatLinearTest)
4528{
4529 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
4530 testFloatTextureLinear(GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES);
4531 testFloatTextureLinear(GL_RGB, GL_RGB, GL_HALF_FLOAT_OES);
4532}
4533
4534// Test linear sampling for legacy GLES 2.0 32F formats in ES3
4535TEST_P(Texture2DFloatTestES3, TextureFloatLinearLegacyTest)
4536{
4537 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4538 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4539
4540 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4541 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4542 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4543
4544 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4545 {
4546 testFloatTextureLinear(GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT);
4547 testFloatTextureLinear(GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT);
4548 testFloatTextureLinear(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT);
4549 }
4550}
4551// Test linear sampling for legacy GLES 2.0 32F formats in ES2
4552TEST_P(Texture2DFloatTestES2, TextureFloatLinearLegacyTest)
4553{
4554 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
4555 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
4556
4557 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
4558 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_FLOAT);
4559 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
4560}
4561
4562// Test linear sampling for legacy GLES 2.0 16F formats in ES3
4563TEST_P(Texture2DFloatTestES3, TextureHalfFloatLinearLegacyTest)
4564{
4565 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4566 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
4567
4568 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4569 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4570 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4571
4572 if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
4573 {
4574 testFloatTextureLinear(GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT);
4575 testFloatTextureLinear(GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT);
4576 testFloatTextureLinear(GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT);
4577 }
4578}
4579// Test linear sampling for legacy GLES 2.0 16F formats in ES2
4580TEST_P(Texture2DFloatTestES2, TextureHalfFloatLinearLegacyTest)
4581{
4582 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
4583 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
4584
4585 testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
4586 testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
4587 testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
4588}
4589
4590// Test color-renderability for ES3 float and half float textures
4591TEST_P(Texture2DFloatTestES3, TextureFloatRenderTest)
4592{
4593 // EXT_color_buffer_float covers float, half float, and 11-11-10 float formats
4594 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
4595
4596 testFloatTextureRender(GL_R32F, GL_RED, GL_FLOAT);
4597 testFloatTextureRender(GL_RG32F, GL_RG, GL_FLOAT);
4598 testFloatTextureRender(GL_RGBA32F, GL_RGBA, GL_FLOAT);
4599
4600 testFloatTextureRender(GL_R16F, GL_RED, GL_HALF_FLOAT);
4601 testFloatTextureRender(GL_RG16F, GL_RG, GL_HALF_FLOAT);
4602 testFloatTextureRender(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
4603
4604 testFloatTextureRender(GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT);
4605}
4606
4607// Test color-renderability for ES2 half float textures
4608TEST_P(Texture2DFloatTestES2, TextureFloatRenderTest)
4609{
4610 // EXT_color_buffer_half_float requires at least one format to be renderable, but does not
4611 // require a specific one
4612 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_half_float"));
4613
4614 bool atLeastOneSupported = false;
4615
4616 if (IsGLExtensionEnabled("GL_OES_texture_half_float") ||
4617 IsGLExtensionEnabled("GL_OES_texture_half_float"))
4618 {
4619 atLeastOneSupported |= checkFloatTextureRender(GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES);
4620 atLeastOneSupported |= checkFloatTextureRender(GL_RG16F_EXT, GL_RG_EXT, GL_HALF_FLOAT_OES);
4621 }
4622 if (IsGLExtensionEnabled("GL_OES_texture_half_float"))
4623 {
4624 atLeastOneSupported |= checkFloatTextureRender(GL_RGB16F_EXT, GL_RGB, GL_HALF_FLOAT_OES);
4625
4626 // If OES_texture_half_float is supported, then RGBA half float textures must be renderable
4627 bool rgbaSupported = checkFloatTextureRender(GL_RGBA16F_EXT, GL_RGBA, GL_HALF_FLOAT_OES);
4628 EXPECT_TRUE(rgbaSupported);
4629 atLeastOneSupported |= rgbaSupported;
4630 }
4631
4632 EXPECT_TRUE(atLeastOneSupported);
4633}
4634
Olli Etuaho95faa232016-06-07 14:01:53 -07004635// Test that UNPACK_SKIP_IMAGES doesn't have an effect on 2D texture uploads.
4636// GLES 3.0.4 section 3.8.3.
4637TEST_P(Texture2DTestES3, UnpackSkipImages2D)
4638{
Yuly Novikovd18c0482019-04-04 19:56:43 -04004639 // Crashes on Nexus 5X due to a driver bug. http://anglebug.com/1429
4640 ANGLE_SKIP_TEST_IF((IsNexus5X() || IsNexus6P()) && IsOpenGLES());
Olli Etuaho95faa232016-06-07 14:01:53 -07004641
4642 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4643 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4644 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4645 ASSERT_GL_NO_ERROR();
4646
4647 // SKIP_IMAGES should not have an effect on uploading 2D textures
4648 glPixelStorei(GL_UNPACK_SKIP_IMAGES, 1000);
4649 ASSERT_GL_NO_ERROR();
4650
4651 std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
4652
4653 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4654 pixelsGreen.data());
4655 ASSERT_GL_NO_ERROR();
4656
4657 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE,
4658 pixelsGreen.data());
4659 ASSERT_GL_NO_ERROR();
4660
4661 glUseProgram(mProgram);
4662 drawQuad(mProgram, "position", 0.5f);
4663 ASSERT_GL_NO_ERROR();
4664
4665 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4666}
4667
Olli Etuaho989cac32016-06-08 16:18:49 -07004668// Test that skip defined in unpack parameters is taken into account when determining whether
4669// unpacking source extends outside unpack buffer bounds.
4670TEST_P(Texture2DTestES3, UnpackSkipPixelsOutOfBounds)
4671{
4672 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4673 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4674 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4675 ASSERT_GL_NO_ERROR();
4676
4677 GLBuffer buf;
4678 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf.get());
4679 std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
4680 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
4681 GL_DYNAMIC_COPY);
4682 ASSERT_GL_NO_ERROR();
4683
4684 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4685 ASSERT_GL_NO_ERROR();
4686
4687 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 1);
4688 ASSERT_GL_NO_ERROR();
4689
4690 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4691 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
4692
4693 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
4694 glPixelStorei(GL_UNPACK_SKIP_ROWS, 1);
4695 ASSERT_GL_NO_ERROR();
4696
4697 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4698 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
4699}
4700
Olli Etuaho218cf9e2016-05-20 13:55:24 +03004701// Test that unpacking rows that overlap in a pixel unpack buffer works as expected.
4702TEST_P(Texture2DTestES3, UnpackOverlappingRowsFromUnpackBuffer)
4703{
Yunchao He9550c602018-02-13 14:47:05 +08004704 ANGLE_SKIP_TEST_IF(IsD3D11());
4705
4706 // Incorrect rendering results seen on OSX AMD.
4707 ANGLE_SKIP_TEST_IF(IsOSX() && IsAMD());
Olli Etuaho218cf9e2016-05-20 13:55:24 +03004708
4709 const GLuint width = 8u;
4710 const GLuint height = 8u;
4711 const GLuint unpackRowLength = 5u;
4712 const GLuint unpackSkipPixels = 1u;
4713
4714 setWindowWidth(width);
4715 setWindowHeight(height);
4716
4717 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4718 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4719 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4720 ASSERT_GL_NO_ERROR();
4721
4722 GLBuffer buf;
4723 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf.get());
4724 std::vector<GLColor> pixelsGreen((height - 1u) * unpackRowLength + width + unpackSkipPixels,
4725 GLColor::green);
4726
4727 for (GLuint skippedPixel = 0u; skippedPixel < unpackSkipPixels; ++skippedPixel)
4728 {
4729 pixelsGreen[skippedPixel] = GLColor(255, 0, 0, 255);
4730 }
4731
4732 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
4733 GL_DYNAMIC_COPY);
4734 ASSERT_GL_NO_ERROR();
4735
4736 glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength);
4737 glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackSkipPixels);
4738 ASSERT_GL_NO_ERROR();
4739
4740 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
4741 ASSERT_GL_NO_ERROR();
4742
4743 glUseProgram(mProgram);
4744 drawQuad(mProgram, "position", 0.5f);
4745 ASSERT_GL_NO_ERROR();
4746
4747 GLuint windowPixelCount = getWindowWidth() * getWindowHeight();
4748 std::vector<GLColor> actual(windowPixelCount, GLColor::black);
4749 glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
4750 actual.data());
4751 std::vector<GLColor> expected(windowPixelCount, GLColor::green);
4752 EXPECT_EQ(expected, actual);
4753}
4754
Jamie Madill9e3d7aa2016-09-02 15:19:43 -04004755template <typename T>
4756T UNorm(double value)
4757{
4758 return static_cast<T>(value * static_cast<double>(std::numeric_limits<T>::max()));
4759}
4760
4761// Test rendering a depth texture with mipmaps.
4762TEST_P(Texture2DTestES3, DepthTexturesWithMipmaps)
4763{
Zhenyao Moe520d7c2017-01-13 13:46:49 -08004764 // TODO(cwallez) this is failing on Intel Win7 OpenGL.
4765 // TODO(zmo) this is faling on Win Intel HD 530 Debug.
Jiawei Shaoaf0f31d2018-09-27 15:42:31 +08004766 // http://anglebug.com/1706
4767 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
Corentin Walleze731d8a2016-09-07 10:56:25 -04004768
Jamie Madill24980272019-04-03 09:03:51 -04004769 // Seems to fail on AMD D3D11. Possibly driver bug. http://anglebug.com/3342
4770 ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsD3D11());
4771
Jamie Madill9e3d7aa2016-09-02 15:19:43 -04004772 const int size = getWindowWidth();
4773
4774 auto dim = [size](int level) { return size >> level; };
Jamie Madill14718762016-09-06 15:56:54 -04004775 int levels = gl::log2(size);
Jamie Madill9e3d7aa2016-09-02 15:19:43 -04004776
4777 glActiveTexture(GL_TEXTURE0);
4778 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4779 glTexStorage2D(GL_TEXTURE_2D, levels, GL_DEPTH_COMPONENT24, size, size);
4780 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
4781 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4782 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4783 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4784 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
4785 ASSERT_GL_NO_ERROR();
4786
4787 glUseProgram(mProgram);
4788 glUniform1i(mTexture2DUniformLocation, 0);
4789
4790 std::vector<unsigned char> expected;
4791
4792 for (int level = 0; level < levels; ++level)
4793 {
4794 double value = (static_cast<double>(level) / static_cast<double>(levels - 1));
4795 expected.push_back(UNorm<unsigned char>(value));
4796
4797 int levelDim = dim(level);
4798
4799 ASSERT_GT(levelDim, 0);
4800
4801 std::vector<unsigned int> initData(levelDim * levelDim, UNorm<unsigned int>(value));
4802 glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, levelDim, levelDim, GL_DEPTH_COMPONENT,
4803 GL_UNSIGNED_INT, initData.data());
4804 }
4805 ASSERT_GL_NO_ERROR();
4806
4807 for (int level = 0; level < levels; ++level)
4808 {
4809 glViewport(0, 0, dim(level), dim(level));
4810 drawQuad(mProgram, "position", 0.5f);
4811 GLColor actual = ReadColor(0, 0);
4812 EXPECT_NEAR(expected[level], actual.R, 10u);
4813 }
4814
4815 ASSERT_GL_NO_ERROR();
4816}
4817
Courtney Goeltzenleuchter1f2782e2019-08-29 14:19:23 -06004818class Texture2DDepthTest : public Texture2DTest
4819{
4820 protected:
4821 Texture2DDepthTest() : Texture2DTest() {}
4822
4823 const char *getVertexShaderSource() override
4824 {
4825 return "attribute vec4 vPosition;\n"
4826 "void main() {\n"
4827 " gl_Position = vPosition;\n"
4828 "}\n";
4829 }
4830
4831 const char *getFragmentShaderSource() override
4832 {
4833 return "precision mediump float;\n"
4834 "uniform sampler2D ShadowMap;"
4835 "void main() {\n"
4836 " vec4 shadow_value = texture2D(ShadowMap, vec2(0.5, 0.5));"
4837 " if (shadow_value.x == shadow_value.z && shadow_value.x != 0.0) {"
4838 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
4839 " } else {"
4840 " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
4841 " }"
4842 "}\n";
4843 }
4844
4845 bool checkTexImageFormatSupport(GLenum format, GLenum internalformat, GLenum type)
4846 {
4847 EXPECT_GL_NO_ERROR();
4848
4849 GLTexture tex;
4850 glBindTexture(GL_TEXTURE_2D, tex);
4851 glTexImage2D(GL_TEXTURE_2D, 0, format, 1, 1, 0, format, type, nullptr);
4852
4853 return (glGetError() == GL_NO_ERROR);
4854 }
4855
4856 void testBehavior(bool useSizedComponent)
4857 {
4858 int w = getWindowWidth();
4859 int h = getWindowHeight();
4860 GLuint format = GL_DEPTH_COMPONENT;
4861 GLuint internalFormat = GL_DEPTH_COMPONENT;
4862
4863 if (useSizedComponent)
4864 {
4865 internalFormat = GL_DEPTH_COMPONENT24;
4866 }
4867
4868 GLFramebuffer fbo;
4869 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4870 ASSERT_GL_NO_ERROR();
4871
4872 GLTexture depthTexture;
4873 glBindTexture(GL_TEXTURE_2D, depthTexture);
4874 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4875 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4876 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4877 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4878
4879 TexCoordDrawTest::setUpProgram();
4880 GLint shadowMapLocation = glGetUniformLocation(mProgram, "ShadowMap");
4881 ASSERT_NE(-1, shadowMapLocation);
4882
4883 GLint positionLocation = glGetAttribLocation(mProgram, "vPosition");
4884 ASSERT_NE(-1, positionLocation);
4885
4886 ANGLE_SKIP_TEST_IF(!checkTexImageFormatSupport(format, internalFormat, GL_UNSIGNED_INT));
4887 glBindTexture(GL_TEXTURE_2D, depthTexture);
4888 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, w, h, 0, format, GL_UNSIGNED_INT, nullptr);
4889 ASSERT_GL_NO_ERROR();
4890
4891 // try adding a color buffer.
4892 GLuint colorTex = 0;
4893 glGenTextures(1, &colorTex);
4894 glBindTexture(GL_TEXTURE_2D, colorTex);
4895 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4896 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4897 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4898 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4899 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4900 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4901 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
4902 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4903 ASSERT_GL_NO_ERROR();
4904
4905 glViewport(0, 0, w, h);
4906 // Fill depthTexture with 0.75
4907 glClearDepthf(0.75);
4908 glClear(GL_DEPTH_BUFFER_BIT);
4909
4910 // Revert to normal framebuffer to test depth shader
4911 glBindFramebuffer(GL_FRAMEBUFFER, 0);
4912 glViewport(0, 0, w, h);
4913 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
4914 glClearDepthf(0.0f);
4915 ASSERT_GL_NO_ERROR();
4916
4917 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
4918 ASSERT_GL_NO_ERROR();
4919
4920 glActiveTexture(GL_TEXTURE0);
4921 glBindTexture(GL_TEXTURE_2D, depthTexture);
4922
4923 glUseProgram(mProgram);
4924 ASSERT_GL_NO_ERROR();
4925
4926 glUniform1i(shadowMapLocation, 0);
4927
4928 const GLfloat gTriangleVertices[] = {-0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f};
4929
4930 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices);
4931 ASSERT_GL_NO_ERROR();
4932 glEnableVertexAttribArray(positionLocation);
4933 ASSERT_GL_NO_ERROR();
4934 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
4935 ASSERT_GL_NO_ERROR();
4936
4937 GLuint pixels[1];
4938 glReadPixels(w / 2, h / 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
4939 ASSERT_GL_NO_ERROR();
4940
4941 // The GLES 3.x spec says that the depth texture sample can be found in the RED component.
4942 // However, the OES_depth_texture indicates that the depth value is treated as luminance and
4943 // is in all the color components. Multiple implementations implement a workaround that
4944 // follows the OES_depth_texture behavior if the internalformat given at glTexImage2D was a
4945 // unsized format (e.g. DEPTH_COMPONENT) and the GLES 3.x behavior if it was a sized
4946 // internalformat such as GL_DEPTH_COMPONENT24. The shader will write out a different color
4947 // depending on if it sees the texture sample in only the RED component.
4948 if (useSizedComponent)
4949 {
4950 ASSERT_NE(pixels[0], 0xff0000ff);
4951 }
4952 else
4953 {
4954 ASSERT_EQ(pixels[0], 0xff0000ff);
4955 }
4956
4957 glBindFramebuffer(GL_FRAMEBUFFER, 0);
4958 glDeleteProgram(mProgram);
4959 }
4960};
4961
4962// Test depth texture compatibility with OES_depth_texture. Uses unsized internformat.
4963TEST_P(Texture2DDepthTest, DepthTextureES2Compatibility)
4964{
4965 ANGLE_SKIP_TEST_IF(IsD3D11());
4966 ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
4967
4968 // When the depth texture is specified with unsized internalformat implementations follow
4969 // OES_depth_texture behavior. Otherwise they follow GLES 3.0 behavior.
4970 testBehavior(false);
4971}
4972
4973// Test depth texture compatibility with GLES3 using sized internalformat.
4974TEST_P(Texture2DDepthTest, DepthTextureES3Compatibility)
4975{
4976 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4977
4978 testBehavior(true);
4979}
4980
Jamie Madill7ffdda92016-09-08 13:26:51 -04004981// Tests unpacking into the unsized GL_ALPHA format.
4982TEST_P(Texture2DTestES3, UnsizedAlphaUnpackBuffer)
4983{
Jamie Madill7ffdda92016-09-08 13:26:51 -04004984 // Initialize the texure.
4985 glBindTexture(GL_TEXTURE_2D, mTexture2D);
4986 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, getWindowWidth(), getWindowHeight(), 0, GL_ALPHA,
4987 GL_UNSIGNED_BYTE, nullptr);
4988 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4989 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4990
4991 std::vector<GLubyte> bufferData(getWindowWidth() * getWindowHeight(), 127);
4992
4993 // Pull in the color data from the unpack buffer.
Jamie Madill2e600342016-09-19 13:56:40 -04004994 GLBuffer unpackBuffer;
Jamie Madill7ffdda92016-09-08 13:26:51 -04004995 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
4996 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer.get());
4997 glBufferData(GL_PIXEL_UNPACK_BUFFER, getWindowWidth() * getWindowHeight(), bufferData.data(),
4998 GL_STATIC_DRAW);
4999
5000 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth(), getWindowHeight(), GL_ALPHA,
5001 GL_UNSIGNED_BYTE, nullptr);
5002
5003 // Clear to a weird color to make sure we're drawing something.
5004 glClearColor(0.5f, 0.8f, 1.0f, 0.2f);
5005 glClear(GL_COLOR_BUFFER_BIT);
5006
5007 // Draw with the alpha texture and verify.
5008 drawQuad(mProgram, "position", 0.5f);
Jamie Madill7ffdda92016-09-08 13:26:51 -04005009
5010 ASSERT_GL_NO_ERROR();
5011 EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 127, 1);
5012}
5013
Jamie Madill2e600342016-09-19 13:56:40 -04005014// Ensure stale unpack data doesn't propagate in D3D11.
5015TEST_P(Texture2DTestES3, StaleUnpackData)
5016{
5017 // Init unpack buffer.
5018 GLsizei pixelCount = getWindowWidth() * getWindowHeight() / 2;
5019 std::vector<GLColor> pixels(pixelCount, GLColor::red);
5020
5021 GLBuffer unpackBuffer;
5022 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
5023 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer.get());
5024 GLsizei bufferSize = pixelCount * sizeof(GLColor);
5025 glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, pixels.data(), GL_STATIC_DRAW);
5026
5027 // Create from unpack buffer.
5028 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5029 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth() / 2, getWindowHeight() / 2, 0,
5030 GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5031 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5032 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5033
5034 drawQuad(mProgram, "position", 0.5f);
5035
5036 ASSERT_GL_NO_ERROR();
5037 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5038
5039 // Fill unpack with green, recreating buffer.
5040 pixels.assign(getWindowWidth() * getWindowHeight(), GLColor::green);
5041 GLsizei size2 = getWindowWidth() * getWindowHeight() * sizeof(GLColor);
5042 glBufferData(GL_PIXEL_UNPACK_BUFFER, size2, pixels.data(), GL_STATIC_DRAW);
5043
5044 // Reinit texture with green.
5045 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GL_RGBA,
5046 GL_UNSIGNED_BYTE, nullptr);
5047
5048 drawQuad(mProgram, "position", 0.5f);
5049
5050 ASSERT_GL_NO_ERROR();
5051 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5052}
5053
Geoff Langfb7685f2017-11-13 11:44:11 -05005054// Ensure that texture parameters passed as floats that are converted to ints are rounded before
5055// validating they are less than 0.
5056TEST_P(Texture2DTestES3, TextureBaseMaxLevelRoundingValidation)
5057{
5058 GLTexture texture;
5059 glBindTexture(GL_TEXTURE_2D, texture);
5060
5061 // Use a negative number that will round to zero when converted to an integer
5062 // According to the spec(2.3.1 Data Conversion For State - Setting Commands):
5063 // "Validation of values performed by state-setting commands is performed after conversion,
5064 // unless specified otherwise for a specific command."
5065 GLfloat param = -7.30157126e-07f;
5066 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, param);
5067 EXPECT_GL_NO_ERROR();
5068
5069 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, param);
5070 EXPECT_GL_NO_ERROR();
5071}
5072
Jamie Madillf097e232016-11-05 00:44:15 -04005073// This test covers a D3D format redefinition bug for 3D textures. The base level format was not
5074// being properly checked, and the texture storage of the previous texture format was persisting.
5075// This would result in an ASSERT in debug and incorrect rendering in release.
5076// See http://anglebug.com/1609 and WebGL 2 test conformance2/misc/views-with-offsets.html.
5077TEST_P(Texture3DTestES3, FormatRedefinitionBug)
5078{
5079 GLTexture tex;
5080 glBindTexture(GL_TEXTURE_3D, tex.get());
5081 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5082
5083 GLFramebuffer framebuffer;
5084 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
5085 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex.get(), 0, 0);
5086
5087 glCheckFramebufferStatus(GL_FRAMEBUFFER);
5088
5089 std::vector<uint8_t> pixelData(100, 0);
5090
5091 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB565, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, nullptr);
5092 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 1, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
5093 pixelData.data());
5094
5095 ASSERT_GL_NO_ERROR();
5096}
5097
Corentin Wallezd2627992017-04-28 17:17:03 -04005098// Test basic pixel unpack buffer OOB checks when uploading to a 2D or 3D texture
5099TEST_P(Texture3DTestES3, BasicUnpackBufferOOB)
5100{
5101 // 2D tests
5102 {
5103 GLTexture tex;
5104 glBindTexture(GL_TEXTURE_2D, tex.get());
5105
5106 GLBuffer pbo;
5107 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo.get());
5108
5109 // Test OOB
5110 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 - 1, nullptr, GL_STATIC_DRAW);
5111 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5112 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
5113
5114 // Test OOB
5115 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2, nullptr, GL_STATIC_DRAW);
5116 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5117 ASSERT_GL_NO_ERROR();
5118 }
5119
5120 // 3D tests
5121 {
5122 GLTexture tex;
5123 glBindTexture(GL_TEXTURE_3D, tex.get());
5124
5125 GLBuffer pbo;
5126 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo.get());
5127
5128 // Test OOB
5129 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 * 2 - 1, nullptr,
5130 GL_STATIC_DRAW);
5131 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5132 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
5133
5134 // Test OOB
5135 glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 * 2, nullptr, GL_STATIC_DRAW);
5136 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5137 ASSERT_GL_NO_ERROR();
5138 }
5139}
5140
Jamie Madill3ed60422017-09-07 11:32:52 -04005141// Tests behaviour with a single texture and multiple sampler objects.
5142TEST_P(Texture2DTestES3, SingleTextureMultipleSamplers)
5143{
5144 GLint maxTextureUnits = 0;
5145 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
5146 ANGLE_SKIP_TEST_IF(maxTextureUnits < 4);
5147
5148 constexpr int kSize = 16;
5149
5150 // Make a single-level texture, fill it with red.
5151 std::vector<GLColor> redColors(kSize * kSize, GLColor::red);
5152 GLTexture tex;
5153 glBindTexture(GL_TEXTURE_2D, tex);
5154 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5155 redColors.data());
5156 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5157 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5158
5159 // Simple sanity check.
5160 draw2DTexturedQuad(0.5f, 1.0f, true);
5161 ASSERT_GL_NO_ERROR();
5162 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5163
5164 // Bind texture to unit 1 with a sampler object making it incomplete.
5165 GLSampler sampler;
5166 glBindSampler(0, sampler);
5167 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5168 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5169
5170 // Make a mipmap texture, fill it with blue.
5171 std::vector<GLColor> blueColors(kSize * kSize, GLColor::blue);
5172 GLTexture mipmapTex;
5173 glBindTexture(GL_TEXTURE_2D, mipmapTex);
5174 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5175 blueColors.data());
5176 glGenerateMipmap(GL_TEXTURE_2D);
5177
5178 // Draw with the sampler, expect blue.
5179 draw2DTexturedQuad(0.5f, 1.0f, true);
5180 ASSERT_GL_NO_ERROR();
5181 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5182
5183 // Simple multitexturing program.
Jamie Madill35cd7332018-12-02 12:03:33 -05005184 constexpr char kVS[] =
Jamie Madill3ed60422017-09-07 11:32:52 -04005185 "#version 300 es\n"
5186 "in vec2 position;\n"
5187 "out vec2 texCoord;\n"
5188 "void main()\n"
5189 "{\n"
5190 " gl_Position = vec4(position, 0, 1);\n"
5191 " texCoord = position * 0.5 + vec2(0.5);\n"
5192 "}";
Jamie Madill35cd7332018-12-02 12:03:33 -05005193
5194 constexpr char kFS[] =
Jamie Madill3ed60422017-09-07 11:32:52 -04005195 "#version 300 es\n"
5196 "precision mediump float;\n"
5197 "in vec2 texCoord;\n"
5198 "uniform sampler2D tex1;\n"
5199 "uniform sampler2D tex2;\n"
5200 "uniform sampler2D tex3;\n"
5201 "uniform sampler2D tex4;\n"
5202 "out vec4 color;\n"
5203 "void main()\n"
5204 "{\n"
5205 " color = (texture(tex1, texCoord) + texture(tex2, texCoord) \n"
5206 " + texture(tex3, texCoord) + texture(tex4, texCoord)) * 0.25;\n"
5207 "}";
5208
Jamie Madill35cd7332018-12-02 12:03:33 -05005209 ANGLE_GL_PROGRAM(program, kVS, kFS);
Jamie Madill3ed60422017-09-07 11:32:52 -04005210
5211 std::array<GLint, 4> texLocations = {
5212 {glGetUniformLocation(program, "tex1"), glGetUniformLocation(program, "tex2"),
5213 glGetUniformLocation(program, "tex3"), glGetUniformLocation(program, "tex4")}};
5214 for (GLint location : texLocations)
5215 {
5216 ASSERT_NE(-1, location);
5217 }
5218
5219 // Init the uniform data.
5220 glUseProgram(program);
5221 for (GLint location = 0; location < 4; ++location)
5222 {
5223 glUniform1i(texLocations[location], location);
5224 }
5225
5226 // Initialize four samplers
5227 GLSampler samplers[4];
5228
5229 // 0: non-mipped.
5230 glBindSampler(0, samplers[0]);
5231 glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5232 glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5233
5234 // 1: mipped.
5235 glBindSampler(1, samplers[1]);
5236 glSamplerParameteri(samplers[1], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5237 glSamplerParameteri(samplers[1], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5238
5239 // 2: non-mipped.
5240 glBindSampler(2, samplers[2]);
5241 glSamplerParameteri(samplers[2], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5242 glSamplerParameteri(samplers[2], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5243
5244 // 3: mipped.
5245 glBindSampler(3, samplers[3]);
5246 glSamplerParameteri(samplers[3], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5247 glSamplerParameteri(samplers[3], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5248
5249 // Bind two blue mipped textures and two single layer textures, should all draw.
5250 glActiveTexture(GL_TEXTURE0);
5251 glBindTexture(GL_TEXTURE_2D, tex);
5252
5253 glActiveTexture(GL_TEXTURE1);
5254 glBindTexture(GL_TEXTURE_2D, mipmapTex);
5255
5256 glActiveTexture(GL_TEXTURE2);
5257 glBindTexture(GL_TEXTURE_2D, tex);
5258
5259 glActiveTexture(GL_TEXTURE3);
5260 glBindTexture(GL_TEXTURE_2D, mipmapTex);
5261
5262 ASSERT_GL_NO_ERROR();
5263
5264 drawQuad(program, "position", 0.5f);
5265 ASSERT_GL_NO_ERROR();
5266 EXPECT_PIXEL_NEAR(0, 0, 128, 0, 128, 255, 2);
5267
5268 // Bind four single layer textures, two should be incomplete.
5269 glActiveTexture(GL_TEXTURE1);
5270 glBindTexture(GL_TEXTURE_2D, tex);
5271
5272 glActiveTexture(GL_TEXTURE3);
5273 glBindTexture(GL_TEXTURE_2D, tex);
5274
5275 drawQuad(program, "position", 0.5f);
5276 ASSERT_GL_NO_ERROR();
5277 EXPECT_PIXEL_NEAR(0, 0, 128, 0, 0, 255, 2);
5278}
5279
Martin Radev7e2c0d32017-09-15 14:25:42 +03005280// The test is added to cover http://anglebug.com/2153. Cubemap completeness checks used to start
5281// always at level 0 instead of the base level resulting in an incomplete texture if the faces at
5282// level 0 are not created. The test creates a cubemap texture, specifies the images only for mip
5283// level 1 filled with white color, updates the base level to be 1 and renders a quad. The program
5284// samples the cubemap using a direction vector (1,1,1).
5285TEST_P(TextureCubeTestES3, SpecifyAndSampleFromBaseLevel1)
5286{
Yunchao He2f23f352018-02-11 22:11:37 +08005287 // Check http://anglebug.com/2155.
5288 ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA());
5289
Jamie Madill35cd7332018-12-02 12:03:33 -05005290 constexpr char kVS[] =
Martin Radev7e2c0d32017-09-15 14:25:42 +03005291 R"(#version 300 es
Olli Etuahoa20af6d2017-09-18 13:32:29 +03005292 precision mediump float;
5293 in vec3 pos;
5294 void main() {
5295 gl_Position = vec4(pos, 1.0);
5296 })";
Martin Radev7e2c0d32017-09-15 14:25:42 +03005297
Jamie Madill35cd7332018-12-02 12:03:33 -05005298 constexpr char kFS[] =
Martin Radev7e2c0d32017-09-15 14:25:42 +03005299 R"(#version 300 es
Olli Etuahoa20af6d2017-09-18 13:32:29 +03005300 precision mediump float;
5301 out vec4 color;
5302 uniform samplerCube uTex;
5303 void main(){
5304 color = texture(uTex, vec3(1.0));
5305 })";
Jamie Madill35cd7332018-12-02 12:03:33 -05005306
5307 ANGLE_GL_PROGRAM(program, kVS, kFS);
Martin Radev7e2c0d32017-09-15 14:25:42 +03005308 glUseProgram(program);
5309
5310 glUniform1i(glGetUniformLocation(program, "uTex"), 0);
5311 glActiveTexture(GL_TEXTURE0);
5312
5313 GLTexture cubeTex;
5314 glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex);
5315
5316 const int kFaceWidth = 1;
5317 const int kFaceHeight = 1;
5318 std::vector<uint32_t> texData(kFaceWidth * kFaceHeight, 0xFFFFFFFF);
5319 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5320 GL_UNSIGNED_BYTE, texData.data());
5321 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5322 GL_UNSIGNED_BYTE, texData.data());
5323 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5324 GL_UNSIGNED_BYTE, texData.data());
5325 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5326 GL_UNSIGNED_BYTE, texData.data());
5327 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5328 GL_UNSIGNED_BYTE, texData.data());
5329 glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
5330 GL_UNSIGNED_BYTE, texData.data());
5331 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5332 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5333 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
5334 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
5335 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);
5336 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1);
5337
5338 drawQuad(program, "pos", 0.5f, 1.0f, true);
5339 ASSERT_GL_NO_ERROR();
5340
5341 EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white);
5342}
5343
Jiawei Shao3c43b4d2018-02-23 11:08:28 +08005344// Verify that using negative texture base level and max level generates GL_INVALID_VALUE.
5345TEST_P(Texture2DTestES3, NegativeTextureBaseLevelAndMaxLevel)
5346{
5347 GLuint texture = create2DTexture();
5348
5349 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, -1);
5350 EXPECT_GL_ERROR(GL_INVALID_VALUE);
5351
5352 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, -1);
5353 EXPECT_GL_ERROR(GL_INVALID_VALUE);
5354
5355 glDeleteTextures(1, &texture);
5356 EXPECT_GL_NO_ERROR();
5357}
5358
Olli Etuaho023371b2018-04-24 17:43:32 +03005359// Test setting base level after calling generateMipmap on a LUMA texture.
5360// Covers http://anglebug.com/2498
5361TEST_P(Texture2DTestES3, GenerateMipmapAndBaseLevelLUMA)
5362{
5363 glActiveTexture(GL_TEXTURE0);
5364 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5365
5366 constexpr const GLsizei kWidth = 8;
5367 constexpr const GLsizei kHeight = 8;
5368 std::array<GLubyte, kWidth * kHeight * 2> whiteData;
5369 whiteData.fill(255u);
5370
5371 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, kWidth, kHeight, 0, GL_LUMINANCE_ALPHA,
5372 GL_UNSIGNED_BYTE, whiteData.data());
5373 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
5374 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
5375 glGenerateMipmap(GL_TEXTURE_2D);
5376 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5377 EXPECT_GL_NO_ERROR();
5378
5379 drawQuad(mProgram, "position", 0.5f);
5380 EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white);
5381}
5382
Till Rathmannc1551dc2018-08-15 17:04:49 +02005383// Covers a bug in the D3D11 backend: http://anglebug.com/2772
5384// When using a sampler the texture was created as if it has mipmaps,
5385// regardless what you specified in GL_TEXTURE_MIN_FILTER via
5386// glSamplerParameteri() -- mistakenly the default value
5387// GL_NEAREST_MIPMAP_LINEAR or the value set via glTexParameteri() was
5388// evaluated.
5389// If you didn't provide mipmaps and didn't let the driver generate them
5390// this led to not sampling your texture data when minification occurred.
5391TEST_P(Texture2DTestES3, MinificationWithSamplerNoMipmapping)
5392{
Jamie Madill35cd7332018-12-02 12:03:33 -05005393 constexpr char kVS[] =
Till Rathmannc1551dc2018-08-15 17:04:49 +02005394 "#version 300 es\n"
5395 "out vec2 texcoord;\n"
5396 "in vec4 position;\n"
5397 "void main()\n"
5398 "{\n"
5399 " gl_Position = vec4(position.xy * 0.1, 0.0, 1.0);\n"
5400 " texcoord = (position.xy * 0.5) + 0.5;\n"
5401 "}\n";
5402
Jamie Madill35cd7332018-12-02 12:03:33 -05005403 constexpr char kFS[] =
Till Rathmannc1551dc2018-08-15 17:04:49 +02005404 "#version 300 es\n"
5405 "precision highp float;\n"
5406 "uniform highp sampler2D tex;\n"
5407 "in vec2 texcoord;\n"
5408 "out vec4 fragColor;\n"
5409 "void main()\n"
5410 "{\n"
5411 " fragColor = texture(tex, texcoord);\n"
5412 "}\n";
Jamie Madill35cd7332018-12-02 12:03:33 -05005413
5414 ANGLE_GL_PROGRAM(program, kVS, kFS);
Till Rathmannc1551dc2018-08-15 17:04:49 +02005415
5416 GLSampler sampler;
5417 glBindSampler(0, sampler);
5418 glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
5419 glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
5420
5421 glActiveTexture(GL_TEXTURE0);
5422 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5423
5424 const GLsizei texWidth = getWindowWidth();
5425 const GLsizei texHeight = getWindowHeight();
5426 const std::vector<GLColor> whiteData(texWidth * texHeight, GLColor::white);
5427
5428 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5429 whiteData.data());
5430 EXPECT_GL_NO_ERROR();
5431
5432 drawQuad(program, "position", 0.5f);
5433 EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, angle::GLColor::white);
5434}
5435
Anders Leinof6cbe442019-04-18 15:32:07 +03005436// Draw a quad with an integer texture with a non-zero base level, and test that the color of the
5437// texture is output.
5438TEST_P(Texture2DIntegerTestES3, IntegerTextureNonZeroBaseLevel)
5439{
Yuly Novikovd2683452019-05-23 16:11:19 -04005440 // http://anglebug.com/3478
5441 ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
5442
Anders Leinof6cbe442019-04-18 15:32:07 +03005443 glActiveTexture(GL_TEXTURE0);
5444 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5445 int width = getWindowWidth();
5446 int height = getWindowHeight();
5447 GLColor color = GLColor::green;
5448 std::vector<GLColor> pixels(width * height, color);
5449 GLint baseLevel = 1;
5450 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, baseLevel);
5451 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5452 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5453 glTexImage2D(GL_TEXTURE_2D, baseLevel, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER,
5454 GL_UNSIGNED_BYTE, pixels.data());
5455
5456 setUpProgram();
5457 glUseProgram(mProgram);
5458 glUniform1i(mTexture2DUniformLocation, 0);
5459 drawQuad(mProgram, "position", 0.5f);
5460
5461 EXPECT_GL_NO_ERROR();
5462 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5463 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5464}
5465
Anders Leino60cc7512019-05-06 09:25:27 +03005466// Draw a quad with an integer cube texture with a non-zero base level, and test that the color of
5467// the texture is output.
5468TEST_P(TextureCubeIntegerTestES3, IntegerCubeTextureNonZeroBaseLevel)
5469{
5470 // All output checks returned black, rather than the texture color.
5471 ANGLE_SKIP_TEST_IF(IsOSX() && IsOpenGL());
5472
5473 glActiveTexture(GL_TEXTURE0);
5474
5475 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
5476 GLint baseLevel = 1;
5477 int width = getWindowWidth();
5478 int height = getWindowHeight();
5479 GLColor color = GLColor::green;
5480 std::vector<GLColor> pixels(width * height, color);
5481 for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
5482 {
5483 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, baseLevel, GL_RGBA8UI, width,
5484 height, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
5485 EXPECT_GL_NO_ERROR();
5486 }
5487 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, baseLevel);
5488 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5489 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5490
5491 glUseProgram(mProgram);
5492 glUniform1i(mTextureCubeUniformLocation, 0);
5493 drawQuad(mProgram, "position", 0.5f);
5494
5495 EXPECT_GL_NO_ERROR();
5496 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5497 EXPECT_PIXEL_COLOR_EQ(width - 1, 0, color);
5498 EXPECT_PIXEL_COLOR_EQ(0, height - 1, color);
5499 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5500}
5501
Anders Leinoe4452442019-05-09 13:29:49 +03005502// This test sets up a cube map with four distincly colored MIP levels.
5503// The size of the texture and the geometry is chosen such that levels 1 or 2 should be chosen at
5504// the corners of the screen.
5505TEST_P(TextureCubeIntegerEdgeTestES3, IntegerCubeTextureCorner)
5506{
5507 glActiveTexture(GL_TEXTURE0);
5508
5509 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
5510 int width = getWindowWidth();
5511 int height = getWindowHeight();
5512 ASSERT_EQ(width, height);
5513 GLColor color[4] = {GLColor::white, GLColor::green, GLColor::blue, GLColor::red};
5514 for (GLint level = 0; level < 4; level++)
5515 {
5516 for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
5517 {
5518 int levelWidth = (2 * width) >> level;
5519 int levelHeight = (2 * height) >> level;
5520 std::vector<GLColor> pixels(levelWidth * levelHeight, color[level]);
5521 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, GL_RGBA8UI, levelWidth,
5522 levelHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
5523 EXPECT_GL_NO_ERROR();
5524 }
5525 }
5526 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5527 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5528 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 3);
5529
5530 glUseProgram(mProgram);
5531 glUniform1i(mTextureCubeUniformLocation, 0);
5532 drawQuad(mProgram, "position", 0.5f);
5533
5534 ASSERT_GL_NO_ERROR();
5535 // Check that we do not read from levels 0 or 3. Levels 1 and 2 are both acceptable.
5536 EXPECT_EQ(ReadColor(0, 0).R, 0);
5537 EXPECT_EQ(ReadColor(width - 1, 0).R, 0);
5538 EXPECT_EQ(ReadColor(0, height - 1).R, 0);
5539 EXPECT_EQ(ReadColor(width - 1, height - 1).R, 0);
5540}
5541
Anders Leino1b6aded2019-05-20 12:56:34 +03005542// Draw a quad with an integer texture with a non-zero base level, and test that the color of the
5543// texture is output.
5544TEST_P(Texture2DIntegerProjectiveOffsetTestES3, NonZeroBaseLevel)
5545{
Jamie Madill29ac2742019-05-28 15:53:00 -04005546 // Fails on AMD: http://crbug.com/967796
Jamie Madill06055b52019-05-29 14:31:42 -04005547 ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsOpenGL());
Jamie Madill29ac2742019-05-28 15:53:00 -04005548
Anders Leino1b6aded2019-05-20 12:56:34 +03005549 glActiveTexture(GL_TEXTURE0);
5550 glBindTexture(GL_TEXTURE_2D, mTexture2D);
5551 int width = getWindowWidth();
5552 int height = getWindowHeight();
5553 GLColor color = GLColor::green;
5554 std::vector<GLColor> pixels(width * height, color);
5555 GLint baseLevel = 1;
5556 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, baseLevel);
5557 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5558 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5559 glTexImage2D(GL_TEXTURE_2D, baseLevel, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER,
5560 GL_UNSIGNED_BYTE, pixels.data());
5561
5562 setUpProgram();
5563 glUseProgram(mProgram);
5564 glUniform1i(mTexture2DUniformLocation, 0);
5565 drawQuad(mProgram, "position", 0.5f);
5566
5567 EXPECT_GL_NO_ERROR();
5568 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5569 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5570}
5571
Anders Leino69d04932019-05-20 14:04:13 +03005572// Draw a quad with an integer texture with a non-zero base level, and test that the color of the
5573// texture is output.
5574TEST_P(Texture2DArrayIntegerTestES3, NonZeroBaseLevel)
5575{
5576 glActiveTexture(GL_TEXTURE0);
5577 glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
5578 int width = getWindowWidth();
5579 int height = getWindowHeight();
5580 int depth = 2;
5581 GLColor color = GLColor::green;
5582 std::vector<GLColor> pixels(width * height * depth, color);
5583 GLint baseLevel = 1;
5584 glTexImage3D(GL_TEXTURE_2D_ARRAY, baseLevel, GL_RGBA8UI, width, height, depth, 0,
5585 GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
5586 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, baseLevel);
5587 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5588 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5589
5590 drawQuad(mProgram, "position", 0.5f);
5591
5592 EXPECT_GL_NO_ERROR();
5593 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5594 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5595}
5596
Anders Leino262e2822019-05-20 14:24:40 +03005597// Draw a quad with an integer 3D texture with a non-zero base level, and test that the color of the
5598// texture is output.
5599TEST_P(Texture3DIntegerTestES3, NonZeroBaseLevel)
5600{
5601 glActiveTexture(GL_TEXTURE0);
5602 glBindTexture(GL_TEXTURE_3D, mTexture3D);
5603 int width = getWindowWidth();
5604 int height = getWindowHeight();
5605 int depth = 2;
5606 GLColor color = GLColor::green;
5607 std::vector<GLColor> pixels(width * height * depth, color);
5608 GLint baseLevel = 1;
5609 glTexImage3D(GL_TEXTURE_3D, baseLevel, GL_RGBA8UI, width, height, depth, 0, GL_RGBA_INTEGER,
5610 GL_UNSIGNED_BYTE, pixels.data());
5611 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, baseLevel);
5612 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5613 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5614
5615 drawQuad(mProgram, "position", 0.5f);
5616
5617 EXPECT_GL_NO_ERROR();
5618 EXPECT_PIXEL_COLOR_EQ(0, 0, color);
5619 EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
5620}
5621
Jamie Madill50cf2be2018-06-15 09:46:57 -04005622// Use this to select which configurations (e.g. which renderer, which GLES major version) these
5623// tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -05005624ANGLE_INSTANTIATE_TEST(Texture2DTest,
5625 ES2_D3D9(),
5626 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005627 ES2_OPENGL(),
Luc Ferron5164b792018-03-06 09:10:12 -05005628 ES2_OPENGLES(),
5629 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005630ANGLE_INSTANTIATE_TEST(TextureCubeTest,
5631 ES2_D3D9(),
5632 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005633 ES2_OPENGL(),
Luc Ferronaf883622018-06-08 15:57:31 -04005634 ES2_OPENGLES(),
5635 ES2_VULKAN());
Olli Etuaho51f1c0f2016-01-13 16:16:24 +02005636ANGLE_INSTANTIATE_TEST(Texture2DTestWithDrawScale,
5637 ES2_D3D9(),
5638 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005639 ES2_OPENGL(),
Luc Ferronaf883622018-06-08 15:57:31 -04005640 ES2_OPENGLES(),
5641 ES2_VULKAN());
Olli Etuaho51f1c0f2016-01-13 16:16:24 +02005642ANGLE_INSTANTIATE_TEST(Sampler2DAsFunctionParameterTest,
5643 ES2_D3D9(),
5644 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005645 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005646 ES2_OPENGLES(),
5647 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005648ANGLE_INSTANTIATE_TEST(SamplerArrayTest,
5649 ES2_D3D9(),
5650 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005651 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005652 ES2_OPENGLES(),
5653 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005654ANGLE_INSTANTIATE_TEST(SamplerArrayAsFunctionParameterTest,
5655 ES2_D3D9(),
5656 ES2_D3D11(),
Geoff Lange0cc2a42016-01-20 10:58:17 -05005657 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005658 ES2_OPENGLES(),
5659 ES2_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005660ANGLE_INSTANTIATE_TEST(Texture2DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Olli Etuahoa314b612016-03-10 16:43:00 +02005661ANGLE_INSTANTIATE_TEST(Texture3DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
James Dong8bb6baa2019-06-18 15:30:16 -06005662ANGLE_INSTANTIATE_TEST(Texture2DIntegerAlpha1TestES3,
5663 ES3_D3D11(),
5664 ES3_OPENGL(),
5665 ES3_OPENGLES(),
5666 ES3_VULKAN());
Olli Etuaho6ee394a2016-02-18 13:30:09 +02005667ANGLE_INSTANTIATE_TEST(Texture2DUnsignedIntegerAlpha1TestES3,
5668 ES3_D3D11(),
5669 ES3_OPENGL(),
James Dong8bb6baa2019-06-18 15:30:16 -06005670 ES3_OPENGLES(),
5671 ES3_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005672ANGLE_INSTANTIATE_TEST(ShadowSamplerPlusSampler3DTestES3,
5673 ES3_D3D11(),
5674 ES3_OPENGL(),
5675 ES3_OPENGLES());
James Dong8bb6baa2019-06-18 15:30:16 -06005676ANGLE_INSTANTIATE_TEST(SamplerTypeMixTestES3,
5677 ES3_D3D11(),
5678 ES3_OPENGL(),
5679 ES3_OPENGLES(),
5680 ES3_VULKAN());
Geoff Lange0cc2a42016-01-20 10:58:17 -05005681ANGLE_INSTANTIATE_TEST(Texture2DArrayTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Olli Etuahobce743a2016-01-15 17:18:28 +02005682ANGLE_INSTANTIATE_TEST(TextureSizeTextureArrayTest, ES3_D3D11(), ES3_OPENGL());
Olli Etuaho96963162016-03-21 11:54:33 +02005683ANGLE_INSTANTIATE_TEST(SamplerInStructTest,
5684 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005685 ES2_D3D9(),
5686 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005687 ES2_OPENGLES(),
5688 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005689ANGLE_INSTANTIATE_TEST(SamplerInStructAsFunctionParameterTest,
5690 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005691 ES2_D3D9(),
5692 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005693 ES2_OPENGLES(),
5694 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005695ANGLE_INSTANTIATE_TEST(SamplerInStructArrayAsFunctionParameterTest,
5696 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005697 ES2_D3D9(),
5698 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005699 ES2_OPENGLES(),
5700 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005701ANGLE_INSTANTIATE_TEST(SamplerInNestedStructAsFunctionParameterTest,
5702 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005703 ES2_D3D9(),
5704 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005705 ES2_OPENGLES(),
5706 ES2_VULKAN());
Olli Etuaho96963162016-03-21 11:54:33 +02005707ANGLE_INSTANTIATE_TEST(SamplerInStructAndOtherVariableTest,
5708 ES2_D3D11(),
Olli Etuaho96963162016-03-21 11:54:33 +02005709 ES2_D3D9(),
5710 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005711 ES2_OPENGLES(),
5712 ES2_VULKAN());
Shahbaz Youssefi962c2222019-02-20 15:43:41 -05005713ANGLE_INSTANTIATE_TEST(TextureAnisotropyTest,
5714 ES2_D3D11(),
5715 ES2_D3D9(),
5716 ES2_OPENGL(),
5717 ES2_OPENGLES(),
5718 ES2_VULKAN());
Till Rathmannb8543632018-10-02 19:46:14 +02005719ANGLE_INSTANTIATE_TEST(TextureBorderClampTest,
5720 ES2_D3D11(),
5721 ES2_D3D9(),
5722 ES2_OPENGL(),
Shahbaz Youssefi0864a7a2018-11-07 15:50:15 -05005723 ES2_OPENGLES(),
5724 ES2_VULKAN());
Till Rathmannb8543632018-10-02 19:46:14 +02005725ANGLE_INSTANTIATE_TEST(TextureBorderClampTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
5726ANGLE_INSTANTIATE_TEST(TextureBorderClampIntegerTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Luc Ferronaf883622018-06-08 15:57:31 -04005727ANGLE_INSTANTIATE_TEST(TextureLimitsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
Vincent Lang25ab4512016-05-13 18:13:59 +02005728ANGLE_INSTANTIATE_TEST(Texture2DNorm16TestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Mohan Maiya8f1169e2019-06-27 15:32:32 -07005729ANGLE_INSTANTIATE_TEST(Texture2DRGTest,
5730 ES2_D3D11(),
5731 ES3_D3D11(),
5732 ES2_OPENGL(),
5733 ES3_OPENGL(),
5734 ES2_OPENGLES(),
5735 ES3_OPENGLES(),
5736 ES2_VULKAN(),
5737 ES3_VULKAN());
Mohan Maiya6caa2652019-09-11 08:06:13 -07005738ANGLE_INSTANTIATE_TEST(Texture2DFloatTestES3,
5739 ES3_D3D11(),
5740 ES3_OPENGL(),
5741 ES3_OPENGLES(),
5742 ES3_VULKAN());
5743ANGLE_INSTANTIATE_TEST(Texture2DFloatTestES2,
5744 ES2_D3D11(),
5745 ES2_OPENGL(),
5746 ES2_OPENGLES(),
5747 ES2_VULKAN());
Martin Radev7e2c0d32017-09-15 14:25:42 +03005748ANGLE_INSTANTIATE_TEST(TextureCubeTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Anders Leinof6cbe442019-04-18 15:32:07 +03005749ANGLE_INSTANTIATE_TEST(Texture2DIntegerTestES3, ES3_D3D11(), ES3_OPENGL());
Anders Leino60cc7512019-05-06 09:25:27 +03005750ANGLE_INSTANTIATE_TEST(TextureCubeIntegerTestES3, ES3_D3D11(), ES3_OPENGL());
Anders Leinoe4452442019-05-09 13:29:49 +03005751ANGLE_INSTANTIATE_TEST(TextureCubeIntegerEdgeTestES3, ES3_D3D11(), ES3_OPENGL());
Anders Leino1b6aded2019-05-20 12:56:34 +03005752ANGLE_INSTANTIATE_TEST(Texture2DIntegerProjectiveOffsetTestES3, ES3_D3D11(), ES3_OPENGL());
Anders Leino69d04932019-05-20 14:04:13 +03005753ANGLE_INSTANTIATE_TEST(Texture2DArrayIntegerTestES3, ES3_D3D11(), ES3_OPENGL());
Anders Leino262e2822019-05-20 14:24:40 +03005754ANGLE_INSTANTIATE_TEST(Texture3DIntegerTestES3, ES3_D3D11(), ES3_OPENGL());
Courtney Goeltzenleuchter1f2782e2019-08-29 14:19:23 -06005755ANGLE_INSTANTIATE_TEST(Texture2DDepthTest,
5756 ES2_D3D9(),
5757 ES2_D3D11(),
5758 ES2_OPENGL(),
5759 ES2_OPENGLES(),
5760 ES2_VULKAN(),
5761 ES3_VULKAN());
Jamie Madillfa05f602015-05-07 13:47:11 -04005762
Jamie Madill7ffdda92016-09-08 13:26:51 -04005763} // anonymous namespace