xref: /aosp_15_r20/external/angle/src/tests/gl_tests/TextureTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include <limits>
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker namespace
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kPixelTolerance     = 1u;
19*8975f5c5SAndroid Build Coastguard Worker constexpr GLfloat kPixelTolerance32F = 0.01f;
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker // Single compressed ETC2 block of source pixels all set red
22*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kCompressedImageETC2[] = {0x7E, 0x80, 0x04, 0x7F, 0x00, 0x07, 0xE0, 0x00};
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker // Take a pixel, and reset the components not covered by the format to default
25*8975f5c5SAndroid Build Coastguard Worker // values. In particular, the default value for the alpha component is 255
26*8975f5c5SAndroid Build Coastguard Worker // (1.0 as unsigned normalized fixed point value).
27*8975f5c5SAndroid Build Coastguard Worker // For legacy formats, the components may be reordered to match the color that
28*8975f5c5SAndroid Build Coastguard Worker // would be created if a pixel of that format was initialized from the given color
SliceFormatColor(GLenum format,GLColor full)29*8975f5c5SAndroid Build Coastguard Worker GLColor SliceFormatColor(GLenum format, GLColor full)
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker     switch (format)
32*8975f5c5SAndroid Build Coastguard Worker     {
33*8975f5c5SAndroid Build Coastguard Worker         case GL_RED:
34*8975f5c5SAndroid Build Coastguard Worker             return GLColor(full.R, 0, 0, 255u);
35*8975f5c5SAndroid Build Coastguard Worker         case GL_RG:
36*8975f5c5SAndroid Build Coastguard Worker             return GLColor(full.R, full.G, 0, 255u);
37*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB:
38*8975f5c5SAndroid Build Coastguard Worker             return GLColor(full.R, full.G, full.B, 255u);
39*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA:
40*8975f5c5SAndroid Build Coastguard Worker             return full;
41*8975f5c5SAndroid Build Coastguard Worker         case GL_LUMINANCE:
42*8975f5c5SAndroid Build Coastguard Worker             return GLColor(full.R, full.R, full.R, 255u);
43*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA:
44*8975f5c5SAndroid Build Coastguard Worker             return GLColor(0, 0, 0, full.R);
45*8975f5c5SAndroid Build Coastguard Worker         case GL_LUMINANCE_ALPHA:
46*8975f5c5SAndroid Build Coastguard Worker             return GLColor(full.R, full.R, full.R, full.G);
47*8975f5c5SAndroid Build Coastguard Worker         default:
48*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(false);
49*8975f5c5SAndroid Build Coastguard Worker             return GLColor::white;
50*8975f5c5SAndroid Build Coastguard Worker     }
51*8975f5c5SAndroid Build Coastguard Worker }
52*8975f5c5SAndroid Build Coastguard Worker 
SliceFormatColor16(GLenum format,GLColor16 full)53*8975f5c5SAndroid Build Coastguard Worker GLColor16 SliceFormatColor16(GLenum format, GLColor16 full)
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker     switch (format)
56*8975f5c5SAndroid Build Coastguard Worker     {
57*8975f5c5SAndroid Build Coastguard Worker         case GL_RED:
58*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(full.R, 0, 0, 0xFFFF);
59*8975f5c5SAndroid Build Coastguard Worker         case GL_RG:
60*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(full.R, full.G, 0, 0xFFFF);
61*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB:
62*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(full.R, full.G, full.B, 0xFFFF);
63*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA:
64*8975f5c5SAndroid Build Coastguard Worker             return full;
65*8975f5c5SAndroid Build Coastguard Worker         case GL_LUMINANCE:
66*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(full.R, full.R, full.R, 0xFFFF);
67*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA:
68*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(0, 0, 0, full.R);
69*8975f5c5SAndroid Build Coastguard Worker         case GL_LUMINANCE_ALPHA:
70*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(full.R, full.R, full.R, full.G);
71*8975f5c5SAndroid Build Coastguard Worker         default:
72*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(false);
73*8975f5c5SAndroid Build Coastguard Worker             return GLColor16(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF);
74*8975f5c5SAndroid Build Coastguard Worker     }
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker // As above, for 32F colors
SliceFormatColor32F(GLenum format,GLColor32F full)78*8975f5c5SAndroid Build Coastguard Worker GLColor32F SliceFormatColor32F(GLenum format, GLColor32F full)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     switch (format)
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         case GL_RED:
83*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(full.R, 0.0f, 0.0f, 1.0f);
84*8975f5c5SAndroid Build Coastguard Worker         case GL_RG:
85*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(full.R, full.G, 0.0f, 1.0f);
86*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB:
87*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(full.R, full.G, full.B, 1.0f);
88*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA:
89*8975f5c5SAndroid Build Coastguard Worker             return full;
90*8975f5c5SAndroid Build Coastguard Worker         case GL_LUMINANCE:
91*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(full.R, full.R, full.R, 1.0f);
92*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA:
93*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(0.0f, 0.0f, 0.0f, full.R);
94*8975f5c5SAndroid Build Coastguard Worker         case GL_LUMINANCE_ALPHA:
95*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(full.R, full.R, full.R, full.G);
96*8975f5c5SAndroid Build Coastguard Worker         default:
97*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(false);
98*8975f5c5SAndroid Build Coastguard Worker             return GLColor32F(1.0f, 1.0f, 1.0f, 1.0f);
99*8975f5c5SAndroid Build Coastguard Worker     }
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker class TexCoordDrawTest : public ANGLETest<>
103*8975f5c5SAndroid Build Coastguard Worker {
104*8975f5c5SAndroid Build Coastguard Worker   protected:
TexCoordDrawTest()105*8975f5c5SAndroid Build Coastguard Worker     TexCoordDrawTest() : ANGLETest(), mProgram(0), mFramebuffer(0), mFramebufferColorTexture(0)
106*8975f5c5SAndroid Build Coastguard Worker     {
107*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
108*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
109*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
110*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
111*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
112*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
113*8975f5c5SAndroid Build Coastguard Worker     }
114*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()115*8975f5c5SAndroid Build Coastguard Worker     virtual const char *getVertexShaderSource()
116*8975f5c5SAndroid Build Coastguard Worker     {
117*8975f5c5SAndroid Build Coastguard Worker         return R"(precision highp float;
118*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
119*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker void main()
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
124*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
125*8975f5c5SAndroid Build Coastguard Worker })";
126*8975f5c5SAndroid Build Coastguard Worker     }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     virtual const char *getFragmentShaderSource() = 0;
129*8975f5c5SAndroid Build Coastguard Worker 
setUpProgram()130*8975f5c5SAndroid Build Coastguard Worker     virtual void setUpProgram()
131*8975f5c5SAndroid Build Coastguard Worker     {
132*8975f5c5SAndroid Build Coastguard Worker         const char *vertexShaderSource   = getVertexShaderSource();
133*8975f5c5SAndroid Build Coastguard Worker         const char *fragmentShaderSource = getFragmentShaderSource();
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
136*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(0u, mProgram);
137*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
138*8975f5c5SAndroid Build Coastguard Worker     }
139*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()140*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override { setUpFramebuffer(); }
141*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()142*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
143*8975f5c5SAndroid Build Coastguard Worker     {
144*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
145*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFramebuffer);
146*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mFramebufferColorTexture);
147*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mProgram);
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker 
setUpFramebuffer()150*8975f5c5SAndroid Build Coastguard Worker     void setUpFramebuffer()
151*8975f5c5SAndroid Build Coastguard Worker     {
152*8975f5c5SAndroid Build Coastguard Worker         // We use an FBO to work around an issue where the default framebuffer applies SRGB
153*8975f5c5SAndroid Build Coastguard Worker         // conversion (particularly known to happen incorrectly on Intel GL drivers). It's not
154*8975f5c5SAndroid Build Coastguard Worker         // clear whether this issue can even be fixed on all backends. For example GLES 3.0.4 spec
155*8975f5c5SAndroid Build Coastguard Worker         // section 4.4 says that the format of the default framebuffer is entirely up to the window
156*8975f5c5SAndroid Build Coastguard Worker         // system, so it might be SRGB, and GLES 3.0 doesn't have a "FRAMEBUFFER_SRGB" to turn off
157*8975f5c5SAndroid Build Coastguard Worker         // SRGB conversion like desktop GL does.
158*8975f5c5SAndroid Build Coastguard Worker         // TODO(oetuaho): Get rid of this if the underlying issue is fixed.
159*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFramebuffer);
160*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mFramebufferColorTexture);
163*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mFramebufferColorTexture);
164*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
165*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
166*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
167*8975f5c5SAndroid Build Coastguard Worker                                mFramebufferColorTexture, 0);
168*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
169*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
170*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
171*8975f5c5SAndroid Build Coastguard Worker     }
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker     // Returns the created texture ID.
create2DTexture()174*8975f5c5SAndroid Build Coastguard Worker     GLuint create2DTexture()
175*8975f5c5SAndroid Build Coastguard Worker     {
176*8975f5c5SAndroid Build Coastguard Worker         GLuint texture2D;
177*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &texture2D);
178*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture2D);
179*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
180*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
181*8975f5c5SAndroid Build Coastguard Worker         return texture2D;
182*8975f5c5SAndroid Build Coastguard Worker     }
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
185*8975f5c5SAndroid Build Coastguard Worker     GLuint mFramebuffer;
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker   protected:
188*8975f5c5SAndroid Build Coastguard Worker     GLuint mFramebufferColorTexture;
189*8975f5c5SAndroid Build Coastguard Worker };
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker class Texture2DTest : public TexCoordDrawTest
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DTest()194*8975f5c5SAndroid Build Coastguard Worker     Texture2DTest() : TexCoordDrawTest(), mTexture2D(0), mTexture2DUniformLocation(-1) {}
195*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()196*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
197*8975f5c5SAndroid Build Coastguard Worker     {
198*8975f5c5SAndroid Build Coastguard Worker         return R"(precision highp float;
199*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
200*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker void main()
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(tex, texcoord);
205*8975f5c5SAndroid Build Coastguard Worker })";
206*8975f5c5SAndroid Build Coastguard Worker     }
207*8975f5c5SAndroid Build Coastguard Worker 
getTextureUniformName()208*8975f5c5SAndroid Build Coastguard Worker     virtual const char *getTextureUniformName() { return "tex"; }
209*8975f5c5SAndroid Build Coastguard Worker 
setUpProgram()210*8975f5c5SAndroid Build Coastguard Worker     void setUpProgram() override
211*8975f5c5SAndroid Build Coastguard Worker     {
212*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::setUpProgram();
213*8975f5c5SAndroid Build Coastguard Worker         mTexture2DUniformLocation = glGetUniformLocation(mProgram, getTextureUniformName());
214*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture2DUniformLocation);
215*8975f5c5SAndroid Build Coastguard Worker     }
216*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()217*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
218*8975f5c5SAndroid Build Coastguard Worker     {
219*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
220*8975f5c5SAndroid Build Coastguard Worker         mTexture2D = create2DTexture();
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
223*8975f5c5SAndroid Build Coastguard Worker     }
224*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()225*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
226*8975f5c5SAndroid Build Coastguard Worker     {
227*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2D);
228*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
229*8975f5c5SAndroid Build Coastguard Worker     }
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker     // Tests CopyTexSubImage with floating point textures of various formats.
testFloatCopySubImage(int sourceImageChannels,int destImageChannels)232*8975f5c5SAndroid Build Coastguard Worker     void testFloatCopySubImage(int sourceImageChannels, int destImageChannels)
233*8975f5c5SAndroid Build Coastguard Worker     {
234*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() < 3)
237*8975f5c5SAndroid Build Coastguard Worker         {
238*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
239*8975f5c5SAndroid Build Coastguard Worker                                !IsGLExtensionEnabled("GL_OES_texture_float"));
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF((sourceImageChannels < 3 || destImageChannels < 3) &&
242*8975f5c5SAndroid Build Coastguard Worker                                !IsGLExtensionEnabled("GL_EXT_texture_rg"));
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(destImageChannels == 3 &&
245*8975f5c5SAndroid Build Coastguard Worker                                !IsGLExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgb"));
246*8975f5c5SAndroid Build Coastguard Worker 
247*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(destImageChannels == 4 &&
248*8975f5c5SAndroid Build Coastguard Worker                                !IsGLExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgba"));
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(destImageChannels <= 2);
251*8975f5c5SAndroid Build Coastguard Worker         }
252*8975f5c5SAndroid Build Coastguard Worker         else
253*8975f5c5SAndroid Build Coastguard Worker         {
254*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_color_buffer_float"));
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker             ANGLE_SKIP_TEST_IF(destImageChannels == 3 &&
257*8975f5c5SAndroid Build Coastguard Worker                                !IsGLExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgb"));
258*8975f5c5SAndroid Build Coastguard Worker         }
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker         // clang-format off
261*8975f5c5SAndroid Build Coastguard Worker         GLfloat sourceImageData[4][16] =
262*8975f5c5SAndroid Build Coastguard Worker         {
263*8975f5c5SAndroid Build Coastguard Worker             { // R
264*8975f5c5SAndroid Build Coastguard Worker                 1.0f,
265*8975f5c5SAndroid Build Coastguard Worker                 0.0f,
266*8975f5c5SAndroid Build Coastguard Worker                 0.0f,
267*8975f5c5SAndroid Build Coastguard Worker                 1.0f
268*8975f5c5SAndroid Build Coastguard Worker             },
269*8975f5c5SAndroid Build Coastguard Worker             { // RG
270*8975f5c5SAndroid Build Coastguard Worker                 1.0f, 0.0f,
271*8975f5c5SAndroid Build Coastguard Worker                 0.0f, 1.0f,
272*8975f5c5SAndroid Build Coastguard Worker                 0.0f, 0.0f,
273*8975f5c5SAndroid Build Coastguard Worker                 1.0f, 1.0f
274*8975f5c5SAndroid Build Coastguard Worker             },
275*8975f5c5SAndroid Build Coastguard Worker             { // RGB
276*8975f5c5SAndroid Build Coastguard Worker                 1.0f, 0.0f, 0.0f,
277*8975f5c5SAndroid Build Coastguard Worker                 0.0f, 1.0f, 0.0f,
278*8975f5c5SAndroid Build Coastguard Worker                 0.0f, 0.0f, 1.0f,
279*8975f5c5SAndroid Build Coastguard Worker                 1.0f, 1.0f, 0.0f
280*8975f5c5SAndroid Build Coastguard Worker             },
281*8975f5c5SAndroid Build Coastguard Worker             { // RGBA
282*8975f5c5SAndroid Build Coastguard Worker                 1.0f, 0.0f, 0.0f, 1.0f,
283*8975f5c5SAndroid Build Coastguard Worker                 0.0f, 1.0f, 0.0f, 1.0f,
284*8975f5c5SAndroid Build Coastguard Worker                 0.0f, 0.0f, 1.0f, 1.0f,
285*8975f5c5SAndroid Build Coastguard Worker                 1.0f, 1.0f, 0.0f, 1.0f
286*8975f5c5SAndroid Build Coastguard Worker             },
287*8975f5c5SAndroid Build Coastguard Worker         };
288*8975f5c5SAndroid Build Coastguard Worker         // clang-format on
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker         GLenum imageFormats[] = {
291*8975f5c5SAndroid Build Coastguard Worker             GL_R32F,
292*8975f5c5SAndroid Build Coastguard Worker             GL_RG32F,
293*8975f5c5SAndroid Build Coastguard Worker             GL_RGB32F,
294*8975f5c5SAndroid Build Coastguard Worker             GL_RGBA32F,
295*8975f5c5SAndroid Build Coastguard Worker         };
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker         GLenum sourceUnsizedFormats[] = {
298*8975f5c5SAndroid Build Coastguard Worker             GL_RED,
299*8975f5c5SAndroid Build Coastguard Worker             GL_RG,
300*8975f5c5SAndroid Build Coastguard Worker             GL_RGB,
301*8975f5c5SAndroid Build Coastguard Worker             GL_RGBA,
302*8975f5c5SAndroid Build Coastguard Worker         };
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker         GLTexture textures[2];
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker         GLfloat *imageData         = sourceImageData[sourceImageChannels - 1];
307*8975f5c5SAndroid Build Coastguard Worker         GLenum sourceImageFormat   = imageFormats[sourceImageChannels - 1];
308*8975f5c5SAndroid Build Coastguard Worker         GLenum sourceUnsizedFormat = sourceUnsizedFormats[sourceImageChannels - 1];
309*8975f5c5SAndroid Build Coastguard Worker         GLenum destImageFormat     = imageFormats[destImageChannels - 1];
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[0]);
312*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
313*8975f5c5SAndroid Build Coastguard Worker         {
314*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, sourceImageFormat, 2, 2);
315*8975f5c5SAndroid Build Coastguard Worker         }
316*8975f5c5SAndroid Build Coastguard Worker         else
317*8975f5c5SAndroid Build Coastguard Worker         {
318*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2DEXT(GL_TEXTURE_2D, 1, sourceImageFormat, 2, 2);
319*8975f5c5SAndroid Build Coastguard Worker         }
320*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
321*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
322*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, sourceUnsizedFormat, GL_FLOAT, imageData);
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker         if (sourceImageChannels < 3 && !IsGLExtensionEnabled("GL_EXT_texture_rg"))
325*8975f5c5SAndroid Build Coastguard Worker         {
326*8975f5c5SAndroid Build Coastguard Worker             // This is not supported
327*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_ERROR(GL_INVALID_OPERATION);
328*8975f5c5SAndroid Build Coastguard Worker         }
329*8975f5c5SAndroid Build Coastguard Worker         else
330*8975f5c5SAndroid Build Coastguard Worker         {
331*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
332*8975f5c5SAndroid Build Coastguard Worker         }
333*8975f5c5SAndroid Build Coastguard Worker 
334*8975f5c5SAndroid Build Coastguard Worker         GLuint fbo;
335*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
336*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
337*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
338*8975f5c5SAndroid Build Coastguard Worker 
339*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[1]);
340*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
341*8975f5c5SAndroid Build Coastguard Worker         {
342*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, destImageFormat, 2, 2);
343*8975f5c5SAndroid Build Coastguard Worker         }
344*8975f5c5SAndroid Build Coastguard Worker         else
345*8975f5c5SAndroid Build Coastguard Worker         {
346*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2DEXT(GL_TEXTURE_2D, 1, destImageFormat, 2, 2);
347*8975f5c5SAndroid Build Coastguard Worker         }
348*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
349*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2);
352*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
355*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker         int testImageChannels = std::min(sourceImageChannels, destImageChannels);
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
360*8975f5c5SAndroid Build Coastguard Worker         if (testImageChannels > 1)
361*8975f5c5SAndroid Build Coastguard Worker         {
362*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowHeight() - 1, 0, 0, 255, 0, 255);
363*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowHeight() - 1, getWindowWidth() - 1, 255, 255, 0, 255);
364*8975f5c5SAndroid Build Coastguard Worker             if (testImageChannels > 2)
365*8975f5c5SAndroid Build Coastguard Worker             {
366*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_PIXEL_EQ(0, getWindowWidth() - 1, 0, 0, 255, 255);
367*8975f5c5SAndroid Build Coastguard Worker             }
368*8975f5c5SAndroid Build Coastguard Worker         }
369*8975f5c5SAndroid Build Coastguard Worker 
370*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &fbo);
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
373*8975f5c5SAndroid Build Coastguard Worker     }
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     void testTextureSize(int testCaseIndex);
376*8975f5c5SAndroid Build Coastguard Worker     void testTextureSizeError();
377*8975f5c5SAndroid Build Coastguard Worker 
378*8975f5c5SAndroid Build Coastguard Worker     struct UploadThenUseStageParam
379*8975f5c5SAndroid Build Coastguard Worker     {
380*8975f5c5SAndroid Build Coastguard Worker         GLenum useStage;
381*8975f5c5SAndroid Build Coastguard Worker         bool closeRenderPassAfterUse;
382*8975f5c5SAndroid Build Coastguard Worker     };
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker     void testUploadThenUseInDifferentStages(const std::vector<UploadThenUseStageParam> &uses);
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2D;
387*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture2DUniformLocation;
388*8975f5c5SAndroid Build Coastguard Worker };
389*8975f5c5SAndroid Build Coastguard Worker 
390*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestES3 : public Texture2DTest
391*8975f5c5SAndroid Build Coastguard Worker {
392*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DTestES3()393*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestES3() : Texture2DTest() {}
394*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()395*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
396*8975f5c5SAndroid Build Coastguard Worker     {
397*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
398*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
399*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
400*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
401*8975f5c5SAndroid Build Coastguard Worker                "{\n"
402*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
403*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
404*8975f5c5SAndroid Build Coastguard Worker                "}\n";
405*8975f5c5SAndroid Build Coastguard Worker     }
406*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()407*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
408*8975f5c5SAndroid Build Coastguard Worker     {
409*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
410*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
411*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler2D tex;\n"
412*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
413*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
414*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
415*8975f5c5SAndroid Build Coastguard Worker                "{\n"
416*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = texture(tex, texcoord);\n"
417*8975f5c5SAndroid Build Coastguard Worker                "}\n";
418*8975f5c5SAndroid Build Coastguard Worker     }
419*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()420*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
421*8975f5c5SAndroid Build Coastguard Worker     {
422*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
423*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
424*8975f5c5SAndroid Build Coastguard Worker     }
425*8975f5c5SAndroid Build Coastguard Worker 
createImmutableTexture2D(GLuint texture,size_t width,size_t height,GLenum format,GLenum internalFormat,GLenum type,GLsizei levels,GLubyte data[4])426*8975f5c5SAndroid Build Coastguard Worker     void createImmutableTexture2D(GLuint texture,
427*8975f5c5SAndroid Build Coastguard Worker                                   size_t width,
428*8975f5c5SAndroid Build Coastguard Worker                                   size_t height,
429*8975f5c5SAndroid Build Coastguard Worker                                   GLenum format,
430*8975f5c5SAndroid Build Coastguard Worker                                   GLenum internalFormat,
431*8975f5c5SAndroid Build Coastguard Worker                                   GLenum type,
432*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei levels,
433*8975f5c5SAndroid Build Coastguard Worker                                   GLubyte data[4])
434*8975f5c5SAndroid Build Coastguard Worker     {
435*8975f5c5SAndroid Build Coastguard Worker         // Support only 1 level for now
436*8975f5c5SAndroid Build Coastguard Worker         ASSERT(levels == 1);
437*8975f5c5SAndroid Build Coastguard Worker 
438*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
439*8975f5c5SAndroid Build Coastguard Worker 
440*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, levels, internalFormat, width, height);
441*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker         if (data != nullptr)
444*8975f5c5SAndroid Build Coastguard Worker         {
445*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, type, data);
446*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
447*8975f5c5SAndroid Build Coastguard Worker         }
448*8975f5c5SAndroid Build Coastguard Worker 
449*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
450*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
451*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
452*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
453*8975f5c5SAndroid Build Coastguard Worker     }
454*8975f5c5SAndroid Build Coastguard Worker 
verifyResults2D(GLuint texture,GLubyte referenceColor[4])455*8975f5c5SAndroid Build Coastguard Worker     void verifyResults2D(GLuint texture, GLubyte referenceColor[4])
456*8975f5c5SAndroid Build Coastguard Worker     {
457*8975f5c5SAndroid Build Coastguard Worker         // Draw a quad with the target texture
458*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
459*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
460*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTexture2DUniformLocation, 0);
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
463*8975f5c5SAndroid Build Coastguard Worker 
464*8975f5c5SAndroid Build Coastguard Worker         // Expect that the rendered quad's color is the same as the reference color with a tolerance
465*8975f5c5SAndroid Build Coastguard Worker         // of 1
466*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, referenceColor[0], referenceColor[1], referenceColor[2],
467*8975f5c5SAndroid Build Coastguard Worker                           referenceColor[3], 1);
468*8975f5c5SAndroid Build Coastguard Worker     }
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     void testCopyImage(const APIExtensionVersion usedExtension);
471*8975f5c5SAndroid Build Coastguard Worker     void testCopyImageDepthStencil(const APIExtensionVersion usedExtension);
472*8975f5c5SAndroid Build Coastguard Worker };
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker class Texture2DMemoryTestES3 : public Texture2DTestES3
475*8975f5c5SAndroid Build Coastguard Worker {
476*8975f5c5SAndroid Build Coastguard Worker   protected:
getPerfCounters()477*8975f5c5SAndroid Build Coastguard Worker     angle::VulkanPerfCounters getPerfCounters()
478*8975f5c5SAndroid Build Coastguard Worker     {
479*8975f5c5SAndroid Build Coastguard Worker         if (mIndexMap.empty())
480*8975f5c5SAndroid Build Coastguard Worker         {
481*8975f5c5SAndroid Build Coastguard Worker             mIndexMap = BuildCounterNameToIndexMap();
482*8975f5c5SAndroid Build Coastguard Worker         }
483*8975f5c5SAndroid Build Coastguard Worker 
484*8975f5c5SAndroid Build Coastguard Worker         return GetPerfCounters(mIndexMap);
485*8975f5c5SAndroid Build Coastguard Worker     }
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     CounterNameToIndexMap mIndexMap;
488*8975f5c5SAndroid Build Coastguard Worker };
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestES3YUV : public Texture2DTestES3
491*8975f5c5SAndroid Build Coastguard Worker {};
492*8975f5c5SAndroid Build Coastguard Worker 
493*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestES3RobustInit : public Texture2DTestES3
494*8975f5c5SAndroid Build Coastguard Worker {
495*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DTestES3RobustInit()496*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestES3RobustInit() : Texture2DTestES3() { setRobustResourceInit(true); }
497*8975f5c5SAndroid Build Coastguard Worker };
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestES3Foveation : public Texture2DTestES3
500*8975f5c5SAndroid Build Coastguard Worker {
501*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DTestES3Foveation()502*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestES3Foveation() : Texture2DTestES3()
503*8975f5c5SAndroid Build Coastguard Worker     {
504*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(256);
505*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(256);
506*8975f5c5SAndroid Build Coastguard Worker     }
507*8975f5c5SAndroid Build Coastguard Worker };
508*8975f5c5SAndroid Build Coastguard Worker 
509*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestES31Foveation : public Texture2DTestES3Foveation
510*8975f5c5SAndroid Build Coastguard Worker {};
511*8975f5c5SAndroid Build Coastguard Worker 
512*8975f5c5SAndroid Build Coastguard Worker class Texture2DBaseMaxTestES3 : public ANGLETest<>
513*8975f5c5SAndroid Build Coastguard Worker {
514*8975f5c5SAndroid Build Coastguard Worker   protected:
515*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kMip0Size   = 13;
516*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kMipCount = 4;
517*8975f5c5SAndroid Build Coastguard Worker 
Texture2DBaseMaxTestES3()518*8975f5c5SAndroid Build Coastguard Worker     Texture2DBaseMaxTestES3() : ANGLETest(), mTextureLocation(0), mLodLocation(0)
519*8975f5c5SAndroid Build Coastguard Worker     {
520*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
521*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
522*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
523*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
524*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
525*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
526*8975f5c5SAndroid Build Coastguard Worker     }
527*8975f5c5SAndroid Build Coastguard Worker 
getMipDataSize(size_t mip0Size,size_t mip)528*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t getMipDataSize(size_t mip0Size, size_t mip)
529*8975f5c5SAndroid Build Coastguard Worker     {
530*8975f5c5SAndroid Build Coastguard Worker         size_t mipSize = std::max<size_t>(1u, mip0Size >> mip);
531*8975f5c5SAndroid Build Coastguard Worker         return mipSize * mipSize;
532*8975f5c5SAndroid Build Coastguard Worker     }
533*8975f5c5SAndroid Build Coastguard Worker 
getTotalMipDataSize(size_t mip0Size)534*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t getTotalMipDataSize(size_t mip0Size)
535*8975f5c5SAndroid Build Coastguard Worker     {
536*8975f5c5SAndroid Build Coastguard Worker         size_t totalCount = 0;
537*8975f5c5SAndroid Build Coastguard Worker         for (size_t mip = 0; mip < kMipCount; ++mip)
538*8975f5c5SAndroid Build Coastguard Worker         {
539*8975f5c5SAndroid Build Coastguard Worker             totalCount += getMipDataSize(mip0Size, mip);
540*8975f5c5SAndroid Build Coastguard Worker         }
541*8975f5c5SAndroid Build Coastguard Worker         return totalCount;
542*8975f5c5SAndroid Build Coastguard Worker     }
543*8975f5c5SAndroid Build Coastguard Worker 
getMipDataOffset(size_t mip0Size,size_t mip)544*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t getMipDataOffset(size_t mip0Size, size_t mip)
545*8975f5c5SAndroid Build Coastguard Worker     {
546*8975f5c5SAndroid Build Coastguard Worker         // This calculates:
547*8975f5c5SAndroid Build Coastguard Worker         //
548*8975f5c5SAndroid Build Coastguard Worker         //     mip == 0: 0
549*8975f5c5SAndroid Build Coastguard Worker         //     o.w.:     sum(0, mip-1) getMipDataSize(i)
550*8975f5c5SAndroid Build Coastguard Worker         //
551*8975f5c5SAndroid Build Coastguard Worker         // The above can be calculated simply as:
552*8975f5c5SAndroid Build Coastguard Worker         //
553*8975f5c5SAndroid Build Coastguard Worker         //     (mip0 >> (kMipCount-1))^2 * (0x55555555 & ((1 << (2*mip)) - 1))
554*8975f5c5SAndroid Build Coastguard Worker         //     \__________  ___________/   \_______________  ________________/
555*8975f5c5SAndroid Build Coastguard Worker         //                \/                               \/
556*8975f5c5SAndroid Build Coastguard Worker         //          last mip size                 sum(0, mip-1) (4^i)
557*8975f5c5SAndroid Build Coastguard Worker         //
558*8975f5c5SAndroid Build Coastguard Worker         // But let's loop explicitly for clarity.
559*8975f5c5SAndroid Build Coastguard Worker         size_t offset = 0;
560*8975f5c5SAndroid Build Coastguard Worker         for (size_t m = 0; m < mip; ++m)
561*8975f5c5SAndroid Build Coastguard Worker         {
562*8975f5c5SAndroid Build Coastguard Worker             offset += getMipDataSize(mip0Size, m);
563*8975f5c5SAndroid Build Coastguard Worker         }
564*8975f5c5SAndroid Build Coastguard Worker         return offset;
565*8975f5c5SAndroid Build Coastguard Worker     }
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker     template <typename colorType = GLColor>
fillMipData(colorType * data,size_t mip0Size,const colorType mipColors[kMipCount])568*8975f5c5SAndroid Build Coastguard Worker     void fillMipData(colorType *data, size_t mip0Size, const colorType mipColors[kMipCount])
569*8975f5c5SAndroid Build Coastguard Worker     {
570*8975f5c5SAndroid Build Coastguard Worker         for (size_t mip = 0; mip < kMipCount; ++mip)
571*8975f5c5SAndroid Build Coastguard Worker         {
572*8975f5c5SAndroid Build Coastguard Worker             size_t offset = getMipDataOffset(mip0Size, mip);
573*8975f5c5SAndroid Build Coastguard Worker             size_t size   = getMipDataSize(mip0Size, mip);
574*8975f5c5SAndroid Build Coastguard Worker             std::fill(data + offset, data + offset + size, mipColors[mip]);
575*8975f5c5SAndroid Build Coastguard Worker         }
576*8975f5c5SAndroid Build Coastguard Worker     }
577*8975f5c5SAndroid Build Coastguard Worker 
initTest(bool immutable)578*8975f5c5SAndroid Build Coastguard Worker     void initTest(bool immutable)
579*8975f5c5SAndroid Build Coastguard Worker     {
580*8975f5c5SAndroid Build Coastguard Worker         // Set up program to sample from specific lod level.
581*8975f5c5SAndroid Build Coastguard Worker         mProgram.makeRaster(essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
582*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mProgram.valid());
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
585*8975f5c5SAndroid Build Coastguard Worker 
586*8975f5c5SAndroid Build Coastguard Worker         mTextureLocation = glGetUniformLocation(mProgram, essl3_shaders::Texture2DUniform());
587*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureLocation);
588*8975f5c5SAndroid Build Coastguard Worker 
589*8975f5c5SAndroid Build Coastguard Worker         mLodLocation = glGetUniformLocation(mProgram, essl3_shaders::LodUniform());
590*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mLodLocation);
591*8975f5c5SAndroid Build Coastguard Worker 
592*8975f5c5SAndroid Build Coastguard Worker         // Set up texture with a handful of lods.
593*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
594*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
595*8975f5c5SAndroid Build Coastguard Worker 
596*8975f5c5SAndroid Build Coastguard Worker         std::array<GLColor, getTotalMipDataSize(kMip0Size)> mipData;
597*8975f5c5SAndroid Build Coastguard Worker         fillMipData(mipData.data(), kMip0Size, kMipColors);
598*8975f5c5SAndroid Build Coastguard Worker 
599*8975f5c5SAndroid Build Coastguard Worker         if (immutable)
600*8975f5c5SAndroid Build Coastguard Worker         {
601*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, kMipCount, GL_RGBA8, kMip0Size, kMip0Size);
602*8975f5c5SAndroid Build Coastguard Worker             for (size_t mip = 0; mip < kMipCount; ++mip)
603*8975f5c5SAndroid Build Coastguard Worker             {
604*8975f5c5SAndroid Build Coastguard Worker                 glTexSubImage2D(GL_TEXTURE_2D, mip, 0, 0, kMip0Size >> mip, kMip0Size >> mip,
605*8975f5c5SAndroid Build Coastguard Worker                                 GL_RGBA, GL_UNSIGNED_BYTE,
606*8975f5c5SAndroid Build Coastguard Worker                                 mipData.data() + getMipDataOffset(kMip0Size, mip));
607*8975f5c5SAndroid Build Coastguard Worker             }
608*8975f5c5SAndroid Build Coastguard Worker         }
609*8975f5c5SAndroid Build Coastguard Worker         else
610*8975f5c5SAndroid Build Coastguard Worker         {
611*8975f5c5SAndroid Build Coastguard Worker             for (size_t mip = 0; mip < kMipCount; ++mip)
612*8975f5c5SAndroid Build Coastguard Worker             {
613*8975f5c5SAndroid Build Coastguard Worker                 glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA8, kMip0Size >> mip, kMip0Size >> mip, 0,
614*8975f5c5SAndroid Build Coastguard Worker                              GL_RGBA, GL_UNSIGNED_BYTE,
615*8975f5c5SAndroid Build Coastguard Worker                              mipData.data() + getMipDataOffset(kMip0Size, mip));
616*8975f5c5SAndroid Build Coastguard Worker             }
617*8975f5c5SAndroid Build Coastguard Worker         }
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
620*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
621*8975f5c5SAndroid Build Coastguard Worker 
622*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
623*8975f5c5SAndroid Build Coastguard Worker     }
624*8975f5c5SAndroid Build Coastguard Worker 
setLodUniform(uint32_t lod)625*8975f5c5SAndroid Build Coastguard Worker     void setLodUniform(uint32_t lod) { glUniform1f(mLodLocation, lod); }
626*8975f5c5SAndroid Build Coastguard Worker 
627*8975f5c5SAndroid Build Coastguard Worker     void testPingPongBaseLevel(bool immutable);
628*8975f5c5SAndroid Build Coastguard Worker     void testGenerateMipmapAfterRebase(bool immutable);
629*8975f5c5SAndroid Build Coastguard Worker 
630*8975f5c5SAndroid Build Coastguard Worker     GLProgram mProgram;
631*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTexture;
632*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureLocation;
633*8975f5c5SAndroid Build Coastguard Worker     GLint mLodLocation;
634*8975f5c5SAndroid Build Coastguard Worker 
635*8975f5c5SAndroid Build Coastguard Worker     const GLColor kMipColors[kMipCount] = {
636*8975f5c5SAndroid Build Coastguard Worker         GLColor::red,
637*8975f5c5SAndroid Build Coastguard Worker         GLColor::green,
638*8975f5c5SAndroid Build Coastguard Worker         GLColor::blue,
639*8975f5c5SAndroid Build Coastguard Worker         GLColor::magenta,
640*8975f5c5SAndroid Build Coastguard Worker     };
641*8975f5c5SAndroid Build Coastguard Worker };
642*8975f5c5SAndroid Build Coastguard Worker 
643*8975f5c5SAndroid Build Coastguard Worker class TextureES31PPO
644*8975f5c5SAndroid Build Coastguard Worker {
645*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureES31PPO()646*8975f5c5SAndroid Build Coastguard Worker     TextureES31PPO() : mVertProg(0), mFragProg(0), mPipeline(0) {}
647*8975f5c5SAndroid Build Coastguard Worker 
get2DTexturedVertexShaderSource()648*8975f5c5SAndroid Build Coastguard Worker     const char *get2DTexturedVertexShaderSource()
649*8975f5c5SAndroid Build Coastguard Worker     {
650*8975f5c5SAndroid Build Coastguard Worker         return "#version 310 es\n"
651*8975f5c5SAndroid Build Coastguard Worker                "precision mediump float;\n"
652*8975f5c5SAndroid Build Coastguard Worker                "in vec2 position;\n"
653*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texCoord;\n"
654*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
655*8975f5c5SAndroid Build Coastguard Worker                "{\n"
656*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position, 0, 1);\n"
657*8975f5c5SAndroid Build Coastguard Worker                "    texCoord = position * 0.5 + vec2(0.5);\n"
658*8975f5c5SAndroid Build Coastguard Worker                "}";
659*8975f5c5SAndroid Build Coastguard Worker     }
660*8975f5c5SAndroid Build Coastguard Worker 
get2DTexturedFragmentShaderSource()661*8975f5c5SAndroid Build Coastguard Worker     const char *get2DTexturedFragmentShaderSource()
662*8975f5c5SAndroid Build Coastguard Worker     {
663*8975f5c5SAndroid Build Coastguard Worker         return "#version 310 es\n"
664*8975f5c5SAndroid Build Coastguard Worker                "precision mediump float;\n"
665*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texCoord;\n"
666*8975f5c5SAndroid Build Coastguard Worker                "uniform sampler2D tex1;\n"
667*8975f5c5SAndroid Build Coastguard Worker                "uniform sampler2D tex2;\n"
668*8975f5c5SAndroid Build Coastguard Worker                "uniform sampler2D tex3;\n"
669*8975f5c5SAndroid Build Coastguard Worker                "uniform sampler2D tex4;\n"
670*8975f5c5SAndroid Build Coastguard Worker                "out vec4 color;\n"
671*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
672*8975f5c5SAndroid Build Coastguard Worker                "{\n"
673*8975f5c5SAndroid Build Coastguard Worker                "    color = (texture(tex1, texCoord) + texture(tex2, texCoord) \n"
674*8975f5c5SAndroid Build Coastguard Worker                "          +  texture(tex3, texCoord) + texture(tex4, texCoord)) * 0.25;\n"
675*8975f5c5SAndroid Build Coastguard Worker                "}";
676*8975f5c5SAndroid Build Coastguard Worker     }
677*8975f5c5SAndroid Build Coastguard Worker 
bindProgramPipeline(const GLchar * vertString,const GLchar * fragString)678*8975f5c5SAndroid Build Coastguard Worker     void bindProgramPipeline(const GLchar *vertString, const GLchar *fragString)
679*8975f5c5SAndroid Build Coastguard Worker     {
680*8975f5c5SAndroid Build Coastguard Worker         mVertProg = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &vertString);
681*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(mVertProg, 0u);
682*8975f5c5SAndroid Build Coastguard Worker         mFragProg = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fragString);
683*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(mFragProg, 0u);
684*8975f5c5SAndroid Build Coastguard Worker 
685*8975f5c5SAndroid Build Coastguard Worker         // Generate a program pipeline and attach the programs to their respective stages
686*8975f5c5SAndroid Build Coastguard Worker         glGenProgramPipelines(1, &mPipeline);
687*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
688*8975f5c5SAndroid Build Coastguard Worker         glUseProgramStages(mPipeline, GL_VERTEX_SHADER_BIT, mVertProg);
689*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
690*8975f5c5SAndroid Build Coastguard Worker         glUseProgramStages(mPipeline, GL_FRAGMENT_SHADER_BIT, mFragProg);
691*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
692*8975f5c5SAndroid Build Coastguard Worker         glBindProgramPipeline(mPipeline);
693*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
694*8975f5c5SAndroid Build Coastguard Worker     }
695*8975f5c5SAndroid Build Coastguard Worker 
bind2DTexturedQuadProgramPipeline()696*8975f5c5SAndroid Build Coastguard Worker     void bind2DTexturedQuadProgramPipeline()
697*8975f5c5SAndroid Build Coastguard Worker     {
698*8975f5c5SAndroid Build Coastguard Worker         const char *vertexShaderSource   = get2DTexturedVertexShaderSource();
699*8975f5c5SAndroid Build Coastguard Worker         const char *fragmentShaderSource = get2DTexturedFragmentShaderSource();
700*8975f5c5SAndroid Build Coastguard Worker 
701*8975f5c5SAndroid Build Coastguard Worker         m2DTexturedQuadVertProg = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &vertexShaderSource);
702*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(m2DTexturedQuadVertProg, 0u);
703*8975f5c5SAndroid Build Coastguard Worker         m2DTexturedQuadFragProg =
704*8975f5c5SAndroid Build Coastguard Worker             glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fragmentShaderSource);
705*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(m2DTexturedQuadFragProg, 0u);
706*8975f5c5SAndroid Build Coastguard Worker 
707*8975f5c5SAndroid Build Coastguard Worker         // Generate a program pipeline and attach the programs to their respective stages
708*8975f5c5SAndroid Build Coastguard Worker         glGenProgramPipelines(1, &m2DTexturedQuadPipeline);
709*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
710*8975f5c5SAndroid Build Coastguard Worker         glUseProgramStages(m2DTexturedQuadPipeline, GL_VERTEX_SHADER_BIT, m2DTexturedQuadVertProg);
711*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
712*8975f5c5SAndroid Build Coastguard Worker         glUseProgramStages(m2DTexturedQuadPipeline, GL_FRAGMENT_SHADER_BIT,
713*8975f5c5SAndroid Build Coastguard Worker                            m2DTexturedQuadFragProg);
714*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
715*8975f5c5SAndroid Build Coastguard Worker         glBindProgramPipeline(m2DTexturedQuadPipeline);
716*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
717*8975f5c5SAndroid Build Coastguard Worker     }
718*8975f5c5SAndroid Build Coastguard Worker 
ppoDrawQuad(std::array<Vector3,6> & quadVertices,const std::string & positionAttribName,const GLfloat positionAttribZ,const GLfloat positionAttribXYScale)719*8975f5c5SAndroid Build Coastguard Worker     void ppoDrawQuad(std::array<Vector3, 6> &quadVertices,
720*8975f5c5SAndroid Build Coastguard Worker                      const std::string &positionAttribName,
721*8975f5c5SAndroid Build Coastguard Worker                      const GLfloat positionAttribZ,
722*8975f5c5SAndroid Build Coastguard Worker                      const GLfloat positionAttribXYScale)
723*8975f5c5SAndroid Build Coastguard Worker     {
724*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(0);
725*8975f5c5SAndroid Build Coastguard Worker 
726*8975f5c5SAndroid Build Coastguard Worker         for (Vector3 &vertex : quadVertices)
727*8975f5c5SAndroid Build Coastguard Worker         {
728*8975f5c5SAndroid Build Coastguard Worker             vertex.x() *= positionAttribXYScale;
729*8975f5c5SAndroid Build Coastguard Worker             vertex.y() *= positionAttribXYScale;
730*8975f5c5SAndroid Build Coastguard Worker             vertex.z() = positionAttribZ;
731*8975f5c5SAndroid Build Coastguard Worker         }
732*8975f5c5SAndroid Build Coastguard Worker 
733*8975f5c5SAndroid Build Coastguard Worker         GLint positionLocation = glGetAttribLocation(mVertProg, positionAttribName.c_str());
734*8975f5c5SAndroid Build Coastguard Worker 
735*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_ARRAY_BUFFER, 0);
736*8975f5c5SAndroid Build Coastguard Worker         glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, quadVertices.data());
737*8975f5c5SAndroid Build Coastguard Worker         glEnableVertexAttribArray(positionLocation);
738*8975f5c5SAndroid Build Coastguard Worker 
739*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
740*8975f5c5SAndroid Build Coastguard Worker 
741*8975f5c5SAndroid Build Coastguard Worker         glDisableVertexAttribArray(positionLocation);
742*8975f5c5SAndroid Build Coastguard Worker         glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
743*8975f5c5SAndroid Build Coastguard Worker     }
744*8975f5c5SAndroid Build Coastguard Worker 
745*8975f5c5SAndroid Build Coastguard Worker     GLuint mVertProg;
746*8975f5c5SAndroid Build Coastguard Worker     GLuint mFragProg;
747*8975f5c5SAndroid Build Coastguard Worker     GLuint mPipeline;
748*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DTexturedQuadVertProg;
749*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DTexturedQuadFragProg;
750*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DTexturedQuadPipeline;
751*8975f5c5SAndroid Build Coastguard Worker };
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestES31PPO : public TextureES31PPO, public Texture2DTest
754*8975f5c5SAndroid Build Coastguard Worker {
755*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DTestES31PPO()756*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestES31PPO() : TextureES31PPO(), Texture2DTest() {}
757*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()758*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override { Texture2DTest::testSetUp(); }
759*8975f5c5SAndroid Build Coastguard Worker };
760*8975f5c5SAndroid Build Coastguard Worker 
761*8975f5c5SAndroid Build Coastguard Worker class Texture2DIntegerAlpha1TestES3 : public Texture2DTest
762*8975f5c5SAndroid Build Coastguard Worker {
763*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DIntegerAlpha1TestES3()764*8975f5c5SAndroid Build Coastguard Worker     Texture2DIntegerAlpha1TestES3() : Texture2DTest() {}
765*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()766*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
767*8975f5c5SAndroid Build Coastguard Worker     {
768*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
769*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
770*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
771*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
772*8975f5c5SAndroid Build Coastguard Worker                "{\n"
773*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
774*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
775*8975f5c5SAndroid Build Coastguard Worker                "}\n";
776*8975f5c5SAndroid Build Coastguard Worker     }
777*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()778*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
779*8975f5c5SAndroid Build Coastguard Worker     {
780*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
781*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
782*8975f5c5SAndroid Build Coastguard Worker                "uniform highp isampler2D tex;\n"
783*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
784*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
785*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
786*8975f5c5SAndroid Build Coastguard Worker                "{\n"
787*8975f5c5SAndroid Build Coastguard Worker                "    vec4 green = vec4(0, 1, 0, 1);\n"
788*8975f5c5SAndroid Build Coastguard Worker                "    vec4 black = vec4(0, 0, 0, 0);\n"
789*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = (texture(tex, texcoord).a == 1) ? green : black;\n"
790*8975f5c5SAndroid Build Coastguard Worker                "}\n";
791*8975f5c5SAndroid Build Coastguard Worker     }
792*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()793*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
794*8975f5c5SAndroid Build Coastguard Worker     {
795*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
796*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
797*8975f5c5SAndroid Build Coastguard Worker     }
798*8975f5c5SAndroid Build Coastguard Worker };
799*8975f5c5SAndroid Build Coastguard Worker 
800*8975f5c5SAndroid Build Coastguard Worker class Texture2DUnsignedIntegerAlpha1TestES3 : public Texture2DTest
801*8975f5c5SAndroid Build Coastguard Worker {
802*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DUnsignedIntegerAlpha1TestES3()803*8975f5c5SAndroid Build Coastguard Worker     Texture2DUnsignedIntegerAlpha1TestES3() : Texture2DTest() {}
804*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()805*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
806*8975f5c5SAndroid Build Coastguard Worker     {
807*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
808*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
809*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
810*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
811*8975f5c5SAndroid Build Coastguard Worker                "{\n"
812*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
813*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
814*8975f5c5SAndroid Build Coastguard Worker                "}\n";
815*8975f5c5SAndroid Build Coastguard Worker     }
816*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()817*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
818*8975f5c5SAndroid Build Coastguard Worker     {
819*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
820*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
821*8975f5c5SAndroid Build Coastguard Worker                "uniform highp usampler2D tex;\n"
822*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
823*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
824*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
825*8975f5c5SAndroid Build Coastguard Worker                "{\n"
826*8975f5c5SAndroid Build Coastguard Worker                "    vec4 green = vec4(0, 1, 0, 1);\n"
827*8975f5c5SAndroid Build Coastguard Worker                "    vec4 black = vec4(0, 0, 0, 0);\n"
828*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = (texture(tex, texcoord).a == 1u) ? green : black;\n"
829*8975f5c5SAndroid Build Coastguard Worker                "}\n";
830*8975f5c5SAndroid Build Coastguard Worker     }
831*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()832*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
833*8975f5c5SAndroid Build Coastguard Worker     {
834*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
835*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
836*8975f5c5SAndroid Build Coastguard Worker     }
837*8975f5c5SAndroid Build Coastguard Worker };
838*8975f5c5SAndroid Build Coastguard Worker 
839*8975f5c5SAndroid Build Coastguard Worker class Texture2DTestWithDrawScale : public Texture2DTest
840*8975f5c5SAndroid Build Coastguard Worker {
841*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DTestWithDrawScale()842*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestWithDrawScale() : Texture2DTest(), mDrawScaleUniformLocation(-1) {}
843*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()844*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
845*8975f5c5SAndroid Build Coastguard Worker     {
846*8975f5c5SAndroid Build Coastguard Worker         return
847*8975f5c5SAndroid Build Coastguard Worker             R"(precision highp float;
848*8975f5c5SAndroid Build Coastguard Worker             attribute vec4 position;
849*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
850*8975f5c5SAndroid Build Coastguard Worker 
851*8975f5c5SAndroid Build Coastguard Worker             uniform vec2 drawScale;
852*8975f5c5SAndroid Build Coastguard Worker 
853*8975f5c5SAndroid Build Coastguard Worker             void main()
854*8975f5c5SAndroid Build Coastguard Worker             {
855*8975f5c5SAndroid Build Coastguard Worker                 gl_Position = vec4(position.xy * drawScale, 0.0, 1.0);
856*8975f5c5SAndroid Build Coastguard Worker                 texcoord = (position.xy * 0.5) + 0.5;
857*8975f5c5SAndroid Build Coastguard Worker             })";
858*8975f5c5SAndroid Build Coastguard Worker     }
859*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()860*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
861*8975f5c5SAndroid Build Coastguard Worker     {
862*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
863*8975f5c5SAndroid Build Coastguard Worker 
864*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
865*8975f5c5SAndroid Build Coastguard Worker 
866*8975f5c5SAndroid Build Coastguard Worker         mDrawScaleUniformLocation = glGetUniformLocation(mProgram, "drawScale");
867*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mDrawScaleUniformLocation);
868*8975f5c5SAndroid Build Coastguard Worker 
869*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
870*8975f5c5SAndroid Build Coastguard Worker         glUniform2f(mDrawScaleUniformLocation, 1.0f, 1.0f);
871*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(0);
872*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
873*8975f5c5SAndroid Build Coastguard Worker     }
874*8975f5c5SAndroid Build Coastguard Worker 
875*8975f5c5SAndroid Build Coastguard Worker     GLint mDrawScaleUniformLocation;
876*8975f5c5SAndroid Build Coastguard Worker };
877*8975f5c5SAndroid Build Coastguard Worker 
878*8975f5c5SAndroid Build Coastguard Worker class Sampler2DAsFunctionParameterTest : public Texture2DTest
879*8975f5c5SAndroid Build Coastguard Worker {
880*8975f5c5SAndroid Build Coastguard Worker   protected:
Sampler2DAsFunctionParameterTest()881*8975f5c5SAndroid Build Coastguard Worker     Sampler2DAsFunctionParameterTest() : Texture2DTest() {}
882*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()883*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
884*8975f5c5SAndroid Build Coastguard Worker     {
885*8975f5c5SAndroid Build Coastguard Worker         return
886*8975f5c5SAndroid Build Coastguard Worker             R"(precision highp float;
887*8975f5c5SAndroid Build Coastguard Worker             uniform sampler2D tex;
888*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
889*8975f5c5SAndroid Build Coastguard Worker 
890*8975f5c5SAndroid Build Coastguard Worker             vec4 computeFragColor(sampler2D aTex)
891*8975f5c5SAndroid Build Coastguard Worker             {
892*8975f5c5SAndroid Build Coastguard Worker                 return texture2D(aTex, texcoord);
893*8975f5c5SAndroid Build Coastguard Worker             }
894*8975f5c5SAndroid Build Coastguard Worker 
895*8975f5c5SAndroid Build Coastguard Worker             void main()
896*8975f5c5SAndroid Build Coastguard Worker             {
897*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor = computeFragColor(tex);
898*8975f5c5SAndroid Build Coastguard Worker             })";
899*8975f5c5SAndroid Build Coastguard Worker     }
900*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()901*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
902*8975f5c5SAndroid Build Coastguard Worker     {
903*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
904*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
905*8975f5c5SAndroid Build Coastguard Worker     }
906*8975f5c5SAndroid Build Coastguard Worker };
907*8975f5c5SAndroid Build Coastguard Worker 
908*8975f5c5SAndroid Build Coastguard Worker class TextureCubeTest : public TexCoordDrawTest
909*8975f5c5SAndroid Build Coastguard Worker {
910*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureCubeTest()911*8975f5c5SAndroid Build Coastguard Worker     TextureCubeTest()
912*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(),
913*8975f5c5SAndroid Build Coastguard Worker           mTexture2D(0),
914*8975f5c5SAndroid Build Coastguard Worker           mTextureCube(0),
915*8975f5c5SAndroid Build Coastguard Worker           mTexture2DUniformLocation(-1),
916*8975f5c5SAndroid Build Coastguard Worker           mTextureCubeUniformLocation(-1)
917*8975f5c5SAndroid Build Coastguard Worker     {}
918*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()919*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
920*8975f5c5SAndroid Build Coastguard Worker     {
921*8975f5c5SAndroid Build Coastguard Worker         return
922*8975f5c5SAndroid Build Coastguard Worker             R"(precision highp float;
923*8975f5c5SAndroid Build Coastguard Worker             uniform sampler2D tex2D;
924*8975f5c5SAndroid Build Coastguard Worker             uniform samplerCube texCube;
925*8975f5c5SAndroid Build Coastguard Worker             uniform int cubeFace;
926*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
927*8975f5c5SAndroid Build Coastguard Worker 
928*8975f5c5SAndroid Build Coastguard Worker             void main()
929*8975f5c5SAndroid Build Coastguard Worker             {
930*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor = texture2D(tex2D, texcoord);
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker                 vec2 scaled = vec2(1) - vec2(2) * texcoord.xy;
933*8975f5c5SAndroid Build Coastguard Worker                 vec3 cubecoord = vec3(1, scaled.xy);
934*8975f5c5SAndroid Build Coastguard Worker                 if (cubeFace == 1)
935*8975f5c5SAndroid Build Coastguard Worker                     cubecoord = vec3(-1, scaled.xy);
936*8975f5c5SAndroid Build Coastguard Worker                 else if (cubeFace == 2)
937*8975f5c5SAndroid Build Coastguard Worker                     cubecoord = vec3(scaled.x, 1, scaled.y);
938*8975f5c5SAndroid Build Coastguard Worker                 else if (cubeFace == 3)
939*8975f5c5SAndroid Build Coastguard Worker                     cubecoord = vec3(scaled.x, -1, scaled.y);
940*8975f5c5SAndroid Build Coastguard Worker                 else if (cubeFace == 4)
941*8975f5c5SAndroid Build Coastguard Worker                     cubecoord = vec3(scaled.xy, 1);
942*8975f5c5SAndroid Build Coastguard Worker                 else if (cubeFace == 5)
943*8975f5c5SAndroid Build Coastguard Worker                     cubecoord = vec3(scaled.xy, -1);
944*8975f5c5SAndroid Build Coastguard Worker 
945*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor += textureCube(texCube, cubecoord);
946*8975f5c5SAndroid Build Coastguard Worker             })";
947*8975f5c5SAndroid Build Coastguard Worker     }
948*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()949*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
950*8975f5c5SAndroid Build Coastguard Worker     {
951*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
952*8975f5c5SAndroid Build Coastguard Worker 
953*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureCube);
954*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
955*8975f5c5SAndroid Build Coastguard Worker         for (GLenum face = 0; face < 6; face++)
956*8975f5c5SAndroid Build Coastguard Worker         {
957*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, 1, 1, 0, GL_RGBA,
958*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, nullptr);
959*8975f5c5SAndroid Build Coastguard Worker         }
960*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
961*8975f5c5SAndroid Build Coastguard Worker 
962*8975f5c5SAndroid Build Coastguard Worker         mTexture2D = create2DTexture();
963*8975f5c5SAndroid Build Coastguard Worker 
964*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
965*8975f5c5SAndroid Build Coastguard Worker 
966*8975f5c5SAndroid Build Coastguard Worker         mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D");
967*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture2DUniformLocation);
968*8975f5c5SAndroid Build Coastguard Worker         mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
969*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureCubeUniformLocation);
970*8975f5c5SAndroid Build Coastguard Worker         mTextureCubeFaceUniformLocation = glGetUniformLocation(mProgram, "cubeFace");
971*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureCubeFaceUniformLocation);
972*8975f5c5SAndroid Build Coastguard Worker     }
973*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()974*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
975*8975f5c5SAndroid Build Coastguard Worker     {
976*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureCube);
977*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
978*8975f5c5SAndroid Build Coastguard Worker     }
979*8975f5c5SAndroid Build Coastguard Worker 
980*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2D;
981*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureCube;
982*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture2DUniformLocation;
983*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureCubeUniformLocation;
984*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureCubeFaceUniformLocation;
985*8975f5c5SAndroid Build Coastguard Worker };
986*8975f5c5SAndroid Build Coastguard Worker 
987*8975f5c5SAndroid Build Coastguard Worker class TextureCubeTestES3 : public TextureCubeTest
988*8975f5c5SAndroid Build Coastguard Worker {
989*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureCubeTestES3()990*8975f5c5SAndroid Build Coastguard Worker     TextureCubeTestES3() {}
991*8975f5c5SAndroid Build Coastguard Worker };
992*8975f5c5SAndroid Build Coastguard Worker 
993*8975f5c5SAndroid Build Coastguard Worker class TextureCubeTestES32 : public TextureCubeTest
994*8975f5c5SAndroid Build Coastguard Worker {
995*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureCubeTestES32()996*8975f5c5SAndroid Build Coastguard Worker     TextureCubeTestES32() {}
997*8975f5c5SAndroid Build Coastguard Worker };
998*8975f5c5SAndroid Build Coastguard Worker 
999*8975f5c5SAndroid Build Coastguard Worker class SamplerArrayTest : public TexCoordDrawTest
1000*8975f5c5SAndroid Build Coastguard Worker {
1001*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerArrayTest()1002*8975f5c5SAndroid Build Coastguard Worker     SamplerArrayTest()
1003*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(),
1004*8975f5c5SAndroid Build Coastguard Worker           mTexture2DA(0),
1005*8975f5c5SAndroid Build Coastguard Worker           mTexture2DB(0),
1006*8975f5c5SAndroid Build Coastguard Worker           mTexture0UniformLocation(-1),
1007*8975f5c5SAndroid Build Coastguard Worker           mTexture1UniformLocation(-1)
1008*8975f5c5SAndroid Build Coastguard Worker     {}
1009*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1010*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1011*8975f5c5SAndroid Build Coastguard Worker     {
1012*8975f5c5SAndroid Build Coastguard Worker         return
1013*8975f5c5SAndroid Build Coastguard Worker             R"(precision mediump float;
1014*8975f5c5SAndroid Build Coastguard Worker             uniform highp sampler2D tex2DArray[2];
1015*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
1016*8975f5c5SAndroid Build Coastguard Worker             void main()
1017*8975f5c5SAndroid Build Coastguard Worker             {
1018*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor = texture2D(tex2DArray[0], texcoord);
1019*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor += texture2D(tex2DArray[1], texcoord);
1020*8975f5c5SAndroid Build Coastguard Worker             })";
1021*8975f5c5SAndroid Build Coastguard Worker     }
1022*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1023*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1024*8975f5c5SAndroid Build Coastguard Worker     {
1025*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1026*8975f5c5SAndroid Build Coastguard Worker 
1027*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1028*8975f5c5SAndroid Build Coastguard Worker 
1029*8975f5c5SAndroid Build Coastguard Worker         mTexture0UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[0]");
1030*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture0UniformLocation);
1031*8975f5c5SAndroid Build Coastguard Worker         mTexture1UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[1]");
1032*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture1UniformLocation);
1033*8975f5c5SAndroid Build Coastguard Worker 
1034*8975f5c5SAndroid Build Coastguard Worker         mTexture2DA = create2DTexture();
1035*8975f5c5SAndroid Build Coastguard Worker         mTexture2DB = create2DTexture();
1036*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1037*8975f5c5SAndroid Build Coastguard Worker     }
1038*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1039*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1040*8975f5c5SAndroid Build Coastguard Worker     {
1041*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2DA);
1042*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2DB);
1043*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1044*8975f5c5SAndroid Build Coastguard Worker     }
1045*8975f5c5SAndroid Build Coastguard Worker 
testSamplerArrayDraw()1046*8975f5c5SAndroid Build Coastguard Worker     void testSamplerArrayDraw()
1047*8975f5c5SAndroid Build Coastguard Worker     {
1048*8975f5c5SAndroid Build Coastguard Worker         GLubyte texData[4];
1049*8975f5c5SAndroid Build Coastguard Worker         texData[0] = 0;
1050*8975f5c5SAndroid Build Coastguard Worker         texData[1] = 60;
1051*8975f5c5SAndroid Build Coastguard Worker         texData[2] = 0;
1052*8975f5c5SAndroid Build Coastguard Worker         texData[3] = 255;
1053*8975f5c5SAndroid Build Coastguard Worker 
1054*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
1055*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2DA);
1056*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
1057*8975f5c5SAndroid Build Coastguard Worker 
1058*8975f5c5SAndroid Build Coastguard Worker         texData[1] = 120;
1059*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE1);
1060*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2DB);
1061*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
1062*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_NO_ERROR);
1063*8975f5c5SAndroid Build Coastguard Worker 
1064*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
1065*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTexture0UniformLocation, 0);
1066*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTexture1UniformLocation, 1);
1067*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
1068*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
1069*8975f5c5SAndroid Build Coastguard Worker 
1070*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, 0, 180, 0, 255, 2);
1071*8975f5c5SAndroid Build Coastguard Worker     }
1072*8975f5c5SAndroid Build Coastguard Worker 
1073*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2DA;
1074*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2DB;
1075*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture0UniformLocation;
1076*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture1UniformLocation;
1077*8975f5c5SAndroid Build Coastguard Worker };
1078*8975f5c5SAndroid Build Coastguard Worker 
1079*8975f5c5SAndroid Build Coastguard Worker class SamplerArrayAsFunctionParameterTest : public SamplerArrayTest
1080*8975f5c5SAndroid Build Coastguard Worker {
1081*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerArrayAsFunctionParameterTest()1082*8975f5c5SAndroid Build Coastguard Worker     SamplerArrayAsFunctionParameterTest() : SamplerArrayTest() {}
1083*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1084*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1085*8975f5c5SAndroid Build Coastguard Worker     {
1086*8975f5c5SAndroid Build Coastguard Worker         return
1087*8975f5c5SAndroid Build Coastguard Worker             R"(precision mediump float;
1088*8975f5c5SAndroid Build Coastguard Worker             uniform highp sampler2D tex2DArray[2];
1089*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
1090*8975f5c5SAndroid Build Coastguard Worker 
1091*8975f5c5SAndroid Build Coastguard Worker             vec4 computeFragColor(highp sampler2D aTex2DArray[2])
1092*8975f5c5SAndroid Build Coastguard Worker             {
1093*8975f5c5SAndroid Build Coastguard Worker                 return texture2D(aTex2DArray[0], texcoord) + texture2D(aTex2DArray[1], texcoord);
1094*8975f5c5SAndroid Build Coastguard Worker             }
1095*8975f5c5SAndroid Build Coastguard Worker 
1096*8975f5c5SAndroid Build Coastguard Worker             void main()
1097*8975f5c5SAndroid Build Coastguard Worker             {
1098*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor = computeFragColor(tex2DArray);
1099*8975f5c5SAndroid Build Coastguard Worker             })";
1100*8975f5c5SAndroid Build Coastguard Worker     }
1101*8975f5c5SAndroid Build Coastguard Worker };
1102*8975f5c5SAndroid Build Coastguard Worker 
1103*8975f5c5SAndroid Build Coastguard Worker class Texture2DArrayTestES3 : public TexCoordDrawTest
1104*8975f5c5SAndroid Build Coastguard Worker {
1105*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DArrayTestES3()1106*8975f5c5SAndroid Build Coastguard Worker     Texture2DArrayTestES3()
1107*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(),
1108*8975f5c5SAndroid Build Coastguard Worker           m2DArrayTexture(0),
1109*8975f5c5SAndroid Build Coastguard Worker           mTextureArrayLocation(-1),
1110*8975f5c5SAndroid Build Coastguard Worker           mTextureArraySliceUniformLocation(-1)
1111*8975f5c5SAndroid Build Coastguard Worker     {}
1112*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1113*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1114*8975f5c5SAndroid Build Coastguard Worker     {
1115*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
1116*8975f5c5SAndroid Build Coastguard Worker out vec2 texcoord;
1117*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
1118*8975f5c5SAndroid Build Coastguard Worker void main()
1119*8975f5c5SAndroid Build Coastguard Worker {
1120*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
1121*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
1122*8975f5c5SAndroid Build Coastguard Worker })";
1123*8975f5c5SAndroid Build Coastguard Worker     }
1124*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1125*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1126*8975f5c5SAndroid Build Coastguard Worker     {
1127*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
1128*8975f5c5SAndroid Build Coastguard Worker precision highp float;
1129*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DArray tex2DArray;
1130*8975f5c5SAndroid Build Coastguard Worker uniform int slice;
1131*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
1132*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
1133*8975f5c5SAndroid Build Coastguard Worker void main()
1134*8975f5c5SAndroid Build Coastguard Worker {
1135*8975f5c5SAndroid Build Coastguard Worker     fragColor = texture(tex2DArray, vec3(texcoord, float(slice)));
1136*8975f5c5SAndroid Build Coastguard Worker })";
1137*8975f5c5SAndroid Build Coastguard Worker     }
1138*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1139*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1140*8975f5c5SAndroid Build Coastguard Worker     {
1141*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1142*8975f5c5SAndroid Build Coastguard Worker 
1143*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1144*8975f5c5SAndroid Build Coastguard Worker 
1145*8975f5c5SAndroid Build Coastguard Worker         mTextureArrayLocation = glGetUniformLocation(mProgram, "tex2DArray");
1146*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureArrayLocation);
1147*8975f5c5SAndroid Build Coastguard Worker 
1148*8975f5c5SAndroid Build Coastguard Worker         mTextureArraySliceUniformLocation = glGetUniformLocation(mProgram, "slice");
1149*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureArraySliceUniformLocation);
1150*8975f5c5SAndroid Build Coastguard Worker 
1151*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &m2DArrayTexture);
1152*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1153*8975f5c5SAndroid Build Coastguard Worker     }
1154*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1155*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1156*8975f5c5SAndroid Build Coastguard Worker     {
1157*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &m2DArrayTexture);
1158*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1159*8975f5c5SAndroid Build Coastguard Worker     }
1160*8975f5c5SAndroid Build Coastguard Worker 
1161*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DArrayTexture;
1162*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureArrayLocation;
1163*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureArraySliceUniformLocation;
1164*8975f5c5SAndroid Build Coastguard Worker };
1165*8975f5c5SAndroid Build Coastguard Worker 
1166*8975f5c5SAndroid Build Coastguard Worker class TextureSizeTextureArrayTest : public TexCoordDrawTest
1167*8975f5c5SAndroid Build Coastguard Worker {
1168*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureSizeTextureArrayTest()1169*8975f5c5SAndroid Build Coastguard Worker     TextureSizeTextureArrayTest()
1170*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(),
1171*8975f5c5SAndroid Build Coastguard Worker           mTexture2DA(0),
1172*8975f5c5SAndroid Build Coastguard Worker           mTexture2DB(0),
1173*8975f5c5SAndroid Build Coastguard Worker           mTexture0Location(-1),
1174*8975f5c5SAndroid Build Coastguard Worker           mTexture1Location(-1)
1175*8975f5c5SAndroid Build Coastguard Worker     {}
1176*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1177*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override { return essl3_shaders::vs::Simple(); }
1178*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1179*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1180*8975f5c5SAndroid Build Coastguard Worker     {
1181*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1182*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1183*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler2D tex2DArray[2];\n"
1184*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1185*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1186*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1187*8975f5c5SAndroid Build Coastguard Worker                "    float red = float(textureSize(tex2DArray[0], 0).x) / 255.0;\n"
1188*8975f5c5SAndroid Build Coastguard Worker                "    float green = float(textureSize(tex2DArray[1], 0).x) / 255.0;\n"
1189*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(red, green, 0.0, 1.0);\n"
1190*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1191*8975f5c5SAndroid Build Coastguard Worker     }
1192*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1193*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1194*8975f5c5SAndroid Build Coastguard Worker     {
1195*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1196*8975f5c5SAndroid Build Coastguard Worker 
1197*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1198*8975f5c5SAndroid Build Coastguard Worker 
1199*8975f5c5SAndroid Build Coastguard Worker         mTexture0Location = glGetUniformLocation(mProgram, "tex2DArray[0]");
1200*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture0Location);
1201*8975f5c5SAndroid Build Coastguard Worker         mTexture1Location = glGetUniformLocation(mProgram, "tex2DArray[1]");
1202*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture1Location);
1203*8975f5c5SAndroid Build Coastguard Worker 
1204*8975f5c5SAndroid Build Coastguard Worker         mTexture2DA = create2DTexture();
1205*8975f5c5SAndroid Build Coastguard Worker         mTexture2DB = create2DTexture();
1206*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1207*8975f5c5SAndroid Build Coastguard Worker     }
1208*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1209*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1210*8975f5c5SAndroid Build Coastguard Worker     {
1211*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2DA);
1212*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2DB);
1213*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1214*8975f5c5SAndroid Build Coastguard Worker     }
1215*8975f5c5SAndroid Build Coastguard Worker 
1216*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2DA;
1217*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2DB;
1218*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture0Location;
1219*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture1Location;
1220*8975f5c5SAndroid Build Coastguard Worker };
1221*8975f5c5SAndroid Build Coastguard Worker 
1222*8975f5c5SAndroid Build Coastguard Worker // Test for GL_OES_texture_3D extension
1223*8975f5c5SAndroid Build Coastguard Worker class Texture3DTestES2 : public TexCoordDrawTest
1224*8975f5c5SAndroid Build Coastguard Worker {
1225*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture3DTestES2()1226*8975f5c5SAndroid Build Coastguard Worker     Texture3DTestES2() : TexCoordDrawTest(), mTexture3D(0), mTexture3DUniformLocation(-1) {}
1227*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1228*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1229*8975f5c5SAndroid Build Coastguard Worker     {
1230*8975f5c5SAndroid Build Coastguard Worker         return "#version 100\n"
1231*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1232*8975f5c5SAndroid Build Coastguard Worker                "attribute vec4 position;\n"
1233*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1234*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1235*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1236*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
1237*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1238*8975f5c5SAndroid Build Coastguard Worker     }
1239*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1240*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1241*8975f5c5SAndroid Build Coastguard Worker     {
1242*8975f5c5SAndroid Build Coastguard Worker         if (!hasTexture3DExt())
1243*8975f5c5SAndroid Build Coastguard Worker         {
1244*8975f5c5SAndroid Build Coastguard Worker             return "#version 100\n"
1245*8975f5c5SAndroid Build Coastguard Worker                    "precision highp float;\n"
1246*8975f5c5SAndroid Build Coastguard Worker                    "varying vec2 texcoord;\n"
1247*8975f5c5SAndroid Build Coastguard Worker                    "void main()\n"
1248*8975f5c5SAndroid Build Coastguard Worker                    "{\n"
1249*8975f5c5SAndroid Build Coastguard Worker                    "    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
1250*8975f5c5SAndroid Build Coastguard Worker                    "}\n";
1251*8975f5c5SAndroid Build Coastguard Worker         }
1252*8975f5c5SAndroid Build Coastguard Worker         return "#version 100\n"
1253*8975f5c5SAndroid Build Coastguard Worker                "#extension GL_OES_texture_3D : enable\n"
1254*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1255*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler3D tex3D;\n"
1256*8975f5c5SAndroid Build Coastguard Worker                "uniform highp float level;\n"
1257*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1258*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1259*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1260*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = texture3DLod(tex3D, vec3(texcoord, 0.0), level);\n"
1261*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1262*8975f5c5SAndroid Build Coastguard Worker     }
1263*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1264*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1265*8975f5c5SAndroid Build Coastguard Worker     {
1266*8975f5c5SAndroid Build Coastguard Worker         // http://anglebug.com/42264265
1267*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(IsOzone());
1268*8975f5c5SAndroid Build Coastguard Worker 
1269*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1270*8975f5c5SAndroid Build Coastguard Worker 
1271*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture3D);
1272*8975f5c5SAndroid Build Coastguard Worker 
1273*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1274*8975f5c5SAndroid Build Coastguard Worker 
1275*8975f5c5SAndroid Build Coastguard Worker         mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D");
1276*8975f5c5SAndroid Build Coastguard Worker         if (hasTexture3DExt())
1277*8975f5c5SAndroid Build Coastguard Worker         {
1278*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(-1, mTexture3DUniformLocation);
1279*8975f5c5SAndroid Build Coastguard Worker         }
1280*8975f5c5SAndroid Build Coastguard Worker     }
1281*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1282*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1283*8975f5c5SAndroid Build Coastguard Worker     {
1284*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture3D);
1285*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1286*8975f5c5SAndroid Build Coastguard Worker     }
1287*8975f5c5SAndroid Build Coastguard Worker 
hasTexture3DExt() const1288*8975f5c5SAndroid Build Coastguard Worker     bool hasTexture3DExt() const
1289*8975f5c5SAndroid Build Coastguard Worker     {
1290*8975f5c5SAndroid Build Coastguard Worker         // http://anglebug.com/42263501
1291*8975f5c5SAndroid Build Coastguard Worker         if ((IsPixel2() || IsNexus5X()) && IsOpenGLES())
1292*8975f5c5SAndroid Build Coastguard Worker         {
1293*8975f5c5SAndroid Build Coastguard Worker             return false;
1294*8975f5c5SAndroid Build Coastguard Worker         }
1295*8975f5c5SAndroid Build Coastguard Worker         return IsGLExtensionEnabled("GL_OES_texture_3D");
1296*8975f5c5SAndroid Build Coastguard Worker     }
1297*8975f5c5SAndroid Build Coastguard Worker 
1298*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture3D;
1299*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture3DUniformLocation;
1300*8975f5c5SAndroid Build Coastguard Worker };
1301*8975f5c5SAndroid Build Coastguard Worker 
1302*8975f5c5SAndroid Build Coastguard Worker class Texture3DTestES3 : public Texture3DTestES2
1303*8975f5c5SAndroid Build Coastguard Worker {
1304*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture3DTestES3()1305*8975f5c5SAndroid Build Coastguard Worker     Texture3DTestES3() : Texture3DTestES2() {}
1306*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1307*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1308*8975f5c5SAndroid Build Coastguard Worker     {
1309*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1310*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1311*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1312*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1313*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1314*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1315*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
1316*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1317*8975f5c5SAndroid Build Coastguard Worker     }
1318*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1319*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1320*8975f5c5SAndroid Build Coastguard Worker     {
1321*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1322*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1323*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler3D tex3D;\n"
1324*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1325*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1326*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1327*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1328*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = texture(tex3D, vec3(texcoord, 0.0));\n"
1329*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1330*8975f5c5SAndroid Build Coastguard Worker     }
1331*8975f5c5SAndroid Build Coastguard Worker };
1332*8975f5c5SAndroid Build Coastguard Worker 
1333*8975f5c5SAndroid Build Coastguard Worker class ShadowSamplerPlusSampler3DTestES3 : public TexCoordDrawTest
1334*8975f5c5SAndroid Build Coastguard Worker {
1335*8975f5c5SAndroid Build Coastguard Worker   protected:
ShadowSamplerPlusSampler3DTestES3()1336*8975f5c5SAndroid Build Coastguard Worker     ShadowSamplerPlusSampler3DTestES3()
1337*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(),
1338*8975f5c5SAndroid Build Coastguard Worker           mTextureShadow(0),
1339*8975f5c5SAndroid Build Coastguard Worker           mTexture3D(0),
1340*8975f5c5SAndroid Build Coastguard Worker           mTextureShadowUniformLocation(-1),
1341*8975f5c5SAndroid Build Coastguard Worker           mTexture3DUniformLocation(-1),
1342*8975f5c5SAndroid Build Coastguard Worker           mDepthRefUniformLocation(-1)
1343*8975f5c5SAndroid Build Coastguard Worker     {}
1344*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1345*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1346*8975f5c5SAndroid Build Coastguard Worker     {
1347*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1348*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1349*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1350*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1351*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1352*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1353*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
1354*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1355*8975f5c5SAndroid Build Coastguard Worker     }
1356*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1357*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1358*8975f5c5SAndroid Build Coastguard Worker     {
1359*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1360*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1361*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler2DShadow tex2DShadow;\n"
1362*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler3D tex3D;\n"
1363*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1364*8975f5c5SAndroid Build Coastguard Worker                "uniform float depthRef;\n"
1365*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1366*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1367*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1368*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(texture(tex2DShadow, vec3(texcoord, depthRef)) * 0.5);\n"
1369*8975f5c5SAndroid Build Coastguard Worker                "    fragColor += texture(tex3D, vec3(texcoord, 0.0));\n"
1370*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1371*8975f5c5SAndroid Build Coastguard Worker     }
1372*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1373*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1374*8975f5c5SAndroid Build Coastguard Worker     {
1375*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1376*8975f5c5SAndroid Build Coastguard Worker 
1377*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture3D);
1378*8975f5c5SAndroid Build Coastguard Worker 
1379*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureShadow);
1380*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextureShadow);
1381*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1382*8975f5c5SAndroid Build Coastguard Worker 
1383*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1384*8975f5c5SAndroid Build Coastguard Worker 
1385*8975f5c5SAndroid Build Coastguard Worker         mTextureShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow");
1386*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureShadowUniformLocation);
1387*8975f5c5SAndroid Build Coastguard Worker         mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D");
1388*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture3DUniformLocation);
1389*8975f5c5SAndroid Build Coastguard Worker         mDepthRefUniformLocation = glGetUniformLocation(mProgram, "depthRef");
1390*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mDepthRefUniformLocation);
1391*8975f5c5SAndroid Build Coastguard Worker     }
1392*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1393*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1394*8975f5c5SAndroid Build Coastguard Worker     {
1395*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureShadow);
1396*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture3D);
1397*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1398*8975f5c5SAndroid Build Coastguard Worker     }
1399*8975f5c5SAndroid Build Coastguard Worker 
1400*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureShadow;
1401*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture3D;
1402*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureShadowUniformLocation;
1403*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture3DUniformLocation;
1404*8975f5c5SAndroid Build Coastguard Worker     GLint mDepthRefUniformLocation;
1405*8975f5c5SAndroid Build Coastguard Worker };
1406*8975f5c5SAndroid Build Coastguard Worker 
1407*8975f5c5SAndroid Build Coastguard Worker class SamplerTypeMixTestES3 : public TexCoordDrawTest
1408*8975f5c5SAndroid Build Coastguard Worker {
1409*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerTypeMixTestES3()1410*8975f5c5SAndroid Build Coastguard Worker     SamplerTypeMixTestES3()
1411*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(),
1412*8975f5c5SAndroid Build Coastguard Worker           mTexture2D(0),
1413*8975f5c5SAndroid Build Coastguard Worker           mTextureCube(0),
1414*8975f5c5SAndroid Build Coastguard Worker           mTexture2DShadow(0),
1415*8975f5c5SAndroid Build Coastguard Worker           mTextureCubeShadow(0),
1416*8975f5c5SAndroid Build Coastguard Worker           mTexture2DUniformLocation(-1),
1417*8975f5c5SAndroid Build Coastguard Worker           mTextureCubeUniformLocation(-1),
1418*8975f5c5SAndroid Build Coastguard Worker           mTexture2DShadowUniformLocation(-1),
1419*8975f5c5SAndroid Build Coastguard Worker           mTextureCubeShadowUniformLocation(-1),
1420*8975f5c5SAndroid Build Coastguard Worker           mDepthRefUniformLocation(-1)
1421*8975f5c5SAndroid Build Coastguard Worker     {}
1422*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1423*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1424*8975f5c5SAndroid Build Coastguard Worker     {
1425*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1426*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1427*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1428*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1429*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1430*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1431*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
1432*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1433*8975f5c5SAndroid Build Coastguard Worker     }
1434*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1435*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1436*8975f5c5SAndroid Build Coastguard Worker     {
1437*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1438*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1439*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler2D tex2D;\n"
1440*8975f5c5SAndroid Build Coastguard Worker                "uniform highp samplerCube texCube;\n"
1441*8975f5c5SAndroid Build Coastguard Worker                "uniform highp sampler2DShadow tex2DShadow;\n"
1442*8975f5c5SAndroid Build Coastguard Worker                "uniform highp samplerCubeShadow texCubeShadow;\n"
1443*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1444*8975f5c5SAndroid Build Coastguard Worker                "uniform float depthRef;\n"
1445*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1446*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1447*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1448*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = texture(tex2D, texcoord);\n"
1449*8975f5c5SAndroid Build Coastguard Worker                "    fragColor += texture(texCube, vec3(1.0, 0.0, 0.0));\n"
1450*8975f5c5SAndroid Build Coastguard Worker                "    fragColor += vec4(texture(tex2DShadow, vec3(texcoord, depthRef)) * 0.25);\n"
1451*8975f5c5SAndroid Build Coastguard Worker                "    fragColor += vec4(texture(texCubeShadow, vec4(1.0, 0.0, 0.0, depthRef)) * "
1452*8975f5c5SAndroid Build Coastguard Worker                "0.125);\n"
1453*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1454*8975f5c5SAndroid Build Coastguard Worker     }
1455*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1456*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1457*8975f5c5SAndroid Build Coastguard Worker     {
1458*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1459*8975f5c5SAndroid Build Coastguard Worker 
1460*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture2D);
1461*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureCube);
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture2DShadow);
1464*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2DShadow);
1465*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1466*8975f5c5SAndroid Build Coastguard Worker 
1467*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureCubeShadow);
1468*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow);
1469*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1470*8975f5c5SAndroid Build Coastguard Worker 
1471*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1472*8975f5c5SAndroid Build Coastguard Worker 
1473*8975f5c5SAndroid Build Coastguard Worker         mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D");
1474*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture2DUniformLocation);
1475*8975f5c5SAndroid Build Coastguard Worker         mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
1476*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureCubeUniformLocation);
1477*8975f5c5SAndroid Build Coastguard Worker         mTexture2DShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow");
1478*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTexture2DShadowUniformLocation);
1479*8975f5c5SAndroid Build Coastguard Worker         mTextureCubeShadowUniformLocation = glGetUniformLocation(mProgram, "texCubeShadow");
1480*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureCubeShadowUniformLocation);
1481*8975f5c5SAndroid Build Coastguard Worker         mDepthRefUniformLocation = glGetUniformLocation(mProgram, "depthRef");
1482*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mDepthRefUniformLocation);
1483*8975f5c5SAndroid Build Coastguard Worker 
1484*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1485*8975f5c5SAndroid Build Coastguard Worker     }
1486*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1487*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1488*8975f5c5SAndroid Build Coastguard Worker     {
1489*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2D);
1490*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureCube);
1491*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture2DShadow);
1492*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureCubeShadow);
1493*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1494*8975f5c5SAndroid Build Coastguard Worker     }
1495*8975f5c5SAndroid Build Coastguard Worker 
1496*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2D;
1497*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureCube;
1498*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture2DShadow;
1499*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureCubeShadow;
1500*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture2DUniformLocation;
1501*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureCubeUniformLocation;
1502*8975f5c5SAndroid Build Coastguard Worker     GLint mTexture2DShadowUniformLocation;
1503*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureCubeShadowUniformLocation;
1504*8975f5c5SAndroid Build Coastguard Worker     GLint mDepthRefUniformLocation;
1505*8975f5c5SAndroid Build Coastguard Worker };
1506*8975f5c5SAndroid Build Coastguard Worker 
1507*8975f5c5SAndroid Build Coastguard Worker class SamplerInStructTest : public Texture2DTest
1508*8975f5c5SAndroid Build Coastguard Worker {
1509*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerInStructTest()1510*8975f5c5SAndroid Build Coastguard Worker     SamplerInStructTest() : Texture2DTest() {}
1511*8975f5c5SAndroid Build Coastguard Worker 
getTextureUniformName()1512*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureUniformName() override { return "us.tex"; }
1513*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1514*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1515*8975f5c5SAndroid Build Coastguard Worker     {
1516*8975f5c5SAndroid Build Coastguard Worker         return "precision highp float;\n"
1517*8975f5c5SAndroid Build Coastguard Worker                "struct S\n"
1518*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1519*8975f5c5SAndroid Build Coastguard Worker                "    vec4 a;\n"
1520*8975f5c5SAndroid Build Coastguard Worker                "    highp sampler2D tex;\n"
1521*8975f5c5SAndroid Build Coastguard Worker                "};\n"
1522*8975f5c5SAndroid Build Coastguard Worker                "uniform S us;\n"
1523*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1524*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1525*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1526*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = texture2D(us.tex, texcoord + us.a.x);\n"
1527*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1528*8975f5c5SAndroid Build Coastguard Worker     }
1529*8975f5c5SAndroid Build Coastguard Worker 
runSamplerInStructTest()1530*8975f5c5SAndroid Build Coastguard Worker     void runSamplerInStructTest()
1531*8975f5c5SAndroid Build Coastguard Worker     {
1532*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1533*8975f5c5SAndroid Build Coastguard Worker 
1534*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
1535*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
1536*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1537*8975f5c5SAndroid Build Coastguard Worker                      &GLColor::green);
1538*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
1539*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1540*8975f5c5SAndroid Build Coastguard Worker     }
1541*8975f5c5SAndroid Build Coastguard Worker };
1542*8975f5c5SAndroid Build Coastguard Worker 
1543*8975f5c5SAndroid Build Coastguard Worker class SamplerInStructAsFunctionParameterTest : public SamplerInStructTest
1544*8975f5c5SAndroid Build Coastguard Worker {
1545*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerInStructAsFunctionParameterTest()1546*8975f5c5SAndroid Build Coastguard Worker     SamplerInStructAsFunctionParameterTest() : SamplerInStructTest() {}
1547*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1548*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1549*8975f5c5SAndroid Build Coastguard Worker     {
1550*8975f5c5SAndroid Build Coastguard Worker         return "precision highp float;\n"
1551*8975f5c5SAndroid Build Coastguard Worker                "struct S\n"
1552*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1553*8975f5c5SAndroid Build Coastguard Worker                "    vec4 a;\n"
1554*8975f5c5SAndroid Build Coastguard Worker                "    highp sampler2D tex;\n"
1555*8975f5c5SAndroid Build Coastguard Worker                "};\n"
1556*8975f5c5SAndroid Build Coastguard Worker                "uniform S us;\n"
1557*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1558*8975f5c5SAndroid Build Coastguard Worker                "vec4 sampleFrom(S s) {\n"
1559*8975f5c5SAndroid Build Coastguard Worker                "    return texture2D(s.tex, texcoord + s.a.x);\n"
1560*8975f5c5SAndroid Build Coastguard Worker                "}\n"
1561*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1562*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1563*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = sampleFrom(us);\n"
1564*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1565*8975f5c5SAndroid Build Coastguard Worker     }
1566*8975f5c5SAndroid Build Coastguard Worker };
1567*8975f5c5SAndroid Build Coastguard Worker 
1568*8975f5c5SAndroid Build Coastguard Worker class SamplerInStructArrayAsFunctionParameterTest : public SamplerInStructTest
1569*8975f5c5SAndroid Build Coastguard Worker {
1570*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerInStructArrayAsFunctionParameterTest()1571*8975f5c5SAndroid Build Coastguard Worker     SamplerInStructArrayAsFunctionParameterTest() : SamplerInStructTest() {}
1572*8975f5c5SAndroid Build Coastguard Worker 
getTextureUniformName()1573*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureUniformName() override { return "us[0].tex"; }
1574*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1575*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1576*8975f5c5SAndroid Build Coastguard Worker     {
1577*8975f5c5SAndroid Build Coastguard Worker         return "precision highp float;\n"
1578*8975f5c5SAndroid Build Coastguard Worker                "struct S\n"
1579*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1580*8975f5c5SAndroid Build Coastguard Worker                "    vec4 a;\n"
1581*8975f5c5SAndroid Build Coastguard Worker                "    highp sampler2D tex;\n"
1582*8975f5c5SAndroid Build Coastguard Worker                "};\n"
1583*8975f5c5SAndroid Build Coastguard Worker                "uniform S us[1];\n"
1584*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1585*8975f5c5SAndroid Build Coastguard Worker                "vec4 sampleFrom(S s) {\n"
1586*8975f5c5SAndroid Build Coastguard Worker                "    return texture2D(s.tex, texcoord + s.a.x);\n"
1587*8975f5c5SAndroid Build Coastguard Worker                "}\n"
1588*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1589*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1590*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = sampleFrom(us[0]);\n"
1591*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1592*8975f5c5SAndroid Build Coastguard Worker     }
1593*8975f5c5SAndroid Build Coastguard Worker };
1594*8975f5c5SAndroid Build Coastguard Worker 
1595*8975f5c5SAndroid Build Coastguard Worker class SamplerInNestedStructAsFunctionParameterTest : public SamplerInStructTest
1596*8975f5c5SAndroid Build Coastguard Worker {
1597*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerInNestedStructAsFunctionParameterTest()1598*8975f5c5SAndroid Build Coastguard Worker     SamplerInNestedStructAsFunctionParameterTest() : SamplerInStructTest() {}
1599*8975f5c5SAndroid Build Coastguard Worker 
getTextureUniformName()1600*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureUniformName() override { return "us[0].sub.tex"; }
1601*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1602*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1603*8975f5c5SAndroid Build Coastguard Worker     {
1604*8975f5c5SAndroid Build Coastguard Worker         return "precision highp float;\n"
1605*8975f5c5SAndroid Build Coastguard Worker                "struct SUB\n"
1606*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1607*8975f5c5SAndroid Build Coastguard Worker                "    vec4 a;\n"
1608*8975f5c5SAndroid Build Coastguard Worker                "    highp sampler2D tex;\n"
1609*8975f5c5SAndroid Build Coastguard Worker                "};\n"
1610*8975f5c5SAndroid Build Coastguard Worker                "struct S\n"
1611*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1612*8975f5c5SAndroid Build Coastguard Worker                "    SUB sub;\n"
1613*8975f5c5SAndroid Build Coastguard Worker                "};\n"
1614*8975f5c5SAndroid Build Coastguard Worker                "uniform S us[1];\n"
1615*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1616*8975f5c5SAndroid Build Coastguard Worker                "vec4 sampleFrom(SUB s) {\n"
1617*8975f5c5SAndroid Build Coastguard Worker                "    return texture2D(s.tex, texcoord + s.a.x);\n"
1618*8975f5c5SAndroid Build Coastguard Worker                "}\n"
1619*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1620*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1621*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = sampleFrom(us[0].sub);\n"
1622*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1623*8975f5c5SAndroid Build Coastguard Worker     }
1624*8975f5c5SAndroid Build Coastguard Worker };
1625*8975f5c5SAndroid Build Coastguard Worker 
1626*8975f5c5SAndroid Build Coastguard Worker class SamplerInStructAndOtherVariableTest : public SamplerInStructTest
1627*8975f5c5SAndroid Build Coastguard Worker {
1628*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplerInStructAndOtherVariableTest()1629*8975f5c5SAndroid Build Coastguard Worker     SamplerInStructAndOtherVariableTest() : SamplerInStructTest() {}
1630*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1631*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1632*8975f5c5SAndroid Build Coastguard Worker     {
1633*8975f5c5SAndroid Build Coastguard Worker         return "precision highp float;\n"
1634*8975f5c5SAndroid Build Coastguard Worker                "struct S\n"
1635*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1636*8975f5c5SAndroid Build Coastguard Worker                "    vec4 a;\n"
1637*8975f5c5SAndroid Build Coastguard Worker                "    highp sampler2D tex;\n"
1638*8975f5c5SAndroid Build Coastguard Worker                "};\n"
1639*8975f5c5SAndroid Build Coastguard Worker                "uniform S us;\n"
1640*8975f5c5SAndroid Build Coastguard Worker                "uniform float us_tex;\n"
1641*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 texcoord;\n"
1642*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1643*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1644*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = texture2D(us.tex, texcoord + us.a.x + us_tex);\n"
1645*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1646*8975f5c5SAndroid Build Coastguard Worker     }
1647*8975f5c5SAndroid Build Coastguard Worker };
1648*8975f5c5SAndroid Build Coastguard Worker 
1649*8975f5c5SAndroid Build Coastguard Worker class Texture2DIntegerTestES3 : public Texture2DTest
1650*8975f5c5SAndroid Build Coastguard Worker {
1651*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DIntegerTestES3()1652*8975f5c5SAndroid Build Coastguard Worker     Texture2DIntegerTestES3() : Texture2DTest() {}
1653*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1654*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1655*8975f5c5SAndroid Build Coastguard Worker     {
1656*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1657*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1658*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1659*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1660*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1661*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1662*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
1663*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1664*8975f5c5SAndroid Build Coastguard Worker     }
1665*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1666*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1667*8975f5c5SAndroid Build Coastguard Worker     {
1668*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1669*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1670*8975f5c5SAndroid Build Coastguard Worker                "precision highp usampler2D;\n"
1671*8975f5c5SAndroid Build Coastguard Worker                "uniform usampler2D tex;\n"
1672*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1673*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1674*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1675*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1676*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(texture(tex, texcoord))/255.0;\n"
1677*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1678*8975f5c5SAndroid Build Coastguard Worker     }
1679*8975f5c5SAndroid Build Coastguard Worker };
1680*8975f5c5SAndroid Build Coastguard Worker 
1681*8975f5c5SAndroid Build Coastguard Worker class TextureCubeIntegerTestES3 : public TexCoordDrawTest
1682*8975f5c5SAndroid Build Coastguard Worker {
1683*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureCubeIntegerTestES3()1684*8975f5c5SAndroid Build Coastguard Worker     TextureCubeIntegerTestES3()
1685*8975f5c5SAndroid Build Coastguard Worker         : TexCoordDrawTest(), mTextureCube(0), mTextureCubeUniformLocation(-1)
1686*8975f5c5SAndroid Build Coastguard Worker     {}
1687*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1688*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1689*8975f5c5SAndroid Build Coastguard Worker     {
1690*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1691*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1692*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1693*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1694*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1695*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1696*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = 0.5*position.xy;\n"
1697*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1698*8975f5c5SAndroid Build Coastguard Worker     }
1699*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1700*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1701*8975f5c5SAndroid Build Coastguard Worker     {
1702*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1703*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1704*8975f5c5SAndroid Build Coastguard Worker                "precision highp usamplerCube;\n"
1705*8975f5c5SAndroid Build Coastguard Worker                "uniform usamplerCube texCube;\n"
1706*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1707*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1708*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1709*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1710*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(texture(texCube, vec3(texcoord, 1)))/255.0;\n"
1711*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1712*8975f5c5SAndroid Build Coastguard Worker     }
1713*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1714*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1715*8975f5c5SAndroid Build Coastguard Worker     {
1716*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1717*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTextureCube);
1718*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1719*8975f5c5SAndroid Build Coastguard Worker 
1720*8975f5c5SAndroid Build Coastguard Worker         mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
1721*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mTextureCubeUniformLocation);
1722*8975f5c5SAndroid Build Coastguard Worker     }
1723*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1724*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1725*8975f5c5SAndroid Build Coastguard Worker     {
1726*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTextureCube);
1727*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testTearDown();
1728*8975f5c5SAndroid Build Coastguard Worker     }
1729*8975f5c5SAndroid Build Coastguard Worker 
1730*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureCube;
1731*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureCubeUniformLocation;
1732*8975f5c5SAndroid Build Coastguard Worker };
1733*8975f5c5SAndroid Build Coastguard Worker 
1734*8975f5c5SAndroid Build Coastguard Worker class TextureCubeIntegerEdgeTestES3 : public TextureCubeIntegerTestES3
1735*8975f5c5SAndroid Build Coastguard Worker {
1736*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureCubeIntegerEdgeTestES3()1737*8975f5c5SAndroid Build Coastguard Worker     TextureCubeIntegerEdgeTestES3() : TextureCubeIntegerTestES3() {}
1738*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1739*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1740*8975f5c5SAndroid Build Coastguard Worker     {
1741*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1742*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1743*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1744*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1745*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1746*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1747*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = position.xy;\n"
1748*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1749*8975f5c5SAndroid Build Coastguard Worker     }
1750*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1751*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1752*8975f5c5SAndroid Build Coastguard Worker     {
1753*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1754*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1755*8975f5c5SAndroid Build Coastguard Worker                "precision highp usamplerCube;\n"
1756*8975f5c5SAndroid Build Coastguard Worker                "uniform usamplerCube texCube;\n"
1757*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1758*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1759*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1760*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1761*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(texture(texCube, vec3(texcoord, 0)))/255.0;\n"
1762*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1763*8975f5c5SAndroid Build Coastguard Worker     }
1764*8975f5c5SAndroid Build Coastguard Worker };
1765*8975f5c5SAndroid Build Coastguard Worker 
1766*8975f5c5SAndroid Build Coastguard Worker class Texture2DIntegerProjectiveOffsetTestES3 : public Texture2DTest
1767*8975f5c5SAndroid Build Coastguard Worker {
1768*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DIntegerProjectiveOffsetTestES3()1769*8975f5c5SAndroid Build Coastguard Worker     Texture2DIntegerProjectiveOffsetTestES3() : Texture2DTest() {}
1770*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1771*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1772*8975f5c5SAndroid Build Coastguard Worker     {
1773*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1774*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1775*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1776*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1777*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1778*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1779*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = 0.5*position.xy + vec2(0.5, 0.5);\n"
1780*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1781*8975f5c5SAndroid Build Coastguard Worker     }
1782*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1783*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1784*8975f5c5SAndroid Build Coastguard Worker     {
1785*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1786*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1787*8975f5c5SAndroid Build Coastguard Worker                "precision highp usampler2D;\n"
1788*8975f5c5SAndroid Build Coastguard Worker                "uniform usampler2D tex;\n"
1789*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1790*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1791*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1792*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1793*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(textureProjOffset(tex, vec3(texcoord, 1), ivec2(0,0), "
1794*8975f5c5SAndroid Build Coastguard Worker                "0.0))/255.0;\n"
1795*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1796*8975f5c5SAndroid Build Coastguard Worker     }
1797*8975f5c5SAndroid Build Coastguard Worker };
1798*8975f5c5SAndroid Build Coastguard Worker 
1799*8975f5c5SAndroid Build Coastguard Worker class Texture2DArrayIntegerTestES3 : public Texture2DArrayTestES3
1800*8975f5c5SAndroid Build Coastguard Worker {
1801*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DArrayIntegerTestES3()1802*8975f5c5SAndroid Build Coastguard Worker     Texture2DArrayIntegerTestES3() : Texture2DArrayTestES3() {}
1803*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1804*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1805*8975f5c5SAndroid Build Coastguard Worker     {
1806*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
1807*8975f5c5SAndroid Build Coastguard Worker out vec2 texcoord;
1808*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
1809*8975f5c5SAndroid Build Coastguard Worker void main()
1810*8975f5c5SAndroid Build Coastguard Worker {
1811*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
1812*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
1813*8975f5c5SAndroid Build Coastguard Worker })";
1814*8975f5c5SAndroid Build Coastguard Worker     }
1815*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1816*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1817*8975f5c5SAndroid Build Coastguard Worker     {
1818*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
1819*8975f5c5SAndroid Build Coastguard Worker precision highp float;
1820*8975f5c5SAndroid Build Coastguard Worker uniform highp usampler2DArray tex2DArray;
1821*8975f5c5SAndroid Build Coastguard Worker uniform int slice;
1822*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
1823*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
1824*8975f5c5SAndroid Build Coastguard Worker void main()
1825*8975f5c5SAndroid Build Coastguard Worker {
1826*8975f5c5SAndroid Build Coastguard Worker     fragColor = vec4(texture(tex2DArray, vec3(texcoord, slice)))/255.0;
1827*8975f5c5SAndroid Build Coastguard Worker })";
1828*8975f5c5SAndroid Build Coastguard Worker     }
1829*8975f5c5SAndroid Build Coastguard Worker };
1830*8975f5c5SAndroid Build Coastguard Worker 
1831*8975f5c5SAndroid Build Coastguard Worker class Texture3DIntegerTestES3 : public Texture3DTestES3
1832*8975f5c5SAndroid Build Coastguard Worker {
1833*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture3DIntegerTestES3()1834*8975f5c5SAndroid Build Coastguard Worker     Texture3DIntegerTestES3() : Texture3DTestES3() {}
1835*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()1836*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
1837*8975f5c5SAndroid Build Coastguard Worker     {
1838*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1839*8975f5c5SAndroid Build Coastguard Worker                "out vec2 texcoord;\n"
1840*8975f5c5SAndroid Build Coastguard Worker                "in vec4 position;\n"
1841*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1842*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1843*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1844*8975f5c5SAndroid Build Coastguard Worker                "    texcoord = (position.xy * 0.5) + 0.5;\n"
1845*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1846*8975f5c5SAndroid Build Coastguard Worker     }
1847*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()1848*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
1849*8975f5c5SAndroid Build Coastguard Worker     {
1850*8975f5c5SAndroid Build Coastguard Worker         return "#version 300 es\n"
1851*8975f5c5SAndroid Build Coastguard Worker                "precision highp float;\n"
1852*8975f5c5SAndroid Build Coastguard Worker                "uniform highp usampler3D tex3D;\n"
1853*8975f5c5SAndroid Build Coastguard Worker                "in vec2 texcoord;\n"
1854*8975f5c5SAndroid Build Coastguard Worker                "out vec4 fragColor;\n"
1855*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
1856*8975f5c5SAndroid Build Coastguard Worker                "{\n"
1857*8975f5c5SAndroid Build Coastguard Worker                "    fragColor = vec4(texture(tex3D, vec3(texcoord, 0.0)))/255.0;\n"
1858*8975f5c5SAndroid Build Coastguard Worker                "}\n";
1859*8975f5c5SAndroid Build Coastguard Worker     }
1860*8975f5c5SAndroid Build Coastguard Worker };
1861*8975f5c5SAndroid Build Coastguard Worker 
1862*8975f5c5SAndroid Build Coastguard Worker class PBOCompressedTextureTest : public Texture2DTest
1863*8975f5c5SAndroid Build Coastguard Worker {
1864*8975f5c5SAndroid Build Coastguard Worker   protected:
PBOCompressedTextureTest()1865*8975f5c5SAndroid Build Coastguard Worker     PBOCompressedTextureTest() : Texture2DTest() {}
1866*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1867*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1868*8975f5c5SAndroid Build Coastguard Worker     {
1869*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1870*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture2D);
1871*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
1872*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
1873*8975f5c5SAndroid Build Coastguard Worker 
1874*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1875*8975f5c5SAndroid Build Coastguard Worker 
1876*8975f5c5SAndroid Build Coastguard Worker         glGenBuffers(1, &mPBO);
1877*8975f5c5SAndroid Build Coastguard Worker     }
1878*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1879*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
1880*8975f5c5SAndroid Build Coastguard Worker     {
1881*8975f5c5SAndroid Build Coastguard Worker         glDeleteBuffers(1, &mPBO);
1882*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testTearDown();
1883*8975f5c5SAndroid Build Coastguard Worker     }
1884*8975f5c5SAndroid Build Coastguard Worker 
1885*8975f5c5SAndroid Build Coastguard Worker     void runCompressedSubImage();
1886*8975f5c5SAndroid Build Coastguard Worker 
1887*8975f5c5SAndroid Build Coastguard Worker     GLuint mPBO;
1888*8975f5c5SAndroid Build Coastguard Worker };
1889*8975f5c5SAndroid Build Coastguard Worker 
1890*8975f5c5SAndroid Build Coastguard Worker class ETC1CompressedTextureTest : public Texture2DTest
1891*8975f5c5SAndroid Build Coastguard Worker {
1892*8975f5c5SAndroid Build Coastguard Worker   protected:
ETC1CompressedTextureTest()1893*8975f5c5SAndroid Build Coastguard Worker     ETC1CompressedTextureTest() : Texture2DTest() {}
1894*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()1895*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
1896*8975f5c5SAndroid Build Coastguard Worker     {
1897*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::testSetUp();
1898*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture2D);
1899*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
1900*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
1901*8975f5c5SAndroid Build Coastguard Worker 
1902*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
1903*8975f5c5SAndroid Build Coastguard Worker     }
1904*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()1905*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { Texture2DTest::testTearDown(); }
1906*8975f5c5SAndroid Build Coastguard Worker };
1907*8975f5c5SAndroid Build Coastguard Worker 
1908*8975f5c5SAndroid Build Coastguard Worker class Texture2DDepthStencilTestES3 : public Texture2DTest
1909*8975f5c5SAndroid Build Coastguard Worker {
1910*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DDepthStencilTestES3()1911*8975f5c5SAndroid Build Coastguard Worker     Texture2DDepthStencilTestES3() : Texture2DTest() {}
1912*8975f5c5SAndroid Build Coastguard Worker 
1913*8975f5c5SAndroid Build Coastguard Worker     void TestSampleWithDepthStencilMode(GLenum format, GLenum mode, bool swizzle);
1914*8975f5c5SAndroid Build Coastguard Worker };
1915*8975f5c5SAndroid Build Coastguard Worker 
TestSampleWithDepthStencilMode(GLenum format,GLenum mode,bool swizzle)1916*8975f5c5SAndroid Build Coastguard Worker void Texture2DDepthStencilTestES3::TestSampleWithDepthStencilMode(GLenum format,
1917*8975f5c5SAndroid Build Coastguard Worker                                                                   GLenum mode,
1918*8975f5c5SAndroid Build Coastguard Worker                                                                   bool swizzle)
1919*8975f5c5SAndroid Build Coastguard Worker {
1920*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_stencil_texturing"));
1921*8975f5c5SAndroid Build Coastguard Worker 
1922*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 4;
1923*8975f5c5SAndroid Build Coastguard Worker 
1924*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mode == GL_STENCIL_INDEX || mode == GL_DEPTH_COMPONENT);
1925*8975f5c5SAndroid Build Coastguard Worker 
1926*8975f5c5SAndroid Build Coastguard Worker     bool isStencilMode;
1927*8975f5c5SAndroid Build Coastguard Worker     GLenum attachment;
1928*8975f5c5SAndroid Build Coastguard Worker     switch (format)
1929*8975f5c5SAndroid Build Coastguard Worker     {
1930*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT16:
1931*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT24:
1932*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT32F:
1933*8975f5c5SAndroid Build Coastguard Worker             attachment    = GL_DEPTH_ATTACHMENT;
1934*8975f5c5SAndroid Build Coastguard Worker             isStencilMode = false;
1935*8975f5c5SAndroid Build Coastguard Worker             break;
1936*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH24_STENCIL8:
1937*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH32F_STENCIL8:
1938*8975f5c5SAndroid Build Coastguard Worker             attachment    = GL_DEPTH_STENCIL_ATTACHMENT;
1939*8975f5c5SAndroid Build Coastguard Worker             isStencilMode = mode == GL_STENCIL_INDEX;
1940*8975f5c5SAndroid Build Coastguard Worker             break;
1941*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_INDEX8:
1942*8975f5c5SAndroid Build Coastguard Worker             attachment    = GL_STENCIL_ATTACHMENT;
1943*8975f5c5SAndroid Build Coastguard Worker             isStencilMode = true;
1944*8975f5c5SAndroid Build Coastguard Worker             break;
1945*8975f5c5SAndroid Build Coastguard Worker         default:
1946*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
1947*8975f5c5SAndroid Build Coastguard Worker     }
1948*8975f5c5SAndroid Build Coastguard Worker 
1949*8975f5c5SAndroid Build Coastguard Worker     // Set up a color texture.
1950*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
1951*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
1952*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
1953*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1954*8975f5c5SAndroid Build Coastguard Worker 
1955*8975f5c5SAndroid Build Coastguard Worker     // Set up a depth/stencil texture to be sampled as mode.
1956*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthStencilTexture;
1957*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthStencilTexture);
1958*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, format, kSize, kSize);
1959*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1960*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1961*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE_ANGLE, mode);
1962*8975f5c5SAndroid Build Coastguard Worker     if (swizzle)
1963*8975f5c5SAndroid Build Coastguard Worker     {
1964*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ALPHA);
1965*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_BLUE);
1966*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_GREEN);
1967*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);
1968*8975f5c5SAndroid Build Coastguard Worker     }
1969*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1970*8975f5c5SAndroid Build Coastguard Worker 
1971*8975f5c5SAndroid Build Coastguard Worker     constexpr char kStencilFS[] =
1972*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
1973*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
1974*8975f5c5SAndroid Build Coastguard Worker uniform highp usampler2D tex;
1975*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
1976*8975f5c5SAndroid Build Coastguard Worker void main()
1977*8975f5c5SAndroid Build Coastguard Worker {
1978*8975f5c5SAndroid Build Coastguard Worker     color = vec4(texelFetch(tex, ivec2(0, 0), 0)) / 255.0f;
1979*8975f5c5SAndroid Build Coastguard Worker })";
1980*8975f5c5SAndroid Build Coastguard Worker 
1981*8975f5c5SAndroid Build Coastguard Worker     constexpr char kDepthFS[] =
1982*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
1983*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
1984*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2D tex;
1985*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
1986*8975f5c5SAndroid Build Coastguard Worker void main()
1987*8975f5c5SAndroid Build Coastguard Worker {
1988*8975f5c5SAndroid Build Coastguard Worker     color = texture(tex, vec2(0, 0));
1989*8975f5c5SAndroid Build Coastguard Worker })";
1990*8975f5c5SAndroid Build Coastguard Worker 
1991*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil to 42.
1992*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer clearFBO;
1993*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, clearFBO);
1994*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, depthStencilTexture, 0);
1995*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1996*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.5);
1997*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(42);
1998*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1999*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2000*8975f5c5SAndroid Build Coastguard Worker 
2001*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2002*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthStencilTexture);
2003*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2004*8975f5c5SAndroid Build Coastguard Worker 
2005*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), isStencilMode ? kStencilFS : kDepthFS);
2006*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(program, "tex");
2007*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, texLocation);
2008*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2009*8975f5c5SAndroid Build Coastguard Worker 
2010*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2011*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texLocation, 0);
2012*8975f5c5SAndroid Build Coastguard Worker 
2013*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer drawFBO;
2014*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
2015*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
2016*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2017*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2018*8975f5c5SAndroid Build Coastguard Worker 
2019*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.95f);
2020*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2021*8975f5c5SAndroid Build Coastguard Worker 
2022*8975f5c5SAndroid Build Coastguard Worker     if (isStencilMode)
2023*8975f5c5SAndroid Build Coastguard Worker     {
2024*8975f5c5SAndroid Build Coastguard Worker         GLColor expected = swizzle ? GLColor(1, 0, 0, 42) : GLColor(42, 0, 0, 1);
2025*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, expected);
2026*8975f5c5SAndroid Build Coastguard Worker     }
2027*8975f5c5SAndroid Build Coastguard Worker     else
2028*8975f5c5SAndroid Build Coastguard Worker     {
2029*8975f5c5SAndroid Build Coastguard Worker         GLColor expected = swizzle ? GLColor(255, 0, 0, 127) : GLColor(127, 0, 0, 255);
2030*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, expected, 1);
2031*8975f5c5SAndroid Build Coastguard Worker     }
2032*8975f5c5SAndroid Build Coastguard Worker }
2033*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,NegativeAPISubImage)2034*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, NegativeAPISubImage)
2035*8975f5c5SAndroid Build Coastguard Worker {
2036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2037*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2038*8975f5c5SAndroid Build Coastguard Worker 
2039*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2040*8975f5c5SAndroid Build Coastguard Worker 
2041*8975f5c5SAndroid Build Coastguard Worker     const GLubyte *pixels[20] = {0};
2042*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
2043*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
2044*8975f5c5SAndroid Build Coastguard Worker 
2045*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
2046*8975f5c5SAndroid Build Coastguard Worker     {
2047*8975f5c5SAndroid Build Coastguard Worker         // Create a 1-level immutable texture.
2048*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
2049*8975f5c5SAndroid Build Coastguard Worker 
2050*8975f5c5SAndroid Build Coastguard Worker         // Try calling sub image on the second level.
2051*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 1, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
2052*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
2053*8975f5c5SAndroid Build Coastguard Worker     }
2054*8975f5c5SAndroid Build Coastguard Worker }
2055*8975f5c5SAndroid Build Coastguard Worker 
2056*8975f5c5SAndroid Build Coastguard Worker // Test that querying GL_TEXTURE_BINDING* doesn't cause an unexpected error.
TEST_P(Texture2DTest,QueryBinding)2057*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, QueryBinding)
2058*8975f5c5SAndroid Build Coastguard Worker {
2059*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
2060*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2061*8975f5c5SAndroid Build Coastguard Worker 
2062*8975f5c5SAndroid Build Coastguard Worker     GLint textureBinding;
2063*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding);
2064*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2065*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(0, textureBinding);
2066*8975f5c5SAndroid Build Coastguard Worker 
2067*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &textureBinding);
2068*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_EGL_image_external") ||
2069*8975f5c5SAndroid Build Coastguard Worker         IsGLExtensionEnabled("GL_NV_EGL_stream_consumer_external"))
2070*8975f5c5SAndroid Build Coastguard Worker     {
2071*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
2072*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(0, textureBinding);
2073*8975f5c5SAndroid Build Coastguard Worker     }
2074*8975f5c5SAndroid Build Coastguard Worker     else
2075*8975f5c5SAndroid Build Coastguard Worker     {
2076*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
2077*8975f5c5SAndroid Build Coastguard Worker     }
2078*8975f5c5SAndroid Build Coastguard Worker }
2079*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,ZeroSizedUploads)2080*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, ZeroSizedUploads)
2081*8975f5c5SAndroid Build Coastguard Worker {
2082*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2083*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2084*8975f5c5SAndroid Build Coastguard Worker 
2085*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2086*8975f5c5SAndroid Build Coastguard Worker 
2087*8975f5c5SAndroid Build Coastguard Worker     // Use the texture first to make sure it's in video memory
2088*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2089*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2090*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2091*8975f5c5SAndroid Build Coastguard Worker 
2092*8975f5c5SAndroid Build Coastguard Worker     const GLubyte *pixel[4] = {0};
2093*8975f5c5SAndroid Build Coastguard Worker 
2094*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
2095*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2096*8975f5c5SAndroid Build Coastguard Worker 
2097*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
2098*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2099*8975f5c5SAndroid Build Coastguard Worker 
2100*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
2101*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2102*8975f5c5SAndroid Build Coastguard Worker }
2103*8975f5c5SAndroid Build Coastguard Worker 
2104*8975f5c5SAndroid Build Coastguard Worker // Tests uploading a red texture and immediately reading from it.
TEST_P(Texture2DTest,SimpleUpload)2105*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, SimpleUpload)
2106*8975f5c5SAndroid Build Coastguard Worker {
2107*8975f5c5SAndroid Build Coastguard Worker     const GLuint width            = getWindowWidth();
2108*8975f5c5SAndroid Build Coastguard Worker     const GLuint height           = getWindowHeight();
2109*8975f5c5SAndroid Build Coastguard Worker     const GLuint windowPixelCount = width * height;
2110*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(windowPixelCount, GLColor::red);
2111*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2112*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2113*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
2114*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2115*8975f5c5SAndroid Build Coastguard Worker 
2116*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2117*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2118*8975f5c5SAndroid Build Coastguard Worker 
2119*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture2D, 0);
2120*8975f5c5SAndroid Build Coastguard Worker 
2121*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2122*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> output(windowPixelCount, GLColor::green);
2123*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, output.data());
2124*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(pixelsRed, output);
2125*8975f5c5SAndroid Build Coastguard Worker }
2126*8975f5c5SAndroid Build Coastguard Worker 
2127*8975f5c5SAndroid Build Coastguard Worker // Test that interleaved superseded updates work as expected
TEST_P(Texture2DTest,InterleavedSupersedingTextureUpdates)2128*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, InterleavedSupersedingTextureUpdates)
2129*8975f5c5SAndroid Build Coastguard Worker {
2130*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexWidth  = 3840;
2131*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexHeight = 2160;
2132*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kBpp       = 4;
2133*8975f5c5SAndroid Build Coastguard Worker 
2134*8975f5c5SAndroid Build Coastguard Worker     // Create the texture
2135*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2136*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2137*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2138*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2139*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2140*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
2141*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2142*8975f5c5SAndroid Build Coastguard Worker 
2143*8975f5c5SAndroid Build Coastguard Worker     // 1. One big upload followed by many small identical uploads
2144*8975f5c5SAndroid Build Coastguard Worker     // Update the entire texture
2145*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> fullTextureData(kTexWidth * kTexHeight * kBpp, 128);
2146*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kFullTextureColor = GLColor(128u, 128u, 128u, 128u);
2147*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, GL_UNSIGNED_BYTE,
2148*8975f5c5SAndroid Build Coastguard Worker                     fullTextureData.data());
2149*8975f5c5SAndroid Build Coastguard Worker 
2150*8975f5c5SAndroid Build Coastguard Worker     // Make a number of identical updates to the right half of the texture
2151*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> rightHalfData(kTexWidth * kTexHeight * kBpp, 201);
2152*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kRightHalfColor = GLColor(201u, 201u, 201u, 201u);
2153*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t iteration = 0; iteration < 10; iteration++)
2154*8975f5c5SAndroid Build Coastguard Worker     {
2155*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, kTexWidth / 2, 0, kTexWidth / 2, kTexHeight, GL_RGBA,
2156*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, rightHalfData.data());
2157*8975f5c5SAndroid Build Coastguard Worker     }
2158*8975f5c5SAndroid Build Coastguard Worker 
2159*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2160*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2161*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2162*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2163*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2164*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1 * getWindowWidth() / 4, getWindowHeight() / 2, kFullTextureColor);
2165*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 2, kRightHalfColor);
2166*8975f5c5SAndroid Build Coastguard Worker 
2167*8975f5c5SAndroid Build Coastguard Worker     // 2. Some small uploads followed by one big upload followed by many identical uploads
2168*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture
2169*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> zeroTextureData(kTexWidth * kTexHeight * kBpp, 255);
2170*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, GL_UNSIGNED_BYTE,
2171*8975f5c5SAndroid Build Coastguard Worker                     zeroTextureData.data());
2172*8975f5c5SAndroid Build Coastguard Worker 
2173*8975f5c5SAndroid Build Coastguard Worker     // Update the top left quadrant of the texture
2174*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> topLeftQuadrantData(kTexWidth * kTexHeight * kBpp, 128);
2175*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kTopLeftQuandrantTextureColor = GLColor(128u, 128u, 128u, 128u);
2176*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, kTexHeight / 2, kTexWidth / 2, kTexHeight / 2, GL_RGBA,
2177*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, topLeftQuadrantData.data());
2178*8975f5c5SAndroid Build Coastguard Worker 
2179*8975f5c5SAndroid Build Coastguard Worker     // Update the top right quadrant of the texture
2180*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> topRightQuadrantData(kTexWidth * kTexHeight * kBpp, 156);
2181*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kTopRightQuadrantTextureColor = GLColor(156u, 156u, 156u, 156u);
2182*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, kTexWidth / 2, kTexHeight / 2, kTexWidth / 2, kTexHeight / 2,
2183*8975f5c5SAndroid Build Coastguard Worker                     GL_RGBA, GL_UNSIGNED_BYTE, topRightQuadrantData.data());
2184*8975f5c5SAndroid Build Coastguard Worker 
2185*8975f5c5SAndroid Build Coastguard Worker     // Update the bottom half of the texture
2186*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> bottomHalfTextureData(kTexWidth * kTexHeight * kBpp, 187);
2187*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kBottomHalfTextureColor = GLColor(187u, 187u, 187u, 187u);
2188*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight / 2, GL_RGBA, GL_UNSIGNED_BYTE,
2189*8975f5c5SAndroid Build Coastguard Worker                     bottomHalfTextureData.data());
2190*8975f5c5SAndroid Build Coastguard Worker 
2191*8975f5c5SAndroid Build Coastguard Worker     // Make a number of identical updates to the bottom right quadrant of the texture
2192*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> bottomRightQuadrantData(kTexWidth * kTexHeight * kBpp, 201);
2193*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kBottomRightQuadrantColor = GLColor(201u, 201u, 201u, 201u);
2194*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t iteration = 0; iteration < 10; iteration++)
2195*8975f5c5SAndroid Build Coastguard Worker     {
2196*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, kTexWidth / 2, 0, kTexWidth / 2, kTexHeight / 2, GL_RGBA,
2197*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, bottomRightQuadrantData.data());
2198*8975f5c5SAndroid Build Coastguard Worker     }
2199*8975f5c5SAndroid Build Coastguard Worker 
2200*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2201*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2202*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2203*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2204*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2205*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() - 1, kTopLeftQuandrantTextureColor);
2206*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1,
2207*8975f5c5SAndroid Build Coastguard Worker                           kTopRightQuadrantTextureColor);
2208*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, kBottomHalfTextureColor);
2209*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4,
2210*8975f5c5SAndroid Build Coastguard Worker                           kBottomRightQuadrantColor);
2211*8975f5c5SAndroid Build Coastguard Worker 
2212*8975f5c5SAndroid Build Coastguard Worker     // 3. Many small uploads folloed by one big upload
2213*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture
2214*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, GL_UNSIGNED_BYTE,
2215*8975f5c5SAndroid Build Coastguard Worker                     zeroTextureData.data());
2216*8975f5c5SAndroid Build Coastguard Worker 
2217*8975f5c5SAndroid Build Coastguard Worker     // Make a number of small updates to different parts of the texture
2218*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::pair<GLint, GLint>> xyOffsets = {
2219*8975f5c5SAndroid Build Coastguard Worker         {1, 4}, {128, 34}, {1208, 1090}, {2560, 2022}};
2220*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kRandomColor = GLColor(55u, 128u, 201u, 255u);
2221*8975f5c5SAndroid Build Coastguard Worker     for (const std::pair<GLint, GLint> &xyOffset : xyOffsets)
2222*8975f5c5SAndroid Build Coastguard Worker     {
2223*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, xyOffset.first, xyOffset.second, 1, 1, GL_RGBA,
2224*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, kRandomColor.data());
2225*8975f5c5SAndroid Build Coastguard Worker     }
2226*8975f5c5SAndroid Build Coastguard Worker 
2227*8975f5c5SAndroid Build Coastguard Worker     // Update the entire texture
2228*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, GL_UNSIGNED_BYTE,
2229*8975f5c5SAndroid Build Coastguard Worker                     fullTextureData.data());
2230*8975f5c5SAndroid Build Coastguard Worker 
2231*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2232*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2233*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2234*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2235*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2236*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() - 1, getWindowHeight() - 1, kFullTextureColor);
2237*8975f5c5SAndroid Build Coastguard Worker }
2238*8975f5c5SAndroid Build Coastguard Worker 
2239*8975f5c5SAndroid Build Coastguard Worker // Test that repeated calls to glTexSubImage2D with superseding updates works
TEST_P(Texture2DTest,ManySupersedingTextureUpdates)2240*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, ManySupersedingTextureUpdates)
2241*8975f5c5SAndroid Build Coastguard Worker {
2242*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexWidth  = 3840;
2243*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexHeight = 2160;
2244*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kBpp       = 4;
2245*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> data(kTexWidth * kTexHeight * kBpp, 0);
2246*8975f5c5SAndroid Build Coastguard Worker 
2247*8975f5c5SAndroid Build Coastguard Worker     // Create the texture
2248*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2249*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2250*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2251*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2252*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2253*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
2254*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2255*8975f5c5SAndroid Build Coastguard Worker 
2256*8975f5c5SAndroid Build Coastguard Worker     // Make a large number of superseding updates
2257*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t width = kTexWidth / 2, height = kTexHeight / 2;
2258*8975f5c5SAndroid Build Coastguard Worker          width < kTexWidth && height < kTexHeight; width++, height++)
2259*8975f5c5SAndroid Build Coastguard Worker     {
2260*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
2261*8975f5c5SAndroid Build Coastguard Worker                         data.data());
2262*8975f5c5SAndroid Build Coastguard Worker     }
2263*8975f5c5SAndroid Build Coastguard Worker 
2264*8975f5c5SAndroid Build Coastguard Worker     // Upload different color to the whole texture thus superseding all prior updates.
2265*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> supersedingData(kTexWidth * kTexHeight * kBpp, 128);
2266*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kGray = GLColor(128u, 128u, 128u, 128u);
2267*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, GL_UNSIGNED_BYTE,
2268*8975f5c5SAndroid Build Coastguard Worker                     supersedingData.data());
2269*8975f5c5SAndroid Build Coastguard Worker 
2270*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2271*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2272*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2273*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2274*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2275*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kGray);
2276*8975f5c5SAndroid Build Coastguard Worker }
2277*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,DefineMultipleLevelsWithoutMipmapping)2278*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, DefineMultipleLevelsWithoutMipmapping)
2279*8975f5c5SAndroid Build Coastguard Worker {
2280*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2281*8975f5c5SAndroid Build Coastguard Worker 
2282*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kImageSize = 256;
2283*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kImageSize * kImageSize> kMipColors[2];
2284*8975f5c5SAndroid Build Coastguard Worker 
2285*8975f5c5SAndroid Build Coastguard Worker     std::fill(kMipColors[0].begin(), kMipColors[0].end(), GLColor::red);
2286*8975f5c5SAndroid Build Coastguard Worker     std::fill(kMipColors[1].begin(), kMipColors[1].end(), GLColor::green);
2287*8975f5c5SAndroid Build Coastguard Worker 
2288*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2289*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2290*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2291*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2292*8975f5c5SAndroid Build Coastguard Worker 
2293*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kImageSize, kImageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2294*8975f5c5SAndroid Build Coastguard Worker                  kMipColors[0].data());
2295*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2296*8975f5c5SAndroid Build Coastguard Worker 
2297*8975f5c5SAndroid Build Coastguard Worker     // Draw so the image is created.
2298*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2299*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2300*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2301*8975f5c5SAndroid Build Coastguard Worker 
2302*8975f5c5SAndroid Build Coastguard Worker     // Define level 1 of the texture.
2303*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kImageSize, kImageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2304*8975f5c5SAndroid Build Coastguard Worker                  kMipColors[1].data());
2305*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2306*8975f5c5SAndroid Build Coastguard Worker 
2307*8975f5c5SAndroid Build Coastguard Worker     // Draw again.
2308*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2309*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[0][0]);
2310*8975f5c5SAndroid Build Coastguard Worker }
2311*8975f5c5SAndroid Build Coastguard Worker 
2312*8975f5c5SAndroid Build Coastguard Worker // Test drawing with two texture types, to trigger an ANGLE bug in validation
TEST_P(TextureCubeTest,CubeMapBug)2313*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTest, CubeMapBug)
2314*8975f5c5SAndroid Build Coastguard Worker {
2315*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2316*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2317*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
2318*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
2319*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2320*8975f5c5SAndroid Build Coastguard Worker 
2321*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2322*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2323*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 1);
2324*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2325*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2326*8975f5c5SAndroid Build Coastguard Worker }
2327*8975f5c5SAndroid Build Coastguard Worker 
2328*8975f5c5SAndroid Build Coastguard Worker // Test drawing with two texture types accessed from the same shader and check that the result of
2329*8975f5c5SAndroid Build Coastguard Worker // drawing is correct.
TEST_P(TextureCubeTest,CubeMapDraw)2330*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTest, CubeMapDraw)
2331*8975f5c5SAndroid Build Coastguard Worker {
2332*8975f5c5SAndroid Build Coastguard Worker     GLubyte texData[4];
2333*8975f5c5SAndroid Build Coastguard Worker     texData[0] = 0;
2334*8975f5c5SAndroid Build Coastguard Worker     texData[1] = 60;
2335*8975f5c5SAndroid Build Coastguard Worker     texData[2] = 0;
2336*8975f5c5SAndroid Build Coastguard Worker     texData[3] = 255;
2337*8975f5c5SAndroid Build Coastguard Worker 
2338*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2339*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2340*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
2341*8975f5c5SAndroid Build Coastguard Worker 
2342*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
2343*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
2344*8975f5c5SAndroid Build Coastguard Worker     texData[1] = 120;
2345*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2346*8975f5c5SAndroid Build Coastguard Worker                     texData);
2347*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2348*8975f5c5SAndroid Build Coastguard Worker                     texData);
2349*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2350*8975f5c5SAndroid Build Coastguard Worker                     texData);
2351*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2352*8975f5c5SAndroid Build Coastguard Worker                     texData);
2353*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2354*8975f5c5SAndroid Build Coastguard Worker                     texData);
2355*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
2356*8975f5c5SAndroid Build Coastguard Worker                     texData);
2357*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
2358*8975f5c5SAndroid Build Coastguard Worker 
2359*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2360*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2361*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 1);
2362*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2363*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2364*8975f5c5SAndroid Build Coastguard Worker 
2365*8975f5c5SAndroid Build Coastguard Worker     int px = getWindowWidth() - 1;
2366*8975f5c5SAndroid Build Coastguard Worker     int py = 0;
2367*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(px, py, 0, 180, 0, 255, 2);
2368*8975f5c5SAndroid Build Coastguard Worker }
2369*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Sampler2DAsFunctionParameterTest,Sampler2DAsFunctionParameter)2370*8975f5c5SAndroid Build Coastguard Worker TEST_P(Sampler2DAsFunctionParameterTest, Sampler2DAsFunctionParameter)
2371*8975f5c5SAndroid Build Coastguard Worker {
2372*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2373*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2374*8975f5c5SAndroid Build Coastguard Worker     GLubyte texData[4];
2375*8975f5c5SAndroid Build Coastguard Worker     texData[0] = 0;
2376*8975f5c5SAndroid Build Coastguard Worker     texData[1] = 128;
2377*8975f5c5SAndroid Build Coastguard Worker     texData[2] = 0;
2378*8975f5c5SAndroid Build Coastguard Worker     texData[3] = 255;
2379*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData);
2380*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2381*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2382*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2383*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2384*8975f5c5SAndroid Build Coastguard Worker 
2385*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 0, 128, 0, 255, 2);
2386*8975f5c5SAndroid Build Coastguard Worker }
2387*8975f5c5SAndroid Build Coastguard Worker 
2388*8975f5c5SAndroid Build Coastguard Worker // Test drawing with two textures passed to the shader in a sampler array.
TEST_P(SamplerArrayTest,SamplerArrayDraw)2389*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerArrayTest, SamplerArrayDraw)
2390*8975f5c5SAndroid Build Coastguard Worker {
2391*8975f5c5SAndroid Build Coastguard Worker     testSamplerArrayDraw();
2392*8975f5c5SAndroid Build Coastguard Worker }
2393*8975f5c5SAndroid Build Coastguard Worker 
2394*8975f5c5SAndroid Build Coastguard Worker // Test drawing with two textures passed to the shader in a sampler array which is passed to a
2395*8975f5c5SAndroid Build Coastguard Worker // user-defined function in the shader.
TEST_P(SamplerArrayAsFunctionParameterTest,SamplerArrayAsFunctionParameter)2396*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerArrayAsFunctionParameterTest, SamplerArrayAsFunctionParameter)
2397*8975f5c5SAndroid Build Coastguard Worker {
2398*8975f5c5SAndroid Build Coastguard Worker     // TODO: Diagnose and fix. http://anglebug.com/42261649
2399*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
2400*8975f5c5SAndroid Build Coastguard Worker 
2401*8975f5c5SAndroid Build Coastguard Worker     testSamplerArrayDraw();
2402*8975f5c5SAndroid Build Coastguard Worker }
2403*8975f5c5SAndroid Build Coastguard Worker 
2404*8975f5c5SAndroid Build Coastguard Worker // Copy of a test in conformance/textures/texture-mips, to test generate mipmaps
TEST_P(Texture2DTestWithDrawScale,MipmapsTwice)2405*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestWithDrawScale, MipmapsTwice)
2406*8975f5c5SAndroid Build Coastguard Worker {
2407*8975f5c5SAndroid Build Coastguard Worker     int px = getWindowWidth() / 2;
2408*8975f5c5SAndroid Build Coastguard Worker     int py = getWindowHeight() / 2;
2409*8975f5c5SAndroid Build Coastguard Worker 
2410*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2411*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2412*8975f5c5SAndroid Build Coastguard Worker 
2413*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(16u * 16u, GLColor::red);
2414*8975f5c5SAndroid Build Coastguard Worker 
2415*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelsRed.data());
2416*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
2417*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2418*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
2419*8975f5c5SAndroid Build Coastguard Worker 
2420*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2421*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2422*8975f5c5SAndroid Build Coastguard Worker     glUniform2f(mDrawScaleUniformLocation, 0.0625f, 0.0625f);
2423*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2424*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2425*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red);
2426*8975f5c5SAndroid Build Coastguard Worker 
2427*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsBlue(16u * 16u, GLColor::blue);
2428*8975f5c5SAndroid Build Coastguard Worker 
2429*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2430*8975f5c5SAndroid Build Coastguard Worker                  pixelsBlue.data());
2431*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
2432*8975f5c5SAndroid Build Coastguard Worker 
2433*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2434*8975f5c5SAndroid Build Coastguard Worker 
2435*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2436*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::blue);
2437*8975f5c5SAndroid Build Coastguard Worker 
2438*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(16u * 16u, GLColor::green);
2439*8975f5c5SAndroid Build Coastguard Worker 
2440*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2441*8975f5c5SAndroid Build Coastguard Worker                  pixelsGreen.data());
2442*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
2443*8975f5c5SAndroid Build Coastguard Worker 
2444*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2445*8975f5c5SAndroid Build Coastguard Worker 
2446*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2447*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green);
2448*8975f5c5SAndroid Build Coastguard Worker }
2449*8975f5c5SAndroid Build Coastguard Worker 
2450*8975f5c5SAndroid Build Coastguard Worker // Test creating a FBO with a cube map render target, to test an ANGLE bug
2451*8975f5c5SAndroid Build Coastguard Worker // https://code.google.com/p/angleproject/issues/detail?id=849
TEST_P(TextureCubeTest,CubeMapFBO)2452*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTest, CubeMapFBO)
2453*8975f5c5SAndroid Build Coastguard Worker {
2454*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261821
2455*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
2456*8975f5c5SAndroid Build Coastguard Worker 
2457*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2458*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2459*8975f5c5SAndroid Build Coastguard Worker 
2460*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
2461*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
2462*8975f5c5SAndroid Build Coastguard Worker                            mTextureCube, 0);
2463*8975f5c5SAndroid Build Coastguard Worker 
2464*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2465*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2466*8975f5c5SAndroid Build Coastguard Worker 
2467*8975f5c5SAndroid Build Coastguard Worker     // Test clearing the six mip faces individually.
2468*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 6> faceColors = {{GLColor::red, GLColor::green, GLColor::blue,
2469*8975f5c5SAndroid Build Coastguard Worker                                           GLColor::yellow, GLColor::cyan, GLColor::magenta}};
2470*8975f5c5SAndroid Build Coastguard Worker 
2471*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIndex = 0; faceIndex < 6; ++faceIndex)
2472*8975f5c5SAndroid Build Coastguard Worker     {
2473*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
2474*8975f5c5SAndroid Build Coastguard Worker                                GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, mTextureCube, 0);
2475*8975f5c5SAndroid Build Coastguard Worker 
2476*8975f5c5SAndroid Build Coastguard Worker         Vector4 clearColorF = faceColors[faceIndex].toNormalizedVector();
2477*8975f5c5SAndroid Build Coastguard Worker         glClearColor(clearColorF.x(), clearColorF.y(), clearColorF.z(), clearColorF.w());
2478*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
2479*8975f5c5SAndroid Build Coastguard Worker 
2480*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, faceColors[faceIndex]);
2481*8975f5c5SAndroid Build Coastguard Worker     }
2482*8975f5c5SAndroid Build Coastguard Worker 
2483*8975f5c5SAndroid Build Coastguard Worker     // Iterate the faces again to make sure the colors haven't changed.
2484*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIndex = 0; faceIndex < 6; ++faceIndex)
2485*8975f5c5SAndroid Build Coastguard Worker     {
2486*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
2487*8975f5c5SAndroid Build Coastguard Worker                                GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, mTextureCube, 0);
2488*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, faceColors[faceIndex])
2489*8975f5c5SAndroid Build Coastguard Worker             << "face color " << faceIndex << " shouldn't change";
2490*8975f5c5SAndroid Build Coastguard Worker     }
2491*8975f5c5SAndroid Build Coastguard Worker }
2492*8975f5c5SAndroid Build Coastguard Worker 
2493*8975f5c5SAndroid Build Coastguard Worker // Tests clearing a cube map with a scissor enabled.
TEST_P(TextureCubeTest,CubeMapFBOScissoredClear)2494*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTest, CubeMapFBOScissoredClear)
2495*8975f5c5SAndroid Build Coastguard Worker {
2496*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261821
2497*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
2498*8975f5c5SAndroid Build Coastguard Worker 
2499*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kSize = 16;
2500*8975f5c5SAndroid Build Coastguard Worker 
2501*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2502*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2503*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2504*8975f5c5SAndroid Build Coastguard Worker 
2505*8975f5c5SAndroid Build Coastguard Worker     GLTexture texcube;
2506*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texcube);
2507*8975f5c5SAndroid Build Coastguard Worker     for (GLenum face = 0; face < 6; face++)
2508*8975f5c5SAndroid Build Coastguard Worker     {
2509*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA,
2510*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
2511*8975f5c5SAndroid Build Coastguard Worker     }
2512*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2513*8975f5c5SAndroid Build Coastguard Worker 
2514*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
2515*8975f5c5SAndroid Build Coastguard Worker                            texcube, 0);
2516*8975f5c5SAndroid Build Coastguard Worker 
2517*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2518*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2519*8975f5c5SAndroid Build Coastguard Worker 
2520*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2521*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2522*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2523*8975f5c5SAndroid Build Coastguard Worker 
2524*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2525*8975f5c5SAndroid Build Coastguard Worker     glScissor(kSize / 2, 0, kSize / 2, kSize);
2526*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2527*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2528*8975f5c5SAndroid Build Coastguard Worker 
2529*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2530*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize / 2 + 1, 0, GLColor::green);
2531*8975f5c5SAndroid Build Coastguard Worker 
2532*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2533*8975f5c5SAndroid Build Coastguard Worker }
2534*8975f5c5SAndroid Build Coastguard Worker 
2535*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D works properly when glTexStorage2DEXT has initialized the image with a
2536*8975f5c5SAndroid Build Coastguard Worker // default color.
TEST_P(Texture2DTest,TexStorage)2537*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexStorage)
2538*8975f5c5SAndroid Build Coastguard Worker {
2539*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
2540*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_storage"));
2541*8975f5c5SAndroid Build Coastguard Worker 
2542*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
2543*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
2544*8975f5c5SAndroid Build Coastguard Worker 
2545*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
2546*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2547*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
2548*8975f5c5SAndroid Build Coastguard Worker 
2549*8975f5c5SAndroid Build Coastguard Worker     // Fill with red
2550*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(3 * 16 * 16);
2551*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
2552*8975f5c5SAndroid Build Coastguard Worker     {
2553*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * 3 + 0] = 255;
2554*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * 3 + 1] = 0;
2555*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * 3 + 2] = 0;
2556*8975f5c5SAndroid Build Coastguard Worker     }
2557*8975f5c5SAndroid Build Coastguard Worker 
2558*8975f5c5SAndroid Build Coastguard Worker     // ANGLE internally uses RGBA as the DirectX format for RGB images
2559*8975f5c5SAndroid Build Coastguard Worker     // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
2560*8975f5c5SAndroid Build Coastguard Worker     // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
2561*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() >= 3)
2562*8975f5c5SAndroid Build Coastguard Worker     {
2563*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
2564*8975f5c5SAndroid Build Coastguard Worker     }
2565*8975f5c5SAndroid Build Coastguard Worker     else
2566*8975f5c5SAndroid Build Coastguard Worker     {
2567*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
2568*8975f5c5SAndroid Build Coastguard Worker     }
2569*8975f5c5SAndroid Build Coastguard Worker 
2570*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
2571*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
2572*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, pixels.data());
2573*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2574*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2575*8975f5c5SAndroid Build Coastguard Worker 
2576*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2577*8975f5c5SAndroid Build Coastguard Worker 
2578*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2579*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2580*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2581*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2582*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
2583*8975f5c5SAndroid Build Coastguard Worker 
2584*8975f5c5SAndroid Build Coastguard Worker     // Validate that the region of the texture without data has an alpha of 1.0
2585*8975f5c5SAndroid Build Coastguard Worker     angle::GLColor pixel = ReadColor(3 * width / 4, 3 * height / 4);
2586*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(255, pixel.A);
2587*8975f5c5SAndroid Build Coastguard Worker }
2588*8975f5c5SAndroid Build Coastguard Worker 
2589*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2DEXT has
2590*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a default color.
TEST_P(Texture2DTest,TexStorageWithPBO)2591*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexStorageWithPBO)
2592*8975f5c5SAndroid Build Coastguard Worker {
2593*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
2594*8975f5c5SAndroid Build Coastguard Worker     {
2595*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
2596*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
2597*8975f5c5SAndroid Build Coastguard Worker     }
2598*8975f5c5SAndroid Build Coastguard Worker 
2599*8975f5c5SAndroid Build Coastguard Worker     const int width          = getWindowWidth();
2600*8975f5c5SAndroid Build Coastguard Worker     const int height         = getWindowHeight();
2601*8975f5c5SAndroid Build Coastguard Worker     const size_t pixelCount  = width * height;
2602*8975f5c5SAndroid Build Coastguard Worker     const int componentCount = 3;
2603*8975f5c5SAndroid Build Coastguard Worker 
2604*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
2605*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2606*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
2607*8975f5c5SAndroid Build Coastguard Worker 
2608*8975f5c5SAndroid Build Coastguard Worker     // Fill with red
2609*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(componentCount * pixelCount);
2610*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < pixelCount; ++pixelId)
2611*8975f5c5SAndroid Build Coastguard Worker     {
2612*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * componentCount + 0] = 255;
2613*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * componentCount + 1] = 0;
2614*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * componentCount + 2] = 0;
2615*8975f5c5SAndroid Build Coastguard Worker     }
2616*8975f5c5SAndroid Build Coastguard Worker 
2617*8975f5c5SAndroid Build Coastguard Worker     // Read 16x16 region from red backbuffer to PBO
2618*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
2619*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
2620*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
2621*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, componentCount * pixelCount, pixels.data(),
2622*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
2623*8975f5c5SAndroid Build Coastguard Worker 
2624*8975f5c5SAndroid Build Coastguard Worker     // ANGLE internally uses RGBA as the DirectX format for RGB images
2625*8975f5c5SAndroid Build Coastguard Worker     // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
2626*8975f5c5SAndroid Build Coastguard Worker     // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
2627*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, width, height);
2628*8975f5c5SAndroid Build Coastguard Worker 
2629*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left quadrant of pixels, leaves the other pixels
2630*8975f5c5SAndroid Build Coastguard Worker     // untouched. glTexSubImage2D should take into account that the image is dirty.
2631*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width / 2, height / 2, GL_RGB, GL_UNSIGNED_BYTE,
2632*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
2633*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2634*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2635*8975f5c5SAndroid Build Coastguard Worker 
2636*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2637*8975f5c5SAndroid Build Coastguard Worker 
2638*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2639*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2640*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2641*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
2642*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2643*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, width / 2, height / 2, GLColor(255, 0, 0, 255));
2644*8975f5c5SAndroid Build Coastguard Worker }
2645*8975f5c5SAndroid Build Coastguard Worker 
2646*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly after deleting the PBO
2647*8975f5c5SAndroid Build Coastguard Worker // and drawing with the texture
2648*8975f5c5SAndroid Build Coastguard Worker // Pseudo code for the follow test:
2649*8975f5c5SAndroid Build Coastguard Worker // 1. Upload PBO to mTexture2D
2650*8975f5c5SAndroid Build Coastguard Worker // 2. Delete PBO
2651*8975f5c5SAndroid Build Coastguard Worker // 3. Draw with otherTexture (x5)
2652*8975f5c5SAndroid Build Coastguard Worker // 4. Draw with mTexture2D
2653*8975f5c5SAndroid Build Coastguard Worker // 5. Validate color output
TEST_P(Texture2DTest,PBOWithMultipleDraws)2654*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, PBOWithMultipleDraws)
2655*8975f5c5SAndroid Build Coastguard Worker {
2656*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
2657*8975f5c5SAndroid Build Coastguard Worker     {
2658*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
2659*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
2660*8975f5c5SAndroid Build Coastguard Worker     }
2661*8975f5c5SAndroid Build Coastguard Worker 
2662*8975f5c5SAndroid Build Coastguard Worker     const GLuint width            = getWindowWidth();
2663*8975f5c5SAndroid Build Coastguard Worker     const GLuint height           = getWindowHeight();
2664*8975f5c5SAndroid Build Coastguard Worker     const GLuint windowPixelCount = width * height;
2665*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(windowPixelCount, GLColor::red);
2666*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(windowPixelCount, GLColor::green);
2667*8975f5c5SAndroid Build Coastguard Worker 
2668*8975f5c5SAndroid Build Coastguard Worker     // Create secondary draw that does not use mTexture
2669*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
2670*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = getFragmentShaderSource();
2671*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(otherProgram, vertexShaderSource, fragmentShaderSource);
2672*8975f5c5SAndroid Build Coastguard Worker 
2673*8975f5c5SAndroid Build Coastguard Worker     GLint uniformLoc = glGetUniformLocation(otherProgram, getTextureUniformName());
2674*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, uniformLoc);
2675*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(0);
2676*8975f5c5SAndroid Build Coastguard Worker 
2677*8975f5c5SAndroid Build Coastguard Worker     // Create secondary Texture to draw with
2678*8975f5c5SAndroid Build Coastguard Worker     GLTexture otherTexture;
2679*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2680*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, otherTexture);
2681*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
2682*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
2683*8975f5c5SAndroid Build Coastguard Worker                     pixelsRed.data());
2684*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2685*8975f5c5SAndroid Build Coastguard Worker 
2686*8975f5c5SAndroid Build Coastguard Worker     // Setup primary Texture
2687*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2688*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2689*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2690*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
2691*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2692*8975f5c5SAndroid Build Coastguard Worker 
2693*8975f5c5SAndroid Build Coastguard Worker     // Setup PBO
2694*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo = 0;
2695*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
2696*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
2697*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
2698*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
2699*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2700*8975f5c5SAndroid Build Coastguard Worker 
2701*8975f5c5SAndroid Build Coastguard Worker     // Write PBO to mTexture
2702*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2703*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2704*8975f5c5SAndroid Build Coastguard Worker     // Delete PBO as ANGLE should be properly handling refcount of this buffer
2705*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
2706*8975f5c5SAndroid Build Coastguard Worker     pixelsGreen.clear();
2707*8975f5c5SAndroid Build Coastguard Worker 
2708*8975f5c5SAndroid Build Coastguard Worker     // Do 5 draws not involving primary texture that the PBO updated
2709*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(otherProgram);
2710*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformLoc, 0);
2711*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, otherTexture);
2712*8975f5c5SAndroid Build Coastguard Worker     drawQuad(otherProgram, "position", 0.5f);
2713*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
2714*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(0);
2715*8975f5c5SAndroid Build Coastguard Worker 
2716*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(otherProgram);
2717*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformLoc, 0);
2718*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, otherTexture);
2719*8975f5c5SAndroid Build Coastguard Worker     drawQuad(otherProgram, "position", 0.5f);
2720*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
2721*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(0);
2722*8975f5c5SAndroid Build Coastguard Worker 
2723*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(otherProgram);
2724*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformLoc, 0);
2725*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, otherTexture);
2726*8975f5c5SAndroid Build Coastguard Worker     drawQuad(otherProgram, "position", 0.5f);
2727*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
2728*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(0);
2729*8975f5c5SAndroid Build Coastguard Worker 
2730*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(otherProgram);
2731*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformLoc, 0);
2732*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, otherTexture);
2733*8975f5c5SAndroid Build Coastguard Worker     drawQuad(otherProgram, "position", 0.5f);
2734*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
2735*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(0);
2736*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2737*8975f5c5SAndroid Build Coastguard Worker 
2738*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> output(windowPixelCount, GLColor::black);
2739*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
2740*8975f5c5SAndroid Build Coastguard Worker                  output.data());
2741*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(pixelsRed, output);
2742*8975f5c5SAndroid Build Coastguard Worker 
2743*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2744*8975f5c5SAndroid Build Coastguard Worker     // Draw using PBO updated texture
2745*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
2746*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
2747*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
2748*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
2749*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2750*8975f5c5SAndroid Build Coastguard Worker 
2751*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> actual(windowPixelCount, GLColor::black);
2752*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
2753*8975f5c5SAndroid Build Coastguard Worker                  actual.data());
2754*8975f5c5SAndroid Build Coastguard Worker     // Value should be green as it was updated during PBO transfer to mTexture
2755*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> expected(windowPixelCount, GLColor::green);
2756*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(expected, actual);
2757*8975f5c5SAndroid Build Coastguard Worker }
2758*8975f5c5SAndroid Build Coastguard Worker 
2759*8975f5c5SAndroid Build Coastguard Worker // Almost mirrors UnitTest_DMSAA_dst_read test from Android skqp test suite
TEST_P(Texture2DTestES3,UnitTest_DMSAA_dst_read)2760*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UnitTest_DMSAA_dst_read)
2761*8975f5c5SAndroid Build Coastguard Worker {
2762*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB_write_control"));
2763*8975f5c5SAndroid Build Coastguard Worker 
2764*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2765*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE31);
2766*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
2767*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2768*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2769*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2770*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2771*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
2772*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
2773*8975f5c5SAndroid Build Coastguard Worker 
2774*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fboTexture;
2775*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboTexture);
2776*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2777*8975f5c5SAndroid Build Coastguard Worker     glCheckFramebufferStatus(GL_FRAMEBUFFER);
2778*8975f5c5SAndroid Build Coastguard Worker 
2779*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fboRenderbuffer;
2780*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
2781*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboRenderbuffer);
2782*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
2783*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 16, 16);
2784*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
2785*8975f5c5SAndroid Build Coastguard Worker     glCheckFramebufferStatus(GL_FRAMEBUFFER);
2786*8975f5c5SAndroid Build Coastguard Worker 
2787*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2788*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
2789*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
2790*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2791*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2792*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2793*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2794*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.000000);
2795*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
2796*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
2797*8975f5c5SAndroid Build Coastguard Worker 
2798*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboRenderbuffer);
2799*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 16, 16);
2800*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_FRAMEBUFFER_SRGB_EXT);
2801*8975f5c5SAndroid Build Coastguard Worker 
2802*8975f5c5SAndroid Build Coastguard Worker     // Create texture program
2803*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawTexture, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
2804*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2805*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(drawTexture, "u_tex2D");
2806*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, texLocation);
2807*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texLocation, 0);
2808*8975f5c5SAndroid Build Coastguard Worker 
2809*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
2810*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
2811*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
2812*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_STENCIL_TEST);
2813*8975f5c5SAndroid Build Coastguard Worker 
2814*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_FRAMEBUFFER_SRGB_EXT);
2815*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.5f);
2816*8975f5c5SAndroid Build Coastguard Worker 
2817*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_FRAMEBUFFER_SRGB_EXT);
2818*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2819*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 6, 10, 10);
2820*8975f5c5SAndroid Build Coastguard Worker 
2821*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.5f);
2822*8975f5c5SAndroid Build Coastguard Worker 
2823*8975f5c5SAndroid Build Coastguard Worker     // Blit fboRenderbuffer onto fboTexture
2824*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fboRenderbuffer);
2825*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboTexture);
2826*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
2827*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 6, 10, 16, 0, 6, 10, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2828*8975f5c5SAndroid Build Coastguard Worker     GLenum attachment = GL_COLOR_ATTACHMENT0;
2829*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &attachment);
2830*8975f5c5SAndroid Build Coastguard Worker 
2831*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboTexture);
2832*8975f5c5SAndroid Build Coastguard Worker     std::array<GLubyte, 10 * 10 * 4> pixelData;
2833*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 6, 10, 10, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
2834*8975f5c5SAndroid Build Coastguard Worker     glFinish();
2835*8975f5c5SAndroid Build Coastguard Worker 
2836*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.000000, 1.000000, 1.000000, 1.000000);
2837*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2838*8975f5c5SAndroid Build Coastguard Worker 
2839*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboRenderbuffer);
2840*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_FRAMEBUFFER_SRGB_EXT);
2841*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.5f);
2842*8975f5c5SAndroid Build Coastguard Worker 
2843*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_FRAMEBUFFER_SRGB_EXT);
2844*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2845*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.5f);
2846*8975f5c5SAndroid Build Coastguard Worker 
2847*8975f5c5SAndroid Build Coastguard Worker     // Blit fboRenderbuffer onto fboTexture
2848*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fboRenderbuffer);
2849*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboTexture);
2850*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
2851*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 6, 10, 16, 0, 6, 10, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2852*8975f5c5SAndroid Build Coastguard Worker     attachment = GL_COLOR_ATTACHMENT0;
2853*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &attachment);
2854*8975f5c5SAndroid Build Coastguard Worker     glFinish();
2855*8975f5c5SAndroid Build Coastguard Worker 
2856*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboRenderbuffer);
2857*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_FRAMEBUFFER_SRGB_EXT);
2858*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.5f);
2859*8975f5c5SAndroid Build Coastguard Worker 
2860*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_FRAMEBUFFER_SRGB_EXT);
2861*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2862*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.5f);
2863*8975f5c5SAndroid Build Coastguard Worker 
2864*8975f5c5SAndroid Build Coastguard Worker     // Blit fboRenderbuffer onto fboTexture
2865*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fboRenderbuffer);
2866*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboTexture);
2867*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
2868*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 6, 10, 16, 0, 6, 10, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2869*8975f5c5SAndroid Build Coastguard Worker     attachment = GL_COLOR_ATTACHMENT0;
2870*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &attachment);
2871*8975f5c5SAndroid Build Coastguard Worker     glFinish();
2872*8975f5c5SAndroid Build Coastguard Worker 
2873*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboTexture);
2874*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 6, 10, 10, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
2875*8975f5c5SAndroid Build Coastguard Worker     glFinish();
2876*8975f5c5SAndroid Build Coastguard Worker }
2877*8975f5c5SAndroid Build Coastguard Worker 
2878*8975f5c5SAndroid Build Coastguard Worker // Test that stencil texture uploads work.
TEST_P(Texture2DTestES3,TexImageWithStencilData)2879*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexImageWithStencilData)
2880*8975f5c5SAndroid Build Coastguard Worker {
2881*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 4;
2882*8975f5c5SAndroid Build Coastguard Worker 
2883*8975f5c5SAndroid Build Coastguard Worker     const std::array<std::tuple<GLenum, GLenum, int, int>, 3> testConfigs = {
2884*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH32F_STENCIL8, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8, 4),
2885*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH24_STENCIL8, GL_UNSIGNED_INT_24_8, 4, 0),
2886*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_STENCIL_INDEX8, GL_UNSIGNED_BYTE, 1, 0)};
2887*8975f5c5SAndroid Build Coastguard Worker 
2888*8975f5c5SAndroid Build Coastguard Worker     for (auto testConfig : testConfigs)
2889*8975f5c5SAndroid Build Coastguard Worker     {
2890*8975f5c5SAndroid Build Coastguard Worker         const GLenum format     = std::get<0>(testConfig);
2891*8975f5c5SAndroid Build Coastguard Worker         const GLenum type       = std::get<1>(testConfig);
2892*8975f5c5SAndroid Build Coastguard Worker         const GLenum typeLength = std::get<2>(testConfig);
2893*8975f5c5SAndroid Build Coastguard Worker         const GLenum typeOffset = std::get<3>(testConfig);
2894*8975f5c5SAndroid Build Coastguard Worker 
2895*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(format == GL_STENCIL_INDEX8 &&
2896*8975f5c5SAndroid Build Coastguard Worker                            !IsGLExtensionEnabled("GL_OES_texture_stencil8"));
2897*8975f5c5SAndroid Build Coastguard Worker 
2898*8975f5c5SAndroid Build Coastguard Worker         // Set up the framebuffer
2899*8975f5c5SAndroid Build Coastguard Worker         GLTexture colorTexture;
2900*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, colorTexture);
2901*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2902*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
2903*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2904*8975f5c5SAndroid Build Coastguard Worker 
2905*8975f5c5SAndroid Build Coastguard Worker         GLTexture depthStencilTexture;
2906*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthStencilTexture);
2907*8975f5c5SAndroid Build Coastguard Worker 
2908*8975f5c5SAndroid Build Coastguard Worker         GLubyte pixels[kSize * kSize * 8] = {};
2909*8975f5c5SAndroid Build Coastguard Worker         for (size_t pixelId = 0; pixelId < kSize * kSize; ++pixelId)
2910*8975f5c5SAndroid Build Coastguard Worker         {
2911*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * typeLength + typeOffset] = 0xD5;
2912*8975f5c5SAndroid Build Coastguard Worker         }
2913*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, format, kSize, kSize, 0,
2914*8975f5c5SAndroid Build Coastguard Worker                      format == GL_STENCIL_INDEX8 ? GL_STENCIL_INDEX : GL_DEPTH_STENCIL, type,
2915*8975f5c5SAndroid Build Coastguard Worker                      pixels);
2916*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2917*8975f5c5SAndroid Build Coastguard Worker 
2918*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
2919*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2920*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture,
2921*8975f5c5SAndroid Build Coastguard Worker                                0);
2922*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(
2923*8975f5c5SAndroid Build Coastguard Worker             GL_FRAMEBUFFER,
2924*8975f5c5SAndroid Build Coastguard Worker             format == GL_STENCIL_INDEX8 ? GL_STENCIL_ATTACHMENT : GL_DEPTH_STENCIL_ATTACHMENT,
2925*8975f5c5SAndroid Build Coastguard Worker             GL_TEXTURE_2D, depthStencilTexture, 0);
2926*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2927*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2928*8975f5c5SAndroid Build Coastguard Worker 
2929*8975f5c5SAndroid Build Coastguard Worker         // Clear only color.
2930*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0, 0, 0, 1);
2931*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
2932*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2933*8975f5c5SAndroid Build Coastguard Worker 
2934*8975f5c5SAndroid Build Coastguard Worker         // If stencil is not set to 0xD5, rendering would fail.
2935*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
2936*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_EQUAL, 0xD5, 0xFF);
2937*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2938*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(0xFF);
2939*8975f5c5SAndroid Build Coastguard Worker 
2940*8975f5c5SAndroid Build Coastguard Worker         // Draw red
2941*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2942*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.5f);
2943*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2944*8975f5c5SAndroid Build Coastguard Worker 
2945*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
2946*8975f5c5SAndroid Build Coastguard Worker     }
2947*8975f5c5SAndroid Build Coastguard Worker }
2948*8975f5c5SAndroid Build Coastguard Worker 
2949*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly. PBO has all pixels as red
2950*8975f5c5SAndroid Build Coastguard Worker // except the middle one being green.
TEST_P(Texture2DTest,TexStorageWithPBOMiddlePixelDifferent)2951*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexStorageWithPBOMiddlePixelDifferent)
2952*8975f5c5SAndroid Build Coastguard Worker {
2953*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
2954*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
2955*8975f5c5SAndroid Build Coastguard Worker 
2956*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
2957*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
2958*8975f5c5SAndroid Build Coastguard Worker 
2959*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
2960*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2961*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
2962*8975f5c5SAndroid Build Coastguard Worker 
2963*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(3 * 16 * 16);
2964*8975f5c5SAndroid Build Coastguard Worker 
2965*8975f5c5SAndroid Build Coastguard Worker     // Initialize texture with default black color.
2966*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
2967*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_RGB, GL_UNSIGNED_BYTE, pixels.data());
2968*8975f5c5SAndroid Build Coastguard Worker 
2969*8975f5c5SAndroid Build Coastguard Worker     // Fill PBO's data with red, with middle one as green
2970*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
2971*8975f5c5SAndroid Build Coastguard Worker     {
2972*8975f5c5SAndroid Build Coastguard Worker         if (pixelId == 8 * 7 + 7)
2973*8975f5c5SAndroid Build Coastguard Worker         {
2974*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * 3 + 0] = 0;
2975*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * 3 + 1] = 255;
2976*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * 3 + 2] = 0;
2977*8975f5c5SAndroid Build Coastguard Worker         }
2978*8975f5c5SAndroid Build Coastguard Worker         else
2979*8975f5c5SAndroid Build Coastguard Worker         {
2980*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * 3 + 0] = 255;
2981*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * 3 + 1] = 0;
2982*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId * 3 + 2] = 0;
2983*8975f5c5SAndroid Build Coastguard Worker         }
2984*8975f5c5SAndroid Build Coastguard Worker     }
2985*8975f5c5SAndroid Build Coastguard Worker 
2986*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
2987*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
2988*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
2989*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
2990*8975f5c5SAndroid Build Coastguard Worker 
2991*8975f5c5SAndroid Build Coastguard Worker     // Update the color of the texture's upper-left 8x8 pixels, leaves the other pixels untouched.
2992*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
2993*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
2994*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2995*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2996*8975f5c5SAndroid Build Coastguard Worker 
2997*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
2998*8975f5c5SAndroid Build Coastguard Worker 
2999*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3000*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3001*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
3002*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
3003*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3004*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255);
3005*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
3006*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 2 - 1, height / 2 - 1, 0, 255, 0, 255);
3007*8975f5c5SAndroid Build Coastguard Worker }
3008*8975f5c5SAndroid Build Coastguard Worker 
3009*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexImage2D has
3010*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a luminance color
TEST_P(Texture2DTest,TexImageWithLuminancePBO)3011*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexImageWithLuminancePBO)
3012*8975f5c5SAndroid Build Coastguard Worker {
3013*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3014*8975f5c5SAndroid Build Coastguard Worker 
3015*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
3016*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
3017*8975f5c5SAndroid Build Coastguard Worker 
3018*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
3019*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
3020*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
3021*8975f5c5SAndroid Build Coastguard Worker 
3022*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 16, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
3023*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
3024*8975f5c5SAndroid Build Coastguard Worker 
3025*8975f5c5SAndroid Build Coastguard Worker     // Fill PBO with white, with middle one as grey
3026*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(16 * 16);
3027*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
3028*8975f5c5SAndroid Build Coastguard Worker     {
3029*8975f5c5SAndroid Build Coastguard Worker         if (pixelId == 8 * 7 + 7)
3030*8975f5c5SAndroid Build Coastguard Worker         {
3031*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 128;
3032*8975f5c5SAndroid Build Coastguard Worker         }
3033*8975f5c5SAndroid Build Coastguard Worker         else
3034*8975f5c5SAndroid Build Coastguard Worker         {
3035*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 255;
3036*8975f5c5SAndroid Build Coastguard Worker         }
3037*8975f5c5SAndroid Build Coastguard Worker     }
3038*8975f5c5SAndroid Build Coastguard Worker 
3039*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3040*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3041*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3042*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 16 * 16, pixels.data(), GL_STATIC_DRAW);
3043*8975f5c5SAndroid Build Coastguard Worker 
3044*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
3045*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
3046*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
3047*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3048*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3049*8975f5c5SAndroid Build Coastguard Worker 
3050*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
3051*8975f5c5SAndroid Build Coastguard Worker 
3052*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3053*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3054*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
3055*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
3056*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3057*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 255, 255, 255);
3058*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(width / 2 - 1, height / 2 - 1, 128, 128, 128, 255, 1);
3059*8975f5c5SAndroid Build Coastguard Worker }
3060*8975f5c5SAndroid Build Coastguard Worker 
3061*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2DEXT has
3062*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a RGB656 color
TEST_P(Texture2DTest,TexImageWithRGB565PBO)3063*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexImageWithRGB565PBO)
3064*8975f5c5SAndroid Build Coastguard Worker {
3065*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3066*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3067*8975f5c5SAndroid Build Coastguard Worker 
3068*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
3069*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
3070*8975f5c5SAndroid Build Coastguard Worker 
3071*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
3072*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
3073*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
3074*8975f5c5SAndroid Build Coastguard Worker 
3075*8975f5c5SAndroid Build Coastguard Worker     // Fill PBO with red, with middle one as green
3076*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> pixels(16 * 16);
3077*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
3078*8975f5c5SAndroid Build Coastguard Worker     {
3079*8975f5c5SAndroid Build Coastguard Worker         if (pixelId == 8 * 7 + 8)
3080*8975f5c5SAndroid Build Coastguard Worker         {
3081*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 0x7E0;
3082*8975f5c5SAndroid Build Coastguard Worker         }
3083*8975f5c5SAndroid Build Coastguard Worker         else
3084*8975f5c5SAndroid Build Coastguard Worker         {
3085*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 0xF800;
3086*8975f5c5SAndroid Build Coastguard Worker         }
3087*8975f5c5SAndroid Build Coastguard Worker     }
3088*8975f5c5SAndroid Build Coastguard Worker 
3089*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3090*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3091*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3092*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 2 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
3093*8975f5c5SAndroid Build Coastguard Worker 
3094*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB565, 16, 16);
3095*8975f5c5SAndroid Build Coastguard Worker 
3096*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
3097*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
3098*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
3099*8975f5c5SAndroid Build Coastguard Worker                     reinterpret_cast<void *>(2));
3100*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3101*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3102*8975f5c5SAndroid Build Coastguard Worker 
3103*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
3104*8975f5c5SAndroid Build Coastguard Worker 
3105*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3106*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3107*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
3108*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
3109*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3110*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
3111*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 2 - 1, height / 2 - 1, 0, 255, 0, 255);
3112*8975f5c5SAndroid Build Coastguard Worker }
3113*8975f5c5SAndroid Build Coastguard Worker 
3114*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2DEXT has
3115*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a RGBA4444 color
TEST_P(Texture2DTest,TexImageWithRGBA4444PBO)3116*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexImageWithRGBA4444PBO)
3117*8975f5c5SAndroid Build Coastguard Worker {
3118*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3119*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3120*8975f5c5SAndroid Build Coastguard Worker 
3121*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
3122*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
3123*8975f5c5SAndroid Build Coastguard Worker 
3124*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
3125*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
3126*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
3127*8975f5c5SAndroid Build Coastguard Worker 
3128*8975f5c5SAndroid Build Coastguard Worker     // Fill PBO with red, with middle one as green
3129*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> pixels(16 * 16);
3130*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
3131*8975f5c5SAndroid Build Coastguard Worker     {
3132*8975f5c5SAndroid Build Coastguard Worker         if (pixelId == 8 * 7 + 8)
3133*8975f5c5SAndroid Build Coastguard Worker         {
3134*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 0xF0F;
3135*8975f5c5SAndroid Build Coastguard Worker         }
3136*8975f5c5SAndroid Build Coastguard Worker         else
3137*8975f5c5SAndroid Build Coastguard Worker         {
3138*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 0xF00F;
3139*8975f5c5SAndroid Build Coastguard Worker         }
3140*8975f5c5SAndroid Build Coastguard Worker     }
3141*8975f5c5SAndroid Build Coastguard Worker 
3142*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3143*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3144*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3145*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 2 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
3146*8975f5c5SAndroid Build Coastguard Worker 
3147*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA4, 16, 16);
3148*8975f5c5SAndroid Build Coastguard Worker 
3149*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
3150*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
3151*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
3152*8975f5c5SAndroid Build Coastguard Worker                     reinterpret_cast<void *>(2));
3153*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3154*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3155*8975f5c5SAndroid Build Coastguard Worker 
3156*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
3157*8975f5c5SAndroid Build Coastguard Worker 
3158*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3159*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3160*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
3161*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
3162*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3163*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
3164*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 2 - 1, height / 2 - 1, 0, 255, 0, 255);
3165*8975f5c5SAndroid Build Coastguard Worker }
3166*8975f5c5SAndroid Build Coastguard Worker 
3167*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2DEXT has
3168*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a RGBA5551 color
TEST_P(Texture2DTest,TexImageWithRGBA5551PBO)3169*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexImageWithRGBA5551PBO)
3170*8975f5c5SAndroid Build Coastguard Worker {
3171*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3172*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3173*8975f5c5SAndroid Build Coastguard Worker 
3174*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
3175*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
3176*8975f5c5SAndroid Build Coastguard Worker 
3177*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
3178*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
3179*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
3180*8975f5c5SAndroid Build Coastguard Worker 
3181*8975f5c5SAndroid Build Coastguard Worker     // Fill PBO with red, with middle one as green
3182*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> pixels(16 * 16);
3183*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
3184*8975f5c5SAndroid Build Coastguard Worker     {
3185*8975f5c5SAndroid Build Coastguard Worker         if (pixelId == 8 * 7 + 7)
3186*8975f5c5SAndroid Build Coastguard Worker         {
3187*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 0x7C1;
3188*8975f5c5SAndroid Build Coastguard Worker         }
3189*8975f5c5SAndroid Build Coastguard Worker         else
3190*8975f5c5SAndroid Build Coastguard Worker         {
3191*8975f5c5SAndroid Build Coastguard Worker             pixels[pixelId] = 0xF801;
3192*8975f5c5SAndroid Build Coastguard Worker         }
3193*8975f5c5SAndroid Build Coastguard Worker     }
3194*8975f5c5SAndroid Build Coastguard Worker 
3195*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3196*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3197*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3198*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 2 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
3199*8975f5c5SAndroid Build Coastguard Worker 
3200*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB5_A1, 16, 16);
3201*8975f5c5SAndroid Build Coastguard Worker 
3202*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
3203*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
3204*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, nullptr);
3205*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3206*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3207*8975f5c5SAndroid Build Coastguard Worker 
3208*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
3209*8975f5c5SAndroid Build Coastguard Worker 
3210*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3211*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3212*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
3213*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
3214*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3215*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
3216*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 2 - 1, height / 2 - 1, 0, 255, 0, 255);
3217*8975f5c5SAndroid Build Coastguard Worker }
3218*8975f5c5SAndroid Build Coastguard Worker 
3219*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D from a PBO respects GL_UNPACK_ROW_LENGTH.
TEST_P(Texture2DTest,TexImageUnpackRowLengthPBO)3220*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TexImageUnpackRowLengthPBO)
3221*8975f5c5SAndroid Build Coastguard Worker {
3222*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
3223*8975f5c5SAndroid Build Coastguard Worker     {
3224*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3225*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3226*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_unpack_subimage"));
3227*8975f5c5SAndroid Build Coastguard Worker     }
3228*8975f5c5SAndroid Build Coastguard Worker 
3229*8975f5c5SAndroid Build Coastguard Worker     const int width      = getWindowWidth() / 2;
3230*8975f5c5SAndroid Build Coastguard Worker     const int height     = getWindowHeight();
3231*8975f5c5SAndroid Build Coastguard Worker     const int rowLength  = getWindowWidth();
3232*8975f5c5SAndroid Build Coastguard Worker     const int bufferSize = rowLength * height;
3233*8975f5c5SAndroid Build Coastguard Worker 
3234*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
3235*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
3236*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
3237*8975f5c5SAndroid Build Coastguard Worker 
3238*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(bufferSize);
3239*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < rowLength; ++y)
3240*8975f5c5SAndroid Build Coastguard Worker     {
3241*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < width; ++x)
3242*8975f5c5SAndroid Build Coastguard Worker         {
3243*8975f5c5SAndroid Build Coastguard Worker             pixels[y * rowLength + x] =
3244*8975f5c5SAndroid Build Coastguard Worker                 x < width ? (y < height / 2 ? GLColor::green : GLColor::blue) : GLColor::red;
3245*8975f5c5SAndroid Build Coastguard Worker         }
3246*8975f5c5SAndroid Build Coastguard Worker     }
3247*8975f5c5SAndroid Build Coastguard Worker 
3248*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3249*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3250*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3251*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize * sizeof(GLColor), pixels.data(),
3252*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
3253*8975f5c5SAndroid Build Coastguard Worker 
3254*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
3255*8975f5c5SAndroid Build Coastguard Worker 
3256*8975f5c5SAndroid Build Coastguard Worker     // Initializes the texture from width x height of the PBO.
3257*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ROW_LENGTH, rowLength);
3258*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3259*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3260*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3261*8975f5c5SAndroid Build Coastguard Worker 
3262*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
3263*8975f5c5SAndroid Build Coastguard Worker 
3264*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3265*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3266*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
3267*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &pbo);
3268*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3269*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3270*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, height - 1, GLColor::blue);
3271*8975f5c5SAndroid Build Coastguard Worker }
3272*8975f5c5SAndroid Build Coastguard Worker 
3273*8975f5c5SAndroid Build Coastguard Worker // Test if the KHR debug label is set and passed to D3D correctly using glCopyTexImage2D.
TEST_P(Texture2DTest,TextureKHRDebugLabelWithCopyTexImage2D)3274*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureKHRDebugLabelWithCopyTexImage2D)
3275*8975f5c5SAndroid Build Coastguard Worker {
3276*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2D;
3277*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2D);
3278*8975f5c5SAndroid Build Coastguard Worker 
3279*8975f5c5SAndroid Build Coastguard Worker     // Create a texture and copy into, to initialize storage object.
3280*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0);
3281*8975f5c5SAndroid Build Coastguard Worker 
3282*8975f5c5SAndroid Build Coastguard Worker     // Set KHR Debug Label.
3283*8975f5c5SAndroid Build Coastguard Worker     std::string label = "TestKHR.DebugLabel";
3284*8975f5c5SAndroid Build Coastguard Worker     glObjectLabelKHR(GL_TEXTURE, texture2D, -1, label.c_str());
3285*8975f5c5SAndroid Build Coastguard Worker 
3286*8975f5c5SAndroid Build Coastguard Worker     std::vector<char> labelBuf(label.length() + 1);
3287*8975f5c5SAndroid Build Coastguard Worker     GLsizei labelLengthBuf = 0;
3288*8975f5c5SAndroid Build Coastguard Worker 
3289*8975f5c5SAndroid Build Coastguard Worker     glGetObjectLabelKHR(GL_TEXTURE, texture2D, static_cast<GLsizei>(labelBuf.size()),
3290*8975f5c5SAndroid Build Coastguard Worker                         &labelLengthBuf, labelBuf.data());
3291*8975f5c5SAndroid Build Coastguard Worker 
3292*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
3293*8975f5c5SAndroid Build Coastguard Worker     EXPECT_STREQ(label.c_str(), labelBuf.data());
3294*8975f5c5SAndroid Build Coastguard Worker 
3295*8975f5c5SAndroid Build Coastguard Worker     // Delete the texture.
3296*8975f5c5SAndroid Build Coastguard Worker     texture2D.reset();
3297*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3298*8975f5c5SAndroid Build Coastguard Worker 
3299*8975f5c5SAndroid Build Coastguard Worker     glObjectLabelKHR(GL_TEXTURE, texture2D, -1, label.c_str());
3300*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
3301*8975f5c5SAndroid Build Coastguard Worker 
3302*8975f5c5SAndroid Build Coastguard Worker     glGetObjectLabelKHR(GL_TEXTURE, texture2D, static_cast<GLsizei>(labelBuf.size()),
3303*8975f5c5SAndroid Build Coastguard Worker                         &labelLengthBuf, labelBuf.data());
3304*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
3305*8975f5c5SAndroid Build Coastguard Worker }
3306*8975f5c5SAndroid Build Coastguard Worker 
3307*8975f5c5SAndroid Build Coastguard Worker // Test to call labeling API before the storage texture is created.
TEST_P(Texture2DTest,CallKHRDebugLabelBeforeTexStorageCreation)3308*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CallKHRDebugLabelBeforeTexStorageCreation)
3309*8975f5c5SAndroid Build Coastguard Worker {
3310*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2D;
3311*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2D);
3312*8975f5c5SAndroid Build Coastguard Worker 
3313*8975f5c5SAndroid Build Coastguard Worker     // Set label before texture storage creation.
3314*8975f5c5SAndroid Build Coastguard Worker     std::string label = "TestKHR.DebugLabel";
3315*8975f5c5SAndroid Build Coastguard Worker     glObjectLabelKHR(GL_TEXTURE, texture2D, -1, label.c_str());
3316*8975f5c5SAndroid Build Coastguard Worker 
3317*8975f5c5SAndroid Build Coastguard Worker     // Create a texture and copy into, to initialize storage object.
3318*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0);
3319*8975f5c5SAndroid Build Coastguard Worker 
3320*8975f5c5SAndroid Build Coastguard Worker     std::vector<char> labelBuf(label.length() + 1);
3321*8975f5c5SAndroid Build Coastguard Worker     GLsizei labelLengthBuf = 0;
3322*8975f5c5SAndroid Build Coastguard Worker 
3323*8975f5c5SAndroid Build Coastguard Worker     glGetObjectLabelKHR(GL_TEXTURE, texture2D, static_cast<GLsizei>(labelBuf.size()),
3324*8975f5c5SAndroid Build Coastguard Worker                         &labelLengthBuf, labelBuf.data());
3325*8975f5c5SAndroid Build Coastguard Worker 
3326*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
3327*8975f5c5SAndroid Build Coastguard Worker     EXPECT_STREQ(label.c_str(), labelBuf.data());
3328*8975f5c5SAndroid Build Coastguard Worker 
3329*8975f5c5SAndroid Build Coastguard Worker     // Delete the texture.
3330*8975f5c5SAndroid Build Coastguard Worker     texture2D.reset();
3331*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3332*8975f5c5SAndroid Build Coastguard Worker 
3333*8975f5c5SAndroid Build Coastguard Worker     glObjectLabelKHR(GL_TEXTURE, texture2D, -1, label.c_str());
3334*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
3335*8975f5c5SAndroid Build Coastguard Worker 
3336*8975f5c5SAndroid Build Coastguard Worker     glGetObjectLabelKHR(GL_TEXTURE, texture2D, static_cast<GLsizei>(labelBuf.size()),
3337*8975f5c5SAndroid Build Coastguard Worker                         &labelLengthBuf, labelBuf.data());
3338*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
3339*8975f5c5SAndroid Build Coastguard Worker }
3340*8975f5c5SAndroid Build Coastguard Worker 
3341*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2D has
3342*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a depth-only format.
TEST_P(Texture2DTestES3,TexImageWithDepthPBO)3343*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexImageWithDepthPBO)
3344*8975f5c5SAndroid Build Coastguard Worker {
3345*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3346*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3347*8975f5c5SAndroid Build Coastguard Worker 
3348*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263861
3349*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsMac());
3350*8975f5c5SAndroid Build Coastguard Worker 
3351*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 4;
3352*8975f5c5SAndroid Build Coastguard Worker 
3353*8975f5c5SAndroid Build Coastguard Worker     // Set up the framebuffer.
3354*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3355*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3356*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3357*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3358*8975f5c5SAndroid Build Coastguard Worker 
3359*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTexture;
3360*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthTexture);
3361*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT16, kSize, kSize);
3362*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3363*8975f5c5SAndroid Build Coastguard Worker 
3364*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3365*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3366*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3367*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
3368*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3369*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3370*8975f5c5SAndroid Build Coastguard Worker 
3371*8975f5c5SAndroid Build Coastguard Worker     // Clear depth to 0, ensuring the texture's image is allocated.
3372*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0);
3373*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
3374*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
3375*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
3376*8975f5c5SAndroid Build Coastguard Worker 
3377*8975f5c5SAndroid Build Coastguard Worker     // Fill depth with 1.0f.
3378*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> pixels(kSize * kSize);
3379*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < pixels.size(); ++pixelId)
3380*8975f5c5SAndroid Build Coastguard Worker     {
3381*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId] = 0xFFFF;
3382*8975f5c5SAndroid Build Coastguard Worker     }
3383*8975f5c5SAndroid Build Coastguard Worker 
3384*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3385*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3386*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3387*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixels.size() * sizeof(pixels[0]), pixels.data(),
3388*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
3389*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3390*8975f5c5SAndroid Build Coastguard Worker 
3391*8975f5c5SAndroid Build Coastguard Worker     // Upload PBO data.
3392*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
3393*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
3394*8975f5c5SAndroid Build Coastguard Worker 
3395*8975f5c5SAndroid Build Coastguard Worker     // If depth is not set to 1, rendering would fail.
3396*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3397*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
3398*8975f5c5SAndroid Build Coastguard Worker 
3399*8975f5c5SAndroid Build Coastguard Worker     // Draw red
3400*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3401*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.95f);
3402*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3403*8975f5c5SAndroid Build Coastguard Worker 
3404*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
3405*8975f5c5SAndroid Build Coastguard Worker }
3406*8975f5c5SAndroid Build Coastguard Worker 
3407*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a DEPTH_COMPONENT16 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth16)3408*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth16)
3409*8975f5c5SAndroid Build Coastguard Worker {
3410*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, false);
3411*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT16, GL_STENCIL_INDEX, false);
3412*8975f5c5SAndroid Build Coastguard Worker }
3413*8975f5c5SAndroid Build Coastguard Worker 
3414*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a swizzled DEPTH_COMPONENT16 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth16Swizzled)3415*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth16Swizzled)
3416*8975f5c5SAndroid Build Coastguard Worker {
3417*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, true);
3418*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT16, GL_STENCIL_INDEX, true);
3419*8975f5c5SAndroid Build Coastguard Worker }
3420*8975f5c5SAndroid Build Coastguard Worker 
3421*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a DEPTH_COMPONENT24 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth24)3422*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth24)
3423*8975f5c5SAndroid Build Coastguard Worker {
3424*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, false);
3425*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT24, GL_STENCIL_INDEX, false);
3426*8975f5c5SAndroid Build Coastguard Worker }
3427*8975f5c5SAndroid Build Coastguard Worker 
3428*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a swizzled DEPTH_COMPONENT24 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth24Swizzled)3429*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth24Swizzled)
3430*8975f5c5SAndroid Build Coastguard Worker {
3431*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, true);
3432*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT24, GL_STENCIL_INDEX, true);
3433*8975f5c5SAndroid Build Coastguard Worker }
3434*8975f5c5SAndroid Build Coastguard Worker 
3435*8975f5c5SAndroid Build Coastguard Worker // Test depth sampling with a DEPTH_COMPONENT32F texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth32f)3436*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth32f)
3437*8975f5c5SAndroid Build Coastguard Worker {
3438*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, false);
3439*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT32F, GL_STENCIL_INDEX, false);
3440*8975f5c5SAndroid Build Coastguard Worker }
3441*8975f5c5SAndroid Build Coastguard Worker 
3442*8975f5c5SAndroid Build Coastguard Worker // Test depth sampling with a swizzled DEPTH_COMPONENT32F texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth32fSwizzled)3443*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth32fSwizzled)
3444*8975f5c5SAndroid Build Coastguard Worker {
3445*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, true);
3446*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH_COMPONENT32F, GL_STENCIL_INDEX, true);
3447*8975f5c5SAndroid Build Coastguard Worker }
3448*8975f5c5SAndroid Build Coastguard Worker 
3449*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a DEPTH24_STENCIL8 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth24Stencil8)3450*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth24Stencil8)
3451*8975f5c5SAndroid Build Coastguard Worker {
3452*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH24_STENCIL8, GL_DEPTH_COMPONENT, false);
3453*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH24_STENCIL8, GL_STENCIL_INDEX, false);
3454*8975f5c5SAndroid Build Coastguard Worker }
3455*8975f5c5SAndroid Build Coastguard Worker 
3456*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a swizzled DEPTH24_STENCIL8 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth24Stencil8Swizzled)3457*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth24Stencil8Swizzled)
3458*8975f5c5SAndroid Build Coastguard Worker {
3459*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH24_STENCIL8, GL_DEPTH_COMPONENT, true);
3460*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH24_STENCIL8, GL_STENCIL_INDEX, true);
3461*8975f5c5SAndroid Build Coastguard Worker }
3462*8975f5c5SAndroid Build Coastguard Worker 
3463*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a DEPTH32F_STENCIL8 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth32fStencil8)3464*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth32fStencil8)
3465*8975f5c5SAndroid Build Coastguard Worker {
3466*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH32F_STENCIL8, GL_DEPTH_COMPONENT, false);
3467*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH32F_STENCIL8, GL_STENCIL_INDEX, false);
3468*8975f5c5SAndroid Build Coastguard Worker }
3469*8975f5c5SAndroid Build Coastguard Worker 
3470*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a swizzled DEPTH32F_STENCIL8 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithDepth32fStencil8Swizzled)3471*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithDepth32fStencil8Swizzled)
3472*8975f5c5SAndroid Build Coastguard Worker {
3473*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH32F_STENCIL8, GL_DEPTH_COMPONENT, true);
3474*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_DEPTH32F_STENCIL8, GL_STENCIL_INDEX, true);
3475*8975f5c5SAndroid Build Coastguard Worker }
3476*8975f5c5SAndroid Build Coastguard Worker 
3477*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a STENCIL_INDEX8 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithStencil8)3478*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithStencil8)
3479*8975f5c5SAndroid Build Coastguard Worker {
3480*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_stencil8"));
3481*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_STENCIL_INDEX8, GL_DEPTH_COMPONENT, false);
3482*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_STENCIL_INDEX8, GL_STENCIL_INDEX, false);
3483*8975f5c5SAndroid Build Coastguard Worker }
3484*8975f5c5SAndroid Build Coastguard Worker 
3485*8975f5c5SAndroid Build Coastguard Worker // Test sampling modes with a swizzled STENCIL_INDEX8 texture.
TEST_P(Texture2DDepthStencilTestES3,TexSampleModesWithStencil8Swizzled)3486*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, TexSampleModesWithStencil8Swizzled)
3487*8975f5c5SAndroid Build Coastguard Worker {
3488*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_stencil8"));
3489*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_STENCIL_INDEX8, GL_DEPTH_COMPONENT, true);
3490*8975f5c5SAndroid Build Coastguard Worker     TestSampleWithDepthStencilMode(GL_STENCIL_INDEX8, GL_STENCIL_INDEX, true);
3491*8975f5c5SAndroid Build Coastguard Worker }
3492*8975f5c5SAndroid Build Coastguard Worker 
3493*8975f5c5SAndroid Build Coastguard Worker // Test that updating a texture format triggers depth/stencil mode resync.
TEST_P(Texture2DDepthStencilTestES3,Redefinition)3494*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthStencilTestES3, Redefinition)
3495*8975f5c5SAndroid Build Coastguard Worker {
3496*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_stencil_texturing"));
3497*8975f5c5SAndroid Build Coastguard Worker 
3498*8975f5c5SAndroid Build Coastguard Worker     constexpr char kDepthFS[] =
3499*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
3500*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
3501*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2D tex;
3502*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
3503*8975f5c5SAndroid Build Coastguard Worker void main()
3504*8975f5c5SAndroid Build Coastguard Worker {
3505*8975f5c5SAndroid Build Coastguard Worker     color = texture(tex, vec2(0, 0));
3506*8975f5c5SAndroid Build Coastguard Worker })";
3507*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(programDepth, essl3_shaders::vs::Simple(), kDepthFS);
3508*8975f5c5SAndroid Build Coastguard Worker 
3509*8975f5c5SAndroid Build Coastguard Worker     constexpr char kStencilFS[] =
3510*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
3511*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
3512*8975f5c5SAndroid Build Coastguard Worker uniform highp usampler2D tex;
3513*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
3514*8975f5c5SAndroid Build Coastguard Worker void main()
3515*8975f5c5SAndroid Build Coastguard Worker {
3516*8975f5c5SAndroid Build Coastguard Worker     color = vec4(texelFetch(tex, ivec2(0, 0), 0)) / 255.0;
3517*8975f5c5SAndroid Build Coastguard Worker })";
3518*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(programStencil, essl3_shaders::vs::Simple(), kStencilFS);
3519*8975f5c5SAndroid Build Coastguard Worker 
3520*8975f5c5SAndroid Build Coastguard Worker     // Set up a D32F with stencil mode.
3521*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
3522*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
3523*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3524*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3525*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE_ANGLE, GL_STENCIL_INDEX);
3526*8975f5c5SAndroid Build Coastguard Worker 
3527*8975f5c5SAndroid Build Coastguard Worker     const GLfloat d32f = 0.5f;
3528*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
3529*8975f5c5SAndroid Build Coastguard Worker                  &d32f);
3530*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3531*8975f5c5SAndroid Build Coastguard Worker 
3532*8975f5c5SAndroid Build Coastguard Worker     drawQuad(programDepth, essl3_shaders::PositionAttrib(), 0.5f);
3533*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 0, 0, 255), 1);
3534*8975f5c5SAndroid Build Coastguard Worker 
3535*8975f5c5SAndroid Build Coastguard Worker     // Redefine the same texture as D24S8
3536*8975f5c5SAndroid Build Coastguard Worker     const GLuint d24s8 = 0xC0;
3537*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 1, 1, 0, GL_DEPTH_STENCIL,
3538*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_24_8, &d24s8);
3539*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3540*8975f5c5SAndroid Build Coastguard Worker 
3541*8975f5c5SAndroid Build Coastguard Worker     drawQuad(programStencil, essl3_shaders::PositionAttrib(), 0.5f);
3542*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(192, 0, 0, 1), 1);
3543*8975f5c5SAndroid Build Coastguard Worker 
3544*8975f5c5SAndroid Build Coastguard Worker     // Redefine the same texture as D16
3545*8975f5c5SAndroid Build Coastguard Worker     const GLushort d16 = 0x4000;
3546*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 1, 1, 0, GL_DEPTH_COMPONENT,
3547*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_SHORT, &d16);
3548*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3549*8975f5c5SAndroid Build Coastguard Worker 
3550*8975f5c5SAndroid Build Coastguard Worker     drawQuad(programDepth, essl3_shaders::PositionAttrib(), 0.5f);
3551*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(64, 0, 0, 255), 1);
3552*8975f5c5SAndroid Build Coastguard Worker }
3553*8975f5c5SAndroid Build Coastguard Worker 
3554*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2D has
3555*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a stencil-only format.
TEST_P(Texture2DTestES3,TexImageWithStencilPBO)3556*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexImageWithStencilPBO)
3557*8975f5c5SAndroid Build Coastguard Worker {
3558*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3559*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3560*8975f5c5SAndroid Build Coastguard Worker 
3561*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263861
3562*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsMac());
3563*8975f5c5SAndroid Build Coastguard Worker 
3564*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 4;
3565*8975f5c5SAndroid Build Coastguard Worker 
3566*8975f5c5SAndroid Build Coastguard Worker     // Set up the framebuffer.
3567*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3568*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3569*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3570*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3571*8975f5c5SAndroid Build Coastguard Worker 
3572*8975f5c5SAndroid Build Coastguard Worker     GLTexture stencilTexture;
3573*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, stencilTexture);
3574*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_STENCIL_INDEX8, kSize, kSize);
3575*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3576*8975f5c5SAndroid Build Coastguard Worker 
3577*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3578*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3579*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3580*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 0);
3581*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3582*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3583*8975f5c5SAndroid Build Coastguard Worker 
3584*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil to 0, ensuring the texture's image is allocated.
3585*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0);
3586*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
3587*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3588*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
3589*8975f5c5SAndroid Build Coastguard Worker 
3590*8975f5c5SAndroid Build Coastguard Worker     // Fill stencil with 0x4E
3591*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(kSize * kSize);
3592*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < pixels.size(); ++pixelId)
3593*8975f5c5SAndroid Build Coastguard Worker     {
3594*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId] = 0x4E;
3595*8975f5c5SAndroid Build Coastguard Worker     }
3596*8975f5c5SAndroid Build Coastguard Worker 
3597*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3598*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3599*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3600*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixels.size() * sizeof(pixels[0]), pixels.data(),
3601*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
3602*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3603*8975f5c5SAndroid Build Coastguard Worker 
3604*8975f5c5SAndroid Build Coastguard Worker     // Upload PBO data.
3605*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,
3606*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
3607*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3608*8975f5c5SAndroid Build Coastguard Worker 
3609*8975f5c5SAndroid Build Coastguard Worker     // If stencil is not set to 0x4E, rendering would fail.
3610*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3611*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x4E, 0xFF);
3612*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
3613*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
3614*8975f5c5SAndroid Build Coastguard Worker 
3615*8975f5c5SAndroid Build Coastguard Worker     // Draw red
3616*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3617*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.95f);
3618*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3619*8975f5c5SAndroid Build Coastguard Worker 
3620*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
3621*8975f5c5SAndroid Build Coastguard Worker }
3622*8975f5c5SAndroid Build Coastguard Worker 
3623*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2D has
3624*8975f5c5SAndroid Build Coastguard Worker // initialized the image with a depth/stencil format.
TEST_P(Texture2DTestES3,TexImageWithDepthStencilPBO)3625*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexImageWithDepthStencilPBO)
3626*8975f5c5SAndroid Build Coastguard Worker {
3627*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
3628*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
3629*8975f5c5SAndroid Build Coastguard Worker 
3630*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263861
3631*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsMac());
3632*8975f5c5SAndroid Build Coastguard Worker 
3633*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 4;
3634*8975f5c5SAndroid Build Coastguard Worker 
3635*8975f5c5SAndroid Build Coastguard Worker     // Set up the framebuffer.
3636*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3637*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3638*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3639*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3640*8975f5c5SAndroid Build Coastguard Worker 
3641*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthStencilTexture;
3642*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthStencilTexture);
3643*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, kSize, kSize);
3644*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3645*8975f5c5SAndroid Build Coastguard Worker 
3646*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3647*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3648*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3649*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
3650*8975f5c5SAndroid Build Coastguard Worker                            depthStencilTexture, 0);
3651*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3652*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3653*8975f5c5SAndroid Build Coastguard Worker 
3654*8975f5c5SAndroid Build Coastguard Worker     // Clear depth and stencil to 0, ensuring the texture's image is allocated.
3655*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0);
3656*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0);
3657*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
3658*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
3660*8975f5c5SAndroid Build Coastguard Worker 
3661*8975f5c5SAndroid Build Coastguard Worker     // Fill depth with 1.0f and stencil with 0xD5
3662*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> pixels(kSize * kSize);
3663*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < pixels.size(); ++pixelId)
3664*8975f5c5SAndroid Build Coastguard Worker     {
3665*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId] = 0xFFFFFFD5;
3666*8975f5c5SAndroid Build Coastguard Worker     }
3667*8975f5c5SAndroid Build Coastguard Worker 
3668*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
3669*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
3670*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
3671*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixels.size() * sizeof(pixels[0]), pixels.data(),
3672*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
3673*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3674*8975f5c5SAndroid Build Coastguard Worker 
3675*8975f5c5SAndroid Build Coastguard Worker     // Upload PBO data.
3676*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
3677*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
3678*8975f5c5SAndroid Build Coastguard Worker 
3679*8975f5c5SAndroid Build Coastguard Worker     // If depth is not set to 1, rendering would fail.
3680*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3681*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
3682*8975f5c5SAndroid Build Coastguard Worker 
3683*8975f5c5SAndroid Build Coastguard Worker     // If stencil is not set to 0xD5, rendering would fail.
3684*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3685*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0xD5, 0xFF);
3686*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
3687*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
3688*8975f5c5SAndroid Build Coastguard Worker 
3689*8975f5c5SAndroid Build Coastguard Worker     // Draw red
3690*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3691*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.95f);
3692*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3693*8975f5c5SAndroid Build Coastguard Worker 
3694*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
3695*8975f5c5SAndroid Build Coastguard Worker }
3696*8975f5c5SAndroid Build Coastguard Worker 
3697*8975f5c5SAndroid Build Coastguard Worker // Test that it is possible to upload to a texture, upload a second texture and delete the first.
TEST_P(Texture2DTestES3,Texture1UploadThenTexture2UploadThenTexture1Delete)3698*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, Texture1UploadThenTexture2UploadThenTexture1Delete)
3699*8975f5c5SAndroid Build Coastguard Worker {
3700*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kMaxBufferToImageCopySize = 64 * 1024 * 1024;
3701*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kTexSize                  = 4096;
3702*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kPixelSizeRGBA          = 4;
3703*8975f5c5SAndroid Build Coastguard Worker     static_assert(kTexSize * kTexSize * kPixelSizeRGBA == kMaxBufferToImageCopySize);
3704*8975f5c5SAndroid Build Coastguard Worker 
3705*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> textureColors(kTexSize * kTexSize, GLColor::red);
3706*8975f5c5SAndroid Build Coastguard Worker 
3707*8975f5c5SAndroid Build Coastguard Worker     // A mutable texture is defined here. The second texture is used to flush the first one when the
3708*8975f5c5SAndroid Build Coastguard Worker     // relevant feature (mutableMipmapTextureUpload) is enabled. If flushed, the update on level 0
3709*8975f5c5SAndroid Build Coastguard Worker     // is large enough to trigger one submission using Vulkan, but the rest of its updates will not
3710*8975f5c5SAndroid Build Coastguard Worker     // trigger a second one. In that case, the texture should not be deleted until all updates are
3711*8975f5c5SAndroid Build Coastguard Worker     // processed.
3712*8975f5c5SAndroid Build Coastguard Worker     GLuint texture1;
3713*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &texture1);
3714*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture1);
3715*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTexSize, kTexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3716*8975f5c5SAndroid Build Coastguard Worker                  textureColors.data());
3717*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kTexSize / 2, kTexSize / 2, 0, GL_RGBA,
3718*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, textureColors.data());
3719*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3720*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3721*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3722*8975f5c5SAndroid Build Coastguard Worker 
3723*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2;
3724*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2);
3725*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3726*8975f5c5SAndroid Build Coastguard Worker                  textureColors.data());
3727*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3728*8975f5c5SAndroid Build Coastguard Worker 
3729*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &texture1);
3730*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3731*8975f5c5SAndroid Build Coastguard Worker }
3732*8975f5c5SAndroid Build Coastguard Worker 
3733*8975f5c5SAndroid Build Coastguard Worker // Test that the driver performs a flush when there is a large amount of image updates.
TEST_P(Texture2DMemoryTestES3,TextureDataInLoopUntilFlush)3734*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DMemoryTestES3, TextureDataInLoopUntilFlush)
3735*8975f5c5SAndroid Build Coastguard Worker {
3736*8975f5c5SAndroid Build Coastguard Worker     // Run this test for Vulkan only.
3737*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
3738*8975f5c5SAndroid Build Coastguard Worker 
3739*8975f5c5SAndroid Build Coastguard Worker     // If VK_EXT_host_image_copy is used, uploads will all be done on the CPU and there would be no
3740*8975f5c5SAndroid Build Coastguard Worker     // submissions.
3741*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getEGLWindow()->isFeatureEnabled(Feature::SupportsHostImageCopy));
3742*8975f5c5SAndroid Build Coastguard Worker 
3743*8975f5c5SAndroid Build Coastguard Worker     GLPerfMonitor monitor;
3744*8975f5c5SAndroid Build Coastguard Worker     glBeginPerfMonitorAMD(monitor);
3745*8975f5c5SAndroid Build Coastguard Worker 
3746*8975f5c5SAndroid Build Coastguard Worker     uint64_t expectedSubmitCalls = getPerfCounters().commandQueueSubmitCallsTotal + 1;
3747*8975f5c5SAndroid Build Coastguard Worker 
3748*8975f5c5SAndroid Build Coastguard Worker     // Set up program
3749*8975f5c5SAndroid Build Coastguard Worker     const char *kFS = R"(#version 300 es
3750*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3751*8975f5c5SAndroid Build Coastguard Worker uniform uni { vec4 color; };
3752*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
3753*8975f5c5SAndroid Build Coastguard Worker void main()
3754*8975f5c5SAndroid Build Coastguard Worker {
3755*8975f5c5SAndroid Build Coastguard Worker     fragColor = color;
3756*8975f5c5SAndroid Build Coastguard Worker })";
3757*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
3758*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(program, 0u);
3759*8975f5c5SAndroid Build Coastguard Worker 
3760*8975f5c5SAndroid Build Coastguard Worker     // Set up the uniform buffer and framebuffer
3761*8975f5c5SAndroid Build Coastguard Worker     GLint uniformBufferIndex;
3762*8975f5c5SAndroid Build Coastguard Worker     uniformBufferIndex = glGetUniformBlockIndex(program, "uni");
3763*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(uniformBufferIndex, -1);
3764*8975f5c5SAndroid Build Coastguard Worker 
3765*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3766*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kBufferSize = 4 * 1024 * 1024;
3767*8975f5c5SAndroid Build Coastguard Worker     std::vector<float> floatData;
3768*8975f5c5SAndroid Build Coastguard Worker     floatData.resize(kBufferSize / (sizeof(float)), 0.0f);
3769*8975f5c5SAndroid Build Coastguard Worker     floatData[0] = 0.5f;
3770*8975f5c5SAndroid Build Coastguard Worker     floatData[1] = 0.75f;
3771*8975f5c5SAndroid Build Coastguard Worker     floatData[2] = 0.25f;
3772*8975f5c5SAndroid Build Coastguard Worker     floatData[3] = 1.0f;
3773*8975f5c5SAndroid Build Coastguard Worker 
3774*8975f5c5SAndroid Build Coastguard Worker     GLBuffer uniformBuffer;
3775*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, uniformBuffer);
3776*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, kBufferSize, floatData.data(), GL_STATIC_DRAW);
3777*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniformBuffer);
3778*8975f5c5SAndroid Build Coastguard Worker     glUniformBlockBinding(program, uniformBufferIndex, 0);
3779*8975f5c5SAndroid Build Coastguard Worker 
3780*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3781*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3782*8975f5c5SAndroid Build Coastguard Worker 
3783*8975f5c5SAndroid Build Coastguard Worker     // Create textures and draw
3784*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTextureWidth  = 512;
3785*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTextureHeight = 512;
3786*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> textureColor(kTextureWidth * kTextureHeight, GLColor::red);
3787*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kIterationCount = 4096;
3788*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kIterationCount];
3789*8975f5c5SAndroid Build Coastguard Worker 
3790*8975f5c5SAndroid Build Coastguard Worker     for (auto &texture : textures)
3791*8975f5c5SAndroid Build Coastguard Worker     {
3792*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
3793*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kTextureWidth, kTextureHeight);
3794*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureWidth, kTextureHeight, GL_RGBA,
3795*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, textureColor.data());
3796*8975f5c5SAndroid Build Coastguard Worker 
3797*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3798*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3799*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
3800*8975f5c5SAndroid Build Coastguard Worker 
3801*8975f5c5SAndroid Build Coastguard Worker         if (getPerfCounters().commandQueueSubmitCallsTotal == expectedSubmitCalls)
3802*8975f5c5SAndroid Build Coastguard Worker         {
3803*8975f5c5SAndroid Build Coastguard Worker             break;
3804*8975f5c5SAndroid Build Coastguard Worker         }
3805*8975f5c5SAndroid Build Coastguard Worker     }
3806*8975f5c5SAndroid Build Coastguard Worker     glEndPerfMonitorAMD(monitor);
3807*8975f5c5SAndroid Build Coastguard Worker 
3808*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(getPerfCounters().commandQueueSubmitCallsTotal, expectedSubmitCalls);
3809*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3810*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 191, 64, 255, 1);
3811*8975f5c5SAndroid Build Coastguard Worker }
3812*8975f5c5SAndroid Build Coastguard Worker 
3813*8975f5c5SAndroid Build Coastguard Worker // Creating a texture and drawing with it in a loop without glFlush() should still work. Driver is
3814*8975f5c5SAndroid Build Coastguard Worker // supposedly to issue flush if needed. There should be no fallbacks to allocate outside the device
3815*8975f5c5SAndroid Build Coastguard Worker // memory.
TEST_P(Texture2DMemoryTestES3,TextureDataInLoopManyTimes)3816*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DMemoryTestES3, TextureDataInLoopManyTimes)
3817*8975f5c5SAndroid Build Coastguard Worker {
3818*8975f5c5SAndroid Build Coastguard Worker     // Run this test for Vulkan only.
3819*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
3820*8975f5c5SAndroid Build Coastguard Worker 
3821*8975f5c5SAndroid Build Coastguard Worker     GLPerfMonitor monitor;
3822*8975f5c5SAndroid Build Coastguard Worker     glBeginPerfMonitorAMD(monitor);
3823*8975f5c5SAndroid Build Coastguard Worker 
3824*8975f5c5SAndroid Build Coastguard Worker     uint64_t expectedSubmitCalls           = getPerfCounters().commandQueueSubmitCallsTotal + 1;
3825*8975f5c5SAndroid Build Coastguard Worker     uint64_t expectedDeviceMemoryFallbacks = getPerfCounters().deviceMemoryImageAllocationFallbacks;
3826*8975f5c5SAndroid Build Coastguard Worker 
3827*8975f5c5SAndroid Build Coastguard Worker     // Set up program
3828*8975f5c5SAndroid Build Coastguard Worker     const char *kFS = R"(#version 300 es
3829*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3830*8975f5c5SAndroid Build Coastguard Worker uniform uni { vec4 color; };
3831*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
3832*8975f5c5SAndroid Build Coastguard Worker void main()
3833*8975f5c5SAndroid Build Coastguard Worker {
3834*8975f5c5SAndroid Build Coastguard Worker     fragColor = color;
3835*8975f5c5SAndroid Build Coastguard Worker })";
3836*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
3837*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(program, 0u);
3838*8975f5c5SAndroid Build Coastguard Worker 
3839*8975f5c5SAndroid Build Coastguard Worker     // Set up the uniform buffer and framebuffer
3840*8975f5c5SAndroid Build Coastguard Worker     GLint uniformBufferIndex;
3841*8975f5c5SAndroid Build Coastguard Worker     uniformBufferIndex = glGetUniformBlockIndex(program, "uni");
3842*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(uniformBufferIndex, -1);
3843*8975f5c5SAndroid Build Coastguard Worker 
3844*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3845*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kBufferSize = 4 * 1024 * 1024;
3846*8975f5c5SAndroid Build Coastguard Worker     std::vector<float> floatData;
3847*8975f5c5SAndroid Build Coastguard Worker     floatData.resize(kBufferSize / (sizeof(float)), 0.0f);
3848*8975f5c5SAndroid Build Coastguard Worker     floatData[0] = 0.5f;
3849*8975f5c5SAndroid Build Coastguard Worker     floatData[1] = 0.75f;
3850*8975f5c5SAndroid Build Coastguard Worker     floatData[2] = 0.25f;
3851*8975f5c5SAndroid Build Coastguard Worker     floatData[3] = 1.0f;
3852*8975f5c5SAndroid Build Coastguard Worker 
3853*8975f5c5SAndroid Build Coastguard Worker     GLBuffer uniformBuffer;
3854*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, uniformBuffer);
3855*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, kBufferSize, floatData.data(), GL_STATIC_DRAW);
3856*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniformBuffer);
3857*8975f5c5SAndroid Build Coastguard Worker     glUniformBlockBinding(program, uniformBufferIndex, 0);
3858*8975f5c5SAndroid Build Coastguard Worker 
3859*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3860*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3861*8975f5c5SAndroid Build Coastguard Worker 
3862*8975f5c5SAndroid Build Coastguard Worker     // Create textures and draw. We will use very small image updates to prevent flush before the
3863*8975f5c5SAndroid Build Coastguard Worker     // device runs out of memory.
3864*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTextureWidth  = 4096;
3865*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTextureHeight = 4096;
3866*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> textureColor(kTextureWidth * kTextureHeight, GLColor::red);
3867*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kIterationCount = 4096;
3868*8975f5c5SAndroid Build Coastguard Worker 
3869*8975f5c5SAndroid Build Coastguard Worker     uint32_t iteration = 0;
3870*8975f5c5SAndroid Build Coastguard Worker     for (; iteration < kIterationCount; iteration++)
3871*8975f5c5SAndroid Build Coastguard Worker     {
3872*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
3873*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
3874*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureWidth, kTextureHeight, 0, GL_RGBA,
3875*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
3876*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
3877*8975f5c5SAndroid Build Coastguard Worker                         textureColor.data());
3878*8975f5c5SAndroid Build Coastguard Worker 
3879*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3880*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3881*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
3882*8975f5c5SAndroid Build Coastguard Worker 
3883*8975f5c5SAndroid Build Coastguard Worker         if (getPerfCounters().commandQueueSubmitCallsTotal >= expectedSubmitCalls)
3884*8975f5c5SAndroid Build Coastguard Worker         {
3885*8975f5c5SAndroid Build Coastguard Worker             break;
3886*8975f5c5SAndroid Build Coastguard Worker         }
3887*8975f5c5SAndroid Build Coastguard Worker     }
3888*8975f5c5SAndroid Build Coastguard Worker 
3889*8975f5c5SAndroid Build Coastguard Worker     glEndPerfMonitorAMD(monitor);
3890*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(getPerfCounters().commandQueueSubmitCallsTotal, expectedSubmitCalls)
3891*8975f5c5SAndroid Build Coastguard Worker         << "iteration " << iteration;
3892*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(getPerfCounters().deviceMemoryImageAllocationFallbacks,
3893*8975f5c5SAndroid Build Coastguard Worker               expectedDeviceMemoryFallbacks);
3894*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3895*8975f5c5SAndroid Build Coastguard Worker }
3896*8975f5c5SAndroid Build Coastguard Worker 
3897*8975f5c5SAndroid Build Coastguard Worker // Test functionality of GL_ANGLE_yuv_internal_format with min/mag filters
3898*8975f5c5SAndroid Build Coastguard Worker // set to nearest and linear modes.
TEST_P(Texture2DTestES3YUV,TexStorage2DYuvFilterModes)3899*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3YUV, TexStorage2DYuvFilterModes)
3900*8975f5c5SAndroid Build Coastguard Worker {
3901*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
3902*8975f5c5SAndroid Build Coastguard Worker 
3903*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
3904*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
3905*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[]         = {40, 40, 40, 40, 40, 40, 40, 40, 240, 109, 240, 109};
3906*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[] = {0, 0, 255, 255};
3907*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(yuvTexture, 2, 4, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3908*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, yuvColor);
3909*8975f5c5SAndroid Build Coastguard Worker 
3910*8975f5c5SAndroid Build Coastguard Worker     // Default is nearest filter mode
3911*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(yuvTexture, expectedRgbColor);
3912*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3913*8975f5c5SAndroid Build Coastguard Worker 
3914*8975f5c5SAndroid Build Coastguard Worker     // Enable linear filter mode
3915*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, yuvTexture);
3916*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3917*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3918*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(yuvTexture, expectedRgbColor);
3919*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3920*8975f5c5SAndroid Build Coastguard Worker 
3921*8975f5c5SAndroid Build Coastguard Worker     const int windowHeight = getWindowHeight();
3922*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor::blue, 1);
3923*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, windowHeight - 1, GLColor::blue, 1);
3924*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, windowHeight / 2, GLColor::blue, 1);
3925*8975f5c5SAndroid Build Coastguard Worker }
3926*8975f5c5SAndroid Build Coastguard Worker 
3927*8975f5c5SAndroid Build Coastguard Worker // Test functionality of GL_ANGLE_yuv_internal_format while cycling through RGB and YUV sources
TEST_P(Texture2DTestES3,TexStorage2DCycleThroughYuvAndRgbSources)3928*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexStorage2DCycleThroughYuvAndRgbSources)
3929*8975f5c5SAndroid Build Coastguard Worker {
3930*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
3931*8975f5c5SAndroid Build Coastguard Worker 
3932*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
3933*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
3934*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[6]         = {40, 40, 40, 40, 240, 109};
3935*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {0, 0, 255, 255};
3936*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(yuvTexture, 2, 2, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3937*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, yuvColor);
3938*8975f5c5SAndroid Build Coastguard Worker 
3939*8975f5c5SAndroid Build Coastguard Worker     // Create RGBA texture
3940*8975f5c5SAndroid Build Coastguard Worker     GLTexture rgbaTexture;
3941*8975f5c5SAndroid Build Coastguard Worker     GLubyte rgbaColor[4] = {0, 0, 255, 255};
3942*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(rgbaTexture, 1, 1, GL_RGBA, GL_RGBA8, GL_UNSIGNED_BYTE, 1, rgbaColor);
3943*8975f5c5SAndroid Build Coastguard Worker 
3944*8975f5c5SAndroid Build Coastguard Worker     // Cycle through source textures
3945*8975f5c5SAndroid Build Coastguard Worker     // RGBA source
3946*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(rgbaTexture, rgbaColor);
3947*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3948*8975f5c5SAndroid Build Coastguard Worker 
3949*8975f5c5SAndroid Build Coastguard Worker     // YUV source
3950*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(yuvTexture, expectedRgbColor);
3951*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3952*8975f5c5SAndroid Build Coastguard Worker 
3953*8975f5c5SAndroid Build Coastguard Worker     // RGBA source
3954*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(rgbaTexture, rgbaColor);
3955*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3956*8975f5c5SAndroid Build Coastguard Worker }
3957*8975f5c5SAndroid Build Coastguard Worker 
3958*8975f5c5SAndroid Build Coastguard Worker // Test functionality of GL_ANGLE_yuv_internal_format with large number of YUV sources
TEST_P(Texture2DTestES3,TexStorage2DLargeYuvTextureCount)3959*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexStorage2DLargeYuvTextureCount)
3960*8975f5c5SAndroid Build Coastguard Worker {
3961*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
3962*8975f5c5SAndroid Build Coastguard Worker 
3963*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTextureCount = 16;
3964*8975f5c5SAndroid Build Coastguard Worker 
3965*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
3966*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture[kTextureCount];
3967*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kTextureCount; i++)
3968*8975f5c5SAndroid Build Coastguard Worker     {
3969*8975f5c5SAndroid Build Coastguard Worker         // Create 2 plane YCbCr 420 texture
3970*8975f5c5SAndroid Build Coastguard Worker         createImmutableTexture2D(yuvTexture[i], 2, 2, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3971*8975f5c5SAndroid Build Coastguard Worker                                  GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
3972*8975f5c5SAndroid Build Coastguard Worker     }
3973*8975f5c5SAndroid Build Coastguard Worker 
3974*8975f5c5SAndroid Build Coastguard Worker     // Cycle through YUV source textures
3975*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
3976*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
3977*8975f5c5SAndroid Build Coastguard Worker 
3978*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kTextureCount; i++)
3979*8975f5c5SAndroid Build Coastguard Worker     {
3980*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, yuvTexture[i]);
3981*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
3982*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3983*8975f5c5SAndroid Build Coastguard Worker     }
3984*8975f5c5SAndroid Build Coastguard Worker }
3985*8975f5c5SAndroid Build Coastguard Worker 
3986*8975f5c5SAndroid Build Coastguard Worker // Test functionality of GL_ANGLE_yuv_internal_format with simultaneous use of multiple YUV sources
TEST_P(Texture2DTestES3,TexStorage2DSimultaneousUseOfMultipleYuvSourcesNoData)3987*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexStorage2DSimultaneousUseOfMultipleYuvSourcesNoData)
3988*8975f5c5SAndroid Build Coastguard Worker {
3989*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
3990*8975f5c5SAndroid Build Coastguard Worker 
3991*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
3992*8975f5c5SAndroid Build Coastguard Worker     // Create 2 plane YCbCr 420 texture
3993*8975f5c5SAndroid Build Coastguard Worker     GLTexture twoPlaneYuvTexture;
3994*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(twoPlaneYuvTexture, 2, 2, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3995*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
3996*8975f5c5SAndroid Build Coastguard Worker 
3997*8975f5c5SAndroid Build Coastguard Worker     // Create 3 plane YCbCr 420 texture
3998*8975f5c5SAndroid Build Coastguard Worker     GLTexture threePlaneYuvTexture;
3999*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(threePlaneYuvTexture, 2, 2, GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE,
4000*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
4001*8975f5c5SAndroid Build Coastguard Worker 
4002*8975f5c5SAndroid Build Coastguard Worker     // Cycle through YUV source textures
4003*8975f5c5SAndroid Build Coastguard Worker     // Create program with 2 samplers
4004*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
4005*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = R"(#version 300 es
4006*8975f5c5SAndroid Build Coastguard Worker precision highp float;
4007*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex0;
4008*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex1;
4009*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
4010*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
4011*8975f5c5SAndroid Build Coastguard Worker 
4012*8975f5c5SAndroid Build Coastguard Worker void main()
4013*8975f5c5SAndroid Build Coastguard Worker {
4014*8975f5c5SAndroid Build Coastguard Worker     vec4 color0 = texture(tex0, texcoord);
4015*8975f5c5SAndroid Build Coastguard Worker     vec4 color1 = texture(tex1, texcoord);
4016*8975f5c5SAndroid Build Coastguard Worker     fragColor = color0 + color1;
4017*8975f5c5SAndroid Build Coastguard Worker })";
4018*8975f5c5SAndroid Build Coastguard Worker 
4019*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(twoSamplersProgram, vertexShaderSource, fragmentShaderSource);
4020*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(twoSamplersProgram);
4021*8975f5c5SAndroid Build Coastguard Worker     GLint tex0Location = glGetUniformLocation(twoSamplersProgram, "tex0");
4022*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex0Location);
4023*8975f5c5SAndroid Build Coastguard Worker     GLint tex1Location = glGetUniformLocation(twoSamplersProgram, "tex1");
4024*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex1Location);
4025*8975f5c5SAndroid Build Coastguard Worker 
4026*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex0Location, 0);
4027*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex1Location, 1);
4028*8975f5c5SAndroid Build Coastguard Worker 
4029*8975f5c5SAndroid Build Coastguard Worker     // Bind 2 plane YUV source
4030*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4031*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4032*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4033*8975f5c5SAndroid Build Coastguard Worker 
4034*8975f5c5SAndroid Build Coastguard Worker     // Bind 3 plane YUV source
4035*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
4036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, threePlaneYuvTexture);
4037*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4038*8975f5c5SAndroid Build Coastguard Worker 
4039*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4040*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4041*8975f5c5SAndroid Build Coastguard Worker 
4042*8975f5c5SAndroid Build Coastguard Worker     // Switch active texture index and draw again
4043*8975f5c5SAndroid Build Coastguard Worker     // Bind 2 plane YUV source
4044*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
4045*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4046*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4047*8975f5c5SAndroid Build Coastguard Worker 
4048*8975f5c5SAndroid Build Coastguard Worker     // Bind 3 plane YUV source
4049*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4050*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, threePlaneYuvTexture);
4051*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4052*8975f5c5SAndroid Build Coastguard Worker 
4053*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4054*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4055*8975f5c5SAndroid Build Coastguard Worker }
4056*8975f5c5SAndroid Build Coastguard Worker 
4057*8975f5c5SAndroid Build Coastguard Worker // Test functional of GL_ANGLE_yuv_internal_format while cycling through YUV sources
TEST_P(Texture2DTestES3,TexStorage2DCycleThroughYuvSourcesNoData)4058*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexStorage2DCycleThroughYuvSourcesNoData)
4059*8975f5c5SAndroid Build Coastguard Worker {
4060*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
4061*8975f5c5SAndroid Build Coastguard Worker 
4062*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
4063*8975f5c5SAndroid Build Coastguard Worker     // Create 2 plane YCbCr 420 texture
4064*8975f5c5SAndroid Build Coastguard Worker     GLTexture twoPlaneYuvTexture;
4065*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(twoPlaneYuvTexture, 2, 2, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
4066*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
4067*8975f5c5SAndroid Build Coastguard Worker 
4068*8975f5c5SAndroid Build Coastguard Worker     // Create 3 plane YCbCr 420 texture
4069*8975f5c5SAndroid Build Coastguard Worker     GLTexture threePlaneYuvTexture;
4070*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(threePlaneYuvTexture, 2, 2, GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE,
4071*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
4072*8975f5c5SAndroid Build Coastguard Worker 
4073*8975f5c5SAndroid Build Coastguard Worker     // Cycle through YUV source textures
4074*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
4075*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
4076*8975f5c5SAndroid Build Coastguard Worker 
4077*8975f5c5SAndroid Build Coastguard Worker     // 2 plane YUV source
4078*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4079*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4080*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4081*8975f5c5SAndroid Build Coastguard Worker 
4082*8975f5c5SAndroid Build Coastguard Worker     // 3 plane YUV source
4083*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, threePlaneYuvTexture);
4084*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4085*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4086*8975f5c5SAndroid Build Coastguard Worker 
4087*8975f5c5SAndroid Build Coastguard Worker     // 2 plane YUV source
4088*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4089*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4090*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4091*8975f5c5SAndroid Build Coastguard Worker }
4092*8975f5c5SAndroid Build Coastguard Worker 
4093*8975f5c5SAndroid Build Coastguard Worker // Test functionality of GL_ANGLE_yuv_internal_format with multiple YUV samplers while
4094*8975f5c5SAndroid Build Coastguard Worker // switching sampler uniform values.
TEST_P(Texture2DTestES3,TexStorage2DMultipleYuvSamplersSwitchSamplerUniformValues)4095*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexStorage2DMultipleYuvSamplersSwitchSamplerUniformValues)
4096*8975f5c5SAndroid Build Coastguard Worker {
4097*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
4098*8975f5c5SAndroid Build Coastguard Worker 
4099*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
4100*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
4101*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[6]         = {40, 40, 40, 40, 240, 109};
4102*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {0, 0, 255, 255};
4103*8975f5c5SAndroid Build Coastguard Worker 
4104*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
4105*8975f5c5SAndroid Build Coastguard Worker     // Create 2 plane YCbCr 420 texture
4106*8975f5c5SAndroid Build Coastguard Worker     GLTexture twoPlaneYuvTexture;
4107*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(twoPlaneYuvTexture, 2, 2, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
4108*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, yuvColor);
4109*8975f5c5SAndroid Build Coastguard Worker     // Create 3 plane YCbCr 420 texture
4110*8975f5c5SAndroid Build Coastguard Worker     GLTexture threePlaneYuvTexture;
4111*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(threePlaneYuvTexture, 2, 2, GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE,
4112*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
4113*8975f5c5SAndroid Build Coastguard Worker     // Create program with 2 samplers
4114*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
4115*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = R"(#version 300 es
4116*8975f5c5SAndroid Build Coastguard Worker precision highp float;
4117*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex0;
4118*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex1;
4119*8975f5c5SAndroid Build Coastguard Worker uniform int texIndex;
4120*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
4121*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
4122*8975f5c5SAndroid Build Coastguard Worker void main()
4123*8975f5c5SAndroid Build Coastguard Worker {
4124*8975f5c5SAndroid Build Coastguard Worker     vec4 color0 = texture(tex0, texcoord);
4125*8975f5c5SAndroid Build Coastguard Worker     vec4 color1 = texture(tex1, texcoord);
4126*8975f5c5SAndroid Build Coastguard Worker     if (texIndex == 0)
4127*8975f5c5SAndroid Build Coastguard Worker     {
4128*8975f5c5SAndroid Build Coastguard Worker         fragColor = color0;
4129*8975f5c5SAndroid Build Coastguard Worker     }
4130*8975f5c5SAndroid Build Coastguard Worker     else
4131*8975f5c5SAndroid Build Coastguard Worker     {
4132*8975f5c5SAndroid Build Coastguard Worker         fragColor = color1;
4133*8975f5c5SAndroid Build Coastguard Worker     }
4134*8975f5c5SAndroid Build Coastguard Worker })";
4135*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(twoSamplersProgram, vertexShaderSource, fragmentShaderSource);
4136*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(twoSamplersProgram);
4137*8975f5c5SAndroid Build Coastguard Worker     GLint tex0Location = glGetUniformLocation(twoSamplersProgram, "tex0");
4138*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex0Location);
4139*8975f5c5SAndroid Build Coastguard Worker     GLint tex1Location = glGetUniformLocation(twoSamplersProgram, "tex1");
4140*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex1Location);
4141*8975f5c5SAndroid Build Coastguard Worker     GLint texIndexLocation = glGetUniformLocation(twoSamplersProgram, "texIndex");
4142*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, texIndexLocation);
4143*8975f5c5SAndroid Build Coastguard Worker     // Bind 2 plane YUV source
4144*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4145*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4146*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4147*8975f5c5SAndroid Build Coastguard Worker     // Bind 3 plane YUV source
4148*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
4149*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, threePlaneYuvTexture);
4150*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4151*8975f5c5SAndroid Build Coastguard Worker 
4152*8975f5c5SAndroid Build Coastguard Worker     // Set sampler uniform values and draw
4153*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex0Location, 0);
4154*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex1Location, 1);
4155*8975f5c5SAndroid Build Coastguard Worker     // Set texture index selector to the 2 plane texture unit
4156*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texIndexLocation, 0);
4157*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4158*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4159*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
4160*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
4161*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4162*8975f5c5SAndroid Build Coastguard Worker 
4163*8975f5c5SAndroid Build Coastguard Worker     // Switch sampler uniform values and draw
4164*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex0Location, 1);
4165*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex1Location, 0);
4166*8975f5c5SAndroid Build Coastguard Worker     // Set texture index selector to the 2 plane texture unit
4167*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texIndexLocation, 1);
4168*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4169*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4170*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
4171*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
4172*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4173*8975f5c5SAndroid Build Coastguard Worker 
4174*8975f5c5SAndroid Build Coastguard Worker     // Switch back sampler uniform values and draw
4175*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex0Location, 0);
4176*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex1Location, 1);
4177*8975f5c5SAndroid Build Coastguard Worker     // Set texture index selector to the 2 plane texture unit
4178*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texIndexLocation, 0);
4179*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4180*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4181*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
4182*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
4183*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4184*8975f5c5SAndroid Build Coastguard Worker }
4185*8975f5c5SAndroid Build Coastguard Worker 
4186*8975f5c5SAndroid Build Coastguard Worker // Test functionality of GL_ANGLE_yuv_internal_format with multiple YUV samplers while
4187*8975f5c5SAndroid Build Coastguard Worker // switching bound textures.
TEST_P(Texture2DTestES3,TexStorage2DMultipleYuvSamplersSwitchBoundTextures)4188*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexStorage2DMultipleYuvSamplersSwitchBoundTextures)
4189*8975f5c5SAndroid Build Coastguard Worker {
4190*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_yuv_internal_format"));
4191*8975f5c5SAndroid Build Coastguard Worker 
4192*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
4193*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
4194*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[6]         = {40, 40, 40, 40, 240, 109};
4195*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {0, 0, 255, 255};
4196*8975f5c5SAndroid Build Coastguard Worker 
4197*8975f5c5SAndroid Build Coastguard Worker     // Create YUV texture
4198*8975f5c5SAndroid Build Coastguard Worker     // Create 2 plane YCbCr 420 texture
4199*8975f5c5SAndroid Build Coastguard Worker     GLTexture twoPlaneYuvTexture;
4200*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(twoPlaneYuvTexture, 2, 2, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
4201*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, yuvColor);
4202*8975f5c5SAndroid Build Coastguard Worker     // Create 3 plane YCbCr 420 texture
4203*8975f5c5SAndroid Build Coastguard Worker     GLTexture threePlaneYuvTexture;
4204*8975f5c5SAndroid Build Coastguard Worker     createImmutableTexture2D(threePlaneYuvTexture, 2, 2, GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE,
4205*8975f5c5SAndroid Build Coastguard Worker                              GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE, GL_UNSIGNED_BYTE, 1, nullptr);
4206*8975f5c5SAndroid Build Coastguard Worker     // Create program with 2 samplers
4207*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
4208*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = R"(#version 300 es
4209*8975f5c5SAndroid Build Coastguard Worker precision highp float;
4210*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex0;
4211*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex1;
4212*8975f5c5SAndroid Build Coastguard Worker uniform int texIndex;
4213*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
4214*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
4215*8975f5c5SAndroid Build Coastguard Worker void main()
4216*8975f5c5SAndroid Build Coastguard Worker {
4217*8975f5c5SAndroid Build Coastguard Worker     vec4 color0 = texture(tex0, texcoord);
4218*8975f5c5SAndroid Build Coastguard Worker     vec4 color1 = texture(tex1, texcoord);
4219*8975f5c5SAndroid Build Coastguard Worker     if (texIndex == 0)
4220*8975f5c5SAndroid Build Coastguard Worker     {
4221*8975f5c5SAndroid Build Coastguard Worker         fragColor = color0;
4222*8975f5c5SAndroid Build Coastguard Worker     }
4223*8975f5c5SAndroid Build Coastguard Worker     else
4224*8975f5c5SAndroid Build Coastguard Worker     {
4225*8975f5c5SAndroid Build Coastguard Worker         fragColor = color1;
4226*8975f5c5SAndroid Build Coastguard Worker     }
4227*8975f5c5SAndroid Build Coastguard Worker })";
4228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(twoSamplersProgram, vertexShaderSource, fragmentShaderSource);
4229*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(twoSamplersProgram);
4230*8975f5c5SAndroid Build Coastguard Worker     GLint tex0Location = glGetUniformLocation(twoSamplersProgram, "tex0");
4231*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex0Location);
4232*8975f5c5SAndroid Build Coastguard Worker     GLint tex1Location = glGetUniformLocation(twoSamplersProgram, "tex1");
4233*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex1Location);
4234*8975f5c5SAndroid Build Coastguard Worker     GLint texIndexLocation = glGetUniformLocation(twoSamplersProgram, "texIndex");
4235*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, texIndexLocation);
4236*8975f5c5SAndroid Build Coastguard Worker     // Set sampler uniform values
4237*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex0Location, 0);
4238*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex1Location, 1);
4239*8975f5c5SAndroid Build Coastguard Worker 
4240*8975f5c5SAndroid Build Coastguard Worker     // Bind 2 plane YUV source
4241*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4242*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4243*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4244*8975f5c5SAndroid Build Coastguard Worker     // Bind 3 plane YUV source
4245*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
4246*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, threePlaneYuvTexture);
4247*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4248*8975f5c5SAndroid Build Coastguard Worker     // Set texture index selector to the 2 plane texture unit
4249*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texIndexLocation, 0);
4250*8975f5c5SAndroid Build Coastguard Worker     // Draw
4251*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4252*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4253*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
4254*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
4255*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4256*8975f5c5SAndroid Build Coastguard Worker 
4257*8975f5c5SAndroid Build Coastguard Worker     // Bind 3 plane YUV source
4258*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4259*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, threePlaneYuvTexture);
4260*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4261*8975f5c5SAndroid Build Coastguard Worker     // Bind 2 plane YUV source
4262*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
4263*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, twoPlaneYuvTexture);
4264*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4265*8975f5c5SAndroid Build Coastguard Worker     // Set texture index selector to the 2 plane texture unit
4266*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texIndexLocation, 1);
4267*8975f5c5SAndroid Build Coastguard Worker     // Draw
4268*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
4269*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4270*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
4271*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
4272*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4273*8975f5c5SAndroid Build Coastguard Worker }
4274*8975f5c5SAndroid Build Coastguard Worker 
4275*8975f5c5SAndroid Build Coastguard Worker // Tests CopySubImage for float formats
TEST_P(Texture2DTest,CopySubImageFloat_R_R)4276*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_R_R)
4277*8975f5c5SAndroid Build Coastguard Worker {
4278*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(1, 1);
4279*8975f5c5SAndroid Build Coastguard Worker }
4280*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RG_R)4281*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RG_R)
4282*8975f5c5SAndroid Build Coastguard Worker {
4283*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(2, 1);
4284*8975f5c5SAndroid Build Coastguard Worker }
4285*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RG_RG)4286*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RG_RG)
4287*8975f5c5SAndroid Build Coastguard Worker {
4288*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(2, 2);
4289*8975f5c5SAndroid Build Coastguard Worker }
4290*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGB_R)4291*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGB_R)
4292*8975f5c5SAndroid Build Coastguard Worker {
4293*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(3, 1);
4294*8975f5c5SAndroid Build Coastguard Worker }
4295*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGB_RG)4296*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGB_RG)
4297*8975f5c5SAndroid Build Coastguard Worker {
4298*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(3, 2);
4299*8975f5c5SAndroid Build Coastguard Worker }
4300*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGB_RGB)4301*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGB_RGB)
4302*8975f5c5SAndroid Build Coastguard Worker {
4303*8975f5c5SAndroid Build Coastguard Worker     // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/40096350)
4304*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGL());
4305*8975f5c5SAndroid Build Coastguard Worker 
4306*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(3, 3);
4307*8975f5c5SAndroid Build Coastguard Worker }
4308*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGBA_R)4309*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGBA_R)
4310*8975f5c5SAndroid Build Coastguard Worker {
4311*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(4, 1);
4312*8975f5c5SAndroid Build Coastguard Worker }
4313*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGBA_RG)4314*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RG)
4315*8975f5c5SAndroid Build Coastguard Worker {
4316*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(4, 2);
4317*8975f5c5SAndroid Build Coastguard Worker }
4318*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGBA_RGB)4319*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RGB)
4320*8975f5c5SAndroid Build Coastguard Worker {
4321*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(4, 3);
4322*8975f5c5SAndroid Build Coastguard Worker }
4323*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DTest,CopySubImageFloat_RGBA_RGBA)4324*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RGBA)
4325*8975f5c5SAndroid Build Coastguard Worker {
4326*8975f5c5SAndroid Build Coastguard Worker     testFloatCopySubImage(4, 4);
4327*8975f5c5SAndroid Build Coastguard Worker }
4328*8975f5c5SAndroid Build Coastguard Worker 
4329*8975f5c5SAndroid Build Coastguard Worker // Port of
4330*8975f5c5SAndroid Build Coastguard Worker // https://www.khronos.org/registry/webgl/conformance-suites/1.0.3/conformance/textures/texture-npot.html
4331*8975f5c5SAndroid Build Coastguard Worker // Run against GL_ALPHA/UNSIGNED_BYTE format, to ensure that D3D11 Feature Level 9_3 correctly
4332*8975f5c5SAndroid Build Coastguard Worker // handles GL_ALPHA
TEST_P(Texture2DTest,TextureNPOT_GL_ALPHA_UBYTE)4333*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureNPOT_GL_ALPHA_UBYTE)
4334*8975f5c5SAndroid Build Coastguard Worker {
4335*8975f5c5SAndroid Build Coastguard Worker     const int npotTexSize = 5;
4336*8975f5c5SAndroid Build Coastguard Worker     const int potTexSize  = 4;  // Should be less than npotTexSize
4337*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
4338*8975f5c5SAndroid Build Coastguard Worker 
4339*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_texture_npot"))
4340*8975f5c5SAndroid Build Coastguard Worker     {
4341*8975f5c5SAndroid Build Coastguard Worker         // This test isn't applicable if texture_npot is enabled
4342*8975f5c5SAndroid Build Coastguard Worker         return;
4343*8975f5c5SAndroid Build Coastguard Worker     }
4344*8975f5c5SAndroid Build Coastguard Worker 
4345*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
4346*8975f5c5SAndroid Build Coastguard Worker 
4347*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
4348*8975f5c5SAndroid Build Coastguard Worker 
4349*8975f5c5SAndroid Build Coastguard Worker     // Default unpack alignment is 4. The values of 'pixels' below needs it to be 1.
4350*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
4351*8975f5c5SAndroid Build Coastguard Worker 
4352*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4353*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
4354*8975f5c5SAndroid Build Coastguard Worker 
4355*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLubyte> pixels(1 * npotTexSize * npotTexSize, 64);
4356*8975f5c5SAndroid Build Coastguard Worker 
4357*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4358*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4359*8975f5c5SAndroid Build Coastguard Worker 
4360*8975f5c5SAndroid Build Coastguard Worker     // Check that an NPOT texture not on level 0 generates INVALID_VALUE
4361*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_ALPHA, npotTexSize, npotTexSize, 0, GL_ALPHA,
4362*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixels.data());
4363*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
4364*8975f5c5SAndroid Build Coastguard Worker 
4365*8975f5c5SAndroid Build Coastguard Worker     // Check that an NPOT texture on level 0 succeeds
4366*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, npotTexSize, npotTexSize, 0, GL_ALPHA,
4367*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixels.data());
4368*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4369*8975f5c5SAndroid Build Coastguard Worker 
4370*8975f5c5SAndroid Build Coastguard Worker     // Check that generateMipmap fails on NPOT
4371*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
4372*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
4373*8975f5c5SAndroid Build Coastguard Worker 
4374*8975f5c5SAndroid Build Coastguard Worker     // Check that nothing is drawn if filtering is not correct for NPOT
4375*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4376*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4377*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
4378*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
4379*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4380*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
4381*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 255);
4382*8975f5c5SAndroid Build Coastguard Worker 
4383*8975f5c5SAndroid Build Coastguard Worker     // NPOT texture with TEXTURE_MIN_FILTER not NEAREST or LINEAR should draw with 0,0,0,255
4384*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4385*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4386*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
4387*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4388*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
4389*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 255);
4390*8975f5c5SAndroid Build Coastguard Worker 
4391*8975f5c5SAndroid Build Coastguard Worker     // NPOT texture with TEXTURE_MIN_FILTER set to LINEAR should draw
4392*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4393*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4394*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
4395*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 64);
4396*8975f5c5SAndroid Build Coastguard Worker 
4397*8975f5c5SAndroid Build Coastguard Worker     // Check that glTexImage2D for POT texture succeeds
4398*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, potTexSize, potTexSize, 0, GL_ALPHA, GL_UNSIGNED_BYTE,
4399*8975f5c5SAndroid Build Coastguard Worker                  pixels.data());
4400*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4401*8975f5c5SAndroid Build Coastguard Worker 
4402*8975f5c5SAndroid Build Coastguard Worker     // Check that generateMipmap for an POT texture succeeds
4403*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
4404*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4405*8975f5c5SAndroid Build Coastguard Worker 
4406*8975f5c5SAndroid Build Coastguard Worker     // POT texture with TEXTURE_MIN_FILTER set to LINEAR_MIPMAP_LINEAR should draw
4407*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
4408*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4409*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
4410*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
4411*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4412*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
4413*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 64);
4414*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4415*8975f5c5SAndroid Build Coastguard Worker }
4416*8975f5c5SAndroid Build Coastguard Worker 
4417*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that glTexSubImage2D always accepts data for non-power-of-two subregions.
4418*8975f5c5SAndroid Build Coastguard Worker // ANGLE previously rejected this if GL_OES_texture_npot wasn't active, which is incorrect.
TEST_P(Texture2DTest,NPOTSubImageParameters)4419*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, NPOTSubImageParameters)
4420*8975f5c5SAndroid Build Coastguard Worker {
4421*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4422*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
4423*8975f5c5SAndroid Build Coastguard Worker 
4424*8975f5c5SAndroid Build Coastguard Worker     // Create an 8x8 (i.e. power-of-two) texture.
4425*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4426*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
4427*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4428*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
4429*8975f5c5SAndroid Build Coastguard Worker 
4430*8975f5c5SAndroid Build Coastguard Worker     // Supply a 3x3 (i.e. non-power-of-two) subimage to the texture.
4431*8975f5c5SAndroid Build Coastguard Worker     // This should always work, even if GL_OES_texture_npot isn't active.
4432*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 3 * 3> data;
4433*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 3, 3, GL_RGBA, GL_UNSIGNED_BYTE, data.data());
4434*8975f5c5SAndroid Build Coastguard Worker 
4435*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4436*8975f5c5SAndroid Build Coastguard Worker }
4437*8975f5c5SAndroid Build Coastguard Worker 
4438*8975f5c5SAndroid Build Coastguard Worker // Regression test for https://crbug.com/1222516 to prevent integer overflow during validation.
TEST_P(Texture2DTest,SubImageValidationOverflow)4439*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, SubImageValidationOverflow)
4440*8975f5c5SAndroid Build Coastguard Worker {
4441*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4442*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
4443*8975f5c5SAndroid Build Coastguard Worker 
4444*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4445*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4446*8975f5c5SAndroid Build Coastguard Worker 
4447*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, -4, 0, 2147483647, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4448*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
4449*8975f5c5SAndroid Build Coastguard Worker 
4450*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, -4, 1, 2147483647, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4451*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
4452*8975f5c5SAndroid Build Coastguard Worker }
4453*8975f5c5SAndroid Build Coastguard Worker 
4454*8975f5c5SAndroid Build Coastguard Worker // Test that when a mutable texture is deleted, its corresponding pointer in the Vulkan backend,
4455*8975f5c5SAndroid Build Coastguard Worker // which is used for mutable texture flushing, is also deleted, and is not accessed by the new
4456*8975f5c5SAndroid Build Coastguard Worker // mutable texture after it.
TEST_P(Texture2DTest,MutableUploadThenDeleteThenMutableUpload)4457*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, MutableUploadThenDeleteThenMutableUpload)
4458*8975f5c5SAndroid Build Coastguard Worker {
4459*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture1;
4460*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture1);
4461*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4462*8975f5c5SAndroid Build Coastguard Worker                  GLColor::red.data());
4463*8975f5c5SAndroid Build Coastguard Worker     texture1.reset();
4464*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4465*8975f5c5SAndroid Build Coastguard Worker 
4466*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2;
4467*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2);
4468*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4469*8975f5c5SAndroid Build Coastguard Worker                  GLColor::green.data());
4470*8975f5c5SAndroid Build Coastguard Worker     texture2.reset();
4471*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4472*8975f5c5SAndroid Build Coastguard Worker }
4473*8975f5c5SAndroid Build Coastguard Worker 
4474*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that glTexStorage3D accepts ASTC sliced 3D. https://crbug.com/1060012
TEST_P(Texture3DTestES3,ImmutableASTCSliced3D)4475*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, ImmutableASTCSliced3D)
4476*8975f5c5SAndroid Build Coastguard Worker {
4477*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_texture_compression_astc_sliced_3d"));
4478*8975f5c5SAndroid Build Coastguard Worker 
4479*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
4480*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_COMPRESSED_RGBA_ASTC_4x4, 4, 4, 1);
4481*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4482*8975f5c5SAndroid Build Coastguard Worker }
4483*8975f5c5SAndroid Build Coastguard Worker 
FillLevel(GLint level,GLuint width,GLuint height,const GLColor & color,bool cubemap,bool subTex)4484*8975f5c5SAndroid Build Coastguard Worker void FillLevel(GLint level,
4485*8975f5c5SAndroid Build Coastguard Worker                GLuint width,
4486*8975f5c5SAndroid Build Coastguard Worker                GLuint height,
4487*8975f5c5SAndroid Build Coastguard Worker                const GLColor &color,
4488*8975f5c5SAndroid Build Coastguard Worker                bool cubemap,
4489*8975f5c5SAndroid Build Coastguard Worker                bool subTex)
4490*8975f5c5SAndroid Build Coastguard Worker {
4491*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(width * height, color);
4492*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> targets;
4493*8975f5c5SAndroid Build Coastguard Worker     if (cubemap)
4494*8975f5c5SAndroid Build Coastguard Worker     {
4495*8975f5c5SAndroid Build Coastguard Worker         targets = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
4496*8975f5c5SAndroid Build Coastguard Worker                    GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
4497*8975f5c5SAndroid Build Coastguard Worker                    GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z};
4498*8975f5c5SAndroid Build Coastguard Worker     }
4499*8975f5c5SAndroid Build Coastguard Worker     else
4500*8975f5c5SAndroid Build Coastguard Worker     {
4501*8975f5c5SAndroid Build Coastguard Worker         targets = {GL_TEXTURE_2D};
4502*8975f5c5SAndroid Build Coastguard Worker     }
4503*8975f5c5SAndroid Build Coastguard Worker 
4504*8975f5c5SAndroid Build Coastguard Worker     for (GLenum target : targets)
4505*8975f5c5SAndroid Build Coastguard Worker     {
4506*8975f5c5SAndroid Build Coastguard Worker         if (subTex)
4507*8975f5c5SAndroid Build Coastguard Worker         {
4508*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage2D(target, level, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
4509*8975f5c5SAndroid Build Coastguard Worker                             pixels.data());
4510*8975f5c5SAndroid Build Coastguard Worker         }
4511*8975f5c5SAndroid Build Coastguard Worker         else
4512*8975f5c5SAndroid Build Coastguard Worker         {
4513*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(target, level, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4514*8975f5c5SAndroid Build Coastguard Worker                          pixels.data());
4515*8975f5c5SAndroid Build Coastguard Worker         }
4516*8975f5c5SAndroid Build Coastguard Worker     }
4517*8975f5c5SAndroid Build Coastguard Worker }
4518*8975f5c5SAndroid Build Coastguard Worker 
4519*8975f5c5SAndroid Build Coastguard Worker // This is part of tests that webgl_conformance_vulkan_passthrough_tests
4520*8975f5c5SAndroid Build Coastguard Worker // conformance/textures/misc/texture-size.html does
testTextureSize(int testCaseIndex)4521*8975f5c5SAndroid Build Coastguard Worker void Texture2DTest::testTextureSize(int testCaseIndex)
4522*8975f5c5SAndroid Build Coastguard Worker {
4523*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 6> kNewMipColors = {
4524*8975f5c5SAndroid Build Coastguard Worker         GLColor::green,  GLColor::red,     GLColor::blue,
4525*8975f5c5SAndroid Build Coastguard Worker         GLColor::yellow, GLColor::magenta, GLColor::cyan,
4526*8975f5c5SAndroid Build Coastguard Worker     };
4527*8975f5c5SAndroid Build Coastguard Worker     GLuint colorCount = 0;
4528*8975f5c5SAndroid Build Coastguard Worker 
4529*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
4530*8975f5c5SAndroid Build Coastguard Worker 
4531*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
4532*8975f5c5SAndroid Build Coastguard Worker         R"(precision highp float;
4533*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
4534*8975f5c5SAndroid Build Coastguard Worker varying vec3 texcoord;
4535*8975f5c5SAndroid Build Coastguard Worker void main()
4536*8975f5c5SAndroid Build Coastguard Worker {
4537*8975f5c5SAndroid Build Coastguard Worker     gl_Position = position;
4538*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xyz * 0.5) + 0.5;
4539*8975f5c5SAndroid Build Coastguard Worker }
4540*8975f5c5SAndroid Build Coastguard Worker )";
4541*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
4542*8975f5c5SAndroid Build Coastguard Worker         R"(precision mediump float;
4543*8975f5c5SAndroid Build Coastguard Worker uniform samplerCube tex;
4544*8975f5c5SAndroid Build Coastguard Worker varying vec3 texcoord;
4545*8975f5c5SAndroid Build Coastguard Worker void main()
4546*8975f5c5SAndroid Build Coastguard Worker {
4547*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = textureCube(tex, texcoord);
4548*8975f5c5SAndroid Build Coastguard Worker })";
4549*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(programCubeMap, kVS, kFS);
4550*8975f5c5SAndroid Build Coastguard Worker     GLint textureCubeUniformLocation = glGetUniformLocation(programCubeMap, "tex");
4551*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureCubeUniformLocation);
4552*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4553*8975f5c5SAndroid Build Coastguard Worker 
4554*8975f5c5SAndroid Build Coastguard Worker     GLint max2DSize = 0;
4555*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max2DSize);
4556*8975f5c5SAndroid Build Coastguard Worker     GLint maxCubeMapSize = 0;
4557*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeMapSize);
4558*8975f5c5SAndroid Build Coastguard Worker     // Assuming 2048x2048xRGBA (22 mb with mips) will run on all WebGL platforms
4559*8975f5c5SAndroid Build Coastguard Worker     GLint max2DSquareSize = std::min(max2DSize, 2048);
4560*8975f5c5SAndroid Build Coastguard Worker     // I'd prefer this to be 2048 but that's 16 mb x 6 faces or 128 mb (with mips)
4561*8975f5c5SAndroid Build Coastguard Worker     // 1024 is 33.5 mb (with mips)
4562*8975f5c5SAndroid Build Coastguard Worker     maxCubeMapSize = std::min(maxCubeMapSize, 1024);
4563*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4564*8975f5c5SAndroid Build Coastguard Worker 
4565*8975f5c5SAndroid Build Coastguard Worker     for (GLint size = 1; size <= max2DSize; size *= 2)
4566*8975f5c5SAndroid Build Coastguard Worker     {
4567*8975f5c5SAndroid Build Coastguard Worker         bool cubeMap     = testCaseIndex == 3;
4568*8975f5c5SAndroid Build Coastguard Worker         GLenum texTarget = cubeMap ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D;
4569*8975f5c5SAndroid Build Coastguard Worker         GLuint program   = cubeMap ? programCubeMap : mProgram;
4570*8975f5c5SAndroid Build Coastguard Worker         GLint texWidth = 0, texHeight = 0;
4571*8975f5c5SAndroid Build Coastguard Worker 
4572*8975f5c5SAndroid Build Coastguard Worker         switch (testCaseIndex)
4573*8975f5c5SAndroid Build Coastguard Worker         {
4574*8975f5c5SAndroid Build Coastguard Worker             case 0:
4575*8975f5c5SAndroid Build Coastguard Worker                 texWidth  = size;
4576*8975f5c5SAndroid Build Coastguard Worker                 texHeight = 1;
4577*8975f5c5SAndroid Build Coastguard Worker                 break;
4578*8975f5c5SAndroid Build Coastguard Worker             case 1:
4579*8975f5c5SAndroid Build Coastguard Worker                 texWidth  = 1;
4580*8975f5c5SAndroid Build Coastguard Worker                 texHeight = size;
4581*8975f5c5SAndroid Build Coastguard Worker                 break;
4582*8975f5c5SAndroid Build Coastguard Worker             case 2:
4583*8975f5c5SAndroid Build Coastguard Worker             case 3:
4584*8975f5c5SAndroid Build Coastguard Worker                 texWidth  = size;
4585*8975f5c5SAndroid Build Coastguard Worker                 texHeight = size;
4586*8975f5c5SAndroid Build Coastguard Worker                 break;
4587*8975f5c5SAndroid Build Coastguard Worker         }
4588*8975f5c5SAndroid Build Coastguard Worker 
4589*8975f5c5SAndroid Build Coastguard Worker         if (texWidth == texHeight && size > max2DSquareSize)
4590*8975f5c5SAndroid Build Coastguard Worker         {
4591*8975f5c5SAndroid Build Coastguard Worker             return;
4592*8975f5c5SAndroid Build Coastguard Worker         }
4593*8975f5c5SAndroid Build Coastguard Worker 
4594*8975f5c5SAndroid Build Coastguard Worker         if (cubeMap && size > maxCubeMapSize)
4595*8975f5c5SAndroid Build Coastguard Worker         {
4596*8975f5c5SAndroid Build Coastguard Worker             return;
4597*8975f5c5SAndroid Build Coastguard Worker         }
4598*8975f5c5SAndroid Build Coastguard Worker 
4599*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
4600*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
4601*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(texTarget, texture);
4602*8975f5c5SAndroid Build Coastguard Worker         FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, false);
4603*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4604*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4605*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4606*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4607*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
4608*8975f5c5SAndroid Build Coastguard Worker 
4609*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
4610*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
4611*8975f5c5SAndroid Build Coastguard Worker 
4612*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
4613*8975f5c5SAndroid Build Coastguard Worker         if (cubeMap)
4614*8975f5c5SAndroid Build Coastguard Worker         {
4615*8975f5c5SAndroid Build Coastguard Worker             glUniform1i(textureCubeUniformLocation, 0);
4616*8975f5c5SAndroid Build Coastguard Worker         }
4617*8975f5c5SAndroid Build Coastguard Worker         else
4618*8975f5c5SAndroid Build Coastguard Worker         {
4619*8975f5c5SAndroid Build Coastguard Worker             glUniform1i(mTexture2DUniformLocation, 0);
4620*8975f5c5SAndroid Build Coastguard Worker         }
4621*8975f5c5SAndroid Build Coastguard Worker 
4622*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "position", 1.0f);
4623*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
4624*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
4625*8975f5c5SAndroid Build Coastguard Worker 
4626*8975f5c5SAndroid Build Coastguard Worker         colorCount = (colorCount + 1) % kNewMipColors.size();
4627*8975f5c5SAndroid Build Coastguard Worker         FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, false);
4628*8975f5c5SAndroid Build Coastguard Worker         glGenerateMipmap(texTarget);
4629*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
4630*8975f5c5SAndroid Build Coastguard Worker 
4631*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
4632*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
4633*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "position", 1.0f);
4634*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
4635*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
4636*8975f5c5SAndroid Build Coastguard Worker 
4637*8975f5c5SAndroid Build Coastguard Worker         colorCount = (colorCount + 1) % kNewMipColors.size();
4638*8975f5c5SAndroid Build Coastguard Worker         FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, true);
4639*8975f5c5SAndroid Build Coastguard Worker         glGenerateMipmap(texTarget);
4640*8975f5c5SAndroid Build Coastguard Worker 
4641*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
4642*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "position", 1.0f);
4643*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
4644*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
4645*8975f5c5SAndroid Build Coastguard Worker     }
4646*8975f5c5SAndroid Build Coastguard Worker }
4647*8975f5c5SAndroid Build Coastguard Worker 
testTextureSizeError()4648*8975f5c5SAndroid Build Coastguard Worker void Texture2DTest::testTextureSizeError()
4649*8975f5c5SAndroid Build Coastguard Worker {
4650*8975f5c5SAndroid Build Coastguard Worker     GLint max2DSize = 0;
4651*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max2DSize);
4652*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4653*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4654*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
4655*8975f5c5SAndroid Build Coastguard Worker     FillLevel(0, max2DSize, max2DSize, GLColor::red, false, false);
4656*8975f5c5SAndroid Build Coastguard Worker     GLenum err  = glGetError();
4657*8975f5c5SAndroid Build Coastguard Worker     bool passed = (err == GL_NO_ERROR || err == GL_OUT_OF_MEMORY);
4658*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(passed);
4659*8975f5c5SAndroid Build Coastguard Worker }
4660*8975f5c5SAndroid Build Coastguard Worker 
4661*8975f5c5SAndroid Build Coastguard Worker // Permutation 0 of testTextureSize.
TEST_P(Texture2DTest,TextureSizeCase0)4662*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureSizeCase0)
4663*8975f5c5SAndroid Build Coastguard Worker {
4664*8975f5c5SAndroid Build Coastguard Worker     testTextureSize(0);
4665*8975f5c5SAndroid Build Coastguard Worker }
4666*8975f5c5SAndroid Build Coastguard Worker 
4667*8975f5c5SAndroid Build Coastguard Worker // Permutation 1 of testTextureSize.
TEST_P(Texture2DTest,TextureSizeCase1)4668*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureSizeCase1)
4669*8975f5c5SAndroid Build Coastguard Worker {
4670*8975f5c5SAndroid Build Coastguard Worker     testTextureSize(1);
4671*8975f5c5SAndroid Build Coastguard Worker }
4672*8975f5c5SAndroid Build Coastguard Worker 
4673*8975f5c5SAndroid Build Coastguard Worker // Permutation 2 of testTextureSize.
TEST_P(Texture2DTest,TextureSizeCase2)4674*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureSizeCase2)
4675*8975f5c5SAndroid Build Coastguard Worker {
4676*8975f5c5SAndroid Build Coastguard Worker     testTextureSize(2);
4677*8975f5c5SAndroid Build Coastguard Worker }
4678*8975f5c5SAndroid Build Coastguard Worker 
4679*8975f5c5SAndroid Build Coastguard Worker // Permutation 3 of testTextureSize.
TEST_P(Texture2DTest,TextureSizeCase3)4680*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureSizeCase3)
4681*8975f5c5SAndroid Build Coastguard Worker {
4682*8975f5c5SAndroid Build Coastguard Worker     testTextureSize(3);
4683*8975f5c5SAndroid Build Coastguard Worker }
4684*8975f5c5SAndroid Build Coastguard Worker 
4685*8975f5c5SAndroid Build Coastguard Worker // Test allocating a very large texture
TEST_P(Texture2DTest,TextureMaxSize)4686*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureMaxSize)
4687*8975f5c5SAndroid Build Coastguard Worker {
4688*8975f5c5SAndroid Build Coastguard Worker     testTextureSizeError();
4689*8975f5c5SAndroid Build Coastguard Worker }
4690*8975f5c5SAndroid Build Coastguard Worker 
4691*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly RGBA 3D texture
TEST_P(Texture3DTestES2,RGBA)4692*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES2, RGBA)
4693*8975f5c5SAndroid Build Coastguard Worker {
4694*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTexture3DExt());
4695*8975f5c5SAndroid Build Coastguard Worker 
4696*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264265
4697*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
4698*8975f5c5SAndroid Build Coastguard Worker 
4699*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4700*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
4701*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
4702*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(1u * 1u * 1u, GLColor::red);
4703*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4704*8975f5c5SAndroid Build Coastguard Worker                     texDataGreen.data());
4705*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 1, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4706*8975f5c5SAndroid Build Coastguard Worker                     texDataRed.data());
4707*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4708*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4709*8975f5c5SAndroid Build Coastguard Worker 
4710*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4711*8975f5c5SAndroid Build Coastguard Worker 
4712*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4713*8975f5c5SAndroid Build Coastguard Worker 
4714*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4715*8975f5c5SAndroid Build Coastguard Worker }
4716*8975f5c5SAndroid Build Coastguard Worker 
4717*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly Luminance 3D texture
TEST_P(Texture3DTestES2,Luminance)4718*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES2, Luminance)
4719*8975f5c5SAndroid Build Coastguard Worker {
4720*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTexture3DExt());
4721*8975f5c5SAndroid Build Coastguard Worker 
4722*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264265
4723*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
4724*8975f5c5SAndroid Build Coastguard Worker 
4725*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4726*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
4727*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> texData(2u * 2u * 2u, 125);
4728*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
4729*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 0, GL_LUMINANCE, 2, 2, 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
4730*8975f5c5SAndroid Build Coastguard Worker                     texData.data());
4731*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4732*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4733*8975f5c5SAndroid Build Coastguard Worker 
4734*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4735*8975f5c5SAndroid Build Coastguard Worker 
4736*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4737*8975f5c5SAndroid Build Coastguard Worker 
4738*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(125, 125, 125, 255));
4739*8975f5c5SAndroid Build Coastguard Worker }
4740*8975f5c5SAndroid Build Coastguard Worker 
4741*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly with glCopyTexSubImage3D
TEST_P(Texture3DTestES2,CopySubImageRGBA)4742*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES2, CopySubImageRGBA)
4743*8975f5c5SAndroid Build Coastguard Worker {
4744*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTexture3DExt());
4745*8975f5c5SAndroid Build Coastguard Worker 
4746*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264265
4747*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
4748*8975f5c5SAndroid Build Coastguard Worker 
4749*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 1, 1);
4750*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4751*8975f5c5SAndroid Build Coastguard Worker 
4752*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4753*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
4754*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u * 4u, GLColor::red);
4755*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4756*8975f5c5SAndroid Build Coastguard Worker                     texDataRed.data());
4757*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4758*8975f5c5SAndroid Build Coastguard Worker                     texDataRed.data());
4759*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 2, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4760*8975f5c5SAndroid Build Coastguard Worker                     texDataRed.data());
4761*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3DOES(GL_TEXTURE_3D, 1, 0, 0, 0, 0, 0, 2, 2);
4762*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3DOES(GL_TEXTURE_3D, 1, 0, 0, 1, 0, 0, 2, 2);
4763*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4764*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
4765*8975f5c5SAndroid Build Coastguard Worker 
4766*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4767*8975f5c5SAndroid Build Coastguard Worker 
4768*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
4769*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4770*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4771*8975f5c5SAndroid Build Coastguard Worker 
4772*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
4773*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(glGetUniformLocation(mProgram, "level"), 1);
4774*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4775*8975f5c5SAndroid Build Coastguard Worker 
4776*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
4777*8975f5c5SAndroid Build Coastguard Worker }
4778*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture3DTestES2,CopySubImageLuminance)4779*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES2, CopySubImageLuminance)
4780*8975f5c5SAndroid Build Coastguard Worker {
4781*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTexture3DExt());
4782*8975f5c5SAndroid Build Coastguard Worker 
4783*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264265
4784*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
4785*8975f5c5SAndroid Build Coastguard Worker 
4786*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
4787*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4788*8975f5c5SAndroid Build Coastguard Worker 
4789*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4790*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
4791*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 0, GL_LUMINANCE, 4, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
4792*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
4793*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 1, GL_LUMINANCE, 2, 2, 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
4794*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
4795*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 2, GL_LUMINANCE, 1, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
4796*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
4797*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3DOES(GL_TEXTURE_3D, 1, 0, 0, 0, 0, 0, 2, 2);
4798*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3DOES(GL_TEXTURE_3D, 1, 0, 0, 1, 0, 0, 2, 2);
4799*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4800*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
4801*8975f5c5SAndroid Build Coastguard Worker 
4802*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4803*8975f5c5SAndroid Build Coastguard Worker 
4804*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
4805*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4806*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4807*8975f5c5SAndroid Build Coastguard Worker 
4808*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
4809*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(glGetUniformLocation(mProgram, "level"), 1);
4810*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4811*8975f5c5SAndroid Build Coastguard Worker 
4812*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
4813*8975f5c5SAndroid Build Coastguard Worker }
4814*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture3DTestES2,CopySubImageAlpha)4815*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES2, CopySubImageAlpha)
4816*8975f5c5SAndroid Build Coastguard Worker {
4817*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTexture3DExt());
4818*8975f5c5SAndroid Build Coastguard Worker 
4819*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264265
4820*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
4821*8975f5c5SAndroid Build Coastguard Worker 
4822*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 0.5);
4823*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4824*8975f5c5SAndroid Build Coastguard Worker 
4825*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4826*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
4827*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 0, GL_ALPHA, 4, 4, 4, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
4828*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 1, GL_ALPHA, 2, 2, 2, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
4829*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_3D, 2, GL_ALPHA, 1, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
4830*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3DOES(GL_TEXTURE_3D, 1, 0, 0, 0, 0, 0, 2, 2);
4831*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3DOES(GL_TEXTURE_3D, 1, 0, 0, 1, 0, 0, 2, 2);
4832*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4833*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
4834*8975f5c5SAndroid Build Coastguard Worker 
4835*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4836*8975f5c5SAndroid Build Coastguard Worker 
4837*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
4838*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4839*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4840*8975f5c5SAndroid Build Coastguard Worker 
4841*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
4842*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(glGetUniformLocation(mProgram, "level"), 1);
4843*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
4844*8975f5c5SAndroid Build Coastguard Worker 
4845*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 128), 1.0);
4846*8975f5c5SAndroid Build Coastguard Worker }
4847*8975f5c5SAndroid Build Coastguard Worker 
4848*8975f5c5SAndroid Build Coastguard Worker // Test that defining a 2D texture array fails with Texture3DOES on ES2.
TEST_P(Texture3DTestES2,DefineTexture2DArrayShouldFail)4849*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES2, DefineTexture2DArrayShouldFail)
4850*8975f5c5SAndroid Build Coastguard Worker {
4851*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTexture3DExt());
4852*8975f5c5SAndroid Build Coastguard Worker 
4853*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264265
4854*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
4855*8975f5c5SAndroid Build Coastguard Worker 
4856*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
4857*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4858*8975f5c5SAndroid Build Coastguard Worker 
4859*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4860*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture3D);
4861*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
4862*8975f5c5SAndroid Build Coastguard Worker 
4863*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4864*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
4865*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4866*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
4867*8975f5c5SAndroid Build Coastguard Worker     glTexImage3DOES(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA, 1, 1, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4868*8975f5c5SAndroid Build Coastguard Worker                     nullptr);
4869*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
4870*8975f5c5SAndroid Build Coastguard Worker }
4871*8975f5c5SAndroid Build Coastguard Worker 
4872*8975f5c5SAndroid Build Coastguard Worker // Verify shrinking a texture with glTexStorage2D works correctly
TEST_P(Texture2DTestES3,ChangeTexSizeWithTexStorage)4873*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, ChangeTexSizeWithTexStorage)
4874*8975f5c5SAndroid Build Coastguard Worker {
4875*8975f5c5SAndroid Build Coastguard Worker     // TODO: http://anglebug.com/42263810
4876*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsOpenGL());
4877*8975f5c5SAndroid Build Coastguard Worker 
4878*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSizeLarge = 128;
4879*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSizeSmall = 64;
4880*8975f5c5SAndroid Build Coastguard Worker 
4881*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
4882*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
4883*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4884*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4885*8975f5c5SAndroid Build Coastguard Worker 
4886*8975f5c5SAndroid Build Coastguard Worker     // Create the texture with 'large' dimensions
4887*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSizeLarge, kSizeLarge, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4888*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4889*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4890*8975f5c5SAndroid Build Coastguard Worker 
4891*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer destFbo;
4892*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, destFbo);
4893*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture2D, 0);
4894*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4895*8975f5c5SAndroid Build Coastguard Worker 
4896*8975f5c5SAndroid Build Coastguard Worker     // Draw with the new texture so it's created in the back end
4897*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
4898*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
4899*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
4900*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4901*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSizeLarge, kSizeLarge, GLColor::blue);
4902*8975f5c5SAndroid Build Coastguard Worker 
4903*8975f5c5SAndroid Build Coastguard Worker     // Shrink the texture
4904*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSizeSmall, kSizeSmall);
4905*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4906*8975f5c5SAndroid Build Coastguard Worker 
4907*8975f5c5SAndroid Build Coastguard Worker     // Create a source texture/FBO to blit from
4908*8975f5c5SAndroid Build Coastguard Worker     GLTexture sourceTex;
4909*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, sourceTex);
4910*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSizeSmall, kSizeSmall);
4911*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4912*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer sourceFbo;
4913*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, sourceFbo);
4914*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTex, 0);
4915*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4916*8975f5c5SAndroid Build Coastguard Worker     // Fill the source texture with green
4917*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4918*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
4919*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
4920*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4921*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSizeSmall, kSizeSmall, GLColor::green);
4922*8975f5c5SAndroid Build Coastguard Worker 
4923*8975f5c5SAndroid Build Coastguard Worker     // Blit the source (green) to the destination
4924*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFbo);
4925*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, destFbo);
4926*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSizeSmall, kSizeSmall, 0, 0, kSizeSmall, kSizeSmall,
4927*8975f5c5SAndroid Build Coastguard Worker                       GL_COLOR_BUFFER_BIT, GL_NEAREST);
4928*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4929*8975f5c5SAndroid Build Coastguard Worker 
4930*8975f5c5SAndroid Build Coastguard Worker     // Render to the default framebuffer sampling from the blited texture and verify it's green
4931*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
4932*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
4933*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(texProgram, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4934*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(texProgram);
4935*8975f5c5SAndroid Build Coastguard Worker     drawQuad(texProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
4936*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::green);
4937*8975f5c5SAndroid Build Coastguard Worker }
4938*8975f5c5SAndroid Build Coastguard Worker 
4939*8975f5c5SAndroid Build Coastguard Worker // Regression test for http://crbug.com/949985 to make sure dirty bits are propagated up from
4940*8975f5c5SAndroid Build Coastguard Worker // TextureImpl and the texture is synced before being used in a draw call.
TEST_P(Texture2DTestES3,TextureImplPropogatesDirtyBits)4941*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureImplPropogatesDirtyBits)
4942*8975f5c5SAndroid Build Coastguard Worker {
4943*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL());
4944*8975f5c5SAndroid Build Coastguard Worker     // Flaky hangs on Win10 AMD RX 550 GL. http://anglebug.com/42262039
4945*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
4946*8975f5c5SAndroid Build Coastguard Worker     // D3D Debug device reports an error. http://anglebug.com/40096590
4947*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());
4948*8975f5c5SAndroid Build Coastguard Worker     // Support copy from levels outside the image range. http://anglebug.com/42263331
4949*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan());
4950*8975f5c5SAndroid Build Coastguard Worker 
4951*8975f5c5SAndroid Build Coastguard Worker     // The workaround in the GL backend required to trigger this bug generates driver warning
4952*8975f5c5SAndroid Build Coastguard Worker     // messages.
4953*8975f5c5SAndroid Build Coastguard Worker     ScopedIgnorePlatformMessages ignoreMessages;
4954*8975f5c5SAndroid Build Coastguard Worker 
4955*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
4956*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
4957*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0 + mTexture2DUniformLocation);
4958*8975f5c5SAndroid Build Coastguard Worker 
4959*8975f5c5SAndroid Build Coastguard Worker     GLTexture dest;
4960*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, dest);
4961*8975f5c5SAndroid Build Coastguard Worker 
4962*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
4963*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
4964*8975f5c5SAndroid Build Coastguard Worker 
4965*8975f5c5SAndroid Build Coastguard Worker     // Put data in mip 0 and 1
4966*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4967*8975f5c5SAndroid Build Coastguard Worker                  GLColor::red.data());
4968*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4969*8975f5c5SAndroid Build Coastguard Worker                  GLColor::green.data());
4970*8975f5c5SAndroid Build Coastguard Worker 
4971*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping so source is complete
4972*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4973*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4974*8975f5c5SAndroid Build Coastguard Worker 
4975*8975f5c5SAndroid Build Coastguard Worker     // Force the dirty bits to be synchronized in source
4976*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
4977*8975f5c5SAndroid Build Coastguard Worker 
4978*8975f5c5SAndroid Build Coastguard Worker     // Copy from mip 1 of the source.  In the GL backend this internally sets the base level to mip
4979*8975f5c5SAndroid Build Coastguard Worker     // 1 and sets a dirty bit.
4980*8975f5c5SAndroid Build Coastguard Worker     glCopyTextureCHROMIUM(source, 1, GL_TEXTURE_2D, dest, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE,
4981*8975f5c5SAndroid Build Coastguard Worker                           GL_FALSE, GL_FALSE);
4982*8975f5c5SAndroid Build Coastguard Worker 
4983*8975f5c5SAndroid Build Coastguard Worker     // Draw again, assertions are generated if the texture has internal dirty bits at draw time
4984*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
4985*8975f5c5SAndroid Build Coastguard Worker }
4986*8975f5c5SAndroid Build Coastguard Worker 
4987*8975f5c5SAndroid Build Coastguard Worker // This test case changes the base level of a texture that's attached to a framebuffer, clears every
4988*8975f5c5SAndroid Build Coastguard Worker // level to green, and then samples the texture when rendering. Test is taken from
4989*8975f5c5SAndroid Build Coastguard Worker // https://www.khronos.org/registry/webgl/sdk/tests/conformance2/rendering/framebuffer-texture-changing-base-level.html
TEST_P(Texture2DTestES3,FramebufferTextureChangingBaselevel)4990*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, FramebufferTextureChangingBaselevel)
4991*8975f5c5SAndroid Build Coastguard Worker {
4992*8975f5c5SAndroid Build Coastguard Worker     // TODO(cnorthrop): Failing on Vulkan/Windows/AMD. http://anglebug.com/42262633
4993*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsAMD());
4994*8975f5c5SAndroid Build Coastguard Worker 
4995*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
4996*8975f5c5SAndroid Build Coastguard Worker 
4997*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint width  = 8;
4998*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint height = 4;
4999*8975f5c5SAndroid Build Coastguard Worker 
5000*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5001*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5002*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
5003*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5004*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
5005*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
5006*8975f5c5SAndroid Build Coastguard Worker 
5007*8975f5c5SAndroid Build Coastguard Worker     // Create all mipmap levels for the texture from level 0 to the 1x1 pixel level.
5008*8975f5c5SAndroid Build Coastguard Worker     GLint level  = 0;
5009*8975f5c5SAndroid Build Coastguard Worker     GLint levelW = width;
5010*8975f5c5SAndroid Build Coastguard Worker     GLint levelH = height;
5011*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelW, levelH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5012*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
5013*8975f5c5SAndroid Build Coastguard Worker     while (levelW > 1 || levelH > 1)
5014*8975f5c5SAndroid Build Coastguard Worker     {
5015*8975f5c5SAndroid Build Coastguard Worker         ++level;
5016*8975f5c5SAndroid Build Coastguard Worker         levelW = static_cast<GLint>(std::max(1.0, std::floor(width / std::pow(2, level))));
5017*8975f5c5SAndroid Build Coastguard Worker         levelH = static_cast<GLint>(std::max(1.0, std::floor(height / std::pow(2, level))));
5018*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelW, levelH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5019*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
5020*8975f5c5SAndroid Build Coastguard Worker     }
5021*8975f5c5SAndroid Build Coastguard Worker 
5022*8975f5c5SAndroid Build Coastguard Worker     // Clear each level of the texture using an FBO. Change the base level to match the level used
5023*8975f5c5SAndroid Build Coastguard Worker     // for the FBO on each iteration.
5024*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5025*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5026*8975f5c5SAndroid Build Coastguard Worker     level  = 0;
5027*8975f5c5SAndroid Build Coastguard Worker     levelW = width;
5028*8975f5c5SAndroid Build Coastguard Worker     levelH = height;
5029*8975f5c5SAndroid Build Coastguard Worker     while (levelW > 1 || levelH > 1)
5030*8975f5c5SAndroid Build Coastguard Worker     {
5031*8975f5c5SAndroid Build Coastguard Worker         levelW = static_cast<GLint>(std::floor(width / std::pow(2, level)));
5032*8975f5c5SAndroid Build Coastguard Worker         levelH = static_cast<GLint>(std::floor(height / std::pow(2, level)));
5033*8975f5c5SAndroid Build Coastguard Worker 
5034*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level);
5035*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, level);
5036*8975f5c5SAndroid Build Coastguard Worker 
5037*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
5038*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
5039*8975f5c5SAndroid Build Coastguard Worker 
5040*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0, 1, 0, 1);
5041*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
5042*8975f5c5SAndroid Build Coastguard Worker 
5043*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5044*8975f5c5SAndroid Build Coastguard Worker 
5045*8975f5c5SAndroid Build Coastguard Worker         ++level;
5046*8975f5c5SAndroid Build Coastguard Worker     }
5047*8975f5c5SAndroid Build Coastguard Worker 
5048*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
5049*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 16, 16);
5050*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
5051*8975f5c5SAndroid Build Coastguard Worker 
5052*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
5053*8975f5c5SAndroid Build Coastguard Worker 
5054*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5055*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5056*8975f5c5SAndroid Build Coastguard Worker }
5057*8975f5c5SAndroid Build Coastguard Worker 
5058*8975f5c5SAndroid Build Coastguard Worker // Test that changing the base level of a texture after redefining a level outside the mip-chain
5059*8975f5c5SAndroid Build Coastguard Worker // preserves the other mips' data.
TEST_P(Texture2DBaseMaxTestES3,ExtendMipChainAfterRedefine)5060*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, ExtendMipChainAfterRedefine)
5061*8975f5c5SAndroid Build Coastguard Worker {
5062*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263298
5063*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
5064*8975f5c5SAndroid Build Coastguard Worker 
5065*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263714
5066*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA() && IsMac());
5067*8975f5c5SAndroid Build Coastguard Worker 
5068*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5069*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5070*8975f5c5SAndroid Build Coastguard Worker 
5071*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5072*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5073*8975f5c5SAndroid Build Coastguard Worker 
5074*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getTotalMipDataSize(kMip0Size)> mipData;
5075*8975f5c5SAndroid Build Coastguard Worker     fillMipData(mipData.data(), kMip0Size, kMipColors);
5076*8975f5c5SAndroid Build Coastguard Worker 
5077*8975f5c5SAndroid Build Coastguard Worker     for (size_t mip = 1; mip < kMipCount; ++mip)
5078*8975f5c5SAndroid Build Coastguard Worker     {
5079*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA8, kMip0Size >> mip, kMip0Size >> mip, 0, GL_RGBA,
5080*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, mipData.data() + getMipDataOffset(kMip0Size, mip));
5081*8975f5c5SAndroid Build Coastguard Worker     }
5082*8975f5c5SAndroid Build Coastguard Worker 
5083*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5084*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
5085*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5086*8975f5c5SAndroid Build Coastguard Worker 
5087*8975f5c5SAndroid Build Coastguard Worker     // Mip 1 is green.  Verify this.
5088*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[1]);
5089*8975f5c5SAndroid Build Coastguard Worker 
5090*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263308
5091*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && (IsIntel() || IsAMD()) && IsWindows());
5092*8975f5c5SAndroid Build Coastguard Worker 
5093*8975f5c5SAndroid Build Coastguard Worker     // Add mip 0 and rebase the mip chain.
5094*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kMip0Size, kMip0Size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5095*8975f5c5SAndroid Build Coastguard Worker                  mipData.data() + getMipDataOffset(kMip0Size, 0));
5096*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
5097*8975f5c5SAndroid Build Coastguard Worker 
5098*8975f5c5SAndroid Build Coastguard Worker     // Mip 1 should still be green.
5099*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[1]);
5100*8975f5c5SAndroid Build Coastguard Worker 
5101*8975f5c5SAndroid Build Coastguard Worker     // Verify the other mips too.
5102*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 2);
5103*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5104*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[2]);
5105*8975f5c5SAndroid Build Coastguard Worker 
5106*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 3);
5107*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5108*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[3]);
5109*8975f5c5SAndroid Build Coastguard Worker 
5110*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
5111*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5112*8975f5c5SAndroid Build Coastguard Worker 
5113*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[0]);
5114*8975f5c5SAndroid Build Coastguard Worker }
5115*8975f5c5SAndroid Build Coastguard Worker 
5116*8975f5c5SAndroid Build Coastguard Worker // Test that changing the base level of a texture multiple times preserves the data.
TEST_P(Texture2DBaseMaxTestES3,PingPongBaseLevel)5117*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, PingPongBaseLevel)
5118*8975f5c5SAndroid Build Coastguard Worker {
5119*8975f5c5SAndroid Build Coastguard Worker     testPingPongBaseLevel(false);
5120*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(Texture2DBaseMaxTestES3,PingPongBaseLevelImmutable)5121*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, PingPongBaseLevelImmutable)
5122*8975f5c5SAndroid Build Coastguard Worker {
5123*8975f5c5SAndroid Build Coastguard Worker     testPingPongBaseLevel(true);
5124*8975f5c5SAndroid Build Coastguard Worker }
testPingPongBaseLevel(bool immutable)5125*8975f5c5SAndroid Build Coastguard Worker void Texture2DBaseMaxTestES3::testPingPongBaseLevel(bool immutable)
5126*8975f5c5SAndroid Build Coastguard Worker {
5127*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263310
5128*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D());
5129*8975f5c5SAndroid Build Coastguard Worker 
5130*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263311
5131*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsAMD() && IsWindows());
5132*8975f5c5SAndroid Build Coastguard Worker 
5133*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263301
5134*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
5135*8975f5c5SAndroid Build Coastguard Worker 
5136*8975f5c5SAndroid Build Coastguard Worker     initTest(immutable);
5137*8975f5c5SAndroid Build Coastguard Worker 
5138*8975f5c5SAndroid Build Coastguard Worker     // Ping pong a few times.
5139*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t tries = 0; tries < 2; ++tries)
5140*8975f5c5SAndroid Build Coastguard Worker     {
5141*8975f5c5SAndroid Build Coastguard Worker         // Rebase to different mips and verify mips.
5142*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t base = 0; base < kMipCount; ++base)
5143*8975f5c5SAndroid Build Coastguard Worker         {
5144*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, base);
5145*8975f5c5SAndroid Build Coastguard Worker             for (uint32_t lod = 0; lod < kMipCount - base; ++lod)
5146*8975f5c5SAndroid Build Coastguard Worker             {
5147*8975f5c5SAndroid Build Coastguard Worker                 setLodUniform(lod);
5148*8975f5c5SAndroid Build Coastguard Worker                 drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5149*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[base + lod]);
5150*8975f5c5SAndroid Build Coastguard Worker             }
5151*8975f5c5SAndroid Build Coastguard Worker         }
5152*8975f5c5SAndroid Build Coastguard Worker 
5153*8975f5c5SAndroid Build Coastguard Worker         // Rebase backwards and verify mips.
5154*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t base = kMipCount - 2; base > 0; --base)
5155*8975f5c5SAndroid Build Coastguard Worker         {
5156*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, base);
5157*8975f5c5SAndroid Build Coastguard Worker             for (uint32_t lod = 0; lod < kMipCount - base; ++lod)
5158*8975f5c5SAndroid Build Coastguard Worker             {
5159*8975f5c5SAndroid Build Coastguard Worker                 setLodUniform(lod);
5160*8975f5c5SAndroid Build Coastguard Worker                 drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5161*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[base + lod]);
5162*8975f5c5SAndroid Build Coastguard Worker             }
5163*8975f5c5SAndroid Build Coastguard Worker         }
5164*8975f5c5SAndroid Build Coastguard Worker     }
5165*8975f5c5SAndroid Build Coastguard Worker }
5166*8975f5c5SAndroid Build Coastguard Worker 
5167*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D after incompatibly redefining a mip level correctly applies the update
5168*8975f5c5SAndroid Build Coastguard Worker // after the redefine data.
TEST_P(Texture2DBaseMaxTestES3,SubImageAfterRedefine)5169*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, SubImageAfterRedefine)
5170*8975f5c5SAndroid Build Coastguard Worker {
5171*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5172*8975f5c5SAndroid Build Coastguard Worker 
5173*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5174*8975f5c5SAndroid Build Coastguard Worker     // created already).
5175*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5176*8975f5c5SAndroid Build Coastguard Worker     {
5177*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5178*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5179*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5180*8975f5c5SAndroid Build Coastguard Worker     }
5181*8975f5c5SAndroid Build Coastguard Worker 
5182*8975f5c5SAndroid Build Coastguard Worker     // Redefine every level, followed by a glTexSubImage2D
5183*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColors[kMipCount] = {
5184*8975f5c5SAndroid Build Coastguard Worker         GLColor::yellow,
5185*8975f5c5SAndroid Build Coastguard Worker         GLColor::cyan,
5186*8975f5c5SAndroid Build Coastguard Worker         GLColor(127, 0, 0, 255),
5187*8975f5c5SAndroid Build Coastguard Worker         GLColor(0, 127, 0, 255),
5188*8975f5c5SAndroid Build Coastguard Worker     };
5189*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getTotalMipDataSize(kMip0Size * 2)> newMipData;
5190*8975f5c5SAndroid Build Coastguard Worker     fillMipData(newMipData.data(), kMip0Size * 2, kNewMipColors);
5191*8975f5c5SAndroid Build Coastguard Worker 
5192*8975f5c5SAndroid Build Coastguard Worker     const GLColor kSubImageMipColors[kMipCount] = {
5193*8975f5c5SAndroid Build Coastguard Worker         GLColor(0, 0, 127, 255),
5194*8975f5c5SAndroid Build Coastguard Worker         GLColor(127, 127, 0, 255),
5195*8975f5c5SAndroid Build Coastguard Worker         GLColor(0, 127, 127, 255),
5196*8975f5c5SAndroid Build Coastguard Worker         GLColor(127, 0, 127, 255),
5197*8975f5c5SAndroid Build Coastguard Worker     };
5198*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getTotalMipDataSize(kMip0Size)> subImageMipData;
5199*8975f5c5SAndroid Build Coastguard Worker     fillMipData(subImageMipData.data(), kMip0Size, kSubImageMipColors);
5200*8975f5c5SAndroid Build Coastguard Worker 
5201*8975f5c5SAndroid Build Coastguard Worker     for (size_t mip = 0; mip < kMipCount; ++mip)
5202*8975f5c5SAndroid Build Coastguard Worker     {
5203*8975f5c5SAndroid Build Coastguard Worker         // Redefine the level.
5204*8975f5c5SAndroid Build Coastguard Worker         size_t newMipSize = (kMip0Size * 2) >> mip;
5205*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA8, newMipSize, newMipSize, 0, GL_RGBA,
5206*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, newMipData.data() + getMipDataOffset(kMip0Size * 2, mip));
5207*8975f5c5SAndroid Build Coastguard Worker 
5208*8975f5c5SAndroid Build Coastguard Worker         // Immediately follow that with a subimage update.
5209*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, mip, 0, 0, kMip0Size >> mip, kMip0Size >> mip, GL_RGBA,
5210*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE,
5211*8975f5c5SAndroid Build Coastguard Worker                         subImageMipData.data() + getMipDataOffset(kMip0Size, mip));
5212*8975f5c5SAndroid Build Coastguard Worker     }
5213*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, kMipCount - 1);
5214*8975f5c5SAndroid Build Coastguard Worker 
5215*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5216*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5217*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5218*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5219*8975f5c5SAndroid Build Coastguard Worker     {
5220*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5221*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5222*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kSubImageMipColors[lod]);
5223*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kNewMipColors[lod]);
5224*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kNewMipColors[lod]);
5225*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kNewMipColors[lod]);
5226*8975f5c5SAndroid Build Coastguard Worker     }
5227*8975f5c5SAndroid Build Coastguard Worker }
5228*8975f5c5SAndroid Build Coastguard Worker 
5229*8975f5c5SAndroid Build Coastguard Worker // Test that incompatibly redefining a level then redefining it back to its original size works.
TEST_P(Texture2DBaseMaxTestES3,IncompatiblyRedefineLevelThenRevert)5230*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, IncompatiblyRedefineLevelThenRevert)
5231*8975f5c5SAndroid Build Coastguard Worker {
5232*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5233*8975f5c5SAndroid Build Coastguard Worker 
5234*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5235*8975f5c5SAndroid Build Coastguard Worker     // created already).
5236*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5237*8975f5c5SAndroid Build Coastguard Worker     {
5238*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5239*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5240*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5241*8975f5c5SAndroid Build Coastguard Worker     }
5242*8975f5c5SAndroid Build Coastguard Worker 
5243*8975f5c5SAndroid Build Coastguard Worker     // Redefine Mip 1 to be larger.
5244*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kLargeMip1Size = getMipDataSize(kMip0Size * 2, 1);
5245*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLargeMip1Size> interimMipData;
5246*8975f5c5SAndroid Build Coastguard Worker     std::fill(interimMipData.data(), interimMipData.data() + kLargeMip1Size, GLColor::yellow);
5247*8975f5c5SAndroid Build Coastguard Worker 
5248*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kMip0Size, kMip0Size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5249*8975f5c5SAndroid Build Coastguard Worker                  interimMipData.data());
5250*8975f5c5SAndroid Build Coastguard Worker 
5251*8975f5c5SAndroid Build Coastguard Worker     // Redefine Mip 1 back to its original size.
5252*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kNormalMip1Size = getMipDataSize(kMip0Size, 1);
5253*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLargeMip1Size> newMipData;
5254*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.data(), newMipData.data() + kNormalMip1Size, GLColor::cyan);
5255*8975f5c5SAndroid Build Coastguard Worker 
5256*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kMip0Size / 2, kMip0Size / 2, 0, GL_RGBA,
5257*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, newMipData.data());
5258*8975f5c5SAndroid Build Coastguard Worker 
5259*8975f5c5SAndroid Build Coastguard Worker     // Verify texture colors.
5260*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5261*8975f5c5SAndroid Build Coastguard Worker     {
5262*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5263*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5264*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, lod == 1 ? GLColor::cyan : kMipColors[lod]);
5265*8975f5c5SAndroid Build Coastguard Worker     }
5266*8975f5c5SAndroid Build Coastguard Worker }
5267*8975f5c5SAndroid Build Coastguard Worker 
5268*8975f5c5SAndroid Build Coastguard Worker // Test that redefining every level of a texture to another format works.  The format uses more
5269*8975f5c5SAndroid Build Coastguard Worker // bits per component, to ensure alignment requirements for the new format are taken into account.
TEST_P(Texture2DBaseMaxTestES3,RedefineEveryLevelToAnotherFormat)5270*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, RedefineEveryLevelToAnotherFormat)
5271*8975f5c5SAndroid Build Coastguard Worker {
5272*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5273*8975f5c5SAndroid Build Coastguard Worker 
5274*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5275*8975f5c5SAndroid Build Coastguard Worker     // created already).
5276*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5277*8975f5c5SAndroid Build Coastguard Worker     {
5278*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5279*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5280*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5281*8975f5c5SAndroid Build Coastguard Worker     }
5282*8975f5c5SAndroid Build Coastguard Worker 
5283*8975f5c5SAndroid Build Coastguard Worker     const GLColor32F kNewMipColors[kMipCount] = {
5284*8975f5c5SAndroid Build Coastguard Worker         GLColor32F(1.0, 1.0, 0.0, 1.0f),
5285*8975f5c5SAndroid Build Coastguard Worker         GLColor32F(1.0, 0.0, 1.0, 1.0f),
5286*8975f5c5SAndroid Build Coastguard Worker         GLColor32F(0.0, 1.0, 1.0, 1.0f),
5287*8975f5c5SAndroid Build Coastguard Worker         GLColor32F(1.0, 1.0, 1.0, 1.0f),
5288*8975f5c5SAndroid Build Coastguard Worker     };
5289*8975f5c5SAndroid Build Coastguard Worker 
5290*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor32F, getTotalMipDataSize(kMip0Size)> newMipData;
5291*8975f5c5SAndroid Build Coastguard Worker     fillMipData(newMipData.data(), kMip0Size, kNewMipColors);
5292*8975f5c5SAndroid Build Coastguard Worker 
5293*8975f5c5SAndroid Build Coastguard Worker     // Redefine every level with the new format.
5294*8975f5c5SAndroid Build Coastguard Worker     for (size_t mip = 0; mip < kMipCount; ++mip)
5295*8975f5c5SAndroid Build Coastguard Worker     {
5296*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA32F, kMip0Size >> mip, kMip0Size >> mip, 0, GL_RGBA,
5297*8975f5c5SAndroid Build Coastguard Worker                      GL_FLOAT, newMipData.data() + getMipDataOffset(kMip0Size, mip));
5298*8975f5c5SAndroid Build Coastguard Worker     }
5299*8975f5c5SAndroid Build Coastguard Worker 
5300*8975f5c5SAndroid Build Coastguard Worker     // Verify texture colors.
5301*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5302*8975f5c5SAndroid Build Coastguard Worker     {
5303*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5304*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5305*8975f5c5SAndroid Build Coastguard Worker 
5306*8975f5c5SAndroid Build Coastguard Worker         GLColor32F mipColor32F = kNewMipColors[lod];
5307*8975f5c5SAndroid Build Coastguard Worker         GLColor mipColor(static_cast<GLubyte>(std::roundf(mipColor32F.R * 255)),
5308*8975f5c5SAndroid Build Coastguard Worker                          static_cast<GLubyte>(std::roundf(mipColor32F.G * 255)),
5309*8975f5c5SAndroid Build Coastguard Worker                          static_cast<GLubyte>(std::roundf(mipColor32F.B * 255)),
5310*8975f5c5SAndroid Build Coastguard Worker                          static_cast<GLubyte>(std::roundf(mipColor32F.A * 255)));
5311*8975f5c5SAndroid Build Coastguard Worker 
5312*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, mipColor);
5313*8975f5c5SAndroid Build Coastguard Worker     }
5314*8975f5c5SAndroid Build Coastguard Worker }
5315*8975f5c5SAndroid Build Coastguard Worker 
5316*8975f5c5SAndroid Build Coastguard Worker // Test that generating mipmaps after change base level.
TEST_P(Texture2DBaseMaxTestES3,GenerateMipmapAfterRebase)5317*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, GenerateMipmapAfterRebase)
5318*8975f5c5SAndroid Build Coastguard Worker {
5319*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264421
5320*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && IsDesktopOpenGL());
5321*8975f5c5SAndroid Build Coastguard Worker 
5322*8975f5c5SAndroid Build Coastguard Worker     testGenerateMipmapAfterRebase(false);
5323*8975f5c5SAndroid Build Coastguard Worker }
5324*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DBaseMaxTestES3,GenerateMipmapAfterRebaseImmutable)5325*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, GenerateMipmapAfterRebaseImmutable)
5326*8975f5c5SAndroid Build Coastguard Worker {
5327*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263310
5328*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D());
5329*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264332
5330*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA());
5331*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264421
5332*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && IsDesktopOpenGL());
5333*8975f5c5SAndroid Build Coastguard Worker 
5334*8975f5c5SAndroid Build Coastguard Worker     testGenerateMipmapAfterRebase(true);
5335*8975f5c5SAndroid Build Coastguard Worker }
5336*8975f5c5SAndroid Build Coastguard Worker 
testGenerateMipmapAfterRebase(bool immutable)5337*8975f5c5SAndroid Build Coastguard Worker void Texture2DBaseMaxTestES3::testGenerateMipmapAfterRebase(bool immutable)
5338*8975f5c5SAndroid Build Coastguard Worker {
5339*8975f5c5SAndroid Build Coastguard Worker     initTest(immutable);
5340*8975f5c5SAndroid Build Coastguard Worker 
5341*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5342*8975f5c5SAndroid Build Coastguard Worker     // created already).
5343*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5344*8975f5c5SAndroid Build Coastguard Worker     {
5345*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5346*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5347*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5348*8975f5c5SAndroid Build Coastguard Worker     }
5349*8975f5c5SAndroid Build Coastguard Worker 
5350*8975f5c5SAndroid Build Coastguard Worker     // Update level 1 (any level would do other than 0) with new data
5351*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColor = GLColor::yellow;
5352*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getMipDataSize(kMip0Size >> 1, 0)> newMipData;
5353*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.begin(), newMipData.end(), kNewMipColor);
5354*8975f5c5SAndroid Build Coastguard Worker 
5355*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kMip0Size >> 1, kMip0Size >> 1, GL_RGBA,
5356*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, newMipData.data());
5357*8975f5c5SAndroid Build Coastguard Worker 
5358*8975f5c5SAndroid Build Coastguard Worker     // Change base level and max level and then generate mipmaps. This should redefine level 1 and 2
5359*8975f5c5SAndroid Build Coastguard Worker     // with kNewMipColor and leave levels 0 and 3 unchanged.
5360*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5361*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, kMipCount - 2);
5362*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5363*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
5364*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, kMipCount - 1);
5365*8975f5c5SAndroid Build Coastguard Worker 
5366*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5367*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5368*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5369*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5370*8975f5c5SAndroid Build Coastguard Worker     {
5371*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5372*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5373*8975f5c5SAndroid Build Coastguard Worker         if (lod == 0)
5374*8975f5c5SAndroid Build Coastguard Worker         {
5375*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]) << "lod " << lod;
5376*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColors[lod]) << "lod " << lod;
5377*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, h, kMipColors[lod]) << "lod " << lod;
5378*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, h, kMipColors[lod]) << "lod " << lod;
5379*8975f5c5SAndroid Build Coastguard Worker         }
5380*8975f5c5SAndroid Build Coastguard Worker         else if (lod == kMipCount - 1)
5381*8975f5c5SAndroid Build Coastguard Worker         {
5382*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]) << "lod " << lod;
5383*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColors[lod]) << "lod " << lod;
5384*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, h, kMipColors[lod]) << "lod " << lod;
5385*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, h, kMipColors[lod]) << "lod " << lod;
5386*8975f5c5SAndroid Build Coastguard Worker         }
5387*8975f5c5SAndroid Build Coastguard Worker         else
5388*8975f5c5SAndroid Build Coastguard Worker         {
5389*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColor) << "lod " << lod;
5390*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, 0, kNewMipColor) << "lod " << lod;
5391*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, h, kNewMipColor) << "lod " << lod;
5392*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, h, kNewMipColor) << "lod " << lod;
5393*8975f5c5SAndroid Build Coastguard Worker         }
5394*8975f5c5SAndroid Build Coastguard Worker     }
5395*8975f5c5SAndroid Build Coastguard Worker }
5396*8975f5c5SAndroid Build Coastguard Worker 
5397*8975f5c5SAndroid Build Coastguard Worker // Test that generating mipmaps after incompatibly redefining a level works.
TEST_P(Texture2DBaseMaxTestES3,GenerateMipmapAfterRedefine)5398*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, GenerateMipmapAfterRedefine)
5399*8975f5c5SAndroid Build Coastguard Worker {
5400*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5401*8975f5c5SAndroid Build Coastguard Worker 
5402*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5403*8975f5c5SAndroid Build Coastguard Worker     // created already).
5404*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5405*8975f5c5SAndroid Build Coastguard Worker     {
5406*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5407*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5408*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5409*8975f5c5SAndroid Build Coastguard Worker     }
5410*8975f5c5SAndroid Build Coastguard Worker 
5411*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 1 (any level would do other than 0) to an incompatible size, say the same size
5412*8975f5c5SAndroid Build Coastguard Worker     // as level 0.
5413*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColor = GLColor::yellow;
5414*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getMipDataSize(kMip0Size, 0)> newMipData;
5415*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.begin(), newMipData.end(), kNewMipColor);
5416*8975f5c5SAndroid Build Coastguard Worker 
5417*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kMip0Size, kMip0Size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5418*8975f5c5SAndroid Build Coastguard Worker                  newMipData.data());
5419*8975f5c5SAndroid Build Coastguard Worker 
5420*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps.  This should redefine level 1 back to being compatible with level 0.
5421*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5422*8975f5c5SAndroid Build Coastguard Worker 
5423*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5424*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5425*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5426*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5427*8975f5c5SAndroid Build Coastguard Worker     {
5428*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5429*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5430*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[0]);
5431*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColors[0]);
5432*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kMipColors[0]);
5433*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kMipColors[0]);
5434*8975f5c5SAndroid Build Coastguard Worker     }
5435*8975f5c5SAndroid Build Coastguard Worker }
5436*8975f5c5SAndroid Build Coastguard Worker 
5437*8975f5c5SAndroid Build Coastguard Worker // Test that generating mipmaps after incompatibly redefining a level while simultaneously changing
5438*8975f5c5SAndroid Build Coastguard Worker // the base level works.
TEST_P(Texture2DBaseMaxTestES3,GenerateMipmapAfterRedefineAndRebase)5439*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, GenerateMipmapAfterRedefineAndRebase)
5440*8975f5c5SAndroid Build Coastguard Worker {
5441*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
5442*8975f5c5SAndroid Build Coastguard Worker 
5443*8975f5c5SAndroid Build Coastguard Worker     // http://crbug.com/1100613
5444*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
5445*8975f5c5SAndroid Build Coastguard Worker 
5446*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/40096747): Failing on ARM-based Apple DTKs.
5447*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && IsDesktopOpenGL());
5448*8975f5c5SAndroid Build Coastguard Worker 
5449*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5450*8975f5c5SAndroid Build Coastguard Worker 
5451*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5452*8975f5c5SAndroid Build Coastguard Worker     // created already).
5453*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5454*8975f5c5SAndroid Build Coastguard Worker     {
5455*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5456*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5457*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]) << lod;
5458*8975f5c5SAndroid Build Coastguard Worker     }
5459*8975f5c5SAndroid Build Coastguard Worker 
5460*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 2 to an incompatible size, say the same size as level 0.
5461*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColor = GLColor::yellow;
5462*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getMipDataSize(kMip0Size, 0)> newMipData;
5463*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.begin(), newMipData.end(), kNewMipColor);
5464*8975f5c5SAndroid Build Coastguard Worker 
5465*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kMip0Size, kMip0Size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5466*8975f5c5SAndroid Build Coastguard Worker                  newMipData.data());
5467*8975f5c5SAndroid Build Coastguard Worker 
5468*8975f5c5SAndroid Build Coastguard Worker     // Set base level of the texture to 1 then generate mipmaps.  Level 2 that's redefined should
5469*8975f5c5SAndroid Build Coastguard Worker     // go back to being compatibly defined.
5470*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5471*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5472*8975f5c5SAndroid Build Coastguard Worker 
5473*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5474*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5475*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5476*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5477*8975f5c5SAndroid Build Coastguard Worker     {
5478*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5479*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5480*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[1]) << lod;
5481*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColors[1]) << lod;
5482*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kMipColors[1]) << lod;
5483*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kMipColors[1]) << lod;
5484*8975f5c5SAndroid Build Coastguard Worker     }
5485*8975f5c5SAndroid Build Coastguard Worker 
5486*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 1 (current base level) to an incompatible size.
5487*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kMip0Size, kMip0Size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5488*8975f5c5SAndroid Build Coastguard Worker                  newMipData.data());
5489*8975f5c5SAndroid Build Coastguard Worker 
5490*8975f5c5SAndroid Build Coastguard Worker     // Set base level of the texture back to 0 then generate mipmaps.  Level 1 should go back to
5491*8975f5c5SAndroid Build Coastguard Worker     // being compatibly defined.
5492*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
5493*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5494*8975f5c5SAndroid Build Coastguard Worker 
5495*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5496*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5497*8975f5c5SAndroid Build Coastguard Worker     {
5498*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5499*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5500*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[0]) << lod;
5501*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColors[0]) << lod;
5502*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kMipColors[0]) << lod;
5503*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kMipColors[0]) << lod;
5504*8975f5c5SAndroid Build Coastguard Worker     }
5505*8975f5c5SAndroid Build Coastguard Worker }
5506*8975f5c5SAndroid Build Coastguard Worker 
5507*8975f5c5SAndroid Build Coastguard Worker // Test that generating mipmaps after incompatibly redefining the base level of the texture works.
TEST_P(Texture2DBaseMaxTestES3,GenerateMipmapAfterRedefiningBase)5508*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, GenerateMipmapAfterRedefiningBase)
5509*8975f5c5SAndroid Build Coastguard Worker {
5510*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5511*8975f5c5SAndroid Build Coastguard Worker 
5512*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5513*8975f5c5SAndroid Build Coastguard Worker     // created already).
5514*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5515*8975f5c5SAndroid Build Coastguard Worker     {
5516*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5517*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5518*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5519*8975f5c5SAndroid Build Coastguard Worker     }
5520*8975f5c5SAndroid Build Coastguard Worker 
5521*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 0 to an incompatible size.
5522*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColor = GLColor::yellow;
5523*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getMipDataSize(kMip0Size * 2, 0)> newMipData;
5524*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.begin(), newMipData.end(), kNewMipColor);
5525*8975f5c5SAndroid Build Coastguard Worker 
5526*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kMip0Size * 2, kMip0Size * 2, 0, GL_RGBA,
5527*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, newMipData.data());
5528*8975f5c5SAndroid Build Coastguard Worker 
5529*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps.
5530*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5531*8975f5c5SAndroid Build Coastguard Worker 
5532*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5533*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5534*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5535*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount + 1; ++lod)
5536*8975f5c5SAndroid Build Coastguard Worker     {
5537*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5538*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5539*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColor);
5540*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kNewMipColor);
5541*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kNewMipColor);
5542*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kNewMipColor);
5543*8975f5c5SAndroid Build Coastguard Worker     }
5544*8975f5c5SAndroid Build Coastguard Worker }
5545*8975f5c5SAndroid Build Coastguard Worker 
5546*8975f5c5SAndroid Build Coastguard Worker // Test that generating mipmaps after incompatibly redefining the base level while simultaneously
5547*8975f5c5SAndroid Build Coastguard Worker // changing MAX_LEVEL works.
TEST_P(Texture2DBaseMaxTestES3,GenerateMipmapAfterRedefiningBaseAndChangingMax)5548*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, GenerateMipmapAfterRedefiningBaseAndChangingMax)
5549*8975f5c5SAndroid Build Coastguard Worker {
5550*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5551*8975f5c5SAndroid Build Coastguard Worker 
5552*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5553*8975f5c5SAndroid Build Coastguard Worker     // created already).
5554*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5555*8975f5c5SAndroid Build Coastguard Worker     {
5556*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5557*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5558*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5559*8975f5c5SAndroid Build Coastguard Worker     }
5560*8975f5c5SAndroid Build Coastguard Worker 
5561*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 0 to an incompatible size.
5562*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColor = GLColor::yellow;
5563*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getMipDataSize(kMip0Size * 2, 0)> newMipData;
5564*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.begin(), newMipData.end(), kNewMipColor);
5565*8975f5c5SAndroid Build Coastguard Worker 
5566*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kMip0Size * 2, kMip0Size * 2, 0, GL_RGBA,
5567*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, newMipData.data());
5568*8975f5c5SAndroid Build Coastguard Worker 
5569*8975f5c5SAndroid Build Coastguard Worker     // Set max level of the texture to 2 then generate mipmaps.
5570*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kMaxLevel = 2;
5571*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, kMaxLevel);
5572*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5573*8975f5c5SAndroid Build Coastguard Worker 
5574*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5575*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5576*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5577*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod <= kMaxLevel; ++lod)
5578*8975f5c5SAndroid Build Coastguard Worker     {
5579*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5580*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5581*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColor);
5582*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kNewMipColor);
5583*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kNewMipColor);
5584*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kNewMipColor);
5585*8975f5c5SAndroid Build Coastguard Worker     }
5586*8975f5c5SAndroid Build Coastguard Worker }
5587*8975f5c5SAndroid Build Coastguard Worker 
5588*8975f5c5SAndroid Build Coastguard Worker // Test that stage invalid texture levels work.
TEST_P(Texture2DBaseMaxTestES3,StageInvalidLevels)5589*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, StageInvalidLevels)
5590*8975f5c5SAndroid Build Coastguard Worker {
5591*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kMaxLevel           = 2;
5592*8975f5c5SAndroid Build Coastguard Worker     const GLColor kMipColor[kMaxLevel + 1] = {GLColor::red, GLColor::green, GLColor::blue};
5593*8975f5c5SAndroid Build Coastguard Worker 
5594*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5595*8975f5c5SAndroid Build Coastguard Worker 
5596*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5597*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5598*8975f5c5SAndroid Build Coastguard Worker 
5599*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5600*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5601*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataCyan(2u * 2u, GLColor::cyan);
5602*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataCyan.data());
5603*8975f5c5SAndroid Build Coastguard Worker     setLodUniform(0);
5604*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5605*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5606*8975f5c5SAndroid Build Coastguard Worker 
5607*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
5608*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5609*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
5610*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
5611*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5612*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5613*8975f5c5SAndroid Build Coastguard Worker 
5614*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
5615*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
5616*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
5617*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5618*8975f5c5SAndroid Build Coastguard Worker 
5619*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5620*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5621*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5622*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod <= kMaxLevel; ++lod)
5623*8975f5c5SAndroid Build Coastguard Worker     {
5624*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5625*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5626*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColor[lod]);
5627*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColor[lod]);
5628*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h, kMipColor[lod]);
5629*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w, h, kMipColor[lod]);
5630*8975f5c5SAndroid Build Coastguard Worker     }
5631*8975f5c5SAndroid Build Coastguard Worker }
5632*8975f5c5SAndroid Build Coastguard Worker 
5633*8975f5c5SAndroid Build Coastguard Worker // Test redefine a mutable texture into an immutable texture.
TEST_P(Texture2DBaseMaxTestES3,RedefineMutableToImmutable)5634*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, RedefineMutableToImmutable)
5635*8975f5c5SAndroid Build Coastguard Worker {
5636*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263310
5637*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D());
5638*8975f5c5SAndroid Build Coastguard Worker 
5639*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263301
5640*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
5641*8975f5c5SAndroid Build Coastguard Worker 
5642*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kBaseLevel          = 1;
5643*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipColors[kMipCount] = {
5644*8975f5c5SAndroid Build Coastguard Worker         GLColor::yellow,
5645*8975f5c5SAndroid Build Coastguard Worker         GLColor::cyan,
5646*8975f5c5SAndroid Build Coastguard Worker         GLColor::white,
5647*8975f5c5SAndroid Build Coastguard Worker         GLColor(127u, 127u, 127u, 255u),
5648*8975f5c5SAndroid Build Coastguard Worker     };
5649*8975f5c5SAndroid Build Coastguard Worker 
5650*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5651*8975f5c5SAndroid Build Coastguard Worker 
5652*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, kBaseLevel);
5653*8975f5c5SAndroid Build Coastguard Worker 
5654*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data
5655*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = kBaseLevel; lod < kMipCount; ++lod)
5656*8975f5c5SAndroid Build Coastguard Worker     {
5657*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod - kBaseLevel);
5658*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5659*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5660*8975f5c5SAndroid Build Coastguard Worker     }
5661*8975f5c5SAndroid Build Coastguard Worker 
5662*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, kMipCount, GL_RGBA8, kMip0Size, kMip0Size);
5663*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getTotalMipDataSize(kMip0Size)> mipData;
5664*8975f5c5SAndroid Build Coastguard Worker     fillMipData(mipData.data(), kMip0Size, kNewMipColors);
5665*8975f5c5SAndroid Build Coastguard Worker     for (size_t mip = 0; mip < kMipCount; ++mip)
5666*8975f5c5SAndroid Build Coastguard Worker     {
5667*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, mip, 0, 0, kMip0Size >> mip, kMip0Size >> mip, GL_RGBA,
5668*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, mipData.data() + getMipDataOffset(kMip0Size, mip));
5669*8975f5c5SAndroid Build Coastguard Worker     }
5670*8975f5c5SAndroid Build Coastguard Worker 
5671*8975f5c5SAndroid Build Coastguard Worker     // Test that all enabled mips have the expected data
5672*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = kBaseLevel; lod < kMipCount; ++lod)
5673*8975f5c5SAndroid Build Coastguard Worker     {
5674*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod - kBaseLevel);
5675*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5676*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[lod]);
5677*8975f5c5SAndroid Build Coastguard Worker     }
5678*8975f5c5SAndroid Build Coastguard Worker 
5679*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
5680*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kBaseLevel; ++lod)
5681*8975f5c5SAndroid Build Coastguard Worker     {
5682*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5683*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5684*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[lod]);
5685*8975f5c5SAndroid Build Coastguard Worker     }
5686*8975f5c5SAndroid Build Coastguard Worker }
5687*8975f5c5SAndroid Build Coastguard Worker 
5688*8975f5c5SAndroid Build Coastguard Worker // Test that redefine a level with incompatible size beyond the max level.
TEST_P(Texture2DBaseMaxTestES3,RedefineIncompatibleLevelBeyondMaxLevel)5689*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, RedefineIncompatibleLevelBeyondMaxLevel)
5690*8975f5c5SAndroid Build Coastguard Worker {
5691*8975f5c5SAndroid Build Coastguard Worker     initTest(false);
5692*8975f5c5SAndroid Build Coastguard Worker 
5693*8975f5c5SAndroid Build Coastguard Worker     // Test that all mips have the expected data initially (this makes sure the texture image is
5694*8975f5c5SAndroid Build Coastguard Worker     // created already).
5695*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < kMipCount; ++lod)
5696*8975f5c5SAndroid Build Coastguard Worker     {
5697*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5698*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5699*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5700*8975f5c5SAndroid Build Coastguard Worker     }
5701*8975f5c5SAndroid Build Coastguard Worker 
5702*8975f5c5SAndroid Build Coastguard Worker     uint32_t maxLevel = 1;
5703*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxLevel);
5704*8975f5c5SAndroid Build Coastguard Worker 
5705*8975f5c5SAndroid Build Coastguard Worker     // Update level 0
5706*8975f5c5SAndroid Build Coastguard Worker     const GLColor kNewMipLevle0Color = GLColor::yellow;
5707*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, getMipDataSize(kMip0Size, 0)> newMipData;
5708*8975f5c5SAndroid Build Coastguard Worker     std::fill(newMipData.begin(), newMipData.end(), kNewMipLevle0Color);
5709*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kMip0Size, kMip0Size, GL_RGBA, GL_UNSIGNED_BYTE,
5710*8975f5c5SAndroid Build Coastguard Worker                     newMipData.data());
5711*8975f5c5SAndroid Build Coastguard Worker 
5712*8975f5c5SAndroid Build Coastguard Worker     // Update level 2 with incompatible data
5713*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 10, 10, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5714*8975f5c5SAndroid Build Coastguard Worker                  newMipData.data());
5715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5716*8975f5c5SAndroid Build Coastguard Worker 
5717*8975f5c5SAndroid Build Coastguard Worker     // Test that the texture looks as expected.
5718*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth() - 1;
5719*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight() - 1;
5720*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t lod = 0; lod < maxLevel; ++lod)
5721*8975f5c5SAndroid Build Coastguard Worker     {
5722*8975f5c5SAndroid Build Coastguard Worker         setLodUniform(lod);
5723*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
5724*8975f5c5SAndroid Build Coastguard Worker         if (lod == 0)
5725*8975f5c5SAndroid Build Coastguard Worker         {
5726*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipLevle0Color);
5727*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, 0, kNewMipLevle0Color);
5728*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, h, kNewMipLevle0Color);
5729*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, h, kNewMipLevle0Color);
5730*8975f5c5SAndroid Build Coastguard Worker         }
5731*8975f5c5SAndroid Build Coastguard Worker         else
5732*8975f5c5SAndroid Build Coastguard Worker         {
5733*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, kMipColors[lod]);
5734*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, 0, kMipColors[lod]);
5735*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, h, kMipColors[lod]);
5736*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(w, h, kMipColors[lod]);
5737*8975f5c5SAndroid Build Coastguard Worker         }
5738*8975f5c5SAndroid Build Coastguard Worker     }
5739*8975f5c5SAndroid Build Coastguard Worker }
5740*8975f5c5SAndroid Build Coastguard Worker 
5741*8975f5c5SAndroid Build Coastguard Worker // Port test from web_gl/conformance2/textures/misc/fuzz-545-immutable-tex-render-feedback.html.
5742*8975f5c5SAndroid Build Coastguard Worker // What this tries to do is create a render feedback loop and ensure it is not crashing.
TEST_P(Texture2DBaseMaxTestES3,Fuzz545ImmutableTexRenderFeedback)5743*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, Fuzz545ImmutableTexRenderFeedback)
5744*8975f5c5SAndroid Build Coastguard Worker {
5745*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5746*8975f5c5SAndroid Build Coastguard Worker 
5747*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t MIPS = 2;
5748*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t SIZE = 10;
5749*8975f5c5SAndroid Build Coastguard Worker 
5750*8975f5c5SAndroid Build Coastguard Worker     GLTexture immutTex;
5751*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, immutTex);
5752*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, MIPS, GL_RGBA8, SIZE, SIZE);
5753*8975f5c5SAndroid Build Coastguard Worker 
5754*8975f5c5SAndroid Build Coastguard Worker     GLTexture mutTex;
5755*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mutTex);
5756*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t mip = 0; mip < MIPS; mip++)
5757*8975f5c5SAndroid Build Coastguard Worker     {
5758*8975f5c5SAndroid Build Coastguard Worker         const uint32_t size = SIZE >> mip;
5759*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA8, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5760*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
5761*8975f5c5SAndroid Build Coastguard Worker     }
5762*8975f5c5SAndroid Build Coastguard Worker 
5763*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum MAG_FILTERS[] = {GL_LINEAR, GL_NEAREST};
5764*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum MIN_FILTERS[] = {
5765*8975f5c5SAndroid Build Coastguard Worker         GL_LINEAR,  GL_LINEAR_MIPMAP_LINEAR,  GL_LINEAR_MIPMAP_NEAREST,
5766*8975f5c5SAndroid Build Coastguard Worker         GL_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST_MIPMAP_NEAREST};
5767*8975f5c5SAndroid Build Coastguard Worker 
5768*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5769*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5770*8975f5c5SAndroid Build Coastguard Worker 
5771*8975f5c5SAndroid Build Coastguard Worker     const GLuint texs[] = {immutTex, mutTex};
5772*8975f5c5SAndroid Build Coastguard Worker     for (const GLuint tex : texs)
5773*8975f5c5SAndroid Build Coastguard Worker     {
5774*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
5775*8975f5c5SAndroid Build Coastguard Worker 
5776*8975f5c5SAndroid Build Coastguard Worker         for (GLuint level_prime_base = 0; level_prime_base < (MIPS + 1); level_prime_base++)
5777*8975f5c5SAndroid Build Coastguard Worker         {  // `level_base` in GLES
5778*8975f5c5SAndroid Build Coastguard Worker             // ES 3.0.6 p150
5779*8975f5c5SAndroid Build Coastguard Worker             GLuint _level_base = level_prime_base;
5780*8975f5c5SAndroid Build Coastguard Worker             if (tex == immutTex)
5781*8975f5c5SAndroid Build Coastguard Worker             {
5782*8975f5c5SAndroid Build Coastguard Worker                 _level_base = std::min(_level_base, MIPS - 1);
5783*8975f5c5SAndroid Build Coastguard Worker             }
5784*8975f5c5SAndroid Build Coastguard Worker             const GLuint level_base = _level_base;
5785*8975f5c5SAndroid Build Coastguard Worker 
5786*8975f5c5SAndroid Build Coastguard Worker             for (GLuint _level_prime_max = (level_prime_base - 1); _level_prime_max < (MIPS + 2);
5787*8975f5c5SAndroid Build Coastguard Worker                  _level_prime_max++)
5788*8975f5c5SAndroid Build Coastguard Worker             {  // `q` in GLES
5789*8975f5c5SAndroid Build Coastguard Worker                 if (_level_prime_max < 0)
5790*8975f5c5SAndroid Build Coastguard Worker                     continue;
5791*8975f5c5SAndroid Build Coastguard Worker                 if (_level_prime_max == (MIPS + 1))
5792*8975f5c5SAndroid Build Coastguard Worker                 {
5793*8975f5c5SAndroid Build Coastguard Worker                     _level_prime_max = 10000;  // This is the default, after all!
5794*8975f5c5SAndroid Build Coastguard Worker                 }
5795*8975f5c5SAndroid Build Coastguard Worker                 const GLuint level_prime_max = _level_prime_max;
5796*8975f5c5SAndroid Build Coastguard Worker 
5797*8975f5c5SAndroid Build Coastguard Worker                 // ES 3.0.6 p150
5798*8975f5c5SAndroid Build Coastguard Worker                 GLuint _level_max = level_prime_max;
5799*8975f5c5SAndroid Build Coastguard Worker                 if (tex == immutTex)
5800*8975f5c5SAndroid Build Coastguard Worker                 {
5801*8975f5c5SAndroid Build Coastguard Worker                     _level_max = std::min(std::max(level_base, level_prime_max), MIPS - 1);
5802*8975f5c5SAndroid Build Coastguard Worker                 }
5803*8975f5c5SAndroid Build Coastguard Worker                 const GLuint level_max = _level_max;
5804*8975f5c5SAndroid Build Coastguard Worker 
5805*8975f5c5SAndroid Build Coastguard Worker                 const GLuint p = std::floor((float)std::log2(SIZE)) + level_base;
5806*8975f5c5SAndroid Build Coastguard Worker                 const GLuint q = std::min(p, level_max);
5807*8975f5c5SAndroid Build Coastguard Worker 
5808*8975f5c5SAndroid Build Coastguard Worker                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level_prime_base);
5809*8975f5c5SAndroid Build Coastguard Worker                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level_prime_max);
5810*8975f5c5SAndroid Build Coastguard Worker 
5811*8975f5c5SAndroid Build Coastguard Worker                 const bool mipComplete = (q <= MIPS - 1);
5812*8975f5c5SAndroid Build Coastguard Worker 
5813*8975f5c5SAndroid Build Coastguard Worker                 for (const GLenum minFilter : MIN_FILTERS)
5814*8975f5c5SAndroid Build Coastguard Worker                 {
5815*8975f5c5SAndroid Build Coastguard Worker                     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
5816*8975f5c5SAndroid Build Coastguard Worker 
5817*8975f5c5SAndroid Build Coastguard Worker                     for (const GLenum magFilter : MAG_FILTERS)
5818*8975f5c5SAndroid Build Coastguard Worker                     {
5819*8975f5c5SAndroid Build Coastguard Worker                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
5820*8975f5c5SAndroid Build Coastguard Worker 
5821*8975f5c5SAndroid Build Coastguard Worker                         for (GLuint dstMip = 0; dstMip < (MIPS + 1); dstMip++)
5822*8975f5c5SAndroid Build Coastguard Worker                         {
5823*8975f5c5SAndroid Build Coastguard Worker                             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
5824*8975f5c5SAndroid Build Coastguard Worker                                                    GL_TEXTURE_2D, tex, dstMip);
5825*8975f5c5SAndroid Build Coastguard Worker 
5826*8975f5c5SAndroid Build Coastguard Worker                             // ES3.0 p213-214
5827*8975f5c5SAndroid Build Coastguard Worker                             bool fbComplete = true;
5828*8975f5c5SAndroid Build Coastguard Worker 
5829*8975f5c5SAndroid Build Coastguard Worker                             // * "The width and height of `image` are non-zero"
5830*8975f5c5SAndroid Build Coastguard Worker                             fbComplete &= (0 <= dstMip && dstMip <= MIPS - 1);
5831*8975f5c5SAndroid Build Coastguard Worker 
5832*8975f5c5SAndroid Build Coastguard Worker                             if (tex != immutTex)
5833*8975f5c5SAndroid Build Coastguard Worker                             {  // "...does not name an immutable-format texture..."
5834*8975f5c5SAndroid Build Coastguard Worker                                 // * "...the value of [level] must be in the range `[level_base,
5835*8975f5c5SAndroid Build Coastguard Worker                                 // q]`"
5836*8975f5c5SAndroid Build Coastguard Worker                                 fbComplete &= (level_base <= dstMip && dstMip <= q);
5837*8975f5c5SAndroid Build Coastguard Worker 
5838*8975f5c5SAndroid Build Coastguard Worker                                 // * "...the value of [level] is not `level_base`, then the texture
5839*8975f5c5SAndroid Build Coastguard Worker                                 // must be mipmap complete"
5840*8975f5c5SAndroid Build Coastguard Worker                                 if (dstMip != level_base)
5841*8975f5c5SAndroid Build Coastguard Worker                                 {
5842*8975f5c5SAndroid Build Coastguard Worker                                     fbComplete &= mipComplete;
5843*8975f5c5SAndroid Build Coastguard Worker                                 }
5844*8975f5c5SAndroid Build Coastguard Worker                             }
5845*8975f5c5SAndroid Build Coastguard Worker 
5846*8975f5c5SAndroid Build Coastguard Worker                             // -
5847*8975f5c5SAndroid Build Coastguard Worker                             GLenum expectError  = 0;
5848*8975f5c5SAndroid Build Coastguard Worker                             GLenum expectStatus = GL_FRAMEBUFFER_COMPLETE;
5849*8975f5c5SAndroid Build Coastguard Worker                             if (!fbComplete)
5850*8975f5c5SAndroid Build Coastguard Worker                             {
5851*8975f5c5SAndroid Build Coastguard Worker                                 expectStatus = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
5852*8975f5c5SAndroid Build Coastguard Worker                                 expectError  = GL_INVALID_FRAMEBUFFER_OPERATION;
5853*8975f5c5SAndroid Build Coastguard Worker                             }
5854*8975f5c5SAndroid Build Coastguard Worker 
5855*8975f5c5SAndroid Build Coastguard Worker                             // -
5856*8975f5c5SAndroid Build Coastguard Worker                             EXPECT_GLENUM_EQ(expectStatus,
5857*8975f5c5SAndroid Build Coastguard Worker                                              glCheckFramebufferStatus(GL_FRAMEBUFFER));
5858*8975f5c5SAndroid Build Coastguard Worker 
5859*8975f5c5SAndroid Build Coastguard Worker                             drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
5860*8975f5c5SAndroid Build Coastguard Worker                             EXPECT_EQ(expectError, glGetError());
5861*8975f5c5SAndroid Build Coastguard Worker                         }
5862*8975f5c5SAndroid Build Coastguard Worker                     }
5863*8975f5c5SAndroid Build Coastguard Worker                 }
5864*8975f5c5SAndroid Build Coastguard Worker             }
5865*8975f5c5SAndroid Build Coastguard Worker         }
5866*8975f5c5SAndroid Build Coastguard Worker     }
5867*8975f5c5SAndroid Build Coastguard Worker }
5868*8975f5c5SAndroid Build Coastguard Worker 
5869*8975f5c5SAndroid Build Coastguard Worker // Test sampling from a texture of a (usually) not color-renderable
5870*8975f5c5SAndroid Build Coastguard Worker // base format with a color-renderable level beyond the max level.
TEST_P(Texture2DBaseMaxTestES3,NotColorRenderableWithColorRenderableBeyondMaxLevel)5871*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, NotColorRenderableWithColorRenderableBeyondMaxLevel)
5872*8975f5c5SAndroid Build Coastguard Worker {
5873*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5874*8975f5c5SAndroid Build Coastguard Worker 
5875*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5876*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5877*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5878*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5879*8975f5c5SAndroid Build Coastguard Worker 
5880*8975f5c5SAndroid Build Coastguard Worker     const GLuint data[4] = {0xC0040200, 0xC0040200, 0xC0040200, 0xC0040200};
5881*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB9_E5, 2, 2, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, data);
5882*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5883*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5884*8975f5c5SAndroid Build Coastguard Worker 
5885*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5886*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
5887*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
5888*8975f5c5SAndroid Build Coastguard Worker }
5889*8975f5c5SAndroid Build Coastguard Worker 
5890*8975f5c5SAndroid Build Coastguard Worker // Test sampling from a texture of a depth-renderable base format
5891*8975f5c5SAndroid Build Coastguard Worker // with a color-renderable level beyond the max level.
TEST_P(Texture2DBaseMaxTestES3,DepthRenderableWithColorRenderableBeyondMaxLevel)5892*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, DepthRenderableWithColorRenderableBeyondMaxLevel)
5893*8975f5c5SAndroid Build Coastguard Worker {
5894*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5895*8975f5c5SAndroid Build Coastguard Worker 
5896*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5897*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5898*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5899*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5900*8975f5c5SAndroid Build Coastguard Worker 
5901*8975f5c5SAndroid Build Coastguard Worker     const GLfloat data[4] = {1.0f, 1.0f, 1.0f, 1.0f};
5902*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 2, 2, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
5903*8975f5c5SAndroid Build Coastguard Worker                  data);
5904*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5905*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5906*8975f5c5SAndroid Build Coastguard Worker 
5907*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5908*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
5909*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5910*8975f5c5SAndroid Build Coastguard Worker }
5911*8975f5c5SAndroid Build Coastguard Worker 
5912*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling while changing the base format from color-renderable
5913*8975f5c5SAndroid Build Coastguard Worker // to (usually) not color-renderable by manipulating base and max levels.
TEST_P(Texture2DBaseMaxTestES3,NotColorRenderableAfterColorRenderableBelowBaseLevel)5914*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, NotColorRenderableAfterColorRenderableBelowBaseLevel)
5915*8975f5c5SAndroid Build Coastguard Worker {
5916*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5917*8975f5c5SAndroid Build Coastguard Worker 
5918*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5919*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5920*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5921*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5922*8975f5c5SAndroid Build Coastguard Worker 
5923*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 4> data0;
5924*8975f5c5SAndroid Build Coastguard Worker     data0.fill(GLColor::green);
5925*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, data0.data());
5926*8975f5c5SAndroid Build Coastguard Worker 
5927*8975f5c5SAndroid Build Coastguard Worker     const GLuint data1[1] = {0xC0040200};
5928*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB9_E5, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, data1);
5929*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5930*8975f5c5SAndroid Build Coastguard Worker 
5931*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5932*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
5933*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5934*8975f5c5SAndroid Build Coastguard Worker 
5935*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5936*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
5937*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
5938*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
5939*8975f5c5SAndroid Build Coastguard Worker }
5940*8975f5c5SAndroid Build Coastguard Worker 
5941*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling while changing the base format from color-renderable
5942*8975f5c5SAndroid Build Coastguard Worker // to depth-renderable by manipulating base and max levels.
TEST_P(Texture2DBaseMaxTestES3,DepthRenderableAfterColorRenderableBelowBaseLevel)5943*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, DepthRenderableAfterColorRenderableBelowBaseLevel)
5944*8975f5c5SAndroid Build Coastguard Worker {
5945*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5946*8975f5c5SAndroid Build Coastguard Worker 
5947*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5948*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5949*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5950*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5951*8975f5c5SAndroid Build Coastguard Worker 
5952*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 4> data0;
5953*8975f5c5SAndroid Build Coastguard Worker     data0.fill(GLColor::green);
5954*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, data0.data());
5955*8975f5c5SAndroid Build Coastguard Worker 
5956*8975f5c5SAndroid Build Coastguard Worker     const GLfloat data1[1] = {1.0f};
5957*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
5958*8975f5c5SAndroid Build Coastguard Worker                  data1);
5959*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5960*8975f5c5SAndroid Build Coastguard Worker 
5961*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5962*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
5963*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5964*8975f5c5SAndroid Build Coastguard Worker 
5965*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5966*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
5967*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
5968*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5969*8975f5c5SAndroid Build Coastguard Worker }
5970*8975f5c5SAndroid Build Coastguard Worker 
5971*8975f5c5SAndroid Build Coastguard Worker // Test that the following scenario works:
5972*8975f5c5SAndroid Build Coastguard Worker // - change a texture's max level to 0.
5973*8975f5c5SAndroid Build Coastguard Worker // - clear the texture with glClear.
5974*8975f5c5SAndroid Build Coastguard Worker // - sample the texture and draw to another FBO.
5975*8975f5c5SAndroid Build Coastguard Worker // - draw to the texture again.
5976*8975f5c5SAndroid Build Coastguard Worker // - The texture's final color should be clear color in 1st pass + draw color.
TEST_P(Texture2DBaseMaxTestES3,SetMaxLevelToZeroThenClearThenSampleThenDraw)5977*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, SetMaxLevelToZeroThenClearThenSampleThenDraw)
5978*8975f5c5SAndroid Build Coastguard Worker {
5979*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(textureProgram, angle::essl3_shaders::vs::Texture2DLod(),
5980*8975f5c5SAndroid Build Coastguard Worker                      angle::essl3_shaders::fs::Texture2DLod());
5981*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, angle::essl1_shaders::vs::Simple(),
5982*8975f5c5SAndroid Build Coastguard Worker                      angle::essl1_shaders::fs::Blue());
5983*8975f5c5SAndroid Build Coastguard Worker 
5984*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5985*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5986*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5987*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5988*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5989*8975f5c5SAndroid Build Coastguard Worker 
5990*8975f5c5SAndroid Build Coastguard Worker     // 1. Change the texture's max level to 0.
5991*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5992*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5993*8975f5c5SAndroid Build Coastguard Worker 
5994*8975f5c5SAndroid Build Coastguard Worker     // 2. Attach the texture to a FBO and clear it.
5995*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5996*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5997*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5998*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
5999*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
6000*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
6001*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f / 255.0f, 2.0f / 255.0f, 3.0f / 255.0f, 4.0f / 255.0f);
6002*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6003*8975f5c5SAndroid Build Coastguard Worker 
6004*8975f5c5SAndroid Build Coastguard Worker     // 3. Draw the bound texture to default FBO.
6005*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6006*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
6007*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6008*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(textureProgram);
6009*8975f5c5SAndroid Build Coastguard Worker     drawQuad(textureProgram, angle::essl1_shaders::PositionAttrib(), 0.5f);
6010*8975f5c5SAndroid Build Coastguard Worker 
6011*8975f5c5SAndroid Build Coastguard Worker     // 4. Draw to the texture again
6012*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6013*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
6014*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, angle::essl1_shaders::PositionAttrib(), 0.5f);
6015*8975f5c5SAndroid Build Coastguard Worker 
6016*8975f5c5SAndroid Build Coastguard Worker     // Expect the final color to be accumulated color
6017*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6018*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(1, 2, 255, 255));
6019*8975f5c5SAndroid Build Coastguard Worker }
6020*8975f5c5SAndroid Build Coastguard Worker 
6021*8975f5c5SAndroid Build Coastguard Worker // Test that the following scenario works:
6022*8975f5c5SAndroid Build Coastguard Worker // - change a texture's max level to 1.
6023*8975f5c5SAndroid Build Coastguard Worker // - clear the texture with glClear.
6024*8975f5c5SAndroid Build Coastguard Worker // - change the texture's max level to 0.
6025*8975f5c5SAndroid Build Coastguard Worker // - sample the texture and draw to another FBO.
6026*8975f5c5SAndroid Build Coastguard Worker // - draw to the texture again.
6027*8975f5c5SAndroid Build Coastguard Worker // - The texture's final color should be clear color in 1st pass + draw color.
TEST_P(Texture2DBaseMaxTestES3,SetMaxLevelToOneThenClearThenSetMaxLevelToZeroThenSampleThenDraw)6028*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DBaseMaxTestES3, SetMaxLevelToOneThenClearThenSetMaxLevelToZeroThenSampleThenDraw)
6029*8975f5c5SAndroid Build Coastguard Worker {
6030*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(textureProgram, angle::essl3_shaders::vs::Texture2DLod(),
6031*8975f5c5SAndroid Build Coastguard Worker                      angle::essl3_shaders::fs::Texture2DLod());
6032*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, angle::essl1_shaders::vs::Simple(),
6033*8975f5c5SAndroid Build Coastguard Worker                      angle::essl1_shaders::fs::Blue());
6034*8975f5c5SAndroid Build Coastguard Worker 
6035*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
6036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
6037*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
6038*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
6039*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6040*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6041*8975f5c5SAndroid Build Coastguard Worker 
6042*8975f5c5SAndroid Build Coastguard Worker     // 1. Change the texture's max level to 1.
6043*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6044*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6045*8975f5c5SAndroid Build Coastguard Worker 
6046*8975f5c5SAndroid Build Coastguard Worker     // 2. Attach the texture to a FBO and clear it.
6047*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6048*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6049*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6050*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
6051*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
6052*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
6053*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f / 255.0f, 2.0f / 255.0f, 3.0f / 255.0f, 4.0f / 255.0f);
6054*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6055*8975f5c5SAndroid Build Coastguard Worker 
6056*8975f5c5SAndroid Build Coastguard Worker     // 3. Change the texture's max level to 0.
6057*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
6058*8975f5c5SAndroid Build Coastguard Worker 
6059*8975f5c5SAndroid Build Coastguard Worker     // 4. Draw the bound texture to default FBO.
6060*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6061*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
6062*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6063*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(textureProgram);
6064*8975f5c5SAndroid Build Coastguard Worker     drawQuad(textureProgram, angle::essl1_shaders::PositionAttrib(), 0.5f);
6065*8975f5c5SAndroid Build Coastguard Worker 
6066*8975f5c5SAndroid Build Coastguard Worker     // 5. Draw to the texture again
6067*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6068*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
6069*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, angle::essl1_shaders::PositionAttrib(), 0.5f);
6070*8975f5c5SAndroid Build Coastguard Worker 
6071*8975f5c5SAndroid Build Coastguard Worker     // Expect the final color to be accumulated color
6072*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6073*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(1, 2, 255, 255));
6074*8975f5c5SAndroid Build Coastguard Worker }
6075*8975f5c5SAndroid Build Coastguard Worker 
6076*8975f5c5SAndroid Build Coastguard Worker // Test to check that texture completeness is determined correctly when the texture base level is
6077*8975f5c5SAndroid Build Coastguard Worker // greater than 0, and also that level 0 is not sampled when base level is greater than 0.
TEST_P(Texture2DTestES3,DrawWithBaseLevel1)6078*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, DrawWithBaseLevel1)
6079*8975f5c5SAndroid Build Coastguard Worker {
6080*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6081*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
6082*8975f5c5SAndroid Build Coastguard Worker 
6083*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
6084*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
6085*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
6086*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6087*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6088*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6089*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6090*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6091*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6092*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6093*8975f5c5SAndroid Build Coastguard Worker 
6094*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6095*8975f5c5SAndroid Build Coastguard Worker 
6096*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6097*8975f5c5SAndroid Build Coastguard Worker 
6098*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6099*8975f5c5SAndroid Build Coastguard Worker }
6100*8975f5c5SAndroid Build Coastguard Worker 
testCopyImage(const APIExtensionVersion usedExtension)6101*8975f5c5SAndroid Build Coastguard Worker void Texture2DTestES3::testCopyImage(const APIExtensionVersion usedExtension)
6102*8975f5c5SAndroid Build Coastguard Worker {
6103*8975f5c5SAndroid Build Coastguard Worker     ASSERT(usedExtension == APIExtensionVersion::EXT || usedExtension == APIExtensionVersion::OES);
6104*8975f5c5SAndroid Build Coastguard Worker 
6105*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
6106*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
6107*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
6108*8975f5c5SAndroid Build Coastguard Worker 
6109*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6110*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
6111*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6112*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6113*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
6114*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
6115*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
6116*8975f5c5SAndroid Build Coastguard Worker 
6117*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
6118*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
6119*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6120*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6121*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
6122*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
6123*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6124*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6125*8975f5c5SAndroid Build Coastguard Worker 
6126*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
6127*8975f5c5SAndroid Build Coastguard Worker 
6128*8975f5c5SAndroid Build Coastguard Worker     // copy
6129*8975f5c5SAndroid Build Coastguard Worker     if (usedExtension == APIExtensionVersion::OES)
6130*8975f5c5SAndroid Build Coastguard Worker     {
6131*8975f5c5SAndroid Build Coastguard Worker         glCopyImageSubDataOES(srcTexture, GL_TEXTURE_2D, 0, 2, 2, 0, destTexture, GL_TEXTURE_2D, 0,
6132*8975f5c5SAndroid Build Coastguard Worker                               2, 2, 0, 2, 2, 1);
6133*8975f5c5SAndroid Build Coastguard Worker     }
6134*8975f5c5SAndroid Build Coastguard Worker     else
6135*8975f5c5SAndroid Build Coastguard Worker     {
6136*8975f5c5SAndroid Build Coastguard Worker         glCopyImageSubDataEXT(srcTexture, GL_TEXTURE_2D, 0, 2, 2, 0, destTexture, GL_TEXTURE_2D, 0,
6137*8975f5c5SAndroid Build Coastguard Worker                               2, 2, 0, 2, 2, 1);
6138*8975f5c5SAndroid Build Coastguard Worker     }
6139*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
6140*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6141*8975f5c5SAndroid Build Coastguard Worker 
6142*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 4, 4);
6143*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6144*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6145*8975f5c5SAndroid Build Coastguard Worker 
6146*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(2, 2, 2, 2, GLColor::green);
6147*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 4, 2, GLColor::red);
6148*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 2, 4, GLColor::red);
6149*8975f5c5SAndroid Build Coastguard Worker }
6150*8975f5c5SAndroid Build Coastguard Worker 
6151*8975f5c5SAndroid Build Coastguard Worker // Test basic GL_EXT_copy_image copy without any bound textures
TEST_P(Texture2DTestES3,CopyImageEXT)6152*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageEXT)
6153*8975f5c5SAndroid Build Coastguard Worker {
6154*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
6155*8975f5c5SAndroid Build Coastguard Worker     testCopyImage(APIExtensionVersion::EXT);
6156*8975f5c5SAndroid Build Coastguard Worker }
6157*8975f5c5SAndroid Build Coastguard Worker 
6158*8975f5c5SAndroid Build Coastguard Worker // Test basic GL_OES_copy_image copy without any bound textures
TEST_P(Texture2DTestES3,CopyImageOES)6159*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageOES)
6160*8975f5c5SAndroid Build Coastguard Worker {
6161*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_copy_image"));
6162*8975f5c5SAndroid Build Coastguard Worker     testCopyImage(APIExtensionVersion::OES);
6163*8975f5c5SAndroid Build Coastguard Worker }
6164*8975f5c5SAndroid Build Coastguard Worker 
testCopyImageDepthStencil(const APIExtensionVersion usedExtension)6165*8975f5c5SAndroid Build Coastguard Worker void Texture2DTestES3::testCopyImageDepthStencil(const APIExtensionVersion usedExtension)
6166*8975f5c5SAndroid Build Coastguard Worker {
6167*8975f5c5SAndroid Build Coastguard Worker     ASSERT(usedExtension == APIExtensionVersion::EXT || usedExtension == APIExtensionVersion::OES);
6168*8975f5c5SAndroid Build Coastguard Worker 
6169*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
6170*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
6171*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
6172*8975f5c5SAndroid Build Coastguard Worker 
6173*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 4;
6174*8975f5c5SAndroid Build Coastguard Worker 
6175*8975f5c5SAndroid Build Coastguard Worker     GLTexture src;
6176*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, src);
6177*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, kSize, kSize);
6178*8975f5c5SAndroid Build Coastguard Worker 
6179*8975f5c5SAndroid Build Coastguard Worker     GLTexture dst;
6180*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, dst);
6181*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, kSize, kSize);
6182*8975f5c5SAndroid Build Coastguard Worker 
6183*8975f5c5SAndroid Build Coastguard Worker     // A color image for testing depth/stencil
6184*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
6185*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
6186*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
6187*8975f5c5SAndroid Build Coastguard Worker 
6188*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
6189*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6190*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
6191*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
6192*8975f5c5SAndroid Build Coastguard Worker 
6193*8975f5c5SAndroid Build Coastguard Worker     // Initialize the src depth image
6194*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6195*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6196*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
6197*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, src, 0);
6198*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.3f);
6199*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x57);
6200*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
6201*8975f5c5SAndroid Build Coastguard Worker 
6202*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
6203*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_FALSE);
6204*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
6205*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x57, 0xFF);
6206*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
6207*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
6208*8975f5c5SAndroid Build Coastguard Worker 
6209*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
6210*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorLoc, 1, 0, 0, 1);
6211*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), -0.41f);
6212*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6213*8975f5c5SAndroid Build Coastguard Worker 
6214*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_GREATER);
6215*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorLoc, 0, 1, 0, 1);
6216*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), -0.39f);
6217*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6218*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6219*8975f5c5SAndroid Build Coastguard Worker 
6220*8975f5c5SAndroid Build Coastguard Worker     // Now that the depth stencil image is definitely initialized, copy it into the destination
6221*8975f5c5SAndroid Build Coastguard Worker     if (usedExtension == APIExtensionVersion::OES)
6222*8975f5c5SAndroid Build Coastguard Worker     {
6223*8975f5c5SAndroid Build Coastguard Worker         glCopyImageSubDataOES(src, GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL_TEXTURE_2D, 0, 0, 0, 0, kSize,
6224*8975f5c5SAndroid Build Coastguard Worker                               kSize, 1);
6225*8975f5c5SAndroid Build Coastguard Worker     }
6226*8975f5c5SAndroid Build Coastguard Worker     else
6227*8975f5c5SAndroid Build Coastguard Worker     {
6228*8975f5c5SAndroid Build Coastguard Worker         glCopyImageSubDataEXT(src, GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL_TEXTURE_2D, 0, 0, 0, 0, kSize,
6229*8975f5c5SAndroid Build Coastguard Worker                               kSize, 1);
6230*8975f5c5SAndroid Build Coastguard Worker     }
6231*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6232*8975f5c5SAndroid Build Coastguard Worker 
6233*8975f5c5SAndroid Build Coastguard Worker     // Verify the dst texture has the right depth/stencil values
6234*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, dst, 0);
6235*8975f5c5SAndroid Build Coastguard Worker 
6236*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
6237*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorLoc, 0, 0, 1, 1);
6238*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), -0.41f);
6239*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
6240*8975f5c5SAndroid Build Coastguard Worker 
6241*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_GREATER);
6242*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorLoc, 1, 1, 0, 1);
6243*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), -0.39f);
6244*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
6245*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6246*8975f5c5SAndroid Build Coastguard Worker }
6247*8975f5c5SAndroid Build Coastguard Worker 
6248*8975f5c5SAndroid Build Coastguard Worker // Test basic GL_EXT_copy_image copy with a depth/stencil texture
TEST_P(Texture2DTestES3,CopyImageEXTDepthStencil)6249*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageEXTDepthStencil)
6250*8975f5c5SAndroid Build Coastguard Worker {
6251*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
6252*8975f5c5SAndroid Build Coastguard Worker     testCopyImageDepthStencil(APIExtensionVersion::EXT);
6253*8975f5c5SAndroid Build Coastguard Worker }
6254*8975f5c5SAndroid Build Coastguard Worker 
6255*8975f5c5SAndroid Build Coastguard Worker // Test basic GL_OES_copy_image copy with a depth/stencil texture
TEST_P(Texture2DTestES3,CopyImageOESDepthStencil)6256*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageOESDepthStencil)
6257*8975f5c5SAndroid Build Coastguard Worker {
6258*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_copy_image"));
6259*8975f5c5SAndroid Build Coastguard Worker     testCopyImageDepthStencil(APIExtensionVersion::OES);
6260*8975f5c5SAndroid Build Coastguard Worker }
6261*8975f5c5SAndroid Build Coastguard Worker 
6262*8975f5c5SAndroid Build Coastguard Worker // Test GL_EXT_copy_image compressed texture copy with mipmaps smaller than the block size
TEST_P(Texture2DTestES3,CopyCompressedImageMipMaps)6263*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyCompressedImageMipMaps)
6264*8975f5c5SAndroid Build Coastguard Worker {
6265*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
6266*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42264170): Fix calls to vkCmdCopyBufferToImage() with images smaller
6267*8975f5c5SAndroid Build Coastguard Worker     // than the compressed format block size.
6268*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getEGLWindow()->isFeatureEnabled(Feature::AllocateNonZeroMemory));
6269*8975f5c5SAndroid Build Coastguard Worker 
6270*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize             = 4;
6271*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kNumLevels          = 3;
6272*8975f5c5SAndroid Build Coastguard Worker     const uint8_t CompressedImageETC1[8] = {0x0, 0x0, 0xf8, 0x2, 0xff, 0xff, 0x0, 0x0};
6273*8975f5c5SAndroid Build Coastguard Worker 
6274*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
6275*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
6276*8975f5c5SAndroid Build Coastguard Worker     for (size_t level = 0; level < kNumLevels; ++level)
6277*8975f5c5SAndroid Build Coastguard Worker     {
6278*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, level, GL_ETC1_RGB8_OES, kSize >> level,
6279*8975f5c5SAndroid Build Coastguard Worker                                kSize >> level, 0, 8, CompressedImageETC1);
6280*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
6281*8975f5c5SAndroid Build Coastguard Worker     }
6282*8975f5c5SAndroid Build Coastguard Worker 
6283*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
6284*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
6285*8975f5c5SAndroid Build Coastguard Worker     for (size_t level = 0; level < kNumLevels; ++level)
6286*8975f5c5SAndroid Build Coastguard Worker     {
6287*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, level, GL_ETC1_RGB8_OES, kSize >> level,
6288*8975f5c5SAndroid Build Coastguard Worker                                kSize >> level, 0, 8, nullptr);
6289*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
6290*8975f5c5SAndroid Build Coastguard Worker     }
6291*8975f5c5SAndroid Build Coastguard Worker 
6292*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
6293*8975f5c5SAndroid Build Coastguard Worker 
6294*8975f5c5SAndroid Build Coastguard Worker     // copy
6295*8975f5c5SAndroid Build Coastguard Worker     for (size_t level = 0; level < kNumLevels; ++level)
6296*8975f5c5SAndroid Build Coastguard Worker     {
6297*8975f5c5SAndroid Build Coastguard Worker         glCopyImageSubDataEXT(srcTexture, GL_TEXTURE_2D, level, 0, 0, 0, destTexture, GL_TEXTURE_2D,
6298*8975f5c5SAndroid Build Coastguard Worker                               level, 0, 0, 0, kSize >> level, kSize >> level, 1);
6299*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
6300*8975f5c5SAndroid Build Coastguard Worker     }
6301*8975f5c5SAndroid Build Coastguard Worker }
6302*8975f5c5SAndroid Build Coastguard Worker 
6303*8975f5c5SAndroid Build Coastguard Worker // Test GL_EXT_copy_image copy with a non-zero base level
TEST_P(Texture2DTestES3,CopyImageBaseLevel1)6304*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageBaseLevel1)
6305*8975f5c5SAndroid Build Coastguard Worker {
6306*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
6307*8975f5c5SAndroid Build Coastguard Worker 
6308*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataBlack(8u * 8u, GLColor::black);
6309*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
6310*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
6311*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataBlue(4u * 4u, GLColor::blue);
6312*8975f5c5SAndroid Build Coastguard Worker 
6313*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
6314*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
6315*8975f5c5SAndroid Build Coastguard Worker 
6316*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6317*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
6318*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6319*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6320*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6321*8975f5c5SAndroid Build Coastguard Worker                  texDataBlack.data());
6322*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
6323*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6324*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6325*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataBlue.data());
6326*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6327*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6328*8975f5c5SAndroid Build Coastguard Worker 
6329*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
6330*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6331*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6332*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6333*8975f5c5SAndroid Build Coastguard Worker                  texDataBlack.data());
6334*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6335*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6336*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataBlue.data());
6337*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
6338*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6339*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6340*8975f5c5SAndroid Build Coastguard Worker 
6341*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
6342*8975f5c5SAndroid Build Coastguard Worker 
6343*8975f5c5SAndroid Build Coastguard Worker     // copy
6344*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(srcTexture, GL_TEXTURE_2D, 1, 2, 2, 0, destTexture, GL_TEXTURE_2D, 1, 2,
6345*8975f5c5SAndroid Build Coastguard Worker                           2, 0, 2, 2, 1);
6346*8975f5c5SAndroid Build Coastguard Worker 
6347*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
6348*8975f5c5SAndroid Build Coastguard Worker 
6349*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6350*8975f5c5SAndroid Build Coastguard Worker 
6351*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 4, 4);
6352*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6353*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6354*8975f5c5SAndroid Build Coastguard Worker 
6355*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(2, 2, 2, 2, GLColor::green);
6356*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 4, 2, GLColor::red);
6357*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 2, 4, GLColor::red);
6358*8975f5c5SAndroid Build Coastguard Worker }
6359*8975f5c5SAndroid Build Coastguard Worker 
6360*8975f5c5SAndroid Build Coastguard Worker // Test basic GL_EXT_copy_image copy without any draw calls by attaching the texture
6361*8975f5c5SAndroid Build Coastguard Worker // to a framebuffer and reads from the framebuffer to validate the copy
TEST_P(Texture2DTestES3,CopyImageFB)6362*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageFB)
6363*8975f5c5SAndroid Build Coastguard Worker {
6364*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
6365*8975f5c5SAndroid Build Coastguard Worker 
6366*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 4, 4);
6367*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(4u * 4u, GLColor::red);
6368*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
6369*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
6370*8975f5c5SAndroid Build Coastguard Worker 
6371*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6372*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
6373*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6374*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6375*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
6376*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
6377*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
6378*8975f5c5SAndroid Build Coastguard Worker 
6379*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
6380*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
6381*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6382*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6383*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
6384*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
6385*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6386*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6387*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
6388*8975f5c5SAndroid Build Coastguard Worker 
6389*8975f5c5SAndroid Build Coastguard Worker     // copy
6390*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(srcTexture, GL_TEXTURE_2D, 0, 0, 0, 0, destTexture, GL_TEXTURE_2D, 0, 0,
6391*8975f5c5SAndroid Build Coastguard Worker                           1, 0, 3, 3, 1);
6392*8975f5c5SAndroid Build Coastguard Worker 
6393*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6394*8975f5c5SAndroid Build Coastguard Worker 
6395*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
6396*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
6397*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);
6398*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6399*8975f5c5SAndroid Build Coastguard Worker 
6400*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 1, 3, 3, GLColor::green);
6401*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(3, 0, 1, 4, GLColor::red);
6402*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 4, 1, GLColor::red);
6403*8975f5c5SAndroid Build Coastguard Worker 
6404*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6405*8975f5c5SAndroid Build Coastguard Worker }
6406*8975f5c5SAndroid Build Coastguard Worker 
6407*8975f5c5SAndroid Build Coastguard Worker // Test GL_EXT_copy_image copy to a framebuffer attachment after
6408*8975f5c5SAndroid Build Coastguard Worker // invalidation. Then draw with blending onto the framebuffer.
TEST_P(Texture2DTestES3,CopyImageFBInvalidateThenBlend)6409*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, CopyImageFBInvalidateThenBlend)
6410*8975f5c5SAndroid Build Coastguard Worker {
6411*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
6412*8975f5c5SAndroid Build Coastguard Worker 
6413*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawBlueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
6414*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRedProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
6415*8975f5c5SAndroid Build Coastguard Worker 
6416*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 4, 4);
6417*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
6418*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureAttachment;
6419*8975f5c5SAndroid Build Coastguard Worker 
6420*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
6421*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
6422*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
6423*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
6424*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6425*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6426*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
6427*8975f5c5SAndroid Build Coastguard Worker 
6428*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textureAttachment);
6429*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
6430*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
6431*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
6432*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
6433*8975f5c5SAndroid Build Coastguard Worker 
6434*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
6435*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
6436*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureAttachment,
6437*8975f5c5SAndroid Build Coastguard Worker                            0);
6438*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6439*8975f5c5SAndroid Build Coastguard Worker 
6440*8975f5c5SAndroid Build Coastguard Worker     // Draw something in the texture to make sure it's image is defined.
6441*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRedProgram, essl1_shaders::PositionAttrib(), 0.0f);
6442*8975f5c5SAndroid Build Coastguard Worker 
6443*8975f5c5SAndroid Build Coastguard Worker     // Invalidate the framebuffer.
6444*8975f5c5SAndroid Build Coastguard Worker     const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
6445*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
6446*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6447*8975f5c5SAndroid Build Coastguard Worker 
6448*8975f5c5SAndroid Build Coastguard Worker     // Copy into the framebuffer attachment.
6449*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(srcTexture, GL_TEXTURE_2D, 0, 0, 0, 0, textureAttachment, GL_TEXTURE_2D,
6450*8975f5c5SAndroid Build Coastguard Worker                           0, 0, 0, 0, 4, 4, 1);
6451*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6452*8975f5c5SAndroid Build Coastguard Worker 
6453*8975f5c5SAndroid Build Coastguard Worker     // Draw and blend, making sure both the copy and draw happen correctly.
6454*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
6455*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
6456*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawBlueProgram, essl1_shaders::PositionAttrib(), 0.0f);
6457*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6458*8975f5c5SAndroid Build Coastguard Worker 
6459*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 4, 4, GLColor::cyan);
6460*8975f5c5SAndroid Build Coastguard Worker 
6461*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6462*8975f5c5SAndroid Build Coastguard Worker }
6463*8975f5c5SAndroid Build Coastguard Worker 
6464*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
6465*8975f5c5SAndroid Build Coastguard Worker // have images defined.
TEST_P(Texture2DTestES3,DrawWithLevelsOutsideRangeUndefined)6466*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeUndefined)
6467*8975f5c5SAndroid Build Coastguard Worker {
6468*8975f5c5SAndroid Build Coastguard Worker     // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array.
6469*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
6470*8975f5c5SAndroid Build Coastguard Worker 
6471*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6472*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
6473*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
6474*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6475*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6476*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6477*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6478*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6479*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6480*8975f5c5SAndroid Build Coastguard Worker 
6481*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6482*8975f5c5SAndroid Build Coastguard Worker 
6483*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6484*8975f5c5SAndroid Build Coastguard Worker 
6485*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6486*8975f5c5SAndroid Build Coastguard Worker }
6487*8975f5c5SAndroid Build Coastguard Worker 
6488*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when level 0 is undefined and base level is 1.
TEST_P(Texture2DTestES3,DrawWithLevelZeroUndefined)6489*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, DrawWithLevelZeroUndefined)
6490*8975f5c5SAndroid Build Coastguard Worker {
6491*8975f5c5SAndroid Build Coastguard Worker     // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array.
6492*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
6493*8975f5c5SAndroid Build Coastguard Worker 
6494*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6495*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
6496*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
6497*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6498*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6499*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6500*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6501*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6502*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
6503*8975f5c5SAndroid Build Coastguard Worker 
6504*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6505*8975f5c5SAndroid Build Coastguard Worker 
6506*8975f5c5SAndroid Build Coastguard Worker     // Texture is incomplete.
6507*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6508*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
6509*8975f5c5SAndroid Build Coastguard Worker 
6510*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6511*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6512*8975f5c5SAndroid Build Coastguard Worker 
6513*8975f5c5SAndroid Build Coastguard Worker     // Texture is now complete.
6514*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6515*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6516*8975f5c5SAndroid Build Coastguard Worker }
6517*8975f5c5SAndroid Build Coastguard Worker 
6518*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
6519*8975f5c5SAndroid Build Coastguard Worker // dimensions that don't fit the images inside the range.
6520*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture2DTestES3,DrawWithLevelsOutsideRangeWithInconsistentDimensions)6521*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
6522*8975f5c5SAndroid Build Coastguard Worker {
6523*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6524*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
6525*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(8u * 8u, GLColor::red);
6526*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green);
6527*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataCyan(2u * 2u, GLColor::cyan);
6528*8975f5c5SAndroid Build Coastguard Worker 
6529*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6530*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6531*8975f5c5SAndroid Build Coastguard Worker 
6532*8975f5c5SAndroid Build Coastguard Worker     // Two levels that are initially unused.
6533*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data());
6534*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6535*8975f5c5SAndroid Build Coastguard Worker                  texDataCyan.data());
6536*8975f5c5SAndroid Build Coastguard Worker 
6537*8975f5c5SAndroid Build Coastguard Worker     // One level that is used - only this level should affect completeness.
6538*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6539*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6540*8975f5c5SAndroid Build Coastguard Worker 
6541*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6542*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6543*8975f5c5SAndroid Build Coastguard Worker 
6544*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6545*8975f5c5SAndroid Build Coastguard Worker 
6546*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6547*8975f5c5SAndroid Build Coastguard Worker 
6548*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6549*8975f5c5SAndroid Build Coastguard Worker 
6550*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
6551*8975f5c5SAndroid Build Coastguard Worker 
6552*8975f5c5SAndroid Build Coastguard Worker     // Switch the level that is being used to the cyan level 2.
6553*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
6554*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
6555*8975f5c5SAndroid Build Coastguard Worker 
6556*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6557*8975f5c5SAndroid Build Coastguard Worker 
6558*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6559*8975f5c5SAndroid Build Coastguard Worker 
6560*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
6561*8975f5c5SAndroid Build Coastguard Worker }
6562*8975f5c5SAndroid Build Coastguard Worker 
6563*8975f5c5SAndroid Build Coastguard Worker // Depth/Stencil textures cannot be 3D.
TEST_P(Texture3DTestES3,DepthStencil3DDisallowed)6564*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, DepthStencil3DDisallowed)
6565*8975f5c5SAndroid Build Coastguard Worker {
6566*8975f5c5SAndroid Build Coastguard Worker     const std::array<std::tuple<GLenum, GLenum, GLenum>, 6> testConfigs = {
6567*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT),
6568*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT),
6569*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT),
6570*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV),
6571*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8),
6572*8975f5c5SAndroid Build Coastguard Worker         std::make_tuple(GL_STENCIL_INDEX8, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE)};
6573*8975f5c5SAndroid Build Coastguard Worker 
6574*8975f5c5SAndroid Build Coastguard Worker     for (auto testConfig : testConfigs)
6575*8975f5c5SAndroid Build Coastguard Worker     {
6576*8975f5c5SAndroid Build Coastguard Worker         const GLenum internalformat = std::get<0>(testConfig);
6577*8975f5c5SAndroid Build Coastguard Worker         const GLenum format         = std::get<1>(testConfig);
6578*8975f5c5SAndroid Build Coastguard Worker         const GLenum type           = std::get<2>(testConfig);
6579*8975f5c5SAndroid Build Coastguard Worker 
6580*8975f5c5SAndroid Build Coastguard Worker         if (internalformat == GL_STENCIL_INDEX8 && !IsGLExtensionEnabled("GL_OES_texture_stencil8"))
6581*8975f5c5SAndroid Build Coastguard Worker         {
6582*8975f5c5SAndroid Build Coastguard Worker             continue;
6583*8975f5c5SAndroid Build Coastguard Worker         }
6584*8975f5c5SAndroid Build Coastguard Worker 
6585*8975f5c5SAndroid Build Coastguard Worker         GLTexture depthTexture;
6586*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, depthTexture);
6587*8975f5c5SAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, internalformat, 16, 16, 16, 0, format, type, nullptr);
6588*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6589*8975f5c5SAndroid Build Coastguard Worker 
6590*8975f5c5SAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_3D, 2, internalformat, 16, 16, 16);
6591*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6592*8975f5c5SAndroid Build Coastguard Worker     }
6593*8975f5c5SAndroid Build Coastguard Worker }
6594*8975f5c5SAndroid Build Coastguard Worker 
6595*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
6596*8975f5c5SAndroid Build Coastguard Worker // have images defined.
TEST_P(Texture3DTestES3,DrawWithLevelsOutsideRangeUndefined)6597*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeUndefined)
6598*8975f5c5SAndroid Build Coastguard Worker {
6599*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6600*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
6601*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
6602*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6603*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6604*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6605*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6606*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
6607*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
6608*8975f5c5SAndroid Build Coastguard Worker 
6609*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6610*8975f5c5SAndroid Build Coastguard Worker 
6611*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6612*8975f5c5SAndroid Build Coastguard Worker 
6613*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6614*8975f5c5SAndroid Build Coastguard Worker }
6615*8975f5c5SAndroid Build Coastguard Worker 
6616*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
6617*8975f5c5SAndroid Build Coastguard Worker // dimensions that don't fit the images inside the range.
6618*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture3DTestES3,DrawWithLevelsOutsideRangeWithInconsistentDimensions)6619*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
6620*8975f5c5SAndroid Build Coastguard Worker {
6621*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6622*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
6623*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red);
6624*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
6625*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan);
6626*8975f5c5SAndroid Build Coastguard Worker 
6627*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6628*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6629*8975f5c5SAndroid Build Coastguard Worker 
6630*8975f5c5SAndroid Build Coastguard Worker     // Two levels that are initially unused.
6631*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6632*8975f5c5SAndroid Build Coastguard Worker                  texDataRed.data());
6633*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6634*8975f5c5SAndroid Build Coastguard Worker                  texDataCyan.data());
6635*8975f5c5SAndroid Build Coastguard Worker 
6636*8975f5c5SAndroid Build Coastguard Worker     // One level that is used - only this level should affect completeness.
6637*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6638*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6639*8975f5c5SAndroid Build Coastguard Worker 
6640*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
6641*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
6642*8975f5c5SAndroid Build Coastguard Worker 
6643*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6644*8975f5c5SAndroid Build Coastguard Worker 
6645*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6646*8975f5c5SAndroid Build Coastguard Worker 
6647*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6648*8975f5c5SAndroid Build Coastguard Worker 
6649*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
6650*8975f5c5SAndroid Build Coastguard Worker 
6651*8975f5c5SAndroid Build Coastguard Worker     // Switch the level that is being used to the cyan level 2.
6652*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 2);
6653*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 2);
6654*8975f5c5SAndroid Build Coastguard Worker 
6655*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6656*8975f5c5SAndroid Build Coastguard Worker 
6657*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6658*8975f5c5SAndroid Build Coastguard Worker 
6659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
6660*8975f5c5SAndroid Build Coastguard Worker }
6661*8975f5c5SAndroid Build Coastguard Worker 
6662*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not
6663*8975f5c5SAndroid Build Coastguard Worker // have images defined.
TEST_P(Texture2DArrayTestES3,DrawWithLevelsOutsideRangeUndefined)6664*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeUndefined)
6665*8975f5c5SAndroid Build Coastguard Worker {
6666*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6667*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
6668*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
6669*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6670*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6671*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6672*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6673*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
6674*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
6675*8975f5c5SAndroid Build Coastguard Worker 
6676*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6677*8975f5c5SAndroid Build Coastguard Worker 
6678*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6679*8975f5c5SAndroid Build Coastguard Worker 
6680*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6681*8975f5c5SAndroid Build Coastguard Worker }
6682*8975f5c5SAndroid Build Coastguard Worker 
6683*8975f5c5SAndroid Build Coastguard Worker // Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have
6684*8975f5c5SAndroid Build Coastguard Worker // dimensions that don't fit the images inside the range.
6685*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture2DArrayTestES3,DrawWithLevelsOutsideRangeWithInconsistentDimensions)6686*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions)
6687*8975f5c5SAndroid Build Coastguard Worker {
6688*8975f5c5SAndroid Build Coastguard Worker     // TODO(crbug.com/998505): Test failing on Android FYI Release (NVIDIA Shield TV)
6689*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
6690*8975f5c5SAndroid Build Coastguard Worker 
6691*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6692*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, m2DArrayTexture);
6693*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red);
6694*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
6695*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan);
6696*8975f5c5SAndroid Build Coastguard Worker 
6697*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6698*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6699*8975f5c5SAndroid Build Coastguard Worker 
6700*8975f5c5SAndroid Build Coastguard Worker     // Two levels that are initially unused.
6701*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6702*8975f5c5SAndroid Build Coastguard Worker                  texDataRed.data());
6703*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6704*8975f5c5SAndroid Build Coastguard Worker                  texDataCyan.data());
6705*8975f5c5SAndroid Build Coastguard Worker 
6706*8975f5c5SAndroid Build Coastguard Worker     // One level that is used - only this level should affect completeness.
6707*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6708*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6709*8975f5c5SAndroid Build Coastguard Worker 
6710*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
6711*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
6712*8975f5c5SAndroid Build Coastguard Worker 
6713*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6714*8975f5c5SAndroid Build Coastguard Worker 
6715*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6716*8975f5c5SAndroid Build Coastguard Worker 
6717*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6718*8975f5c5SAndroid Build Coastguard Worker 
6719*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
6720*8975f5c5SAndroid Build Coastguard Worker 
6721*8975f5c5SAndroid Build Coastguard Worker     // Switch the level that is being used to the cyan level 2.
6722*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 2);
6723*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 2);
6724*8975f5c5SAndroid Build Coastguard Worker 
6725*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6726*8975f5c5SAndroid Build Coastguard Worker 
6727*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6728*8975f5c5SAndroid Build Coastguard Worker 
6729*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
6730*8975f5c5SAndroid Build Coastguard Worker }
6731*8975f5c5SAndroid Build Coastguard Worker 
6732*8975f5c5SAndroid Build Coastguard Worker // Create a 2D array, then immediately redefine it to have fewer layers.  Regression test for a bug
6733*8975f5c5SAndroid Build Coastguard Worker // in the Vulkan backend where the old higher-layer-count data upload was not removed.
TEST_P(Texture2DArrayTestES3,TextureArrayRedefineThenUse)6734*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, TextureArrayRedefineThenUse)
6735*8975f5c5SAndroid Build Coastguard Worker {
6736*8975f5c5SAndroid Build Coastguard Worker     int px = getWindowWidth() / 2;
6737*8975f5c5SAndroid Build Coastguard Worker     int py = getWindowHeight() / 2;
6738*8975f5c5SAndroid Build Coastguard Worker 
6739*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
6740*8975f5c5SAndroid Build Coastguard Worker 
6741*8975f5c5SAndroid Build Coastguard Worker     // Fill the whole texture with red, then redefine it and fill with green
6742*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red);
6743*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(2 * 2 * 2, GLColor::green);
6744*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6745*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
6746*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6747*8975f5c5SAndroid Build Coastguard Worker                  pixelsGreen.data());
6748*8975f5c5SAndroid Build Coastguard Worker 
6749*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
6750*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6751*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6752*8975f5c5SAndroid Build Coastguard Worker 
6753*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
6754*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6755*8975f5c5SAndroid Build Coastguard Worker 
6756*8975f5c5SAndroid Build Coastguard Worker     // Draw the first slice
6757*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 0);
6758*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6759*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6760*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green);
6761*8975f5c5SAndroid Build Coastguard Worker 
6762*8975f5c5SAndroid Build Coastguard Worker     // Draw the second slice
6763*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 1);
6764*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6765*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6766*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green);
6767*8975f5c5SAndroid Build Coastguard Worker }
6768*8975f5c5SAndroid Build Coastguard Worker 
6769*8975f5c5SAndroid Build Coastguard Worker // Create a 2D array texture and update layers with data and test that pruning
6770*8975f5c5SAndroid Build Coastguard Worker // of superseded updates works as expected.
TEST_P(Texture2DArrayTestES3,TextureArrayPruneSupersededUpdates)6771*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, TextureArrayPruneSupersededUpdates)
6772*8975f5c5SAndroid Build Coastguard Worker {
6773*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexWidth  = 256;
6774*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexHeight = 256;
6775*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexLayers = 3;
6776*8975f5c5SAndroid Build Coastguard Worker 
6777*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
6778*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6779*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6780*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6781*8975f5c5SAndroid Build Coastguard Worker 
6782*8975f5c5SAndroid Build Coastguard Worker     // Initialize entire texture.
6783*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kInitialExpectedColor = GLColor(201u, 201u, 201u, 201u);
6784*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> initialData(kTexWidth * kTexHeight * kTexLayers, kInitialExpectedColor);
6785*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, kTexWidth, kTexHeight, kTexLayers, 0, GL_RGBA,
6786*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, initialData.data());
6787*8975f5c5SAndroid Build Coastguard Worker 
6788*8975f5c5SAndroid Build Coastguard Worker     // Upate different layers with different colors, these together should supersed
6789*8975f5c5SAndroid Build Coastguard Worker     // the entire init update
6790*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kExpectedColor[] = {GLColor(32u, 32u, 32u, 32u), GLColor(64u, 64u, 64u, 64u),
6791*8975f5c5SAndroid Build Coastguard Worker                                           GLColor(128u, 128u, 128u, 128u)};
6792*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> supersedingData[] = {
6793*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor>(kTexWidth * kTexHeight, kExpectedColor[0]),
6794*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor>(kTexWidth * kTexHeight, kExpectedColor[1]),
6795*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor>(kTexWidth * kTexHeight, kExpectedColor[2])};
6796*8975f5c5SAndroid Build Coastguard Worker 
6797*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, kTexWidth, kTexHeight, 1, GL_RGBA,
6798*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, supersedingData[0].data());
6799*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, kTexWidth, kTexHeight, 1, GL_RGBA,
6800*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, supersedingData[1].data());
6801*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 2, kTexWidth, kTexHeight, 1, GL_RGBA,
6802*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, supersedingData[2].data());
6803*8975f5c5SAndroid Build Coastguard Worker 
6804*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
6805*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6806*8975f5c5SAndroid Build Coastguard Worker 
6807*8975f5c5SAndroid Build Coastguard Worker     // Draw layer 0
6808*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 0);
6809*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6810*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6811*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kExpectedColor[0]);
6812*8975f5c5SAndroid Build Coastguard Worker 
6813*8975f5c5SAndroid Build Coastguard Worker     // Draw layer 1
6814*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 1);
6815*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6816*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6817*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kExpectedColor[1]);
6818*8975f5c5SAndroid Build Coastguard Worker 
6819*8975f5c5SAndroid Build Coastguard Worker     // Draw layer 2
6820*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 2);
6821*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6822*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6823*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kExpectedColor[2]);
6824*8975f5c5SAndroid Build Coastguard Worker }
6825*8975f5c5SAndroid Build Coastguard Worker 
6826*8975f5c5SAndroid Build Coastguard Worker // Create a 2D array, use it, then redefine it to have fewer layers.  Regression test for a bug in
6827*8975f5c5SAndroid Build Coastguard Worker // the Vulkan backend where the old higher-layer-count data upload was not removed.
TEST_P(Texture2DArrayTestES3,TextureArrayUseThenRedefineThenUse)6828*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, TextureArrayUseThenRedefineThenUse)
6829*8975f5c5SAndroid Build Coastguard Worker {
6830*8975f5c5SAndroid Build Coastguard Worker     int px = getWindowWidth() / 2;
6831*8975f5c5SAndroid Build Coastguard Worker     int py = getWindowHeight() / 2;
6832*8975f5c5SAndroid Build Coastguard Worker 
6833*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
6834*8975f5c5SAndroid Build Coastguard Worker 
6835*8975f5c5SAndroid Build Coastguard Worker     // Fill the whole texture with red.
6836*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red);
6837*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6838*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
6839*8975f5c5SAndroid Build Coastguard Worker 
6840*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
6841*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6842*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6843*8975f5c5SAndroid Build Coastguard Worker 
6844*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
6845*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6846*8975f5c5SAndroid Build Coastguard Worker 
6847*8975f5c5SAndroid Build Coastguard Worker     // Draw the first slice
6848*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 0);
6849*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6850*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6851*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red);
6852*8975f5c5SAndroid Build Coastguard Worker 
6853*8975f5c5SAndroid Build Coastguard Worker     // Draw the fourth slice
6854*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 3);
6855*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6856*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6857*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red);
6858*8975f5c5SAndroid Build Coastguard Worker 
6859*8975f5c5SAndroid Build Coastguard Worker     // Redefine the image and fill with green
6860*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(2 * 2 * 2, GLColor::green);
6861*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6862*8975f5c5SAndroid Build Coastguard Worker                  pixelsGreen.data());
6863*8975f5c5SAndroid Build Coastguard Worker 
6864*8975f5c5SAndroid Build Coastguard Worker     // Draw the first slice
6865*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 0);
6866*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6867*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6868*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green);
6869*8975f5c5SAndroid Build Coastguard Worker 
6870*8975f5c5SAndroid Build Coastguard Worker     // Draw the second slice
6871*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArraySliceUniformLocation, 1);
6872*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6873*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6874*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green);
6875*8975f5c5SAndroid Build Coastguard Worker }
6876*8975f5c5SAndroid Build Coastguard Worker 
6877*8975f5c5SAndroid Build Coastguard Worker // Create a 2D array texture, use it, then redefine one level without changing dimensions.
TEST_P(Texture2DArrayTestES3,RedefineLevelData)6878*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, RedefineLevelData)
6879*8975f5c5SAndroid Build Coastguard Worker {
6880*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
6881*8975f5c5SAndroid Build Coastguard Worker 
6882*8975f5c5SAndroid Build Coastguard Worker     // Fill both levels with red
6883*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(2 * 2 * 1, GLColor::red);
6884*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6885*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
6886*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6887*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
6888*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6889*8975f5c5SAndroid Build Coastguard Worker 
6890*8975f5c5SAndroid Build Coastguard Worker     // Check that both levels are red
6891*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6892*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6893*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m2DArrayTexture, 0, 0);
6894*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6895*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m2DArrayTexture, 1, 0);
6896*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6897*8975f5c5SAndroid Build Coastguard Worker 
6898*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 1 with green
6899*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6900*8975f5c5SAndroid Build Coastguard Worker                  &GLColor::green);
6901*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6902*8975f5c5SAndroid Build Coastguard Worker 
6903*8975f5c5SAndroid Build Coastguard Worker     // Check that level 0 is red and level 1 is green
6904*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m2DArrayTexture, 0, 0);
6905*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6906*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m2DArrayTexture, 1, 0);
6907*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6908*8975f5c5SAndroid Build Coastguard Worker }
6909*8975f5c5SAndroid Build Coastguard Worker 
6910*8975f5c5SAndroid Build Coastguard Worker // Create a 3D texture, use it, then redefine one level without changing dimensions.
TEST_P(Texture3DTestES3,RedefineLevelData)6911*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, RedefineLevelData)
6912*8975f5c5SAndroid Build Coastguard Worker {
6913*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
6914*8975f5c5SAndroid Build Coastguard Worker 
6915*8975f5c5SAndroid Build Coastguard Worker     // Fill both levels with red
6916*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(2 * 2 * 1, GLColor::red);
6917*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6918*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
6919*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6920*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
6921*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6922*8975f5c5SAndroid Build Coastguard Worker 
6923*8975f5c5SAndroid Build Coastguard Worker     // Check that both levels are red
6924*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6925*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6926*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture3D, 0, 0);
6927*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6928*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture3D, 1, 0);
6929*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6930*8975f5c5SAndroid Build Coastguard Worker 
6931*8975f5c5SAndroid Build Coastguard Worker     // Redefine level 1 with green
6932*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6933*8975f5c5SAndroid Build Coastguard Worker                  &GLColor::green);
6934*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6935*8975f5c5SAndroid Build Coastguard Worker 
6936*8975f5c5SAndroid Build Coastguard Worker     // Check that level 0 is red and level 1 is green
6937*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture3D, 0, 0);
6938*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6939*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture3D, 1, 0);
6940*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6941*8975f5c5SAndroid Build Coastguard Worker }
6942*8975f5c5SAndroid Build Coastguard Worker 
6943*8975f5c5SAndroid Build Coastguard Worker // Test that texture completeness is updated if texture max level changes.
6944*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture2DTestES3,TextureCompletenessChangesWithMaxLevel)6945*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureCompletenessChangesWithMaxLevel)
6946*8975f5c5SAndroid Build Coastguard Worker {
6947*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6948*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
6949*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green);
6950*8975f5c5SAndroid Build Coastguard Worker 
6951*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6952*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
6953*8975f5c5SAndroid Build Coastguard Worker 
6954*8975f5c5SAndroid Build Coastguard Worker     // A level that is initially unused.
6955*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6956*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6957*8975f5c5SAndroid Build Coastguard Worker 
6958*8975f5c5SAndroid Build Coastguard Worker     // One level that is initially used - only this level should affect completeness.
6959*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6960*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
6961*8975f5c5SAndroid Build Coastguard Worker 
6962*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
6963*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
6964*8975f5c5SAndroid Build Coastguard Worker 
6965*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6966*8975f5c5SAndroid Build Coastguard Worker 
6967*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6968*8975f5c5SAndroid Build Coastguard Worker 
6969*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6970*8975f5c5SAndroid Build Coastguard Worker 
6971*8975f5c5SAndroid Build Coastguard Worker     // Switch the max level to level 1. The levels within the used range now have inconsistent
6972*8975f5c5SAndroid Build Coastguard Worker     // dimensions and the texture should be incomplete.
6973*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6974*8975f5c5SAndroid Build Coastguard Worker 
6975*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6976*8975f5c5SAndroid Build Coastguard Worker 
6977*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
6978*8975f5c5SAndroid Build Coastguard Worker 
6979*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
6980*8975f5c5SAndroid Build Coastguard Worker }
6981*8975f5c5SAndroid Build Coastguard Worker 
6982*8975f5c5SAndroid Build Coastguard Worker // Test a bug that staged clear overlaps with glTexSubImage with multiple layers may incorrectly
6983*8975f5c5SAndroid Build Coastguard Worker // keep the staged clear. http://anglebug.com/345532371
TEST_P(Texture2DArrayTestES3,ClearThenTexSubImageWithOverlappingLayersThenRead)6984*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, ClearThenTexSubImageWithOverlappingLayersThenRead)
6985*8975f5c5SAndroid Build Coastguard Worker {
6986*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexWidth  = 128;
6987*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexHeight = 128;
6988*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexDepth  = 6;
6989*8975f5c5SAndroid Build Coastguard Worker     // Create a single leveled texture with 6 layers
6990*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
6991*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
6992*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kTexWidth, kTexHeight, kTexDepth);
6993*8975f5c5SAndroid Build Coastguard Worker 
6994*8975f5c5SAndroid Build Coastguard Worker     // Stage clear to red on all layers
6995*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer drawFBO;
6996*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
6997*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
6998*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei layer = 0; layer < kTexDepth; layer++)
6999*8975f5c5SAndroid Build Coastguard Worker     {
7000*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, layer);
7001*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
7002*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
7003*8975f5c5SAndroid Build Coastguard Worker     }
7004*8975f5c5SAndroid Build Coastguard Worker 
7005*8975f5c5SAndroid Build Coastguard Worker     // TexSubImage with green color on half of the image of layer 2,3,4
7006*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> updateData((kTexWidth / 2) * kTexHeight * 3, GLColor::green);
7007*8975f5c5SAndroid Build Coastguard Worker     GLsizei layerStart = 2;
7008*8975f5c5SAndroid Build Coastguard Worker     GLsizei layerCount = 3;
7009*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, layerStart, kTexWidth / 2, kTexHeight, layerCount,
7010*8975f5c5SAndroid Build Coastguard Worker                     GL_RGBA, GL_UNSIGNED_BYTE, updateData.data());
7011*8975f5c5SAndroid Build Coastguard Worker 
7012*8975f5c5SAndroid Build Coastguard Worker     // Now read out layer 2/3/4
7013*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFBO;
7014*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
7015*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei layer = layerStart; layer < layerStart + layerCount; layer++)
7016*8975f5c5SAndroid Build Coastguard Worker     {
7017*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, layer);
7018*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
7019*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(kTexWidth / 4, kTexHeight / 2, GLColor::green.R, GLColor::green.G,
7020*8975f5c5SAndroid Build Coastguard Worker                         GLColor::green.B, GLColor::green.A);
7021*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(3 * kTexWidth / 4, kTexHeight / 2, GLColor::red.R, GLColor::red.G,
7022*8975f5c5SAndroid Build Coastguard Worker                         GLColor::red.B, GLColor::red.A);
7023*8975f5c5SAndroid Build Coastguard Worker     }
7024*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7025*8975f5c5SAndroid Build Coastguard Worker }
7026*8975f5c5SAndroid Build Coastguard Worker 
7027*8975f5c5SAndroid Build Coastguard Worker // Test a bug that staged clear overlaps with glTexSubImage with multiple layers may incorrectly
7028*8975f5c5SAndroid Build Coastguard Worker // keep the staged clear. http://anglebug.com/345532371
TEST_P(Texture2DArrayTestES3,ClearThenTexSubImageWithOverlappingLayersThenDrawAndRead)7029*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, ClearThenTexSubImageWithOverlappingLayersThenDrawAndRead)
7030*8975f5c5SAndroid Build Coastguard Worker {
7031*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexWidth  = 128;
7032*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexHeight = 128;
7033*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexDepth  = 6;
7034*8975f5c5SAndroid Build Coastguard Worker     // Create a single leveled texture with 6 layers
7035*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
7036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
7037*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kTexWidth, kTexHeight, kTexDepth);
7038*8975f5c5SAndroid Build Coastguard Worker 
7039*8975f5c5SAndroid Build Coastguard Worker     // Stage clear to red on all layers
7040*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer drawFBO;
7041*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
7042*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
7043*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei layer = 0; layer < kTexDepth; layer++)
7044*8975f5c5SAndroid Build Coastguard Worker     {
7045*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, layer);
7046*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
7047*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
7048*8975f5c5SAndroid Build Coastguard Worker     }
7049*8975f5c5SAndroid Build Coastguard Worker 
7050*8975f5c5SAndroid Build Coastguard Worker     // TexSubImage with green color on half of the image of layer 2,3,4
7051*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> updateData((kTexWidth / 2) * kTexHeight * 3, GLColor::green);
7052*8975f5c5SAndroid Build Coastguard Worker     GLsizei layerStart = 2;
7053*8975f5c5SAndroid Build Coastguard Worker     GLsizei layerCount = 3;
7054*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, layerStart, kTexWidth / 2, kTexHeight, layerCount,
7055*8975f5c5SAndroid Build Coastguard Worker                     GL_RGBA, GL_UNSIGNED_BYTE, updateData.data());
7056*8975f5c5SAndroid Build Coastguard Worker 
7057*8975f5c5SAndroid Build Coastguard Worker     // Now Draw to fbo on layerStart with blue color
7058*8975f5c5SAndroid Build Coastguard Worker     GLsizei blueQuadLayer = 2;
7059*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, blueQuadLayer);
7060*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
7061*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
7062*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
7063*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
7064*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
7065*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl3_shaders::PositionAttrib(), 0.5f);
7066*8975f5c5SAndroid Build Coastguard Worker 
7067*8975f5c5SAndroid Build Coastguard Worker     // Now read out layer 2/3/4
7068*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFBO;
7069*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
7070*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei layer = layerStart; layer < layerStart + layerCount; layer++)
7071*8975f5c5SAndroid Build Coastguard Worker     {
7072*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, layer);
7073*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
7074*8975f5c5SAndroid Build Coastguard Worker         if (layer == blueQuadLayer)
7075*8975f5c5SAndroid Build Coastguard Worker         {
7076*8975f5c5SAndroid Build Coastguard Worker             // green + blue = cyan
7077*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(kTexWidth / 4, kTexHeight / 2, GLColor::cyan.R, GLColor::cyan.G,
7078*8975f5c5SAndroid Build Coastguard Worker                             GLColor::cyan.B, GLColor::cyan.A);
7079*8975f5c5SAndroid Build Coastguard Worker             // red + blue = magenta
7080*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(3 * kTexWidth / 4, kTexHeight / 2, GLColor::magenta.R,
7081*8975f5c5SAndroid Build Coastguard Worker                             GLColor::magenta.G, GLColor::magenta.B, GLColor::magenta.A);
7082*8975f5c5SAndroid Build Coastguard Worker         }
7083*8975f5c5SAndroid Build Coastguard Worker         else
7084*8975f5c5SAndroid Build Coastguard Worker         {
7085*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(kTexWidth / 4, kTexHeight / 2, GLColor::green.R, GLColor::green.G,
7086*8975f5c5SAndroid Build Coastguard Worker                             GLColor::green.B, GLColor::green.A);
7087*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(3 * kTexWidth / 4, kTexHeight / 2, GLColor::red.R, GLColor::red.G,
7088*8975f5c5SAndroid Build Coastguard Worker                             GLColor::red.B, GLColor::red.A);
7089*8975f5c5SAndroid Build Coastguard Worker         }
7090*8975f5c5SAndroid Build Coastguard Worker     }
7091*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7092*8975f5c5SAndroid Build Coastguard Worker }
7093*8975f5c5SAndroid Build Coastguard Worker 
7094*8975f5c5SAndroid Build Coastguard Worker // Test that compressed textures ignore the pixel unpack state.
7095*8975f5c5SAndroid Build Coastguard Worker // (https://crbug.org/1267496)
TEST_P(Texture3DTestES3,PixelUnpackStateTexImage)7096*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, PixelUnpackStateTexImage)
7097*8975f5c5SAndroid Build Coastguard Worker {
7098*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc") &&
7099*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_ANGLE_texture_compression_dxt3"));
7100*8975f5c5SAndroid Build Coastguard Worker 
7101*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 5);
7102*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture3D);
7103*8975f5c5SAndroid Build Coastguard Worker 
7104*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[64] = {0};
7105*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 4, 4, 4, 0, 64,
7106*8975f5c5SAndroid Build Coastguard Worker                            data);
7107*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7108*8975f5c5SAndroid Build Coastguard Worker }
7109*8975f5c5SAndroid Build Coastguard Worker 
7110*8975f5c5SAndroid Build Coastguard Worker // Test that compressed textures ignore the pixel unpack state.
7111*8975f5c5SAndroid Build Coastguard Worker // (https://crbug.org/1267496)
TEST_P(Texture3DTestES3,PixelUnpackStateTexSubImage)7112*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, PixelUnpackStateTexSubImage)
7113*8975f5c5SAndroid Build Coastguard Worker {
7114*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc") &&
7115*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_ANGLE_texture_compression_dxt3"));
7116*8975f5c5SAndroid Build Coastguard Worker 
7117*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture3D);
7118*8975f5c5SAndroid Build Coastguard Worker 
7119*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[64] = {0};
7120*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 4, 4, 4, 0, 64,
7121*8975f5c5SAndroid Build Coastguard Worker                            data);
7122*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7123*8975f5c5SAndroid Build Coastguard Worker 
7124*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 5);
7125*8975f5c5SAndroid Build Coastguard Worker 
7126*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 4, 4, 4,
7127*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 64, data);
7128*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7129*8975f5c5SAndroid Build Coastguard Worker }
7130*8975f5c5SAndroid Build Coastguard Worker 
7131*8975f5c5SAndroid Build Coastguard Worker // Test that 3D texture completeness is updated if texture max level changes.
7132*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture3DTestES3,Texture3DCompletenessChangesWithMaxLevel)7133*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, Texture3DCompletenessChangesWithMaxLevel)
7134*8975f5c5SAndroid Build Coastguard Worker {
7135*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7136*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
7137*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
7138*8975f5c5SAndroid Build Coastguard Worker 
7139*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
7140*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
7141*8975f5c5SAndroid Build Coastguard Worker 
7142*8975f5c5SAndroid Build Coastguard Worker     // A level that is initially unused.
7143*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7144*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
7145*8975f5c5SAndroid Build Coastguard Worker 
7146*8975f5c5SAndroid Build Coastguard Worker     // One level that is initially used - only this level should affect completeness.
7147*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7148*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
7149*8975f5c5SAndroid Build Coastguard Worker 
7150*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
7151*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
7152*8975f5c5SAndroid Build Coastguard Worker 
7153*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7154*8975f5c5SAndroid Build Coastguard Worker 
7155*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7156*8975f5c5SAndroid Build Coastguard Worker 
7157*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7158*8975f5c5SAndroid Build Coastguard Worker 
7159*8975f5c5SAndroid Build Coastguard Worker     // Switch the max level to level 1. The levels within the used range now have inconsistent
7160*8975f5c5SAndroid Build Coastguard Worker     // dimensions and the texture should be incomplete.
7161*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
7162*8975f5c5SAndroid Build Coastguard Worker 
7163*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7164*8975f5c5SAndroid Build Coastguard Worker 
7165*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7166*8975f5c5SAndroid Build Coastguard Worker 
7167*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7168*8975f5c5SAndroid Build Coastguard Worker }
7169*8975f5c5SAndroid Build Coastguard Worker 
7170*8975f5c5SAndroid Build Coastguard Worker // Test that texture completeness is updated if texture base level changes.
7171*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture2DTestES3,TextureCompletenessChangesWithBaseLevel)7172*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureCompletenessChangesWithBaseLevel)
7173*8975f5c5SAndroid Build Coastguard Worker {
7174*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7175*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7176*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green);
7177*8975f5c5SAndroid Build Coastguard Worker 
7178*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
7179*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
7180*8975f5c5SAndroid Build Coastguard Worker 
7181*8975f5c5SAndroid Build Coastguard Worker     // Two levels that are initially unused.
7182*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7183*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
7184*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7185*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
7186*8975f5c5SAndroid Build Coastguard Worker 
7187*8975f5c5SAndroid Build Coastguard Worker     // One level that is initially used - only this level should affect completeness.
7188*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7189*8975f5c5SAndroid Build Coastguard Worker                  texDataGreen.data());
7190*8975f5c5SAndroid Build Coastguard Worker 
7191*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
7192*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
7193*8975f5c5SAndroid Build Coastguard Worker 
7194*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7195*8975f5c5SAndroid Build Coastguard Worker 
7196*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7197*8975f5c5SAndroid Build Coastguard Worker 
7198*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7199*8975f5c5SAndroid Build Coastguard Worker 
7200*8975f5c5SAndroid Build Coastguard Worker     // Switch the base level to level 1. The levels within the used range now have inconsistent
7201*8975f5c5SAndroid Build Coastguard Worker     // dimensions and the texture should be incomplete.
7202*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
7203*8975f5c5SAndroid Build Coastguard Worker 
7204*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7205*8975f5c5SAndroid Build Coastguard Worker 
7206*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7207*8975f5c5SAndroid Build Coastguard Worker 
7208*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7209*8975f5c5SAndroid Build Coastguard Worker }
7210*8975f5c5SAndroid Build Coastguard Worker 
7211*8975f5c5SAndroid Build Coastguard Worker // Test that texture is not complete if base level is greater than max level.
7212*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.13 Texture completeness
TEST_P(Texture2DTestES3,TextureBaseLevelGreaterThanMaxLevel)7213*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureBaseLevelGreaterThanMaxLevel)
7214*8975f5c5SAndroid Build Coastguard Worker {
7215*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7216*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7217*8975f5c5SAndroid Build Coastguard Worker 
7218*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7219*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7220*8975f5c5SAndroid Build Coastguard Worker 
7221*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
7222*8975f5c5SAndroid Build Coastguard Worker 
7223*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
7224*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
7225*8975f5c5SAndroid Build Coastguard Worker 
7226*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7227*8975f5c5SAndroid Build Coastguard Worker 
7228*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7229*8975f5c5SAndroid Build Coastguard Worker 
7230*8975f5c5SAndroid Build Coastguard Worker     // Texture should be incomplete.
7231*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7232*8975f5c5SAndroid Build Coastguard Worker }
7233*8975f5c5SAndroid Build Coastguard Worker 
7234*8975f5c5SAndroid Build Coastguard Worker // Test that immutable texture base level and max level are clamped.
7235*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.10 subsection Mipmapping
TEST_P(Texture2DTestES3,ImmutableTextureBaseLevelOutOfRange)7236*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, ImmutableTextureBaseLevelOutOfRange)
7237*8975f5c5SAndroid Build Coastguard Worker {
7238*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7239*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7240*8975f5c5SAndroid Build Coastguard Worker 
7241*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7242*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7243*8975f5c5SAndroid Build Coastguard Worker 
7244*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
7245*8975f5c5SAndroid Build Coastguard Worker 
7246*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
7247*8975f5c5SAndroid Build Coastguard Worker 
7248*8975f5c5SAndroid Build Coastguard Worker     // For immutable-format textures, base level should be clamped to [0, levels - 1], and max level
7249*8975f5c5SAndroid Build Coastguard Worker     // should be clamped to [base_level, levels - 1].
7250*8975f5c5SAndroid Build Coastguard Worker     // GLES 3.0.4 section 3.8.10 subsection Mipmapping
7251*8975f5c5SAndroid Build Coastguard Worker     // In the case of this test, those rules make the effective base level and max level 0.
7252*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
7253*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000);
7254*8975f5c5SAndroid Build Coastguard Worker 
7255*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7256*8975f5c5SAndroid Build Coastguard Worker 
7257*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7258*8975f5c5SAndroid Build Coastguard Worker 
7259*8975f5c5SAndroid Build Coastguard Worker     // Texture should be complete.
7260*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7261*8975f5c5SAndroid Build Coastguard Worker }
7262*8975f5c5SAndroid Build Coastguard Worker 
7263*8975f5c5SAndroid Build Coastguard Worker // Test that changing base level works when it affects the format of the texture.
TEST_P(Texture2DTestES3,TextureFormatChangesWithBaseLevel)7264*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureFormatChangesWithBaseLevel)
7265*8975f5c5SAndroid Build Coastguard Worker {
7266*8975f5c5SAndroid Build Coastguard Worker     // TODO(crbug.com/998505): Test failing on Android FYI Release (NVIDIA Shield TV)
7267*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNVIDIAShield());
7268*8975f5c5SAndroid Build Coastguard Worker 
7269*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsDesktopOpenGL());
7270*8975f5c5SAndroid Build Coastguard Worker 
7271*8975f5c5SAndroid Build Coastguard Worker     // Observed incorrect rendering on AMD OpenGL.
7272*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsDesktopOpenGL());
7273*8975f5c5SAndroid Build Coastguard Worker 
7274*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7275*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7276*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataCyan(4u * 4u, GLColor::cyan);
7277*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green);
7278*8975f5c5SAndroid Build Coastguard Worker 
7279*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
7280*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
7281*8975f5c5SAndroid Build Coastguard Worker 
7282*8975f5c5SAndroid Build Coastguard Worker     // RGBA8 level that's initially unused.
7283*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7284*8975f5c5SAndroid Build Coastguard Worker                  texDataCyan.data());
7285*8975f5c5SAndroid Build Coastguard Worker 
7286*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
7287*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
7288*8975f5c5SAndroid Build Coastguard Worker 
7289*8975f5c5SAndroid Build Coastguard Worker     // RG8 level that's initially used, with consistent dimensions with level 0 but a different
7290*8975f5c5SAndroid Build Coastguard Worker     // format. It reads green channel data from the green and alpha channels of texDataGreen
7291*8975f5c5SAndroid Build Coastguard Worker     // (this is a bit hacky but works).
7292*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RG8, 2, 2, 0, GL_RG, GL_UNSIGNED_BYTE, texDataGreen.data());
7293*8975f5c5SAndroid Build Coastguard Worker 
7294*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7295*8975f5c5SAndroid Build Coastguard Worker 
7296*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7297*8975f5c5SAndroid Build Coastguard Worker 
7298*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7299*8975f5c5SAndroid Build Coastguard Worker 
7300*8975f5c5SAndroid Build Coastguard Worker     // Switch the texture to use the cyan level 0 with the RGBA format.
7301*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
7302*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
7303*8975f5c5SAndroid Build Coastguard Worker 
7304*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7305*8975f5c5SAndroid Build Coastguard Worker 
7306*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7307*8975f5c5SAndroid Build Coastguard Worker 
7308*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
7309*8975f5c5SAndroid Build Coastguard Worker }
7310*8975f5c5SAndroid Build Coastguard Worker 
7311*8975f5c5SAndroid Build Coastguard Worker // Test that setting a texture image works when base level is out of range.
TEST_P(Texture2DTestES3,SetImageWhenBaseLevelOutOfRange)7312*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, SetImageWhenBaseLevelOutOfRange)
7313*8975f5c5SAndroid Build Coastguard Worker {
7314*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7315*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7316*8975f5c5SAndroid Build Coastguard Worker 
7317*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7318*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7319*8975f5c5SAndroid Build Coastguard Worker 
7320*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000);
7321*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000);
7322*8975f5c5SAndroid Build Coastguard Worker 
7323*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
7324*8975f5c5SAndroid Build Coastguard Worker 
7325*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7326*8975f5c5SAndroid Build Coastguard Worker 
7327*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
7328*8975f5c5SAndroid Build Coastguard Worker 
7329*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7330*8975f5c5SAndroid Build Coastguard Worker 
7331*8975f5c5SAndroid Build Coastguard Worker     // Texture should be complete.
7332*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7333*8975f5c5SAndroid Build Coastguard Worker }
7334*8975f5c5SAndroid Build Coastguard Worker 
7335*8975f5c5SAndroid Build Coastguard Worker // In the D3D11 renderer, we need to initialize some texture formats, to fill empty channels. EG
7336*8975f5c5SAndroid Build Coastguard Worker // RBA->RGBA8, with 1.0 in the alpha channel. This test covers a bug where redefining array textures
7337*8975f5c5SAndroid Build Coastguard Worker // with these formats does not work as expected.
TEST_P(Texture2DArrayTestES3,RedefineInittableArray)7338*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayTestES3, RedefineInittableArray)
7339*8975f5c5SAndroid Build Coastguard Worker {
7340*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixelData;
7341*8975f5c5SAndroid Build Coastguard Worker     for (size_t count = 0; count < 5000; count++)
7342*8975f5c5SAndroid Build Coastguard Worker     {
7343*8975f5c5SAndroid Build Coastguard Worker         pixelData.push_back(0u);
7344*8975f5c5SAndroid Build Coastguard Worker         pixelData.push_back(255u);
7345*8975f5c5SAndroid Build Coastguard Worker         pixelData.push_back(0u);
7346*8975f5c5SAndroid Build Coastguard Worker     }
7347*8975f5c5SAndroid Build Coastguard Worker 
7348*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
7349*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
7350*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureArrayLocation, 0);
7351*8975f5c5SAndroid Build Coastguard Worker 
7352*8975f5c5SAndroid Build Coastguard Worker     // The first draw worked correctly.
7353*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
7354*8975f5c5SAndroid Build Coastguard Worker                  &pixelData[0]);
7355*8975f5c5SAndroid Build Coastguard Worker 
7356*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7357*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7358*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
7359*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
7360*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
7361*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7362*8975f5c5SAndroid Build Coastguard Worker 
7363*8975f5c5SAndroid Build Coastguard Worker     // The dimension of the respecification must match the original exactly to trigger the bug.
7364*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
7365*8975f5c5SAndroid Build Coastguard Worker                  &pixelData[0]);
7366*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 1.0f);
7367*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7368*8975f5c5SAndroid Build Coastguard Worker 
7369*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7370*8975f5c5SAndroid Build Coastguard Worker }
7371*8975f5c5SAndroid Build Coastguard Worker 
7372*8975f5c5SAndroid Build Coastguard Worker // Test shadow sampler and regular non-shadow sampler coexisting in the same shader.
7373*8975f5c5SAndroid Build Coastguard Worker // This test is needed especially to confirm that sampler registers get assigned correctly on
7374*8975f5c5SAndroid Build Coastguard Worker // the HLSL backend even when there's a mix of different HLSL sampler and texture types.
TEST_P(ShadowSamplerPlusSampler3DTestES3,ShadowSamplerPlusSampler3DDraw)7375*8975f5c5SAndroid Build Coastguard Worker TEST_P(ShadowSamplerPlusSampler3DTestES3, ShadowSamplerPlusSampler3DDraw)
7376*8975f5c5SAndroid Build Coastguard Worker {
7377*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7378*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
7379*8975f5c5SAndroid Build Coastguard Worker     GLubyte texData[4];
7380*8975f5c5SAndroid Build Coastguard Worker     texData[0] = 0;
7381*8975f5c5SAndroid Build Coastguard Worker     texData[1] = 60;
7382*8975f5c5SAndroid Build Coastguard Worker     texData[2] = 0;
7383*8975f5c5SAndroid Build Coastguard Worker     texData[3] = 255;
7384*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
7385*8975f5c5SAndroid Build Coastguard Worker 
7386*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
7387*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTextureShadow);
7388*8975f5c5SAndroid Build Coastguard Worker     GLfloat depthTexData[1];
7389*8975f5c5SAndroid Build Coastguard Worker     depthTexData[0] = 0.5f;
7390*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
7391*8975f5c5SAndroid Build Coastguard Worker                  depthTexData);
7392*8975f5c5SAndroid Build Coastguard Worker 
7393*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
7394*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(mDepthRefUniformLocation, 0.3f);
7395*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture3DUniformLocation, 0);
7396*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureShadowUniformLocation, 1);
7397*8975f5c5SAndroid Build Coastguard Worker 
7398*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
7399*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7400*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7401*8975f5c5SAndroid Build Coastguard Worker     // The shader writes 0.5 * <comparison result (1.0)> + <texture color>
7402*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 188, 128, 255, 2);
7403*8975f5c5SAndroid Build Coastguard Worker 
7404*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GREATER);
7405*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7406*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7407*8975f5c5SAndroid Build Coastguard Worker     // The shader writes 0.5 * <comparison result (0.0)> + <texture color>
7408*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 0, 60, 0, 255, 2);
7409*8975f5c5SAndroid Build Coastguard Worker }
7410*8975f5c5SAndroid Build Coastguard Worker 
7411*8975f5c5SAndroid Build Coastguard Worker // Test multiple different sampler types in the same shader.
7412*8975f5c5SAndroid Build Coastguard Worker // This test makes sure that even if sampler / texture registers get grouped together based on type
7413*8975f5c5SAndroid Build Coastguard Worker // or otherwise get shuffled around in the HLSL backend of the shader translator, the D3D renderer
7414*8975f5c5SAndroid Build Coastguard Worker // still has the right register index information for each ESSL sampler.
7415*8975f5c5SAndroid Build Coastguard Worker // The tested ESSL samplers have the following types in D3D11 HLSL:
7416*8975f5c5SAndroid Build Coastguard Worker // sampler2D:         Texture2D   + SamplerState
7417*8975f5c5SAndroid Build Coastguard Worker // samplerCube:       TextureCube + SamplerState
7418*8975f5c5SAndroid Build Coastguard Worker // sampler2DShadow:   Texture2D   + SamplerComparisonState
7419*8975f5c5SAndroid Build Coastguard Worker // samplerCubeShadow: TextureCube + SamplerComparisonState
TEST_P(SamplerTypeMixTestES3,SamplerTypeMixDraw)7420*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerTypeMixTestES3, SamplerTypeMixDraw)
7421*8975f5c5SAndroid Build Coastguard Worker {
7422*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7423*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7424*8975f5c5SAndroid Build Coastguard Worker     GLubyte texData[4];
7425*8975f5c5SAndroid Build Coastguard Worker     texData[0] = 0;
7426*8975f5c5SAndroid Build Coastguard Worker     texData[1] = 0;
7427*8975f5c5SAndroid Build Coastguard Worker     texData[2] = 120;
7428*8975f5c5SAndroid Build Coastguard Worker     texData[3] = 255;
7429*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
7430*8975f5c5SAndroid Build Coastguard Worker 
7431*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
7432*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
7433*8975f5c5SAndroid Build Coastguard Worker     texData[0] = 0;
7434*8975f5c5SAndroid Build Coastguard Worker     texData[1] = 90;
7435*8975f5c5SAndroid Build Coastguard Worker     texData[2] = 0;
7436*8975f5c5SAndroid Build Coastguard Worker     texData[3] = 255;
7437*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1);
7438*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
7439*8975f5c5SAndroid Build Coastguard Worker                     texData);
7440*8975f5c5SAndroid Build Coastguard Worker 
7441*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE2);
7442*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2DShadow);
7443*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
7444*8975f5c5SAndroid Build Coastguard Worker     GLfloat depthTexData[1];
7445*8975f5c5SAndroid Build Coastguard Worker     depthTexData[0] = 0.5f;
7446*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
7447*8975f5c5SAndroid Build Coastguard Worker                  depthTexData);
7448*8975f5c5SAndroid Build Coastguard Worker 
7449*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE3);
7450*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow);
7451*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
7452*8975f5c5SAndroid Build Coastguard Worker     depthTexData[0] = 0.2f;
7453*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_DEPTH_COMPONENT32F, 1, 1);
7454*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT,
7455*8975f5c5SAndroid Build Coastguard Worker                     depthTexData);
7456*8975f5c5SAndroid Build Coastguard Worker 
7457*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42262588: TODO: Add a DS texture case
7458*8975f5c5SAndroid Build Coastguard Worker 
7459*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7460*8975f5c5SAndroid Build Coastguard Worker 
7461*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
7462*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(mDepthRefUniformLocation, 0.3f);
7463*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
7464*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 1);
7465*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DShadowUniformLocation, 2);
7466*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeShadowUniformLocation, 3);
7467*8975f5c5SAndroid Build Coastguard Worker 
7468*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7469*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7470*8975f5c5SAndroid Build Coastguard Worker     // The shader writes:
7471*8975f5c5SAndroid Build Coastguard Worker     // <texture 2d color> +
7472*8975f5c5SAndroid Build Coastguard Worker     // <cube map color> +
7473*8975f5c5SAndroid Build Coastguard Worker     // 0.25 * <comparison result (1.0)> +
7474*8975f5c5SAndroid Build Coastguard Worker     // 0.125 * <comparison result (0.0)>
7475*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 64, 154, 184, 255, 2);
7476*8975f5c5SAndroid Build Coastguard Worker }
7477*8975f5c5SAndroid Build Coastguard Worker 
7478*8975f5c5SAndroid Build Coastguard Worker // Test different base levels on textures accessed through the same sampler array.
7479*8975f5c5SAndroid Build Coastguard Worker // Calling textureSize() on the samplers hits the D3D sampler metadata workaround.
TEST_P(TextureSizeTextureArrayTest,BaseLevelVariesInTextureArray)7480*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureSizeTextureArrayTest, BaseLevelVariesInTextureArray)
7481*8975f5c5SAndroid Build Coastguard Worker {
7482*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
7483*8975f5c5SAndroid Build Coastguard Worker 
7484*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263017
7485*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsWindows() && IsD3D11());
7486*8975f5c5SAndroid Build Coastguard Worker 
7487*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7488*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2DA);
7489*8975f5c5SAndroid Build Coastguard Worker     GLsizei size = 64;
7490*8975f5c5SAndroid Build Coastguard Worker     for (GLint level = 0; level < 7; ++level)
7491*8975f5c5SAndroid Build Coastguard Worker     {
7492*8975f5c5SAndroid Build Coastguard Worker         ASSERT_LT(0, size);
7493*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7494*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
7495*8975f5c5SAndroid Build Coastguard Worker         size = size / 2;
7496*8975f5c5SAndroid Build Coastguard Worker     }
7497*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(0, size);
7498*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
7499*8975f5c5SAndroid Build Coastguard Worker 
7500*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
7501*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2DB);
7502*8975f5c5SAndroid Build Coastguard Worker     size = 128;
7503*8975f5c5SAndroid Build Coastguard Worker     for (GLint level = 0; level < 8; ++level)
7504*8975f5c5SAndroid Build Coastguard Worker     {
7505*8975f5c5SAndroid Build Coastguard Worker         ASSERT_LT(0, size);
7506*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7507*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
7508*8975f5c5SAndroid Build Coastguard Worker         size = size / 2;
7509*8975f5c5SAndroid Build Coastguard Worker     }
7510*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(0, size);
7511*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
7512*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7513*8975f5c5SAndroid Build Coastguard Worker 
7514*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
7515*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture0Location, 0);
7516*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture1Location, 1);
7517*8975f5c5SAndroid Build Coastguard Worker 
7518*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, essl3_shaders::PositionAttrib(), 0.5f);
7519*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7520*8975f5c5SAndroid Build Coastguard Worker     // Red channel: width of level 1 of texture A: 32.
7521*8975f5c5SAndroid Build Coastguard Worker     // Green channel: width of level 3 of texture B: 16.
7522*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 32, 16, 0, 255, 2);
7523*8975f5c5SAndroid Build Coastguard Worker }
7524*8975f5c5SAndroid Build Coastguard Worker 
7525*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7526*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTestES3,TextureRGBImplicitAlpha1)7527*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGBImplicitAlpha1)
7528*8975f5c5SAndroid Build Coastguard Worker {
7529*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7530*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7531*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
7532*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7533*8975f5c5SAndroid Build Coastguard Worker 
7534*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7535*8975f5c5SAndroid Build Coastguard Worker 
7536*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7537*8975f5c5SAndroid Build Coastguard Worker }
7538*8975f5c5SAndroid Build Coastguard Worker 
7539*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7540*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTestES3,TextureRGBXImplicitAlpha1)7541*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGBXImplicitAlpha1)
7542*8975f5c5SAndroid Build Coastguard Worker {
7543*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_rgbx_internal_format"));
7544*8975f5c5SAndroid Build Coastguard Worker 
7545*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2D;
7546*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2D);
7547*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBX8_ANGLE, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
7548*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7549*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7550*8975f5c5SAndroid Build Coastguard Worker 
7551*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7552*8975f5c5SAndroid Build Coastguard Worker 
7553*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7554*8975f5c5SAndroid Build Coastguard Worker }
7555*8975f5c5SAndroid Build Coastguard Worker 
7556*8975f5c5SAndroid Build Coastguard Worker // Test that data upload to RGBX works.
TEST_P(Texture2DTestES3,TextureRGBXUpload)7557*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGBXUpload)
7558*8975f5c5SAndroid Build Coastguard Worker {
7559*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_rgbx_internal_format"));
7560*8975f5c5SAndroid Build Coastguard Worker 
7561*8975f5c5SAndroid Build Coastguard Worker     const size_t kWidth  = 32;
7562*8975f5c5SAndroid Build Coastguard Worker     const size_t kHeight = 32;
7563*8975f5c5SAndroid Build Coastguard Worker 
7564*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
7565*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
7566*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
7567*8975f5c5SAndroid Build Coastguard Worker 
7568*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
7569*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7570*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
7571*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7572*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7573*8975f5c5SAndroid Build Coastguard Worker 
7574*8975f5c5SAndroid Build Coastguard Worker     // Upload data to an RGBX texture
7575*8975f5c5SAndroid Build Coastguard Worker     const GLColorRGB kColor(100, 200, 55);
7576*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColorRGB> data(kWidth * kHeight, kColor);
7577*8975f5c5SAndroid Build Coastguard Worker 
7578*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
7579*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
7580*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBX8_ANGLE, kWidth, kHeight);
7581*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
7582*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
7583*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, data.data());
7584*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7585*8975f5c5SAndroid Build Coastguard Worker 
7586*8975f5c5SAndroid Build Coastguard Worker     // Sample from the texture
7587*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
7588*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
7589*8975f5c5SAndroid Build Coastguard Worker 
7590*8975f5c5SAndroid Build Coastguard Worker     const GLColor kExpect(kColor.R, kColor.G, kColor.B, 255);
7591*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpect, 1);
7592*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 1, kExpect, 1);
7593*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(1, 0, kExpect, 1);
7594*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kWidth - 1, 0, kExpect, 1);
7595*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, kHeight - 1, kExpect, 1);
7596*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kWidth - 1, kHeight - 1, kExpect, 1);
7597*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kWidth / 2, kHeight / 2, kExpect, 1);
7598*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7599*8975f5c5SAndroid Build Coastguard Worker }
7600*8975f5c5SAndroid Build Coastguard Worker 
7601*8975f5c5SAndroid Build Coastguard Worker // Test that data download from RGBX works.
TEST_P(Texture2DTestES3,TextureRGBXDownload)7602*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGBXDownload)
7603*8975f5c5SAndroid Build Coastguard Worker {
7604*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_rgbx_internal_format"));
7605*8975f5c5SAndroid Build Coastguard Worker 
7606*8975f5c5SAndroid Build Coastguard Worker     const size_t kWidth  = 32;
7607*8975f5c5SAndroid Build Coastguard Worker     const size_t kHeight = 32;
7608*8975f5c5SAndroid Build Coastguard Worker 
7609*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
7610*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
7611*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBX8_ANGLE, kWidth, kHeight);
7612*8975f5c5SAndroid Build Coastguard Worker 
7613*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
7614*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7615*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
7616*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7617*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7618*8975f5c5SAndroid Build Coastguard Worker 
7619*8975f5c5SAndroid Build Coastguard Worker     // Render to the RGBX texture
7620*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
7621*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
7622*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
7623*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
7624*8975f5c5SAndroid Build Coastguard Worker 
7625*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorLoc, 0.3f, 0.6f, 0.8f, 0.2f);
7626*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
7627*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7628*8975f5c5SAndroid Build Coastguard Worker 
7629*8975f5c5SAndroid Build Coastguard Worker     // Readback as RGBX.
7630*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> readback(kWidth * kHeight);
7631*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kWidth, kHeight, GL_RGBX8_ANGLE, GL_UNSIGNED_BYTE, readback.data());
7632*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7633*8975f5c5SAndroid Build Coastguard Worker 
7634*8975f5c5SAndroid Build Coastguard Worker     const GLColor kExpect(76,   // 0.3f * 255
7635*8975f5c5SAndroid Build Coastguard Worker                           153,  // 0.6f * 255
7636*8975f5c5SAndroid Build Coastguard Worker                           204,  // 0.8f * 255
7637*8975f5c5SAndroid Build Coastguard Worker                           255);
7638*8975f5c5SAndroid Build Coastguard Worker 
7639*8975f5c5SAndroid Build Coastguard Worker     for (size_t y = 0; y < kHeight; y++)
7640*8975f5c5SAndroid Build Coastguard Worker     {
7641*8975f5c5SAndroid Build Coastguard Worker         for (size_t x = 0; x < kWidth; x++)
7642*8975f5c5SAndroid Build Coastguard Worker         {
7643*8975f5c5SAndroid Build Coastguard Worker             const GLColor actualColor = readback[y * kWidth + x];
7644*8975f5c5SAndroid Build Coastguard Worker 
7645*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(actualColor.R, kExpect.R, 1) << x << "x" << y;
7646*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(actualColor.G, kExpect.G, 1) << x << "x" << y;
7647*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(actualColor.B, kExpect.B, 1) << x << "x" << y;
7648*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(actualColor.A, kExpect.A) << x << "x" << y;
7649*8975f5c5SAndroid Build Coastguard Worker         }
7650*8975f5c5SAndroid Build Coastguard Worker     }
7651*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7652*8975f5c5SAndroid Build Coastguard Worker }
7653*8975f5c5SAndroid Build Coastguard Worker 
7654*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7655*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTest,TextureLuminanceImplicitAlpha1)7656*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureLuminanceImplicitAlpha1)
7657*8975f5c5SAndroid Build Coastguard Worker {
7658*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
7659*8975f5c5SAndroid Build Coastguard Worker 
7660*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7661*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7662*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
7663*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7664*8975f5c5SAndroid Build Coastguard Worker 
7665*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7666*8975f5c5SAndroid Build Coastguard Worker 
7667*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7668*8975f5c5SAndroid Build Coastguard Worker }
7669*8975f5c5SAndroid Build Coastguard Worker 
7670*8975f5c5SAndroid Build Coastguard Worker // Validate that every component of the pixel will be equal to the luminance value we've set
7671*8975f5c5SAndroid Build Coastguard Worker // and that the alpha channel will be 1 (or 255 to be exact).
TEST_P(Texture2DTest,TextureLuminanceRGBSame)7672*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureLuminanceRGBSame)
7673*8975f5c5SAndroid Build Coastguard Worker {
7674*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
7675*8975f5c5SAndroid Build Coastguard Worker 
7676*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7677*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7678*8975f5c5SAndroid Build Coastguard Worker     uint8_t pixel = 50;
7679*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &pixel);
7680*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7681*8975f5c5SAndroid Build Coastguard Worker 
7682*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7683*8975f5c5SAndroid Build Coastguard Worker 
7684*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(pixel, pixel, pixel, 255));
7685*8975f5c5SAndroid Build Coastguard Worker }
7686*8975f5c5SAndroid Build Coastguard Worker 
7687*8975f5c5SAndroid Build Coastguard Worker // Validate that every component of the pixel will be equal to the luminance value we've set
7688*8975f5c5SAndroid Build Coastguard Worker // and that the alpha channel will be the second component.
TEST_P(Texture2DTest,TextureLuminanceAlphaRGBSame)7689*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureLuminanceAlphaRGBSame)
7690*8975f5c5SAndroid Build Coastguard Worker {
7691*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
7692*8975f5c5SAndroid Build Coastguard Worker 
7693*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7694*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7695*8975f5c5SAndroid Build Coastguard Worker     uint8_t pixel[] = {50, 25};
7696*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
7697*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixel);
7698*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7699*8975f5c5SAndroid Build Coastguard Worker 
7700*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7701*8975f5c5SAndroid Build Coastguard Worker 
7702*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(pixel[0], pixel[0], pixel[0], pixel[1]));
7703*8975f5c5SAndroid Build Coastguard Worker }
7704*8975f5c5SAndroid Build Coastguard Worker 
7705*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7706*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTest,TextureLuminance32ImplicitAlpha1)7707*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureLuminance32ImplicitAlpha1)
7708*8975f5c5SAndroid Build Coastguard Worker {
7709*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
7710*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D9());
7711*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan());
7712*8975f5c5SAndroid Build Coastguard Worker 
7713*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
7714*8975f5c5SAndroid Build Coastguard Worker 
7715*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7716*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7717*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_FLOAT, nullptr);
7718*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7719*8975f5c5SAndroid Build Coastguard Worker 
7720*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7721*8975f5c5SAndroid Build Coastguard Worker 
7722*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7723*8975f5c5SAndroid Build Coastguard Worker }
7724*8975f5c5SAndroid Build Coastguard Worker 
7725*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7726*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTest,TextureLuminance16ImplicitAlpha1)7727*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, TextureLuminance16ImplicitAlpha1)
7728*8975f5c5SAndroid Build Coastguard Worker {
7729*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
7730*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D9());
7731*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan());
7732*8975f5c5SAndroid Build Coastguard Worker     // TODO(ynovikov): re-enable once root cause of http://anglebug.com/42260416 is fixed
7733*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsAdreno() && IsOpenGLES());
7734*8975f5c5SAndroid Build Coastguard Worker 
7735*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
7736*8975f5c5SAndroid Build Coastguard Worker 
7737*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7738*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7739*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, nullptr);
7740*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7741*8975f5c5SAndroid Build Coastguard Worker 
7742*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7743*8975f5c5SAndroid Build Coastguard Worker 
7744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7745*8975f5c5SAndroid Build Coastguard Worker }
7746*8975f5c5SAndroid Build Coastguard Worker 
7747*8975f5c5SAndroid Build Coastguard Worker // Test that CopyTexImage2D does not trigger assertion after CompressedTexImage2D.
7748*8975f5c5SAndroid Build Coastguard Worker // https://crbug.com/1216276
TEST_P(Texture2DTest,CopyAfterCompressed)7749*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, CopyAfterCompressed)
7750*8975f5c5SAndroid Build Coastguard Worker {
7751*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
7752*8975f5c5SAndroid Build Coastguard Worker 
7753*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7754*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 0, 8, nullptr);
7755*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7756*8975f5c5SAndroid Build Coastguard Worker 
7757*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 0, 0, 4, 4, 0);
7758*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7759*8975f5c5SAndroid Build Coastguard Worker }
7760*8975f5c5SAndroid Build Coastguard Worker 
7761*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7762*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DUnsignedIntegerAlpha1TestES3,TextureRGB8UIImplicitAlpha1)7763*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB8UIImplicitAlpha1)
7764*8975f5c5SAndroid Build Coastguard Worker {
7765*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
7766*8975f5c5SAndroid Build Coastguard Worker 
7767*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7768*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7769*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, nullptr);
7770*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7771*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7772*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7773*8975f5c5SAndroid Build Coastguard Worker 
7774*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7775*8975f5c5SAndroid Build Coastguard Worker 
7776*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7777*8975f5c5SAndroid Build Coastguard Worker }
7778*8975f5c5SAndroid Build Coastguard Worker 
7779*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7780*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DIntegerAlpha1TestES3,TextureRGB8IImplicitAlpha1)7781*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB8IImplicitAlpha1)
7782*8975f5c5SAndroid Build Coastguard Worker {
7783*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
7784*8975f5c5SAndroid Build Coastguard Worker 
7785*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7786*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7787*8975f5c5SAndroid Build Coastguard Worker 
7788*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8I, 1, 1, 0, GL_RGB_INTEGER, GL_BYTE, nullptr);
7789*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7790*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7791*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7792*8975f5c5SAndroid Build Coastguard Worker 
7793*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7794*8975f5c5SAndroid Build Coastguard Worker 
7795*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7796*8975f5c5SAndroid Build Coastguard Worker }
7797*8975f5c5SAndroid Build Coastguard Worker 
7798*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7799*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DUnsignedIntegerAlpha1TestES3,TextureRGB16UIImplicitAlpha1)7800*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB16UIImplicitAlpha1)
7801*8975f5c5SAndroid Build Coastguard Worker {
7802*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
7803*8975f5c5SAndroid Build Coastguard Worker 
7804*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7805*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7806*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, nullptr);
7807*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7808*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7809*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7810*8975f5c5SAndroid Build Coastguard Worker 
7811*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7812*8975f5c5SAndroid Build Coastguard Worker 
7813*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7814*8975f5c5SAndroid Build Coastguard Worker }
7815*8975f5c5SAndroid Build Coastguard Worker 
7816*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7817*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DIntegerAlpha1TestES3,TextureRGB16IImplicitAlpha1)7818*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB16IImplicitAlpha1)
7819*8975f5c5SAndroid Build Coastguard Worker {
7820*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
7821*8975f5c5SAndroid Build Coastguard Worker 
7822*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7823*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7824*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16I, 1, 1, 0, GL_RGB_INTEGER, GL_SHORT, nullptr);
7825*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7826*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7827*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7828*8975f5c5SAndroid Build Coastguard Worker 
7829*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7830*8975f5c5SAndroid Build Coastguard Worker 
7831*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7832*8975f5c5SAndroid Build Coastguard Worker }
7833*8975f5c5SAndroid Build Coastguard Worker 
7834*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7835*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DUnsignedIntegerAlpha1TestES3,TextureRGB32UIImplicitAlpha1)7836*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB32UIImplicitAlpha1)
7837*8975f5c5SAndroid Build Coastguard Worker {
7838*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
7839*8975f5c5SAndroid Build Coastguard Worker 
7840*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7841*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7842*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, nullptr);
7843*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7844*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7845*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7846*8975f5c5SAndroid Build Coastguard Worker 
7847*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7848*8975f5c5SAndroid Build Coastguard Worker 
7849*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7850*8975f5c5SAndroid Build Coastguard Worker }
7851*8975f5c5SAndroid Build Coastguard Worker 
7852*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7853*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DIntegerAlpha1TestES3,TextureRGB32IImplicitAlpha1)7854*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB32IImplicitAlpha1)
7855*8975f5c5SAndroid Build Coastguard Worker {
7856*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
7857*8975f5c5SAndroid Build Coastguard Worker 
7858*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7859*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7860*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32I, 1, 1, 0, GL_RGB_INTEGER, GL_INT, nullptr);
7861*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7862*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7863*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7864*8975f5c5SAndroid Build Coastguard Worker 
7865*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7866*8975f5c5SAndroid Build Coastguard Worker 
7867*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7868*8975f5c5SAndroid Build Coastguard Worker }
7869*8975f5c5SAndroid Build Coastguard Worker 
7870*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7871*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTestES3,TextureRGBSNORMImplicitAlpha1)7872*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGBSNORMImplicitAlpha1)
7873*8975f5c5SAndroid Build Coastguard Worker {
7874*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7875*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7876*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 1, 1, 0, GL_RGB, GL_BYTE, nullptr);
7877*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7878*8975f5c5SAndroid Build Coastguard Worker 
7879*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7880*8975f5c5SAndroid Build Coastguard Worker 
7881*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7882*8975f5c5SAndroid Build Coastguard Worker }
7883*8975f5c5SAndroid Build Coastguard Worker 
7884*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7885*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTestES3,TextureRGB9E5ImplicitAlpha1)7886*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGB9E5ImplicitAlpha1)
7887*8975f5c5SAndroid Build Coastguard Worker {
7888*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7889*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7890*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB9_E5, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV,
7891*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
7892*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7893*8975f5c5SAndroid Build Coastguard Worker 
7894*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7895*8975f5c5SAndroid Build Coastguard Worker 
7896*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7897*8975f5c5SAndroid Build Coastguard Worker }
7898*8975f5c5SAndroid Build Coastguard Worker 
7899*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7900*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTestES3,TextureCOMPRESSEDRGB8ETC2ImplicitAlpha1)7901*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureCOMPRESSEDRGB8ETC2ImplicitAlpha1)
7902*8975f5c5SAndroid Build Coastguard Worker {
7903*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
7904*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
7905*8975f5c5SAndroid Build Coastguard Worker 
7906*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7907*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7908*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 1, 1, 0, 8, nullptr);
7909*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7910*8975f5c5SAndroid Build Coastguard Worker 
7911*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7912*8975f5c5SAndroid Build Coastguard Worker 
7913*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7914*8975f5c5SAndroid Build Coastguard Worker }
7915*8975f5c5SAndroid Build Coastguard Worker 
7916*8975f5c5SAndroid Build Coastguard Worker // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
7917*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 table 3.24
TEST_P(Texture2DTestES3,TextureCOMPRESSEDSRGB8ETC2ImplicitAlpha1)7918*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureCOMPRESSEDSRGB8ETC2ImplicitAlpha1)
7919*8975f5c5SAndroid Build Coastguard Worker {
7920*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
7921*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
7922*8975f5c5SAndroid Build Coastguard Worker 
7923*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7924*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7925*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ETC2, 1, 1, 0, 8, nullptr);
7926*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7927*8975f5c5SAndroid Build Coastguard Worker 
7928*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7929*8975f5c5SAndroid Build Coastguard Worker 
7930*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7931*8975f5c5SAndroid Build Coastguard Worker }
7932*8975f5c5SAndroid Build Coastguard Worker 
7933*8975f5c5SAndroid Build Coastguard Worker // ETC2 punchthrough alpha formats must be initialized to opaque black when emulated
7934*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42265413
TEST_P(Texture2DTestES3RobustInit,TextureCOMPRESSEDRGB8A1ETC2)7935*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3RobustInit, TextureCOMPRESSEDRGB8A1ETC2)
7936*8975f5c5SAndroid Build Coastguard Worker {
7937*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7938*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7939*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 1, 1, 0,
7940*8975f5c5SAndroid Build Coastguard Worker                            8, nullptr);
7941*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7942*8975f5c5SAndroid Build Coastguard Worker 
7943*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7944*8975f5c5SAndroid Build Coastguard Worker 
7945*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7946*8975f5c5SAndroid Build Coastguard Worker }
7947*8975f5c5SAndroid Build Coastguard Worker 
7948*8975f5c5SAndroid Build Coastguard Worker // ETC2 punchthrough alpha formats must be initialized to opaque black when emulated
7949*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42265413
TEST_P(Texture2DTestES3RobustInit,TextureCOMPRESSEDSRGB8A1ETC2)7950*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3RobustInit, TextureCOMPRESSEDSRGB8A1ETC2)
7951*8975f5c5SAndroid Build Coastguard Worker {
7952*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
7953*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7954*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 1, 1, 0,
7955*8975f5c5SAndroid Build Coastguard Worker                            8, nullptr);
7956*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7957*8975f5c5SAndroid Build Coastguard Worker 
7958*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
7959*8975f5c5SAndroid Build Coastguard Worker 
7960*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
7961*8975f5c5SAndroid Build Coastguard Worker }
7962*8975f5c5SAndroid Build Coastguard Worker 
7963*8975f5c5SAndroid Build Coastguard Worker // Test that compressed textures ignore the pixel unpack state.
7964*8975f5c5SAndroid Build Coastguard Worker // (https://crbug.org/1267496)
TEST_P(Texture2DTestES3,PixelUnpackStateTexImage)7965*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, PixelUnpackStateTexImage)
7966*8975f5c5SAndroid Build Coastguard Worker {
7967*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc") &&
7968*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_ANGLE_texture_compression_dxt3"));
7969*8975f5c5SAndroid Build Coastguard Worker 
7970*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ROW_LENGTH, 9);
7971*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7972*8975f5c5SAndroid Build Coastguard Worker 
7973*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[64] = {0};
7974*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 8, 8, 0, 64, data);
7975*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7976*8975f5c5SAndroid Build Coastguard Worker }
7977*8975f5c5SAndroid Build Coastguard Worker 
7978*8975f5c5SAndroid Build Coastguard Worker // Test that compressed textures ignore the pixel unpack state.
7979*8975f5c5SAndroid Build Coastguard Worker // (https://crbug.org/1267496)
TEST_P(Texture2DTestES3,PixelUnpackStateTexSubImage)7980*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, PixelUnpackStateTexSubImage)
7981*8975f5c5SAndroid Build Coastguard Worker {
7982*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc") &&
7983*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_ANGLE_texture_compression_dxt3"));
7984*8975f5c5SAndroid Build Coastguard Worker 
7985*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
7986*8975f5c5SAndroid Build Coastguard Worker 
7987*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[64] = {0};
7988*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 8, 8, 0, 64, data);
7989*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7990*8975f5c5SAndroid Build Coastguard Worker 
7991*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ROW_LENGTH, 9);
7992*8975f5c5SAndroid Build Coastguard Worker 
7993*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 64,
7994*8975f5c5SAndroid Build Coastguard Worker                               data);
7995*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
7996*8975f5c5SAndroid Build Coastguard Worker }
7997*8975f5c5SAndroid Build Coastguard Worker 
7998*8975f5c5SAndroid Build Coastguard Worker // Test for http://anglebug.com/42265405.
TEST_P(Texture2DTestES3,TextureRGBUpdateWithPBO)7999*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureRGBUpdateWithPBO)
8000*8975f5c5SAndroid Build Coastguard Worker {
8001*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
8002*8975f5c5SAndroid Build Coastguard Worker 
8003*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 16, 16);
8004*8975f5c5SAndroid Build Coastguard Worker 
8005*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex1;
8006*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataRed(16u * 16u, GLColor::red);
8007*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> texDataGreen(16u * 16u, GLColor::green);
8008*8975f5c5SAndroid Build Coastguard Worker 
8009*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
8010*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
8011*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_RGB, GL_UNSIGNED_BYTE, texDataRed.data());
8012*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8013*8975f5c5SAndroid Build Coastguard Worker 
8014*8975f5c5SAndroid Build Coastguard Worker     GLBuffer pbo;
8015*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
8016*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * 16 * 16, texDataGreen.data(), GL_STATIC_DRAW);
8017*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
8018*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8019*8975f5c5SAndroid Build Coastguard Worker 
8020*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8021*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8022*8975f5c5SAndroid Build Coastguard Worker 
8023*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
8024*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
8025*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(4, 4, GLColor::green);
8026*8975f5c5SAndroid Build Coastguard Worker }
8027*8975f5c5SAndroid Build Coastguard Worker 
8028*8975f5c5SAndroid Build Coastguard Worker // Copied from Texture2DTest::TexStorage
8029*8975f5c5SAndroid Build Coastguard Worker // Test that glTexSubImage2D works properly when glTexStorage2DEXT has initialized the image with a
8030*8975f5c5SAndroid Build Coastguard Worker // default color.
TEST_P(Texture2DTestES31PPO,TexStorage)8031*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES31PPO, TexStorage)
8032*8975f5c5SAndroid Build Coastguard Worker {
8033*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
8034*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF((getClientMajorVersion() < 3 && getClientMinorVersion() < 1) &&
8035*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_storage"));
8036*8975f5c5SAndroid Build Coastguard Worker 
8037*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
8038*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = getFragmentShaderSource();
8039*8975f5c5SAndroid Build Coastguard Worker 
8040*8975f5c5SAndroid Build Coastguard Worker     bindProgramPipeline(vertexShaderSource, fragmentShaderSource);
8041*8975f5c5SAndroid Build Coastguard Worker     mTexture2DUniformLocation = glGetUniformLocation(mFragProg, getTextureUniformName());
8042*8975f5c5SAndroid Build Coastguard Worker 
8043*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
8044*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
8045*8975f5c5SAndroid Build Coastguard Worker 
8046*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
8047*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8048*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
8049*8975f5c5SAndroid Build Coastguard Worker 
8050*8975f5c5SAndroid Build Coastguard Worker     // Fill with red
8051*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels(3 * 16 * 16);
8052*8975f5c5SAndroid Build Coastguard Worker     for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
8053*8975f5c5SAndroid Build Coastguard Worker     {
8054*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * 3 + 0] = 255;
8055*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * 3 + 1] = 0;
8056*8975f5c5SAndroid Build Coastguard Worker         pixels[pixelId * 3 + 2] = 0;
8057*8975f5c5SAndroid Build Coastguard Worker     }
8058*8975f5c5SAndroid Build Coastguard Worker 
8059*8975f5c5SAndroid Build Coastguard Worker     // ANGLE internally uses RGBA as the internal format for RGB images, therefore glTexStorage2DEXT
8060*8975f5c5SAndroid Build Coastguard Worker     // initializes the image to a default color to get a consistent alpha color. The data is kept in
8061*8975f5c5SAndroid Build Coastguard Worker     // a CPU-side image and the image is marked as dirty.
8062*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
8063*8975f5c5SAndroid Build Coastguard Worker 
8064*8975f5c5SAndroid Build Coastguard Worker     // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
8065*8975f5c5SAndroid Build Coastguard Worker     // glTexSubImage2D should take into account that the image is dirty.
8066*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, pixels.data());
8067*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
8068*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
8069*8975f5c5SAndroid Build Coastguard Worker 
8070*8975f5c5SAndroid Build Coastguard Worker     glActiveShaderProgram(mPipeline, mFragProg);
8071*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
8072*8975f5c5SAndroid Build Coastguard Worker 
8073*8975f5c5SAndroid Build Coastguard Worker     std::array<Vector3, 6> quadVertices = ANGLETestBase::GetQuadVertices();
8074*8975f5c5SAndroid Build Coastguard Worker     ppoDrawQuad(quadVertices, "position", 0.5f, 1.0f);
8075*8975f5c5SAndroid Build Coastguard Worker 
8076*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8077*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
8078*8975f5c5SAndroid Build Coastguard Worker 
8079*8975f5c5SAndroid Build Coastguard Worker     // Validate that the region of the texture without data has an alpha of 1.0
8080*8975f5c5SAndroid Build Coastguard Worker     angle::GLColor pixel = ReadColor(3 * width / 4, 3 * height / 4);
8081*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(255, pixel.A);
8082*8975f5c5SAndroid Build Coastguard Worker }
8083*8975f5c5SAndroid Build Coastguard Worker 
8084*8975f5c5SAndroid Build Coastguard Worker // Copied from Texture2DTestES3::SingleTextureMultipleSamplers
8085*8975f5c5SAndroid Build Coastguard Worker // Tests behaviour with a single texture and multiple sampler objects.
TEST_P(Texture2DTestES31PPO,SingleTextureMultipleSamplers)8086*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES31PPO, SingleTextureMultipleSamplers)
8087*8975f5c5SAndroid Build Coastguard Worker {
8088*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
8089*8975f5c5SAndroid Build Coastguard Worker 
8090*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
8091*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = getFragmentShaderSource();
8092*8975f5c5SAndroid Build Coastguard Worker 
8093*8975f5c5SAndroid Build Coastguard Worker     bindProgramPipeline(vertexShaderSource, fragmentShaderSource);
8094*8975f5c5SAndroid Build Coastguard Worker     mTexture2DUniformLocation = glGetUniformLocation(mFragProg, getTextureUniformName());
8095*8975f5c5SAndroid Build Coastguard Worker 
8096*8975f5c5SAndroid Build Coastguard Worker     GLint maxTextureUnits = 0;
8097*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
8098*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(maxTextureUnits < 4);
8099*8975f5c5SAndroid Build Coastguard Worker 
8100*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize                 = 16;
8101*8975f5c5SAndroid Build Coastguard Worker     std::array<Vector3, 6> quadVertices = ANGLETestBase::GetQuadVertices();
8102*8975f5c5SAndroid Build Coastguard Worker 
8103*8975f5c5SAndroid Build Coastguard Worker     // Make a single-level texture, fill it with red.
8104*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redColors(kSize * kSize, GLColor::red);
8105*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
8106*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
8107*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
8108*8975f5c5SAndroid Build Coastguard Worker                  redColors.data());
8109*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8110*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8111*8975f5c5SAndroid Build Coastguard Worker 
8112*8975f5c5SAndroid Build Coastguard Worker     // Simple confidence check.
8113*8975f5c5SAndroid Build Coastguard Worker     bind2DTexturedQuadProgramPipeline();
8114*8975f5c5SAndroid Build Coastguard Worker     ppoDrawQuad(quadVertices, "position", 0.5f, 1.0f);
8115*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8116*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
8117*8975f5c5SAndroid Build Coastguard Worker 
8118*8975f5c5SAndroid Build Coastguard Worker     // Bind texture to unit 1 with a sampler object making it incomplete.
8119*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
8120*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
8121*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
8122*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8123*8975f5c5SAndroid Build Coastguard Worker 
8124*8975f5c5SAndroid Build Coastguard Worker     // Make a mipmap texture, fill it with blue.
8125*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> blueColors(kSize * kSize, GLColor::blue);
8126*8975f5c5SAndroid Build Coastguard Worker     GLTexture mipmapTex;
8127*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mipmapTex);
8128*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
8129*8975f5c5SAndroid Build Coastguard Worker                  blueColors.data());
8130*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
8131*8975f5c5SAndroid Build Coastguard Worker 
8132*8975f5c5SAndroid Build Coastguard Worker     // Draw with the sampler, expect blue.
8133*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, true);
8134*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8135*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
8136*8975f5c5SAndroid Build Coastguard Worker 
8137*8975f5c5SAndroid Build Coastguard Worker     // Simple multitexturing program.
8138*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
8139*8975f5c5SAndroid Build Coastguard Worker         "#version 310 es\n"
8140*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
8141*8975f5c5SAndroid Build Coastguard Worker         "in vec2 position;\n"
8142*8975f5c5SAndroid Build Coastguard Worker         "out vec2 texCoord;\n"
8143*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
8144*8975f5c5SAndroid Build Coastguard Worker         "{\n"
8145*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
8146*8975f5c5SAndroid Build Coastguard Worker         "    texCoord = position * 0.5 + vec2(0.5);\n"
8147*8975f5c5SAndroid Build Coastguard Worker         "}";
8148*8975f5c5SAndroid Build Coastguard Worker 
8149*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
8150*8975f5c5SAndroid Build Coastguard Worker         "#version 310 es\n"
8151*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
8152*8975f5c5SAndroid Build Coastguard Worker         "in vec2 texCoord;\n"
8153*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex1;\n"
8154*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex2;\n"
8155*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex3;\n"
8156*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex4;\n"
8157*8975f5c5SAndroid Build Coastguard Worker         "out vec4 color;\n"
8158*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
8159*8975f5c5SAndroid Build Coastguard Worker         "{\n"
8160*8975f5c5SAndroid Build Coastguard Worker         "    color = (texture(tex1, texCoord) + texture(tex2, texCoord) \n"
8161*8975f5c5SAndroid Build Coastguard Worker         "          +  texture(tex3, texCoord) + texture(tex4, texCoord)) * 0.25;\n"
8162*8975f5c5SAndroid Build Coastguard Worker         "}";
8163*8975f5c5SAndroid Build Coastguard Worker 
8164*8975f5c5SAndroid Build Coastguard Worker     bindProgramPipeline(kVS, kFS);
8165*8975f5c5SAndroid Build Coastguard Worker 
8166*8975f5c5SAndroid Build Coastguard Worker     std::array<GLint, 4> texLocations = {
8167*8975f5c5SAndroid Build Coastguard Worker         {glGetUniformLocation(mFragProg, "tex1"), glGetUniformLocation(mFragProg, "tex2"),
8168*8975f5c5SAndroid Build Coastguard Worker          glGetUniformLocation(mFragProg, "tex3"), glGetUniformLocation(mFragProg, "tex4")}};
8169*8975f5c5SAndroid Build Coastguard Worker     for (GLint location : texLocations)
8170*8975f5c5SAndroid Build Coastguard Worker     {
8171*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, location);
8172*8975f5c5SAndroid Build Coastguard Worker     }
8173*8975f5c5SAndroid Build Coastguard Worker 
8174*8975f5c5SAndroid Build Coastguard Worker     // Init the uniform data.
8175*8975f5c5SAndroid Build Coastguard Worker     glActiveShaderProgram(mPipeline, mFragProg);
8176*8975f5c5SAndroid Build Coastguard Worker     for (GLint location = 0; location < 4; ++location)
8177*8975f5c5SAndroid Build Coastguard Worker     {
8178*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(texLocations[location], location);
8179*8975f5c5SAndroid Build Coastguard Worker     }
8180*8975f5c5SAndroid Build Coastguard Worker 
8181*8975f5c5SAndroid Build Coastguard Worker     // Initialize four samplers
8182*8975f5c5SAndroid Build Coastguard Worker     GLSampler samplers[4];
8183*8975f5c5SAndroid Build Coastguard Worker 
8184*8975f5c5SAndroid Build Coastguard Worker     // 0: non-mipped.
8185*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, samplers[0]);
8186*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8187*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8188*8975f5c5SAndroid Build Coastguard Worker 
8189*8975f5c5SAndroid Build Coastguard Worker     // 1: mipped.
8190*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(1, samplers[1]);
8191*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[1], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
8192*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[1], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8193*8975f5c5SAndroid Build Coastguard Worker 
8194*8975f5c5SAndroid Build Coastguard Worker     // 2: non-mipped.
8195*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(2, samplers[2]);
8196*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[2], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8197*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[2], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8198*8975f5c5SAndroid Build Coastguard Worker 
8199*8975f5c5SAndroid Build Coastguard Worker     // 3: mipped.
8200*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(3, samplers[3]);
8201*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[3], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
8202*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[3], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8203*8975f5c5SAndroid Build Coastguard Worker 
8204*8975f5c5SAndroid Build Coastguard Worker     // Bind two blue mipped textures and two single layer textures, should all draw.
8205*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8206*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
8207*8975f5c5SAndroid Build Coastguard Worker 
8208*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
8209*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mipmapTex);
8210*8975f5c5SAndroid Build Coastguard Worker 
8211*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE2);
8212*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
8213*8975f5c5SAndroid Build Coastguard Worker 
8214*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE3);
8215*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mipmapTex);
8216*8975f5c5SAndroid Build Coastguard Worker 
8217*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8218*8975f5c5SAndroid Build Coastguard Worker 
8219*8975f5c5SAndroid Build Coastguard Worker     ppoDrawQuad(quadVertices, "position", 0.5f, 1.0f);
8220*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8221*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 0, 128, 255, 2);
8222*8975f5c5SAndroid Build Coastguard Worker 
8223*8975f5c5SAndroid Build Coastguard Worker     // Bind four single layer textures, two should be incomplete.
8224*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
8225*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
8226*8975f5c5SAndroid Build Coastguard Worker 
8227*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE3);
8228*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
8229*8975f5c5SAndroid Build Coastguard Worker 
8230*8975f5c5SAndroid Build Coastguard Worker     ppoDrawQuad(quadVertices, "position", 0.5f, 1.0f);
8231*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8232*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 0, 0, 255, 2);
8233*8975f5c5SAndroid Build Coastguard Worker }
8234*8975f5c5SAndroid Build Coastguard Worker 
8235*8975f5c5SAndroid Build Coastguard Worker // Use a sampler in a uniform struct.
TEST_P(SamplerInStructTest,SamplerInStruct)8236*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerInStructTest, SamplerInStruct)
8237*8975f5c5SAndroid Build Coastguard Worker {
8238*8975f5c5SAndroid Build Coastguard Worker     runSamplerInStructTest();
8239*8975f5c5SAndroid Build Coastguard Worker }
8240*8975f5c5SAndroid Build Coastguard Worker 
8241*8975f5c5SAndroid Build Coastguard Worker // Use a sampler in a uniform struct that's passed as a function parameter.
TEST_P(SamplerInStructAsFunctionParameterTest,SamplerInStructAsFunctionParameter)8242*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerInStructAsFunctionParameterTest, SamplerInStructAsFunctionParameter)
8243*8975f5c5SAndroid Build Coastguard Worker {
8244*8975f5c5SAndroid Build Coastguard Worker     // Fails on Nexus 5X due to a driver bug. http://anglebug.com/42260422
8245*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
8246*8975f5c5SAndroid Build Coastguard Worker 
8247*8975f5c5SAndroid Build Coastguard Worker     runSamplerInStructTest();
8248*8975f5c5SAndroid Build Coastguard Worker }
8249*8975f5c5SAndroid Build Coastguard Worker 
8250*8975f5c5SAndroid Build Coastguard Worker // Use a sampler in a uniform struct array with a struct from the array passed as a function
8251*8975f5c5SAndroid Build Coastguard Worker // parameter.
TEST_P(SamplerInStructArrayAsFunctionParameterTest,SamplerInStructArrayAsFunctionParameter)8252*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerInStructArrayAsFunctionParameterTest, SamplerInStructArrayAsFunctionParameter)
8253*8975f5c5SAndroid Build Coastguard Worker {
8254*8975f5c5SAndroid Build Coastguard Worker     // Fails on Nexus 5X due to a driver bug. http://anglebug.com/42260422
8255*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
8256*8975f5c5SAndroid Build Coastguard Worker 
8257*8975f5c5SAndroid Build Coastguard Worker     runSamplerInStructTest();
8258*8975f5c5SAndroid Build Coastguard Worker }
8259*8975f5c5SAndroid Build Coastguard Worker 
8260*8975f5c5SAndroid Build Coastguard Worker // Use a sampler in a struct inside a uniform struct with the nested struct passed as a function
8261*8975f5c5SAndroid Build Coastguard Worker // parameter.
TEST_P(SamplerInNestedStructAsFunctionParameterTest,SamplerInNestedStructAsFunctionParameter)8262*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerInNestedStructAsFunctionParameterTest, SamplerInNestedStructAsFunctionParameter)
8263*8975f5c5SAndroid Build Coastguard Worker {
8264*8975f5c5SAndroid Build Coastguard Worker     // Fails on Nexus 5X due to a driver bug. http://anglebug.com/42260422
8265*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
8266*8975f5c5SAndroid Build Coastguard Worker 
8267*8975f5c5SAndroid Build Coastguard Worker     runSamplerInStructTest();
8268*8975f5c5SAndroid Build Coastguard Worker }
8269*8975f5c5SAndroid Build Coastguard Worker 
8270*8975f5c5SAndroid Build Coastguard Worker // Make sure that there isn't a name conflict between sampler extracted from a struct and a
8271*8975f5c5SAndroid Build Coastguard Worker // similarly named uniform.
TEST_P(SamplerInStructAndOtherVariableTest,SamplerInStructAndOtherVariable)8272*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplerInStructAndOtherVariableTest, SamplerInStructAndOtherVariable)
8273*8975f5c5SAndroid Build Coastguard Worker {
8274*8975f5c5SAndroid Build Coastguard Worker     runSamplerInStructTest();
8275*8975f5c5SAndroid Build Coastguard Worker }
8276*8975f5c5SAndroid Build Coastguard Worker 
8277*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_texture_filter_anisotropic
8278*8975f5c5SAndroid Build Coastguard Worker class TextureAnisotropyTest : public Texture2DTest
8279*8975f5c5SAndroid Build Coastguard Worker {
8280*8975f5c5SAndroid Build Coastguard Worker   protected:
uploadTexture()8281*8975f5c5SAndroid Build Coastguard Worker     void uploadTexture()
8282*8975f5c5SAndroid Build Coastguard Worker     {
8283*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
8284*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
8285*8975f5c5SAndroid Build Coastguard Worker         GLColor texDataRed[1] = {GLColor::red};
8286*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed);
8287*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
8288*8975f5c5SAndroid Build Coastguard Worker     }
8289*8975f5c5SAndroid Build Coastguard Worker };
8290*8975f5c5SAndroid Build Coastguard Worker 
8291*8975f5c5SAndroid Build Coastguard Worker // Tests that setting anisotropic filtering doesn't cause failures at draw time.
TEST_P(TextureAnisotropyTest,AnisotropyFunctional)8292*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureAnisotropyTest, AnisotropyFunctional)
8293*8975f5c5SAndroid Build Coastguard Worker {
8294*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_filter_anisotropic"));
8295*8975f5c5SAndroid Build Coastguard Worker 
8296*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8297*8975f5c5SAndroid Build Coastguard Worker 
8298*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8299*8975f5c5SAndroid Build Coastguard Worker 
8300*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8301*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8302*8975f5c5SAndroid Build Coastguard Worker     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f);
8303*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8304*8975f5c5SAndroid Build Coastguard Worker 
8305*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8306*8975f5c5SAndroid Build Coastguard Worker 
8307*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
8308*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
8309*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::red);
8310*8975f5c5SAndroid Build Coastguard Worker }
8311*8975f5c5SAndroid Build Coastguard Worker 
8312*8975f5c5SAndroid Build Coastguard Worker // GL_OES_texture_border_clamp
8313*8975f5c5SAndroid Build Coastguard Worker class TextureBorderClampTest : public Texture2DTest
8314*8975f5c5SAndroid Build Coastguard Worker {
8315*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureBorderClampTest()8316*8975f5c5SAndroid Build Coastguard Worker     TextureBorderClampTest() : Texture2DTest() {}
8317*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()8318*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
8319*8975f5c5SAndroid Build Coastguard Worker     {
8320*8975f5c5SAndroid Build Coastguard Worker         return
8321*8975f5c5SAndroid Build Coastguard Worker             R"(precision highp float;
8322*8975f5c5SAndroid Build Coastguard Worker             attribute vec4 position;
8323*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
8324*8975f5c5SAndroid Build Coastguard Worker 
8325*8975f5c5SAndroid Build Coastguard Worker             void main()
8326*8975f5c5SAndroid Build Coastguard Worker             {
8327*8975f5c5SAndroid Build Coastguard Worker                 gl_Position = vec4(position.xy, 0.0, 1.0);
8328*8975f5c5SAndroid Build Coastguard Worker                 // texcoords in [-0.5, 1.5]
8329*8975f5c5SAndroid Build Coastguard Worker                 texcoord = (position.xy) + 0.5;
8330*8975f5c5SAndroid Build Coastguard Worker             })";
8331*8975f5c5SAndroid Build Coastguard Worker     }
8332*8975f5c5SAndroid Build Coastguard Worker 
uploadTexture()8333*8975f5c5SAndroid Build Coastguard Worker     void uploadTexture()
8334*8975f5c5SAndroid Build Coastguard Worker     {
8335*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
8336*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
8337*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor> texDataRed(1, GLColor::red);
8338*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
8339*8975f5c5SAndroid Build Coastguard Worker                      texDataRed.data());
8340*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
8341*8975f5c5SAndroid Build Coastguard Worker     }
8342*8975f5c5SAndroid Build Coastguard Worker 
testFormat(GLenum format,GLenum type,GLColor32F borderColor)8343*8975f5c5SAndroid Build Coastguard Worker     void testFormat(GLenum format, GLenum type, GLColor32F borderColor)
8344*8975f5c5SAndroid Build Coastguard Worker     {
8345*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
8346*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
8347*8975f5c5SAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &borderColor.R);
8348*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8349*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8350*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8351*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8352*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, format, 2, 2, 0, format, type, nullptr);
8353*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
8354*8975f5c5SAndroid Build Coastguard Worker     }
8355*8975f5c5SAndroid Build Coastguard Worker 
testCompressedFormat(GLenum format,GLsizei size,GLColor32F borderColor)8356*8975f5c5SAndroid Build Coastguard Worker     void testCompressedFormat(GLenum format, GLsizei size, GLColor32F borderColor)
8357*8975f5c5SAndroid Build Coastguard Worker     {
8358*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
8359*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
8360*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
8361*8975f5c5SAndroid Build Coastguard Worker         glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &borderColor.R);
8362*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8363*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8364*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8365*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8366*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, 4, 4, 0, size, nullptr);
8367*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
8368*8975f5c5SAndroid Build Coastguard Worker     }
8369*8975f5c5SAndroid Build Coastguard Worker };
8370*8975f5c5SAndroid Build Coastguard Worker 
8371*8975f5c5SAndroid Build Coastguard Worker // Test if the color set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the texture in
8372*8975f5c5SAndroid Build Coastguard Worker // GL_CLAMP_TO_BORDER wrap mode (set with glTexParameter).
TEST_P(TextureBorderClampTest,TextureBorderClampFunctional)8373*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampFunctional)
8374*8975f5c5SAndroid Build Coastguard Worker {
8375*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8376*8975f5c5SAndroid Build Coastguard Worker 
8377*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8378*8975f5c5SAndroid Build Coastguard Worker 
8379*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8380*8975f5c5SAndroid Build Coastguard Worker 
8381*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8382*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8383*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8384*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8385*8975f5c5SAndroid Build Coastguard Worker     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
8386*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8387*8975f5c5SAndroid Build Coastguard Worker 
8388*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8389*8975f5c5SAndroid Build Coastguard Worker 
8390*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
8391*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8392*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
8393*8975f5c5SAndroid Build Coastguard Worker }
8394*8975f5c5SAndroid Build Coastguard Worker 
8395*8975f5c5SAndroid Build Coastguard Worker // Test reading back GL_TEXTURE_BORDER_COLOR by glGetTexParameter.
TEST_P(TextureBorderClampTest,TextureBorderClampFunctional2)8396*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampFunctional2)
8397*8975f5c5SAndroid Build Coastguard Worker {
8398*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8399*8975f5c5SAndroid Build Coastguard Worker 
8400*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8401*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
8402*8975f5c5SAndroid Build Coastguard Worker 
8403*8975f5c5SAndroid Build Coastguard Worker     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
8404*8975f5c5SAndroid Build Coastguard Worker 
8405*8975f5c5SAndroid Build Coastguard Worker     GLint colorFixedPoint[4] = {0};
8406*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorFixedPoint);
8407*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint colorGreenFixedPoint[4] = {0, std::numeric_limits<GLint>::max(), 0,
8408*8975f5c5SAndroid Build Coastguard Worker                                                std::numeric_limits<GLint>::max()};
8409*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[0], colorGreenFixedPoint[0]);
8410*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[1], colorGreenFixedPoint[1]);
8411*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[2], colorGreenFixedPoint[2]);
8412*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[3], colorGreenFixedPoint[3]);
8413*8975f5c5SAndroid Build Coastguard Worker 
8414*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint colorBlueFixedPoint[4] = {0, 0, std::numeric_limits<GLint>::max(),
8415*8975f5c5SAndroid Build Coastguard Worker                                               std::numeric_limits<GLint>::max()};
8416*8975f5c5SAndroid Build Coastguard Worker     glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorBlueFixedPoint);
8417*8975f5c5SAndroid Build Coastguard Worker 
8418*8975f5c5SAndroid Build Coastguard Worker     GLfloat color[4] = {0.0f};
8419*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);
8420*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[0], kFloatBlue.R);
8421*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[1], kFloatBlue.G);
8422*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[2], kFloatBlue.B);
8423*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[3], kFloatBlue.A);
8424*8975f5c5SAndroid Build Coastguard Worker }
8425*8975f5c5SAndroid Build Coastguard Worker 
8426*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter validation at glTexParameter.
TEST_P(TextureBorderClampTest,TextureBorderClampValidation)8427*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampValidation)
8428*8975f5c5SAndroid Build Coastguard Worker {
8429*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8430*8975f5c5SAndroid Build Coastguard Worker 
8431*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8432*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
8433*8975f5c5SAndroid Build Coastguard Worker 
8434*8975f5c5SAndroid Build Coastguard Worker     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 1.0f);
8435*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
8436*8975f5c5SAndroid Build Coastguard Worker 
8437*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, std::numeric_limits<GLint>::max());
8438*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
8439*8975f5c5SAndroid Build Coastguard Worker 
8440*8975f5c5SAndroid Build Coastguard Worker     glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
8441*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
8442*8975f5c5SAndroid Build Coastguard Worker 
8443*8975f5c5SAndroid Build Coastguard Worker     GLint colorInt[4] = {0};
8444*8975f5c5SAndroid Build Coastguard Worker     glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, colorInt);
8445*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
8446*8975f5c5SAndroid Build Coastguard Worker 
8447*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
8448*8975f5c5SAndroid Build Coastguard Worker     {
8449*8975f5c5SAndroid Build Coastguard Worker         glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
8450*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8451*8975f5c5SAndroid Build Coastguard Worker         glGetTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
8452*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8453*8975f5c5SAndroid Build Coastguard Worker 
8454*8975f5c5SAndroid Build Coastguard Worker         GLuint colorUInt[4] = {0};
8455*8975f5c5SAndroid Build Coastguard Worker         glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
8456*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8457*8975f5c5SAndroid Build Coastguard Worker         glGetTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
8458*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8459*8975f5c5SAndroid Build Coastguard Worker 
8460*8975f5c5SAndroid Build Coastguard Worker         GLSampler sampler;
8461*8975f5c5SAndroid Build Coastguard Worker         glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
8462*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8463*8975f5c5SAndroid Build Coastguard Worker         glGetSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
8464*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8465*8975f5c5SAndroid Build Coastguard Worker 
8466*8975f5c5SAndroid Build Coastguard Worker         glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
8467*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8468*8975f5c5SAndroid Build Coastguard Worker         glGetSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
8469*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8470*8975f5c5SAndroid Build Coastguard Worker     }
8471*8975f5c5SAndroid Build Coastguard Worker }
8472*8975f5c5SAndroid Build Coastguard Worker 
8473*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with unorm formats.
TEST_P(TextureBorderClampTest,TextureBorderClampUnorm8)8474*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampUnorm8)
8475*8975f5c5SAndroid Build Coastguard Worker {
8476*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8477*8975f5c5SAndroid Build Coastguard Worker 
8478*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8479*8975f5c5SAndroid Build Coastguard Worker 
8480*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8481*8975f5c5SAndroid Build Coastguard Worker 
8482*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_ALPHA, GL_UNSIGNED_BYTE, kBorder);
8483*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 16), 1);
8484*8975f5c5SAndroid Build Coastguard Worker 
8485*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RGB, GL_UNSIGNED_BYTE, kBorder);
8486*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 255), 1);
8487*8975f5c5SAndroid Build Coastguard Worker 
8488*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RGBA, GL_UNSIGNED_BYTE, kBorder);
8489*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8490*8975f5c5SAndroid Build Coastguard Worker 
8491*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_LUMINANCE, GL_UNSIGNED_BYTE, kBorder);
8492*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 255), 1);
8493*8975f5c5SAndroid Build Coastguard Worker 
8494*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, kBorder);
8495*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 16), 1);
8496*8975f5c5SAndroid Build Coastguard Worker }
8497*8975f5c5SAndroid Build Coastguard Worker 
8498*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with sRGB formats.
TEST_P(TextureBorderClampTest,TextureBorderClampSrgb)8499*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampSrgb)
8500*8975f5c5SAndroid Build Coastguard Worker {
8501*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8502*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB"));
8503*8975f5c5SAndroid Build Coastguard Worker 
8504*8975f5c5SAndroid Build Coastguard Worker     // AMD D3D9 drivers always sample sRGB formats with (0, 0, 0, 0) border color, won't fix.
8505*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9());
8506*8975f5c5SAndroid Build Coastguard Worker 
8507*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8508*8975f5c5SAndroid Build Coastguard Worker 
8509*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8510*8975f5c5SAndroid Build Coastguard Worker 
8511*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_SRGB_EXT, GL_UNSIGNED_BYTE, kBorder);
8512*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 255), 1);
8513*8975f5c5SAndroid Build Coastguard Worker 
8514*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, kBorder);
8515*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8516*8975f5c5SAndroid Build Coastguard Worker }
8517*8975f5c5SAndroid Build Coastguard Worker 
8518*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with half-float formats.
TEST_P(TextureBorderClampTest,TextureBorderClampFloat16)8519*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampFloat16)
8520*8975f5c5SAndroid Build Coastguard Worker {
8521*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8522*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
8523*8975f5c5SAndroid Build Coastguard Worker 
8524*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8525*8975f5c5SAndroid Build Coastguard Worker 
8526*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8527*8975f5c5SAndroid Build Coastguard Worker 
8528*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_ALPHA, GL_HALF_FLOAT_OES, kBorder);
8529*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 16), 1);
8530*8975f5c5SAndroid Build Coastguard Worker 
8531*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RGB, GL_HALF_FLOAT_OES, kBorder);
8532*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 255), 1);
8533*8975f5c5SAndroid Build Coastguard Worker 
8534*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RGBA, GL_HALF_FLOAT_OES, kBorder);
8535*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8536*8975f5c5SAndroid Build Coastguard Worker 
8537*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_LUMINANCE, GL_HALF_FLOAT_OES, kBorder);
8538*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 255), 1);
8539*8975f5c5SAndroid Build Coastguard Worker 
8540*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, kBorder);
8541*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 16), 1);
8542*8975f5c5SAndroid Build Coastguard Worker }
8543*8975f5c5SAndroid Build Coastguard Worker 
8544*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with float formats.
TEST_P(TextureBorderClampTest,TextureBorderClampFloat32)8545*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampFloat32)
8546*8975f5c5SAndroid Build Coastguard Worker {
8547*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8548*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
8549*8975f5c5SAndroid Build Coastguard Worker 
8550*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8551*8975f5c5SAndroid Build Coastguard Worker 
8552*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8553*8975f5c5SAndroid Build Coastguard Worker 
8554*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_ALPHA, GL_FLOAT, kBorder);
8555*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 16), 1);
8556*8975f5c5SAndroid Build Coastguard Worker 
8557*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RGB, GL_FLOAT, kBorder);
8558*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 255), 1);
8559*8975f5c5SAndroid Build Coastguard Worker 
8560*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RGBA, GL_FLOAT, kBorder);
8561*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8562*8975f5c5SAndroid Build Coastguard Worker 
8563*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_LUMINANCE, GL_FLOAT, kBorder);
8564*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 255), 1);
8565*8975f5c5SAndroid Build Coastguard Worker 
8566*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_LUMINANCE_ALPHA, GL_FLOAT, kBorder);
8567*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 16), 1);
8568*8975f5c5SAndroid Build Coastguard Worker }
8569*8975f5c5SAndroid Build Coastguard Worker 
8570*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with red and red-green formats.
TEST_P(TextureBorderClampTest,TextureBorderClampRG)8571*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampRG)
8572*8975f5c5SAndroid Build Coastguard Worker {
8573*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8574*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
8575*8975f5c5SAndroid Build Coastguard Worker 
8576*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8577*8975f5c5SAndroid Build Coastguard Worker 
8578*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8579*8975f5c5SAndroid Build Coastguard Worker 
8580*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RED_EXT, GL_UNSIGNED_BYTE, kBorder);
8581*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 0, 0, 255), 1);
8582*8975f5c5SAndroid Build Coastguard Worker 
8583*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_RG_EXT, GL_UNSIGNED_BYTE, kBorder);
8584*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 0, 255), 1);
8585*8975f5c5SAndroid Build Coastguard Worker 
8586*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_texture_half_float"))
8587*8975f5c5SAndroid Build Coastguard Worker     {
8588*8975f5c5SAndroid Build Coastguard Worker         testFormat(GL_RED_EXT, GL_HALF_FLOAT_OES, kBorder);
8589*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 0, 0, 255), 1);
8590*8975f5c5SAndroid Build Coastguard Worker 
8591*8975f5c5SAndroid Build Coastguard Worker         testFormat(GL_RG_EXT, GL_HALF_FLOAT_OES, kBorder);
8592*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 0, 255), 1);
8593*8975f5c5SAndroid Build Coastguard Worker     }
8594*8975f5c5SAndroid Build Coastguard Worker 
8595*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_texture_float"))
8596*8975f5c5SAndroid Build Coastguard Worker     {
8597*8975f5c5SAndroid Build Coastguard Worker         testFormat(GL_RED_EXT, GL_FLOAT, kBorder);
8598*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 0, 0, 255), 1);
8599*8975f5c5SAndroid Build Coastguard Worker 
8600*8975f5c5SAndroid Build Coastguard Worker         testFormat(GL_RG_EXT, GL_FLOAT, kBorder);
8601*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 0, 255), 1);
8602*8975f5c5SAndroid Build Coastguard Worker     }
8603*8975f5c5SAndroid Build Coastguard Worker }
8604*8975f5c5SAndroid Build Coastguard Worker 
8605*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with DXT1 formats.
TEST_P(TextureBorderClampTest,TextureBorderClampDXT1)8606*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampDXT1)
8607*8975f5c5SAndroid Build Coastguard Worker {
8608*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8609*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
8610*8975f5c5SAndroid Build Coastguard Worker 
8611*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8612*8975f5c5SAndroid Build Coastguard Worker 
8613*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8614*8975f5c5SAndroid Build Coastguard Worker 
8615*8975f5c5SAndroid Build Coastguard Worker     testCompressedFormat(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, kBorder);
8616*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 255), 1);
8617*8975f5c5SAndroid Build Coastguard Worker 
8618*8975f5c5SAndroid Build Coastguard Worker     testCompressedFormat(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, kBorder);
8619*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8620*8975f5c5SAndroid Build Coastguard Worker }
8621*8975f5c5SAndroid Build Coastguard Worker 
8622*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with DXT1 sRGB formats.
TEST_P(TextureBorderClampTest,TextureBorderClampDXT1Srgb)8623*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, TextureBorderClampDXT1Srgb)
8624*8975f5c5SAndroid Build Coastguard Worker {
8625*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8626*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc_srgb"));
8627*8975f5c5SAndroid Build Coastguard Worker 
8628*8975f5c5SAndroid Build Coastguard Worker     // AMD D3D9 drivers always sample sRGB formats with (0, 0, 0, 0) border color, won't fix.
8629*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9());
8630*8975f5c5SAndroid Build Coastguard Worker 
8631*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8632*8975f5c5SAndroid Build Coastguard Worker 
8633*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8634*8975f5c5SAndroid Build Coastguard Worker 
8635*8975f5c5SAndroid Build Coastguard Worker     testCompressedFormat(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 8, kBorder);
8636*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 255), 1);
8637*8975f5c5SAndroid Build Coastguard Worker 
8638*8975f5c5SAndroid Build Coastguard Worker     testCompressedFormat(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 8, kBorder);
8639*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8640*8975f5c5SAndroid Build Coastguard Worker }
8641*8975f5c5SAndroid Build Coastguard Worker 
8642*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter with texture redefinition.
TEST_P(TextureBorderClampTest,Redefinition)8643*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTest, Redefinition)
8644*8975f5c5SAndroid Build Coastguard Worker {
8645*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8646*8975f5c5SAndroid Build Coastguard Worker 
8647*8975f5c5SAndroid Build Coastguard Worker     GLColor32F kBorder = {0.5f, 0.25f, 0.125f, 0.0625f};
8648*8975f5c5SAndroid Build Coastguard Worker 
8649*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8650*8975f5c5SAndroid Build Coastguard Worker 
8651*8975f5c5SAndroid Build Coastguard Worker     testFormat(GL_ALPHA, GL_UNSIGNED_BYTE, kBorder);
8652*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 16), 1);
8653*8975f5c5SAndroid Build Coastguard Worker 
8654*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 2, 2, 0, GL_LUMINANCE_ALPHA,
8655*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
8656*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8657*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 128, 128, 16), 1);
8658*8975f5c5SAndroid Build Coastguard Worker 
8659*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
8660*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8661*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(128, 64, 32, 16), 1);
8662*8975f5c5SAndroid Build Coastguard Worker }
8663*8975f5c5SAndroid Build Coastguard Worker 
8664*8975f5c5SAndroid Build Coastguard Worker class TextureBorderClampTestES3 : public TextureBorderClampTest
8665*8975f5c5SAndroid Build Coastguard Worker {
8666*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureBorderClampTestES3()8667*8975f5c5SAndroid Build Coastguard Worker     TextureBorderClampTestES3() : TextureBorderClampTest() {}
8668*8975f5c5SAndroid Build Coastguard Worker };
8669*8975f5c5SAndroid Build Coastguard Worker 
8670*8975f5c5SAndroid Build Coastguard Worker // Test if the color set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the texture in
8671*8975f5c5SAndroid Build Coastguard Worker // GL_CLAMP_TO_BORDER wrap mode (set with glSamplerParameter).
TEST_P(TextureBorderClampTestES3,TextureBorderClampES3Functional)8672*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Functional)
8673*8975f5c5SAndroid Build Coastguard Worker {
8674*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8675*8975f5c5SAndroid Build Coastguard Worker 
8676*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8677*8975f5c5SAndroid Build Coastguard Worker 
8678*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8679*8975f5c5SAndroid Build Coastguard Worker 
8680*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
8681*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
8682*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8683*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8684*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8685*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8686*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
8687*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8688*8975f5c5SAndroid Build Coastguard Worker 
8689*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8690*8975f5c5SAndroid Build Coastguard Worker 
8691*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
8692*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8693*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
8694*8975f5c5SAndroid Build Coastguard Worker }
8695*8975f5c5SAndroid Build Coastguard Worker 
8696*8975f5c5SAndroid Build Coastguard Worker // Test reading back GL_TEXTURE_BORDER_COLOR by glGetSamplerParameter.
TEST_P(TextureBorderClampTestES3,TextureBorderClampES3Functional2)8697*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Functional2)
8698*8975f5c5SAndroid Build Coastguard Worker {
8699*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8700*8975f5c5SAndroid Build Coastguard Worker 
8701*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8702*8975f5c5SAndroid Build Coastguard Worker 
8703*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
8704*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
8705*8975f5c5SAndroid Build Coastguard Worker 
8706*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, &kFloatGreen.R);
8707*8975f5c5SAndroid Build Coastguard Worker 
8708*8975f5c5SAndroid Build Coastguard Worker     GLint colorFixedPoint[4] = {0};
8709*8975f5c5SAndroid Build Coastguard Worker     glGetSamplerParameteriv(sampler, GL_TEXTURE_BORDER_COLOR, colorFixedPoint);
8710*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint colorGreenFixedPoint[4] = {0, std::numeric_limits<GLint>::max(), 0,
8711*8975f5c5SAndroid Build Coastguard Worker                                                std::numeric_limits<GLint>::max()};
8712*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[0], colorGreenFixedPoint[0]);
8713*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[1], colorGreenFixedPoint[1]);
8714*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[2], colorGreenFixedPoint[2]);
8715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorFixedPoint[3], colorGreenFixedPoint[3]);
8716*8975f5c5SAndroid Build Coastguard Worker 
8717*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint colorBlueFixedPoint[4] = {0, 0, std::numeric_limits<GLint>::max(),
8718*8975f5c5SAndroid Build Coastguard Worker                                               std::numeric_limits<GLint>::max()};
8719*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteriv(sampler, GL_TEXTURE_BORDER_COLOR, colorBlueFixedPoint);
8720*8975f5c5SAndroid Build Coastguard Worker 
8721*8975f5c5SAndroid Build Coastguard Worker     GLfloat color[4] = {0.0f};
8722*8975f5c5SAndroid Build Coastguard Worker     glGetSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, color);
8723*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[0], kFloatBlue.R);
8724*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[1], kFloatBlue.G);
8725*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[2], kFloatBlue.B);
8726*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(color[3], kFloatBlue.A);
8727*8975f5c5SAndroid Build Coastguard Worker 
8728*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint colorSomewhatRedInt[4] = {500000, 0, 0, std::numeric_limits<GLint>::max()};
8729*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorSomewhatRedInt);
8730*8975f5c5SAndroid Build Coastguard Worker     GLint colorInt[4] = {0};
8731*8975f5c5SAndroid Build Coastguard Worker     glGetSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorInt);
8732*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[0], colorSomewhatRedInt[0]);
8733*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[1], colorSomewhatRedInt[1]);
8734*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[2], colorSomewhatRedInt[2]);
8735*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[3], colorSomewhatRedInt[3]);
8736*8975f5c5SAndroid Build Coastguard Worker 
8737*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint colorSomewhatRedUInt[4] = {500000, 0, 0, std::numeric_limits<GLuint>::max()};
8738*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorSomewhatRedUInt);
8739*8975f5c5SAndroid Build Coastguard Worker     GLuint colorUInt[4] = {0};
8740*8975f5c5SAndroid Build Coastguard Worker     glGetSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, colorUInt);
8741*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[0], colorSomewhatRedUInt[0]);
8742*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[1], colorSomewhatRedUInt[1]);
8743*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[2], colorSomewhatRedUInt[2]);
8744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[3], colorSomewhatRedUInt[3]);
8745*8975f5c5SAndroid Build Coastguard Worker 
8746*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
8747*8975f5c5SAndroid Build Coastguard Worker 
8748*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint colorSomewhatGreenInt[4] = {0, 500000, 0, std::numeric_limits<GLint>::max()};
8749*8975f5c5SAndroid Build Coastguard Worker     glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorSomewhatGreenInt);
8750*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorInt);
8751*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[0], colorSomewhatGreenInt[0]);
8752*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[1], colorSomewhatGreenInt[1]);
8753*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[2], colorSomewhatGreenInt[2]);
8754*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorInt[3], colorSomewhatGreenInt[3]);
8755*8975f5c5SAndroid Build Coastguard Worker 
8756*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint colorSomewhatGreenUInt[4] = {0, 500000, 0, std::numeric_limits<GLuint>::max()};
8757*8975f5c5SAndroid Build Coastguard Worker     glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorSomewhatGreenUInt);
8758*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, colorUInt);
8759*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[0], colorSomewhatGreenUInt[0]);
8760*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[1], colorSomewhatGreenUInt[1]);
8761*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[2], colorSomewhatGreenUInt[2]);
8762*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(colorUInt[3], colorSomewhatGreenUInt[3]);
8763*8975f5c5SAndroid Build Coastguard Worker }
8764*8975f5c5SAndroid Build Coastguard Worker 
8765*8975f5c5SAndroid Build Coastguard Worker // Test GL_TEXTURE_BORDER_COLOR parameter validation at glSamplerParameter.
TEST_P(TextureBorderClampTestES3,TextureBorderClampES3Validation)8766*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTestES3, TextureBorderClampES3Validation)
8767*8975f5c5SAndroid Build Coastguard Worker {
8768*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8769*8975f5c5SAndroid Build Coastguard Worker 
8770*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8771*8975f5c5SAndroid Build Coastguard Worker 
8772*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
8773*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
8774*8975f5c5SAndroid Build Coastguard Worker 
8775*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterf(sampler, GL_TEXTURE_BORDER_COLOR, 1.0f);
8776*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
8777*8975f5c5SAndroid Build Coastguard Worker 
8778*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, std::numeric_limits<GLint>::max());
8779*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
8780*8975f5c5SAndroid Build Coastguard Worker }
8781*8975f5c5SAndroid Build Coastguard Worker 
8782*8975f5c5SAndroid Build Coastguard Worker // Test that format-specific adjustments are applied
8783*8975f5c5SAndroid Build Coastguard Worker // when the border color type does not match the texture type.
TEST_P(TextureBorderClampTestES3,TextureBorderTypeMismatch)8784*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampTestES3, TextureBorderTypeMismatch)
8785*8975f5c5SAndroid Build Coastguard Worker {
8786*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8787*8975f5c5SAndroid Build Coastguard Worker 
8788*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
8789*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
8790*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8791*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8792*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8793*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8794*8975f5c5SAndroid Build Coastguard Worker 
8795*8975f5c5SAndroid Build Coastguard Worker     GLColor32UI kBorder = {1, 2, 3, 0};
8796*8975f5c5SAndroid Build Coastguard Worker     glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &kBorder.R);
8797*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8798*8975f5c5SAndroid Build Coastguard Worker 
8799*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8800*8975f5c5SAndroid Build Coastguard Worker 
8801*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
8802*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8803*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
8804*8975f5c5SAndroid Build Coastguard Worker }
8805*8975f5c5SAndroid Build Coastguard Worker 
8806*8975f5c5SAndroid Build Coastguard Worker class TextureBorderClampIntegerTestES3 : public Texture2DTest
8807*8975f5c5SAndroid Build Coastguard Worker {
8808*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureBorderClampIntegerTestES3()8809*8975f5c5SAndroid Build Coastguard Worker     TextureBorderClampIntegerTestES3() : Texture2DTest(), isUnsignedIntTest(false) {}
8810*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()8811*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
8812*8975f5c5SAndroid Build Coastguard Worker     {
8813*8975f5c5SAndroid Build Coastguard Worker         return
8814*8975f5c5SAndroid Build Coastguard Worker             R"(#version 300 es
8815*8975f5c5SAndroid Build Coastguard Worker             out vec2 texcoord;
8816*8975f5c5SAndroid Build Coastguard Worker             in vec4 position;
8817*8975f5c5SAndroid Build Coastguard Worker 
8818*8975f5c5SAndroid Build Coastguard Worker             void main()
8819*8975f5c5SAndroid Build Coastguard Worker             {
8820*8975f5c5SAndroid Build Coastguard Worker                 gl_Position = vec4(position.xy, 0.0, 1.0);
8821*8975f5c5SAndroid Build Coastguard Worker                 // texcoords in [-0.5, 1.5]
8822*8975f5c5SAndroid Build Coastguard Worker                 texcoord = (position.xy) + 0.5;
8823*8975f5c5SAndroid Build Coastguard Worker             })";
8824*8975f5c5SAndroid Build Coastguard Worker     }
8825*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()8826*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
8827*8975f5c5SAndroid Build Coastguard Worker     {
8828*8975f5c5SAndroid Build Coastguard Worker         if (isUnsignedIntTest)
8829*8975f5c5SAndroid Build Coastguard Worker         {
8830*8975f5c5SAndroid Build Coastguard Worker             return "#version 300 es\n"
8831*8975f5c5SAndroid Build Coastguard Worker                    "precision highp float;\n"
8832*8975f5c5SAndroid Build Coastguard Worker                    "uniform highp usampler2D tex;\n"
8833*8975f5c5SAndroid Build Coastguard Worker                    "in vec2 texcoord;\n"
8834*8975f5c5SAndroid Build Coastguard Worker                    "out vec4 fragColor;\n"
8835*8975f5c5SAndroid Build Coastguard Worker 
8836*8975f5c5SAndroid Build Coastguard Worker                    "void main()\n"
8837*8975f5c5SAndroid Build Coastguard Worker                    "{\n"
8838*8975f5c5SAndroid Build Coastguard Worker                    "vec4 red   = vec4(1.0, 0.0, 0.0, 1.0);\n"
8839*8975f5c5SAndroid Build Coastguard Worker                    "vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
8840*8975f5c5SAndroid Build Coastguard Worker                    "fragColor = (texture(tex, texcoord).r == 150u)"
8841*8975f5c5SAndroid Build Coastguard Worker                    "            ? green : red;\n"
8842*8975f5c5SAndroid Build Coastguard Worker                    "}\n";
8843*8975f5c5SAndroid Build Coastguard Worker         }
8844*8975f5c5SAndroid Build Coastguard Worker         else
8845*8975f5c5SAndroid Build Coastguard Worker         {
8846*8975f5c5SAndroid Build Coastguard Worker             return "#version 300 es\n"
8847*8975f5c5SAndroid Build Coastguard Worker                    "precision highp float;\n"
8848*8975f5c5SAndroid Build Coastguard Worker                    "uniform highp isampler2D tex;\n"
8849*8975f5c5SAndroid Build Coastguard Worker                    "in vec2 texcoord;\n"
8850*8975f5c5SAndroid Build Coastguard Worker                    "out vec4 fragColor;\n"
8851*8975f5c5SAndroid Build Coastguard Worker 
8852*8975f5c5SAndroid Build Coastguard Worker                    "void main()\n"
8853*8975f5c5SAndroid Build Coastguard Worker                    "{\n"
8854*8975f5c5SAndroid Build Coastguard Worker                    "vec4 red   = vec4(1.0, 0.0, 0.0, 1.0);\n"
8855*8975f5c5SAndroid Build Coastguard Worker                    "vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
8856*8975f5c5SAndroid Build Coastguard Worker                    "fragColor = (texture(tex, texcoord).r == -50)"
8857*8975f5c5SAndroid Build Coastguard Worker                    "            ? green : red;\n"
8858*8975f5c5SAndroid Build Coastguard Worker                    "}\n";
8859*8975f5c5SAndroid Build Coastguard Worker         }
8860*8975f5c5SAndroid Build Coastguard Worker     }
8861*8975f5c5SAndroid Build Coastguard Worker 
uploadTexture()8862*8975f5c5SAndroid Build Coastguard Worker     void uploadTexture()
8863*8975f5c5SAndroid Build Coastguard Worker     {
8864*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
8865*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
8866*8975f5c5SAndroid Build Coastguard Worker         if (isUnsignedIntTest)
8867*8975f5c5SAndroid Build Coastguard Worker         {
8868*8975f5c5SAndroid Build Coastguard Worker             std::vector<GLubyte> texData(4, 100);
8869*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 1, 1, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
8870*8975f5c5SAndroid Build Coastguard Worker                          texData.data());
8871*8975f5c5SAndroid Build Coastguard Worker         }
8872*8975f5c5SAndroid Build Coastguard Worker         else
8873*8975f5c5SAndroid Build Coastguard Worker         {
8874*8975f5c5SAndroid Build Coastguard Worker             std::vector<GLbyte> texData(4, 100);
8875*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, 1, 1, 0, GL_RGBA_INTEGER, GL_BYTE,
8876*8975f5c5SAndroid Build Coastguard Worker                          texData.data());
8877*8975f5c5SAndroid Build Coastguard Worker         }
8878*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
8879*8975f5c5SAndroid Build Coastguard Worker     }
8880*8975f5c5SAndroid Build Coastguard Worker 
8881*8975f5c5SAndroid Build Coastguard Worker     bool isUnsignedIntTest;
8882*8975f5c5SAndroid Build Coastguard Worker };
8883*8975f5c5SAndroid Build Coastguard Worker 
8884*8975f5c5SAndroid Build Coastguard Worker // Test if the integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the
8885*8975f5c5SAndroid Build Coastguard Worker // integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIivOES).
TEST_P(TextureBorderClampIntegerTestES3,TextureBorderClampInteger)8886*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampInteger)
8887*8975f5c5SAndroid Build Coastguard Worker {
8888*8975f5c5SAndroid Build Coastguard Worker     // Fails on Win10 FYI x64 Release (AMD RX 550). http://anglebug.com/40096617
8889*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
8890*8975f5c5SAndroid Build Coastguard Worker 
8891*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8892*8975f5c5SAndroid Build Coastguard Worker 
8893*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8894*8975f5c5SAndroid Build Coastguard Worker 
8895*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8896*8975f5c5SAndroid Build Coastguard Worker 
8897*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8898*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8899*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8900*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8901*8975f5c5SAndroid Build Coastguard Worker 
8902*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint borderColor[4] = {-50, -50, -50, -50};
8903*8975f5c5SAndroid Build Coastguard Worker     glTexParameterIivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
8904*8975f5c5SAndroid Build Coastguard Worker 
8905*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8906*8975f5c5SAndroid Build Coastguard Worker 
8907*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8908*8975f5c5SAndroid Build Coastguard Worker 
8909*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
8910*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8911*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
8912*8975f5c5SAndroid Build Coastguard Worker }
8913*8975f5c5SAndroid Build Coastguard Worker 
8914*8975f5c5SAndroid Build Coastguard Worker // Test if the integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside of the
8915*8975f5c5SAndroid Build Coastguard Worker // integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIivOES).
TEST_P(TextureBorderClampIntegerTestES3,TextureBorderClampInteger2)8916*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampInteger2)
8917*8975f5c5SAndroid Build Coastguard Worker {
8918*8975f5c5SAndroid Build Coastguard Worker     // Fails on Win10 FYI x64 Release (AMD RX 550). http://anglebug.com/40096617
8919*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
8920*8975f5c5SAndroid Build Coastguard Worker 
8921*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8922*8975f5c5SAndroid Build Coastguard Worker 
8923*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8924*8975f5c5SAndroid Build Coastguard Worker 
8925*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8926*8975f5c5SAndroid Build Coastguard Worker 
8927*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
8928*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
8929*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8930*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8931*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8932*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8933*8975f5c5SAndroid Build Coastguard Worker 
8934*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint borderColor[4] = {-50, -50, -50, -50};
8935*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterIivOES(sampler, GL_TEXTURE_BORDER_COLOR, borderColor);
8936*8975f5c5SAndroid Build Coastguard Worker 
8937*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8938*8975f5c5SAndroid Build Coastguard Worker 
8939*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8940*8975f5c5SAndroid Build Coastguard Worker 
8941*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
8942*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8943*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
8944*8975f5c5SAndroid Build Coastguard Worker }
8945*8975f5c5SAndroid Build Coastguard Worker 
8946*8975f5c5SAndroid Build Coastguard Worker // Test if the unsigned integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside
8947*8975f5c5SAndroid Build Coastguard Worker // of the unsigned integer texture in GL_CLAMP_TO_BORDER wrap mode (set with glTexParameterIuivOES).
TEST_P(TextureBorderClampIntegerTestES3,TextureBorderClampIntegerUnsigned)8948*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampIntegerUnsigned)
8949*8975f5c5SAndroid Build Coastguard Worker {
8950*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8951*8975f5c5SAndroid Build Coastguard Worker 
8952*8975f5c5SAndroid Build Coastguard Worker     isUnsignedIntTest = true;
8953*8975f5c5SAndroid Build Coastguard Worker 
8954*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8955*8975f5c5SAndroid Build Coastguard Worker 
8956*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8957*8975f5c5SAndroid Build Coastguard Worker 
8958*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8959*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8960*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8961*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8962*8975f5c5SAndroid Build Coastguard Worker 
8963*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint borderColor[4] = {150, 150, 150, 150};
8964*8975f5c5SAndroid Build Coastguard Worker     glTexParameterIuivOES(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
8965*8975f5c5SAndroid Build Coastguard Worker 
8966*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8967*8975f5c5SAndroid Build Coastguard Worker 
8968*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
8969*8975f5c5SAndroid Build Coastguard Worker 
8970*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
8971*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8972*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
8973*8975f5c5SAndroid Build Coastguard Worker }
8974*8975f5c5SAndroid Build Coastguard Worker 
8975*8975f5c5SAndroid Build Coastguard Worker // Test if the unsigned integer values set as GL_TEXTURE_BORDER_COLOR is used when sampling outside
8976*8975f5c5SAndroid Build Coastguard Worker // of the unsigned integer texture in GL_CLAMP_TO_BORDER wrap mode (set with
8977*8975f5c5SAndroid Build Coastguard Worker // glSamplerParameterIuivOES).
TEST_P(TextureBorderClampIntegerTestES3,TextureBorderClampIntegerUnsigned2)8978*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBorderClampIntegerTestES3, TextureBorderClampIntegerUnsigned2)
8979*8975f5c5SAndroid Build Coastguard Worker {
8980*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_border_clamp"));
8981*8975f5c5SAndroid Build Coastguard Worker 
8982*8975f5c5SAndroid Build Coastguard Worker     isUnsignedIntTest = true;
8983*8975f5c5SAndroid Build Coastguard Worker 
8984*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
8985*8975f5c5SAndroid Build Coastguard Worker 
8986*8975f5c5SAndroid Build Coastguard Worker     uploadTexture();
8987*8975f5c5SAndroid Build Coastguard Worker 
8988*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
8989*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
8990*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
8991*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
8992*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8993*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
8994*8975f5c5SAndroid Build Coastguard Worker 
8995*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint borderColor[4] = {150, 150, 150, 150};
8996*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameterIuivOES(sampler, GL_TEXTURE_BORDER_COLOR, borderColor);
8997*8975f5c5SAndroid Build Coastguard Worker 
8998*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
8999*8975f5c5SAndroid Build Coastguard Worker 
9000*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9001*8975f5c5SAndroid Build Coastguard Worker 
9002*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
9003*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
9004*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
9005*8975f5c5SAndroid Build Coastguard Worker }
9006*8975f5c5SAndroid Build Coastguard Worker 
9007*8975f5c5SAndroid Build Coastguard Worker // ~GL_OES_texture_border_clamp
9008*8975f5c5SAndroid Build Coastguard Worker 
9009*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_texture_mirror_clamp_to_edge
9010*8975f5c5SAndroid Build Coastguard Worker class TextureMirrorClampToEdgeTest : public Texture2DTest
9011*8975f5c5SAndroid Build Coastguard Worker {
9012*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureMirrorClampToEdgeTest()9013*8975f5c5SAndroid Build Coastguard Worker     TextureMirrorClampToEdgeTest() : Texture2DTest() {}
9014*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()9015*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
9016*8975f5c5SAndroid Build Coastguard Worker     {
9017*8975f5c5SAndroid Build Coastguard Worker         return R"(precision highp float;
9018*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
9019*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
9020*8975f5c5SAndroid Build Coastguard Worker 
9021*8975f5c5SAndroid Build Coastguard Worker void main()
9022*8975f5c5SAndroid Build Coastguard Worker {
9023*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
9024*8975f5c5SAndroid Build Coastguard Worker     texcoord = position.xy * 2.0;
9025*8975f5c5SAndroid Build Coastguard Worker })";
9026*8975f5c5SAndroid Build Coastguard Worker     }
9027*8975f5c5SAndroid Build Coastguard Worker 
uploadTexture(bool isInteger,bool isSigned,GLuint sampler)9028*8975f5c5SAndroid Build Coastguard Worker     void uploadTexture(bool isInteger, bool isSigned, GLuint sampler)
9029*8975f5c5SAndroid Build Coastguard Worker     {
9030*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
9031*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture2D);
9032*8975f5c5SAndroid Build Coastguard Worker         if (isInteger && isSigned)
9033*8975f5c5SAndroid Build Coastguard Worker         {
9034*8975f5c5SAndroid Build Coastguard Worker             const int8_t data[] = {0, 0, 0, -1, -1, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, -1};
9035*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, 2, 2, 0, GL_RGBA_INTEGER, GL_BYTE, data);
9036*8975f5c5SAndroid Build Coastguard Worker         }
9037*8975f5c5SAndroid Build Coastguard Worker         else if (isInteger)
9038*8975f5c5SAndroid Build Coastguard Worker         {
9039*8975f5c5SAndroid Build Coastguard Worker             const uint8_t data[] = {0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1};
9040*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 2, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
9041*8975f5c5SAndroid Build Coastguard Worker                          data);
9042*8975f5c5SAndroid Build Coastguard Worker         }
9043*8975f5c5SAndroid Build Coastguard Worker         else
9044*8975f5c5SAndroid Build Coastguard Worker         {
9045*8975f5c5SAndroid Build Coastguard Worker             const uint8_t data[] = {0, 0, 0, 255, 255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255};
9046*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
9047*8975f5c5SAndroid Build Coastguard Worker         }
9048*8975f5c5SAndroid Build Coastguard Worker 
9049*8975f5c5SAndroid Build Coastguard Worker         if (sampler != 0)
9050*8975f5c5SAndroid Build Coastguard Worker         {
9051*8975f5c5SAndroid Build Coastguard Worker             glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_MIRROR_CLAMP_TO_EDGE_EXT);
9052*8975f5c5SAndroid Build Coastguard Worker             glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_MIRROR_CLAMP_TO_EDGE_EXT);
9053*8975f5c5SAndroid Build Coastguard Worker             glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9054*8975f5c5SAndroid Build Coastguard Worker             glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9055*8975f5c5SAndroid Build Coastguard Worker         }
9056*8975f5c5SAndroid Build Coastguard Worker         else
9057*8975f5c5SAndroid Build Coastguard Worker         {
9058*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRROR_CLAMP_TO_EDGE_EXT);
9059*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRROR_CLAMP_TO_EDGE_EXT);
9060*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9061*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9062*8975f5c5SAndroid Build Coastguard Worker         }
9063*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9064*8975f5c5SAndroid Build Coastguard Worker     }
9065*8975f5c5SAndroid Build Coastguard Worker 
checkTextureSampling()9066*8975f5c5SAndroid Build Coastguard Worker     void checkTextureSampling()
9067*8975f5c5SAndroid Build Coastguard Worker     {
9068*8975f5c5SAndroid Build Coastguard Worker         auto screenX = [&](float x) { return getWindowWidth() * (x * 0.25 + 0.5); };
9069*8975f5c5SAndroid Build Coastguard Worker         auto screenY = [&](float y) { return getWindowHeight() * (y * 0.25 + 0.5); };
9070*8975f5c5SAndroid Build Coastguard Worker 
9071*8975f5c5SAndroid Build Coastguard Worker         // +S, +T
9072*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.25), screenY(0.25), GLColor::black);
9073*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.75), screenY(0.25), GLColor::red);
9074*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(1.50), screenY(0.25), GLColor::red);
9075*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.25), screenY(0.75), GLColor::green);
9076*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.25), screenY(1.50), GLColor::green);
9077*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.75), screenY(0.75), GLColor::blue);
9078*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(1.50), screenY(0.75), GLColor::blue);
9079*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.75), screenY(1.50), GLColor::blue);
9080*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(1.50), screenY(1.50), GLColor::blue);
9081*8975f5c5SAndroid Build Coastguard Worker 
9082*8975f5c5SAndroid Build Coastguard Worker         // -S, +T
9083*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.25), screenY(0.25), GLColor::black);
9084*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.75), screenY(0.25), GLColor::red);
9085*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-1.50), screenY(0.25), GLColor::red);
9086*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.25), screenY(0.75), GLColor::green);
9087*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.25), screenY(1.50), GLColor::green);
9088*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.75), screenY(0.75), GLColor::blue);
9089*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-1.50), screenY(0.75), GLColor::blue);
9090*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.75), screenY(1.50), GLColor::blue);
9091*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-1.50), screenY(1.50), GLColor::blue);
9092*8975f5c5SAndroid Build Coastguard Worker 
9093*8975f5c5SAndroid Build Coastguard Worker         // +S, -T
9094*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.25), screenY(-0.25), GLColor::black);
9095*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.75), screenY(-0.25), GLColor::red);
9096*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(1.50), screenY(-0.25), GLColor::red);
9097*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.25), screenY(-0.75), GLColor::green);
9098*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.25), screenY(-1.50), GLColor::green);
9099*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.75), screenY(-0.75), GLColor::blue);
9100*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(1.50), screenY(-0.75), GLColor::blue);
9101*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(0.75), screenY(-1.50), GLColor::blue);
9102*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(1.50), screenY(-1.50), GLColor::blue);
9103*8975f5c5SAndroid Build Coastguard Worker 
9104*8975f5c5SAndroid Build Coastguard Worker         // -S, -T
9105*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.25), screenY(-0.25), GLColor::black);
9106*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.75), screenY(-0.25), GLColor::red);
9107*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-1.50), screenY(-0.25), GLColor::red);
9108*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.25), screenY(-0.75), GLColor::green);
9109*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.25), screenY(-1.50), GLColor::green);
9110*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.75), screenY(-0.75), GLColor::blue);
9111*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-1.50), screenY(-0.75), GLColor::blue);
9112*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-0.75), screenY(-1.50), GLColor::blue);
9113*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(screenX(-1.50), screenY(-1.50), GLColor::blue);
9114*8975f5c5SAndroid Build Coastguard Worker     }
9115*8975f5c5SAndroid Build Coastguard Worker };
9116*8975f5c5SAndroid Build Coastguard Worker 
9117*8975f5c5SAndroid Build Coastguard Worker // Test that the texture is correctly mirrored in negative directions
9118*8975f5c5SAndroid Build Coastguard Worker // and clamped to edge pixels outside of the normalized range.
TEST_P(TextureMirrorClampToEdgeTest,TexParameter)9119*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMirrorClampToEdgeTest, TexParameter)
9120*8975f5c5SAndroid Build Coastguard Worker {
9121*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_mirror_clamp_to_edge"));
9122*8975f5c5SAndroid Build Coastguard Worker 
9123*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
9124*8975f5c5SAndroid Build Coastguard Worker     uploadTexture(false, false, 0);
9125*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9126*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9127*8975f5c5SAndroid Build Coastguard Worker 
9128*8975f5c5SAndroid Build Coastguard Worker     checkTextureSampling();
9129*8975f5c5SAndroid Build Coastguard Worker }
9130*8975f5c5SAndroid Build Coastguard Worker 
9131*8975f5c5SAndroid Build Coastguard Worker class TextureMirrorClampToEdgeTestES3 : public TextureMirrorClampToEdgeTest
9132*8975f5c5SAndroid Build Coastguard Worker {
9133*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureMirrorClampToEdgeTestES3()9134*8975f5c5SAndroid Build Coastguard Worker     TextureMirrorClampToEdgeTestES3() : TextureMirrorClampToEdgeTest() {}
9135*8975f5c5SAndroid Build Coastguard Worker };
9136*8975f5c5SAndroid Build Coastguard Worker 
9137*8975f5c5SAndroid Build Coastguard Worker // Test that the texture is correctly mirrored in negative directions and clamped
9138*8975f5c5SAndroid Build Coastguard Worker // to edge pixels outside of the normalized range with mode set via glSamplerParameter.
TEST_P(TextureMirrorClampToEdgeTestES3,SamplerParameter)9139*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMirrorClampToEdgeTestES3, SamplerParameter)
9140*8975f5c5SAndroid Build Coastguard Worker {
9141*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_mirror_clamp_to_edge"));
9142*8975f5c5SAndroid Build Coastguard Worker 
9143*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
9144*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
9145*8975f5c5SAndroid Build Coastguard Worker 
9146*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
9147*8975f5c5SAndroid Build Coastguard Worker     uploadTexture(false, false, sampler);
9148*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9149*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9150*8975f5c5SAndroid Build Coastguard Worker 
9151*8975f5c5SAndroid Build Coastguard Worker     checkTextureSampling();
9152*8975f5c5SAndroid Build Coastguard Worker }
9153*8975f5c5SAndroid Build Coastguard Worker 
9154*8975f5c5SAndroid Build Coastguard Worker class TextureMirrorClampToEdgeIntegerTestES3 : public TextureMirrorClampToEdgeTestES3
9155*8975f5c5SAndroid Build Coastguard Worker {
9156*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureMirrorClampToEdgeIntegerTestES3()9157*8975f5c5SAndroid Build Coastguard Worker     TextureMirrorClampToEdgeIntegerTestES3() : TextureMirrorClampToEdgeTestES3() {}
9158*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()9159*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
9160*8975f5c5SAndroid Build Coastguard Worker     {
9161*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
9162*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9163*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
9164*8975f5c5SAndroid Build Coastguard Worker out vec2 texcoord;
9165*8975f5c5SAndroid Build Coastguard Worker 
9166*8975f5c5SAndroid Build Coastguard Worker void main()
9167*8975f5c5SAndroid Build Coastguard Worker {
9168*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
9169*8975f5c5SAndroid Build Coastguard Worker     texcoord = position.xy * 2.0;
9170*8975f5c5SAndroid Build Coastguard Worker })";
9171*8975f5c5SAndroid Build Coastguard Worker     }
9172*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()9173*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
9174*8975f5c5SAndroid Build Coastguard Worker     {
9175*8975f5c5SAndroid Build Coastguard Worker         if (mIsSigned)
9176*8975f5c5SAndroid Build Coastguard Worker         {
9177*8975f5c5SAndroid Build Coastguard Worker             return R"(#version 300 es
9178*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9179*8975f5c5SAndroid Build Coastguard Worker uniform highp isampler2D tex;
9180*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
9181*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
9182*8975f5c5SAndroid Build Coastguard Worker void main() { fragColor = vec4(-texture(tex, texcoord)); })";
9183*8975f5c5SAndroid Build Coastguard Worker         }
9184*8975f5c5SAndroid Build Coastguard Worker         else
9185*8975f5c5SAndroid Build Coastguard Worker         {
9186*8975f5c5SAndroid Build Coastguard Worker             return R"(#version 300 es
9187*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9188*8975f5c5SAndroid Build Coastguard Worker uniform highp usampler2D tex;
9189*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
9190*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
9191*8975f5c5SAndroid Build Coastguard Worker void main() { fragColor = vec4(texture(tex, texcoord)); })";
9192*8975f5c5SAndroid Build Coastguard Worker         }
9193*8975f5c5SAndroid Build Coastguard Worker     }
9194*8975f5c5SAndroid Build Coastguard Worker 
9195*8975f5c5SAndroid Build Coastguard Worker     bool mIsSigned = false;
9196*8975f5c5SAndroid Build Coastguard Worker };
9197*8975f5c5SAndroid Build Coastguard Worker 
9198*8975f5c5SAndroid Build Coastguard Worker // Test that the texture is correctly mirrored in negative directions and clamped
9199*8975f5c5SAndroid Build Coastguard Worker // to edge pixels outside of the normalized range with mode set with glTexParameter.
TEST_P(TextureMirrorClampToEdgeIntegerTestES3,TexParameterSigned)9200*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMirrorClampToEdgeIntegerTestES3, TexParameterSigned)
9201*8975f5c5SAndroid Build Coastguard Worker {
9202*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_mirror_clamp_to_edge"));
9203*8975f5c5SAndroid Build Coastguard Worker 
9204*8975f5c5SAndroid Build Coastguard Worker     mIsSigned = true;
9205*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
9206*8975f5c5SAndroid Build Coastguard Worker     uploadTexture(true, true, 0);
9207*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9208*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9209*8975f5c5SAndroid Build Coastguard Worker 
9210*8975f5c5SAndroid Build Coastguard Worker     checkTextureSampling();
9211*8975f5c5SAndroid Build Coastguard Worker }
9212*8975f5c5SAndroid Build Coastguard Worker 
9213*8975f5c5SAndroid Build Coastguard Worker // Test that the texture is correctly mirrored in negative directions and clamped
9214*8975f5c5SAndroid Build Coastguard Worker // to edge pixels outside of the normalized range with mode set with glSamplerParameter.
TEST_P(TextureMirrorClampToEdgeIntegerTestES3,SamplerParameterSigned)9215*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMirrorClampToEdgeIntegerTestES3, SamplerParameterSigned)
9216*8975f5c5SAndroid Build Coastguard Worker {
9217*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_mirror_clamp_to_edge"));
9218*8975f5c5SAndroid Build Coastguard Worker 
9219*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
9220*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
9221*8975f5c5SAndroid Build Coastguard Worker 
9222*8975f5c5SAndroid Build Coastguard Worker     mIsSigned = true;
9223*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
9224*8975f5c5SAndroid Build Coastguard Worker     uploadTexture(true, true, sampler);
9225*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9226*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9227*8975f5c5SAndroid Build Coastguard Worker 
9228*8975f5c5SAndroid Build Coastguard Worker     checkTextureSampling();
9229*8975f5c5SAndroid Build Coastguard Worker }
9230*8975f5c5SAndroid Build Coastguard Worker 
9231*8975f5c5SAndroid Build Coastguard Worker // Test that the unsigned integer texture is correctly mirrored in negative directions and clamped
9232*8975f5c5SAndroid Build Coastguard Worker // to edge pixels outside of the normalized range with mode set with glTexParameter.
TEST_P(TextureMirrorClampToEdgeIntegerTestES3,TexParameterUnsigned)9233*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMirrorClampToEdgeIntegerTestES3, TexParameterUnsigned)
9234*8975f5c5SAndroid Build Coastguard Worker {
9235*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_mirror_clamp_to_edge"));
9236*8975f5c5SAndroid Build Coastguard Worker 
9237*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
9238*8975f5c5SAndroid Build Coastguard Worker     uploadTexture(true, false, 0);
9239*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9240*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9241*8975f5c5SAndroid Build Coastguard Worker 
9242*8975f5c5SAndroid Build Coastguard Worker     checkTextureSampling();
9243*8975f5c5SAndroid Build Coastguard Worker }
9244*8975f5c5SAndroid Build Coastguard Worker 
9245*8975f5c5SAndroid Build Coastguard Worker // Test that the unsigned integer texture is correctly mirrored in negative directions and clamped
9246*8975f5c5SAndroid Build Coastguard Worker // to edge pixels outside of the normalized range with mode set with glSamplerParameter.
TEST_P(TextureMirrorClampToEdgeIntegerTestES3,SamplerParameterUnsigned)9247*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMirrorClampToEdgeIntegerTestES3, SamplerParameterUnsigned)
9248*8975f5c5SAndroid Build Coastguard Worker {
9249*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_mirror_clamp_to_edge"));
9250*8975f5c5SAndroid Build Coastguard Worker 
9251*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
9252*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
9253*8975f5c5SAndroid Build Coastguard Worker 
9254*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
9255*8975f5c5SAndroid Build Coastguard Worker     uploadTexture(true, false, sampler);
9256*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9257*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9258*8975f5c5SAndroid Build Coastguard Worker 
9259*8975f5c5SAndroid Build Coastguard Worker     checkTextureSampling();
9260*8975f5c5SAndroid Build Coastguard Worker }
9261*8975f5c5SAndroid Build Coastguard Worker // ~GL_EXT_texture_mirror_clamp_to_edge
9262*8975f5c5SAndroid Build Coastguard Worker 
9263*8975f5c5SAndroid Build Coastguard Worker class TextureLimitsTest : public ANGLETest<>
9264*8975f5c5SAndroid Build Coastguard Worker {
9265*8975f5c5SAndroid Build Coastguard Worker   protected:
9266*8975f5c5SAndroid Build Coastguard Worker     struct RGBA8
9267*8975f5c5SAndroid Build Coastguard Worker     {
9268*8975f5c5SAndroid Build Coastguard Worker         uint8_t R, G, B, A;
9269*8975f5c5SAndroid Build Coastguard Worker     };
9270*8975f5c5SAndroid Build Coastguard Worker 
TextureLimitsTest()9271*8975f5c5SAndroid Build Coastguard Worker     TextureLimitsTest()
9272*8975f5c5SAndroid Build Coastguard Worker         : mProgram(0), mMaxVertexTextures(0), mMaxFragmentTextures(0), mMaxCombinedTextures(0)
9273*8975f5c5SAndroid Build Coastguard Worker     {
9274*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
9275*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
9276*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
9277*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
9278*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
9279*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
9280*8975f5c5SAndroid Build Coastguard Worker     }
9281*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()9282*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
9283*8975f5c5SAndroid Build Coastguard Worker     {
9284*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &mMaxVertexTextures);
9285*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mMaxFragmentTextures);
9286*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mMaxCombinedTextures);
9287*8975f5c5SAndroid Build Coastguard Worker 
9288*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9289*8975f5c5SAndroid Build Coastguard Worker     }
9290*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()9291*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
9292*8975f5c5SAndroid Build Coastguard Worker     {
9293*8975f5c5SAndroid Build Coastguard Worker         if (mProgram != 0)
9294*8975f5c5SAndroid Build Coastguard Worker         {
9295*8975f5c5SAndroid Build Coastguard Worker             glDeleteProgram(mProgram);
9296*8975f5c5SAndroid Build Coastguard Worker             mProgram = 0;
9297*8975f5c5SAndroid Build Coastguard Worker 
9298*8975f5c5SAndroid Build Coastguard Worker             if (!mTextures.empty())
9299*8975f5c5SAndroid Build Coastguard Worker             {
9300*8975f5c5SAndroid Build Coastguard Worker                 glDeleteTextures(static_cast<GLsizei>(mTextures.size()), &mTextures[0]);
9301*8975f5c5SAndroid Build Coastguard Worker             }
9302*8975f5c5SAndroid Build Coastguard Worker         }
9303*8975f5c5SAndroid Build Coastguard Worker     }
9304*8975f5c5SAndroid Build Coastguard Worker 
compileProgramWithTextureCounts(const std::string & vertexPrefix,GLint vertexTextureCount,GLint vertexActiveTextureCount,const std::string & fragPrefix,GLint fragmentTextureCount,GLint fragmentActiveTextureCount)9305*8975f5c5SAndroid Build Coastguard Worker     void compileProgramWithTextureCounts(const std::string &vertexPrefix,
9306*8975f5c5SAndroid Build Coastguard Worker                                          GLint vertexTextureCount,
9307*8975f5c5SAndroid Build Coastguard Worker                                          GLint vertexActiveTextureCount,
9308*8975f5c5SAndroid Build Coastguard Worker                                          const std::string &fragPrefix,
9309*8975f5c5SAndroid Build Coastguard Worker                                          GLint fragmentTextureCount,
9310*8975f5c5SAndroid Build Coastguard Worker                                          GLint fragmentActiveTextureCount)
9311*8975f5c5SAndroid Build Coastguard Worker     {
9312*8975f5c5SAndroid Build Coastguard Worker         std::stringstream vertexShaderStr;
9313*8975f5c5SAndroid Build Coastguard Worker         vertexShaderStr << "attribute vec2 position;\n"
9314*8975f5c5SAndroid Build Coastguard Worker                         << "varying vec4 color;\n"
9315*8975f5c5SAndroid Build Coastguard Worker                         << "varying vec2 texCoord;\n";
9316*8975f5c5SAndroid Build Coastguard Worker 
9317*8975f5c5SAndroid Build Coastguard Worker         for (GLint textureIndex = 0; textureIndex < vertexTextureCount; ++textureIndex)
9318*8975f5c5SAndroid Build Coastguard Worker         {
9319*8975f5c5SAndroid Build Coastguard Worker             vertexShaderStr << "uniform sampler2D " << vertexPrefix << textureIndex << ";\n";
9320*8975f5c5SAndroid Build Coastguard Worker         }
9321*8975f5c5SAndroid Build Coastguard Worker 
9322*8975f5c5SAndroid Build Coastguard Worker         vertexShaderStr << "void main() {\n"
9323*8975f5c5SAndroid Build Coastguard Worker                         << "  gl_Position = vec4(position, 0, 1);\n"
9324*8975f5c5SAndroid Build Coastguard Worker                         << "  texCoord = (position * 0.5) + 0.5;\n"
9325*8975f5c5SAndroid Build Coastguard Worker                         << "  color = vec4(0);\n";
9326*8975f5c5SAndroid Build Coastguard Worker 
9327*8975f5c5SAndroid Build Coastguard Worker         for (GLint textureIndex = 0; textureIndex < vertexActiveTextureCount; ++textureIndex)
9328*8975f5c5SAndroid Build Coastguard Worker         {
9329*8975f5c5SAndroid Build Coastguard Worker             vertexShaderStr << "  color += texture2D(" << vertexPrefix << textureIndex
9330*8975f5c5SAndroid Build Coastguard Worker                             << ", texCoord);\n";
9331*8975f5c5SAndroid Build Coastguard Worker         }
9332*8975f5c5SAndroid Build Coastguard Worker 
9333*8975f5c5SAndroid Build Coastguard Worker         vertexShaderStr << "}";
9334*8975f5c5SAndroid Build Coastguard Worker 
9335*8975f5c5SAndroid Build Coastguard Worker         std::stringstream fragmentShaderStr;
9336*8975f5c5SAndroid Build Coastguard Worker         fragmentShaderStr << "varying mediump vec4 color;\n" << "varying mediump vec2 texCoord;\n";
9337*8975f5c5SAndroid Build Coastguard Worker 
9338*8975f5c5SAndroid Build Coastguard Worker         for (GLint textureIndex = 0; textureIndex < fragmentTextureCount; ++textureIndex)
9339*8975f5c5SAndroid Build Coastguard Worker         {
9340*8975f5c5SAndroid Build Coastguard Worker             fragmentShaderStr << "uniform sampler2D " << fragPrefix << textureIndex << ";\n";
9341*8975f5c5SAndroid Build Coastguard Worker         }
9342*8975f5c5SAndroid Build Coastguard Worker 
9343*8975f5c5SAndroid Build Coastguard Worker         fragmentShaderStr << "void main() {\n" << "  gl_FragColor = color;\n";
9344*8975f5c5SAndroid Build Coastguard Worker 
9345*8975f5c5SAndroid Build Coastguard Worker         for (GLint textureIndex = 0; textureIndex < fragmentActiveTextureCount; ++textureIndex)
9346*8975f5c5SAndroid Build Coastguard Worker         {
9347*8975f5c5SAndroid Build Coastguard Worker             fragmentShaderStr << "  gl_FragColor += texture2D(" << fragPrefix << textureIndex
9348*8975f5c5SAndroid Build Coastguard Worker                               << ", texCoord);\n";
9349*8975f5c5SAndroid Build Coastguard Worker         }
9350*8975f5c5SAndroid Build Coastguard Worker 
9351*8975f5c5SAndroid Build Coastguard Worker         fragmentShaderStr << "}";
9352*8975f5c5SAndroid Build Coastguard Worker 
9353*8975f5c5SAndroid Build Coastguard Worker         const std::string &vertexShaderSource   = vertexShaderStr.str();
9354*8975f5c5SAndroid Build Coastguard Worker         const std::string &fragmentShaderSource = fragmentShaderStr.str();
9355*8975f5c5SAndroid Build Coastguard Worker 
9356*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str());
9357*8975f5c5SAndroid Build Coastguard Worker     }
9358*8975f5c5SAndroid Build Coastguard Worker 
getPixel(GLint texIndex)9359*8975f5c5SAndroid Build Coastguard Worker     RGBA8 getPixel(GLint texIndex)
9360*8975f5c5SAndroid Build Coastguard Worker     {
9361*8975f5c5SAndroid Build Coastguard Worker         RGBA8 pixel = {static_cast<uint8_t>(texIndex & 0x7u), static_cast<uint8_t>(texIndex >> 3),
9362*8975f5c5SAndroid Build Coastguard Worker                        0, 255u};
9363*8975f5c5SAndroid Build Coastguard Worker         return pixel;
9364*8975f5c5SAndroid Build Coastguard Worker     }
9365*8975f5c5SAndroid Build Coastguard Worker 
initTextures(GLint tex2DCount,GLint texCubeCount)9366*8975f5c5SAndroid Build Coastguard Worker     void initTextures(GLint tex2DCount, GLint texCubeCount)
9367*8975f5c5SAndroid Build Coastguard Worker     {
9368*8975f5c5SAndroid Build Coastguard Worker         GLint totalCount = tex2DCount + texCubeCount;
9369*8975f5c5SAndroid Build Coastguard Worker         mTextures.assign(totalCount, 0);
9370*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(totalCount, &mTextures[0]);
9371*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9372*8975f5c5SAndroid Build Coastguard Worker 
9373*8975f5c5SAndroid Build Coastguard Worker         std::vector<RGBA8> texData(16 * 16);
9374*8975f5c5SAndroid Build Coastguard Worker 
9375*8975f5c5SAndroid Build Coastguard Worker         GLint texIndex = 0;
9376*8975f5c5SAndroid Build Coastguard Worker         for (; texIndex < tex2DCount; ++texIndex)
9377*8975f5c5SAndroid Build Coastguard Worker         {
9378*8975f5c5SAndroid Build Coastguard Worker             texData.assign(texData.size(), getPixel(texIndex));
9379*8975f5c5SAndroid Build Coastguard Worker             glActiveTexture(GL_TEXTURE0 + texIndex);
9380*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]);
9381*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
9382*8975f5c5SAndroid Build Coastguard Worker                          &texData[0]);
9383*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9384*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9385*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
9386*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
9387*8975f5c5SAndroid Build Coastguard Worker         }
9388*8975f5c5SAndroid Build Coastguard Worker 
9389*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9390*8975f5c5SAndroid Build Coastguard Worker 
9391*8975f5c5SAndroid Build Coastguard Worker         for (; texIndex < texCubeCount; ++texIndex)
9392*8975f5c5SAndroid Build Coastguard Worker         {
9393*8975f5c5SAndroid Build Coastguard Worker             texData.assign(texData.size(), getPixel(texIndex));
9394*8975f5c5SAndroid Build Coastguard Worker             glActiveTexture(GL_TEXTURE0 + texIndex);
9395*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[texIndex]);
9396*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
9397*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, &texData[0]);
9398*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
9399*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, &texData[0]);
9400*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
9401*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, &texData[0]);
9402*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
9403*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, &texData[0]);
9404*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
9405*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, &texData[0]);
9406*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
9407*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_BYTE, &texData[0]);
9408*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9409*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9410*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
9411*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
9412*8975f5c5SAndroid Build Coastguard Worker         }
9413*8975f5c5SAndroid Build Coastguard Worker 
9414*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9415*8975f5c5SAndroid Build Coastguard Worker     }
9416*8975f5c5SAndroid Build Coastguard Worker 
testWithTextures(GLint vertexTextureCount,const std::string & vertexTexturePrefix,GLint fragmentTextureCount,const std::string & fragmentTexturePrefix)9417*8975f5c5SAndroid Build Coastguard Worker     void testWithTextures(GLint vertexTextureCount,
9418*8975f5c5SAndroid Build Coastguard Worker                           const std::string &vertexTexturePrefix,
9419*8975f5c5SAndroid Build Coastguard Worker                           GLint fragmentTextureCount,
9420*8975f5c5SAndroid Build Coastguard Worker                           const std::string &fragmentTexturePrefix)
9421*8975f5c5SAndroid Build Coastguard Worker     {
9422*8975f5c5SAndroid Build Coastguard Worker         // Generate textures
9423*8975f5c5SAndroid Build Coastguard Worker         initTextures(vertexTextureCount + fragmentTextureCount, 0);
9424*8975f5c5SAndroid Build Coastguard Worker 
9425*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
9426*8975f5c5SAndroid Build Coastguard Worker         RGBA8 expectedSum = {0};
9427*8975f5c5SAndroid Build Coastguard Worker         for (GLint texIndex = 0; texIndex < vertexTextureCount; ++texIndex)
9428*8975f5c5SAndroid Build Coastguard Worker         {
9429*8975f5c5SAndroid Build Coastguard Worker             std::stringstream uniformNameStr;
9430*8975f5c5SAndroid Build Coastguard Worker             uniformNameStr << vertexTexturePrefix << texIndex;
9431*8975f5c5SAndroid Build Coastguard Worker             const std::string &uniformName = uniformNameStr.str();
9432*8975f5c5SAndroid Build Coastguard Worker             GLint location                 = glGetUniformLocation(mProgram, uniformName.c_str());
9433*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(-1, location);
9434*8975f5c5SAndroid Build Coastguard Worker 
9435*8975f5c5SAndroid Build Coastguard Worker             glUniform1i(location, texIndex);
9436*8975f5c5SAndroid Build Coastguard Worker             RGBA8 contribution = getPixel(texIndex);
9437*8975f5c5SAndroid Build Coastguard Worker             expectedSum.R += contribution.R;
9438*8975f5c5SAndroid Build Coastguard Worker             expectedSum.G += contribution.G;
9439*8975f5c5SAndroid Build Coastguard Worker         }
9440*8975f5c5SAndroid Build Coastguard Worker 
9441*8975f5c5SAndroid Build Coastguard Worker         for (GLint texIndex = 0; texIndex < fragmentTextureCount; ++texIndex)
9442*8975f5c5SAndroid Build Coastguard Worker         {
9443*8975f5c5SAndroid Build Coastguard Worker             std::stringstream uniformNameStr;
9444*8975f5c5SAndroid Build Coastguard Worker             uniformNameStr << fragmentTexturePrefix << texIndex;
9445*8975f5c5SAndroid Build Coastguard Worker             const std::string &uniformName = uniformNameStr.str();
9446*8975f5c5SAndroid Build Coastguard Worker             GLint location                 = glGetUniformLocation(mProgram, uniformName.c_str());
9447*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(-1, location);
9448*8975f5c5SAndroid Build Coastguard Worker 
9449*8975f5c5SAndroid Build Coastguard Worker             glUniform1i(location, texIndex + vertexTextureCount);
9450*8975f5c5SAndroid Build Coastguard Worker             RGBA8 contribution = getPixel(texIndex + vertexTextureCount);
9451*8975f5c5SAndroid Build Coastguard Worker             expectedSum.R += contribution.R;
9452*8975f5c5SAndroid Build Coastguard Worker             expectedSum.G += contribution.G;
9453*8975f5c5SAndroid Build Coastguard Worker         }
9454*8975f5c5SAndroid Build Coastguard Worker 
9455*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GE(256u, expectedSum.G);
9456*8975f5c5SAndroid Build Coastguard Worker 
9457*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
9458*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9459*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, expectedSum.R, expectedSum.G, 0, 255, 1);
9460*8975f5c5SAndroid Build Coastguard Worker     }
9461*8975f5c5SAndroid Build Coastguard Worker 
9462*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
9463*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> mTextures;
9464*8975f5c5SAndroid Build Coastguard Worker     GLint mMaxVertexTextures;
9465*8975f5c5SAndroid Build Coastguard Worker     GLint mMaxFragmentTextures;
9466*8975f5c5SAndroid Build Coastguard Worker     GLint mMaxCombinedTextures;
9467*8975f5c5SAndroid Build Coastguard Worker };
9468*8975f5c5SAndroid Build Coastguard Worker 
9469*8975f5c5SAndroid Build Coastguard Worker // Test rendering with the maximum vertex texture units.
TEST_P(TextureLimitsTest,MaxVertexTextures)9470*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, MaxVertexTextures)
9471*8975f5c5SAndroid Build Coastguard Worker {
9472*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("tex", mMaxVertexTextures, mMaxVertexTextures, "tex", 0, 0);
9473*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
9474*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9475*8975f5c5SAndroid Build Coastguard Worker 
9476*8975f5c5SAndroid Build Coastguard Worker     testWithTextures(mMaxVertexTextures, "tex", 0, "tex");
9477*8975f5c5SAndroid Build Coastguard Worker }
9478*8975f5c5SAndroid Build Coastguard Worker 
9479*8975f5c5SAndroid Build Coastguard Worker // Test rendering with the maximum fragment texture units.
TEST_P(TextureLimitsTest,MaxFragmentTextures)9480*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, MaxFragmentTextures)
9481*8975f5c5SAndroid Build Coastguard Worker {
9482*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures, mMaxFragmentTextures);
9483*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
9484*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9485*8975f5c5SAndroid Build Coastguard Worker 
9486*8975f5c5SAndroid Build Coastguard Worker     testWithTextures(mMaxFragmentTextures, "tex", 0, "tex");
9487*8975f5c5SAndroid Build Coastguard Worker }
9488*8975f5c5SAndroid Build Coastguard Worker 
9489*8975f5c5SAndroid Build Coastguard Worker // Test rendering with maximum combined texture units.
TEST_P(TextureLimitsTest,MaxCombinedTextures)9490*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, MaxCombinedTextures)
9491*8975f5c5SAndroid Build Coastguard Worker {
9492*8975f5c5SAndroid Build Coastguard Worker     GLint vertexTextures = mMaxVertexTextures;
9493*8975f5c5SAndroid Build Coastguard Worker 
9494*8975f5c5SAndroid Build Coastguard Worker     if (vertexTextures + mMaxFragmentTextures > mMaxCombinedTextures)
9495*8975f5c5SAndroid Build Coastguard Worker     {
9496*8975f5c5SAndroid Build Coastguard Worker         vertexTextures = mMaxCombinedTextures - mMaxFragmentTextures;
9497*8975f5c5SAndroid Build Coastguard Worker     }
9498*8975f5c5SAndroid Build Coastguard Worker 
9499*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("vtex", vertexTextures, vertexTextures, "ftex",
9500*8975f5c5SAndroid Build Coastguard Worker                                     mMaxFragmentTextures, mMaxFragmentTextures);
9501*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
9502*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9503*8975f5c5SAndroid Build Coastguard Worker 
9504*8975f5c5SAndroid Build Coastguard Worker     testWithTextures(vertexTextures, "vtex", mMaxFragmentTextures, "ftex");
9505*8975f5c5SAndroid Build Coastguard Worker }
9506*8975f5c5SAndroid Build Coastguard Worker 
9507*8975f5c5SAndroid Build Coastguard Worker // Negative test for exceeding the number of vertex textures
TEST_P(TextureLimitsTest,ExcessiveVertexTextures)9508*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, ExcessiveVertexTextures)
9509*8975f5c5SAndroid Build Coastguard Worker {
9510*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("tex", mMaxVertexTextures + 1, mMaxVertexTextures + 1, "tex", 0,
9511*8975f5c5SAndroid Build Coastguard Worker                                     0);
9512*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(0u, mProgram);
9513*8975f5c5SAndroid Build Coastguard Worker }
9514*8975f5c5SAndroid Build Coastguard Worker 
9515*8975f5c5SAndroid Build Coastguard Worker // Negative test for exceeding the number of fragment textures
TEST_P(TextureLimitsTest,ExcessiveFragmentTextures)9516*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, ExcessiveFragmentTextures)
9517*8975f5c5SAndroid Build Coastguard Worker {
9518*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 1,
9519*8975f5c5SAndroid Build Coastguard Worker                                     mMaxFragmentTextures + 1);
9520*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(0u, mProgram);
9521*8975f5c5SAndroid Build Coastguard Worker }
9522*8975f5c5SAndroid Build Coastguard Worker 
9523*8975f5c5SAndroid Build Coastguard Worker // Test active vertex textures under the limit, but excessive textures specified.
TEST_P(TextureLimitsTest,MaxActiveVertexTextures)9524*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, MaxActiveVertexTextures)
9525*8975f5c5SAndroid Build Coastguard Worker {
9526*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("tex", mMaxVertexTextures + 4, mMaxVertexTextures, "tex", 0, 0);
9527*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
9528*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9529*8975f5c5SAndroid Build Coastguard Worker 
9530*8975f5c5SAndroid Build Coastguard Worker     testWithTextures(mMaxVertexTextures, "tex", 0, "tex");
9531*8975f5c5SAndroid Build Coastguard Worker }
9532*8975f5c5SAndroid Build Coastguard Worker 
9533*8975f5c5SAndroid Build Coastguard Worker // Test active fragment textures under the limit, but excessive textures specified.
TEST_P(TextureLimitsTest,MaxActiveFragmentTextures)9534*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, MaxActiveFragmentTextures)
9535*8975f5c5SAndroid Build Coastguard Worker {
9536*8975f5c5SAndroid Build Coastguard Worker     compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 4,
9537*8975f5c5SAndroid Build Coastguard Worker                                     mMaxFragmentTextures);
9538*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
9539*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9540*8975f5c5SAndroid Build Coastguard Worker 
9541*8975f5c5SAndroid Build Coastguard Worker     testWithTextures(0, "tex", mMaxFragmentTextures, "tex");
9542*8975f5c5SAndroid Build Coastguard Worker }
9543*8975f5c5SAndroid Build Coastguard Worker 
9544*8975f5c5SAndroid Build Coastguard Worker // Negative test for pointing two sampler uniforms of different types to the same texture.
9545*8975f5c5SAndroid Build Coastguard Worker // GLES 2.0.25 section 2.10.4 page 39.
TEST_P(TextureLimitsTest,TextureTypeConflict)9546*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureLimitsTest, TextureTypeConflict)
9547*8975f5c5SAndroid Build Coastguard Worker {
9548*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
9549*8975f5c5SAndroid Build Coastguard Worker         "attribute vec2 position;\n"
9550*8975f5c5SAndroid Build Coastguard Worker         "varying float color;\n"
9551*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex2D;\n"
9552*8975f5c5SAndroid Build Coastguard Worker         "uniform samplerCube texCube;\n"
9553*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
9554*8975f5c5SAndroid Build Coastguard Worker         "  gl_Position = vec4(position, 0, 1);\n"
9555*8975f5c5SAndroid Build Coastguard Worker         "  vec2 texCoord = (position * 0.5) + 0.5;\n"
9556*8975f5c5SAndroid Build Coastguard Worker         "  color = texture2D(tex2D, texCoord).x;\n"
9557*8975f5c5SAndroid Build Coastguard Worker         "  color += textureCube(texCube, vec3(texCoord, 0)).x;\n"
9558*8975f5c5SAndroid Build Coastguard Worker         "}";
9559*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
9560*8975f5c5SAndroid Build Coastguard Worker         "varying mediump float color;\n"
9561*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
9562*8975f5c5SAndroid Build Coastguard Worker         "  gl_FragColor = vec4(color, 0, 0, 1);\n"
9563*8975f5c5SAndroid Build Coastguard Worker         "}";
9564*8975f5c5SAndroid Build Coastguard Worker 
9565*8975f5c5SAndroid Build Coastguard Worker     mProgram = CompileProgram(kVS, kFS);
9566*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
9567*8975f5c5SAndroid Build Coastguard Worker 
9568*8975f5c5SAndroid Build Coastguard Worker     initTextures(1, 0);
9569*8975f5c5SAndroid Build Coastguard Worker 
9570*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
9571*8975f5c5SAndroid Build Coastguard Worker     GLint tex2DLocation = glGetUniformLocation(mProgram, "tex2D");
9572*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex2DLocation);
9573*8975f5c5SAndroid Build Coastguard Worker     GLint texCubeLocation = glGetUniformLocation(mProgram, "texCube");
9574*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, texCubeLocation);
9575*8975f5c5SAndroid Build Coastguard Worker 
9576*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex2DLocation, 0);
9577*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texCubeLocation, 0);
9578*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
9579*8975f5c5SAndroid Build Coastguard Worker 
9580*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
9581*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
9582*8975f5c5SAndroid Build Coastguard Worker }
9583*8975f5c5SAndroid Build Coastguard Worker 
9584*8975f5c5SAndroid Build Coastguard Worker class Texture2DNorm16TestES3 : public Texture2DTestES3
9585*8975f5c5SAndroid Build Coastguard Worker {
9586*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DNorm16TestES3()9587*8975f5c5SAndroid Build Coastguard Worker     Texture2DNorm16TestES3() : Texture2DTestES3(), mTextures{0, 0, 0}, mFBO(0), mRenderbuffer(0) {}
9588*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()9589*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
9590*8975f5c5SAndroid Build Coastguard Worker     {
9591*8975f5c5SAndroid Build Coastguard Worker         Texture2DTestES3::testSetUp();
9592*8975f5c5SAndroid Build Coastguard Worker 
9593*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
9594*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(3, mTextures);
9595*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
9596*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, &mRenderbuffer);
9597*8975f5c5SAndroid Build Coastguard Worker 
9598*8975f5c5SAndroid Build Coastguard Worker         for (size_t textureIndex = 0; textureIndex < 3; textureIndex++)
9599*8975f5c5SAndroid Build Coastguard Worker         {
9600*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mTextures[textureIndex]);
9601*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
9602*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
9603*8975f5c5SAndroid Build Coastguard Worker         }
9604*8975f5c5SAndroid Build Coastguard Worker 
9605*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
9606*8975f5c5SAndroid Build Coastguard Worker 
9607*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9608*8975f5c5SAndroid Build Coastguard Worker     }
9609*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()9610*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
9611*8975f5c5SAndroid Build Coastguard Worker     {
9612*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(3, mTextures);
9613*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
9614*8975f5c5SAndroid Build Coastguard Worker         glDeleteRenderbuffers(1, &mRenderbuffer);
9615*8975f5c5SAndroid Build Coastguard Worker 
9616*8975f5c5SAndroid Build Coastguard Worker         Texture2DTestES3::testTearDown();
9617*8975f5c5SAndroid Build Coastguard Worker     }
9618*8975f5c5SAndroid Build Coastguard Worker 
testNorm16Texture(GLint internalformat,GLenum format,GLenum type)9619*8975f5c5SAndroid Build Coastguard Worker     void testNorm16Texture(GLint internalformat, GLenum format, GLenum type)
9620*8975f5c5SAndroid Build Coastguard Worker     {
9621*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
9622*8975f5c5SAndroid Build Coastguard Worker 
9623*8975f5c5SAndroid Build Coastguard Worker         GLushort pixelValue  = (type == GL_SHORT) ? 0x7FFF : 0x6A35;
9624*8975f5c5SAndroid Build Coastguard Worker         GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue};
9625*8975f5c5SAndroid Build Coastguard Worker 
9626*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
9627*8975f5c5SAndroid Build Coastguard Worker 
9628*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
9629*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0],
9630*8975f5c5SAndroid Build Coastguard Worker                                0);
9631*8975f5c5SAndroid Build Coastguard Worker 
9632*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < 2; ++i)
9633*8975f5c5SAndroid Build Coastguard Worker         {
9634*8975f5c5SAndroid Build Coastguard Worker             bool isSubImage = i == 1;
9635*8975f5c5SAndroid Build Coastguard Worker             SCOPED_TRACE("is subimage:" + std::to_string(isSubImage));
9636*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mTextures[0]);
9637*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
9638*8975f5c5SAndroid Build Coastguard Worker 
9639*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mTextures[1]);
9640*8975f5c5SAndroid Build Coastguard Worker             if (isSubImage)
9641*8975f5c5SAndroid Build Coastguard Worker             {
9642*8975f5c5SAndroid Build Coastguard Worker                 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, nullptr);
9643*8975f5c5SAndroid Build Coastguard Worker                 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, format, type, imageData);
9644*8975f5c5SAndroid Build Coastguard Worker             }
9645*8975f5c5SAndroid Build Coastguard Worker             else
9646*8975f5c5SAndroid Build Coastguard Worker             {
9647*8975f5c5SAndroid Build Coastguard Worker                 glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
9648*8975f5c5SAndroid Build Coastguard Worker             }
9649*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
9650*8975f5c5SAndroid Build Coastguard Worker 
9651*8975f5c5SAndroid Build Coastguard Worker             drawQuad(mProgram, "position", 0.5f);
9652*8975f5c5SAndroid Build Coastguard Worker 
9653*8975f5c5SAndroid Build Coastguard Worker             GLubyte expectedValue =
9654*8975f5c5SAndroid Build Coastguard Worker                 (type == GL_SHORT) ? 0xFF : static_cast<GLubyte>(pixelValue >> 8);
9655*8975f5c5SAndroid Build Coastguard Worker 
9656*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0,
9657*8975f5c5SAndroid Build Coastguard Worker                                   SliceFormatColor(format, GLColor(expectedValue, expectedValue,
9658*8975f5c5SAndroid Build Coastguard Worker                                                                    expectedValue, expectedValue)));
9659*8975f5c5SAndroid Build Coastguard Worker         }
9660*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
9661*8975f5c5SAndroid Build Coastguard Worker 
9662*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9663*8975f5c5SAndroid Build Coastguard Worker     }
9664*8975f5c5SAndroid Build Coastguard Worker 
testReadPixelsRGBAWithRangeAndPixelStoreMode(GLuint x,GLuint y,GLuint width,GLuint height,GLint packRowLength,GLint packAlignment,GLint packSkipPixels,GLint packSkipRows,GLenum type,GLColor16 color)9665*8975f5c5SAndroid Build Coastguard Worker     void testReadPixelsRGBAWithRangeAndPixelStoreMode(GLuint x,
9666*8975f5c5SAndroid Build Coastguard Worker                                                       GLuint y,
9667*8975f5c5SAndroid Build Coastguard Worker                                                       GLuint width,
9668*8975f5c5SAndroid Build Coastguard Worker                                                       GLuint height,
9669*8975f5c5SAndroid Build Coastguard Worker                                                       GLint packRowLength,
9670*8975f5c5SAndroid Build Coastguard Worker                                                       GLint packAlignment,
9671*8975f5c5SAndroid Build Coastguard Worker                                                       GLint packSkipPixels,
9672*8975f5c5SAndroid Build Coastguard Worker                                                       GLint packSkipRows,
9673*8975f5c5SAndroid Build Coastguard Worker                                                       GLenum type,
9674*8975f5c5SAndroid Build Coastguard Worker                                                       GLColor16 color)
9675*8975f5c5SAndroid Build Coastguard Worker     {
9676*8975f5c5SAndroid Build Coastguard Worker         // PACK modes debugging
9677*8975f5c5SAndroid Build Coastguard Worker         GLint s = 2;  // single component size in bytes, UNSIGNED_SHORT -> 2 in our case
9678*8975f5c5SAndroid Build Coastguard Worker         GLint n = 4;  // 4 components per pixel, stands for GL_RGBA
9679*8975f5c5SAndroid Build Coastguard Worker 
9680*8975f5c5SAndroid Build Coastguard Worker         GLuint l       = packRowLength == 0 ? width : packRowLength;
9681*8975f5c5SAndroid Build Coastguard Worker         const GLint &a = packAlignment;
9682*8975f5c5SAndroid Build Coastguard Worker 
9683*8975f5c5SAndroid Build Coastguard Worker         // According to
9684*8975f5c5SAndroid Build Coastguard Worker         // https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glPixelStorei.xhtml
9685*8975f5c5SAndroid Build Coastguard Worker         GLint k                    = (s >= a) ? n * l : a / s * (1 + (s * n * l - 1) / a);
9686*8975f5c5SAndroid Build Coastguard Worker         std::size_t componentCount = n * packSkipPixels + k * (packSkipRows + height);
9687*8975f5c5SAndroid Build Coastguard Worker         if (static_cast<GLuint>(packRowLength) < width)
9688*8975f5c5SAndroid Build Coastguard Worker         {
9689*8975f5c5SAndroid Build Coastguard Worker             componentCount += width * n * s - k;
9690*8975f5c5SAndroid Build Coastguard Worker         }
9691*8975f5c5SAndroid Build Coastguard Worker 
9692*8975f5c5SAndroid Build Coastguard Worker         // Populate the pixels array with random dirty value
9693*8975f5c5SAndroid Build Coastguard Worker         constexpr GLushort kDirtyValue = 0x1234;
9694*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> pixels(componentCount, kDirtyValue);
9695*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(x, y, width, height, GL_RGBA, type, pixels.data());
9696*8975f5c5SAndroid Build Coastguard Worker 
9697*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
9698*8975f5c5SAndroid Build Coastguard Worker 
9699*8975f5c5SAndroid Build Coastguard Worker         GLushort *pixelRowStart = pixels.data();
9700*8975f5c5SAndroid Build Coastguard Worker         pixelRowStart += n * packSkipPixels + k * packSkipRows;
9701*8975f5c5SAndroid Build Coastguard Worker 
9702*8975f5c5SAndroid Build Coastguard Worker         std::vector<bool> modifiedPixels(componentCount, false);
9703*8975f5c5SAndroid Build Coastguard Worker 
9704*8975f5c5SAndroid Build Coastguard Worker         char errorInfo[200];
9705*8975f5c5SAndroid Build Coastguard Worker 
9706*8975f5c5SAndroid Build Coastguard Worker         for (GLuint row = 0; row < height; ++row)
9707*8975f5c5SAndroid Build Coastguard Worker         {
9708*8975f5c5SAndroid Build Coastguard Worker             GLushort *curPixel = pixelRowStart;
9709*8975f5c5SAndroid Build Coastguard Worker             for (GLuint col = 0, len = (row == height - 1) ? width : std::min(l, width); col < len;
9710*8975f5c5SAndroid Build Coastguard Worker                  ++col)
9711*8975f5c5SAndroid Build Coastguard Worker             {
9712*8975f5c5SAndroid Build Coastguard Worker                 snprintf(errorInfo, sizeof(errorInfo),
9713*8975f5c5SAndroid Build Coastguard Worker                          "extent: {%u, %u}, coord: (%u, %u), rowLength: %d, alignment: %d, "
9714*8975f5c5SAndroid Build Coastguard Worker                          "skipPixels: %d, skipRows: %d\n",
9715*8975f5c5SAndroid Build Coastguard Worker                          width, height, col, row, packRowLength, packAlignment, packSkipPixels,
9716*8975f5c5SAndroid Build Coastguard Worker                          packSkipRows);
9717*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(color.R, curPixel[0]) << errorInfo;
9718*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(color.G, curPixel[1]) << errorInfo;
9719*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(color.B, curPixel[2]) << errorInfo;
9720*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(color.A, curPixel[3]) << errorInfo;
9721*8975f5c5SAndroid Build Coastguard Worker 
9722*8975f5c5SAndroid Build Coastguard Worker                 std::ptrdiff_t diff      = curPixel - pixels.data();
9723*8975f5c5SAndroid Build Coastguard Worker                 modifiedPixels[diff + 0] = true;
9724*8975f5c5SAndroid Build Coastguard Worker                 modifiedPixels[diff + 1] = true;
9725*8975f5c5SAndroid Build Coastguard Worker                 modifiedPixels[diff + 2] = true;
9726*8975f5c5SAndroid Build Coastguard Worker                 modifiedPixels[diff + 3] = true;
9727*8975f5c5SAndroid Build Coastguard Worker 
9728*8975f5c5SAndroid Build Coastguard Worker                 curPixel += n;
9729*8975f5c5SAndroid Build Coastguard Worker             }
9730*8975f5c5SAndroid Build Coastguard Worker             pixelRowStart += k;
9731*8975f5c5SAndroid Build Coastguard Worker         }
9732*8975f5c5SAndroid Build Coastguard Worker 
9733*8975f5c5SAndroid Build Coastguard Worker         for (std::size_t i = 0; i < modifiedPixels.size(); ++i)
9734*8975f5c5SAndroid Build Coastguard Worker         {
9735*8975f5c5SAndroid Build Coastguard Worker             if (!modifiedPixels[i])
9736*8975f5c5SAndroid Build Coastguard Worker             {
9737*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(pixels[i], kDirtyValue);
9738*8975f5c5SAndroid Build Coastguard Worker             }
9739*8975f5c5SAndroid Build Coastguard Worker         }
9740*8975f5c5SAndroid Build Coastguard Worker     }
9741*8975f5c5SAndroid Build Coastguard Worker 
testNorm16RenderAndReadPixels(GLint internalformat,GLenum format,GLenum type)9742*8975f5c5SAndroid Build Coastguard Worker     void testNorm16RenderAndReadPixels(GLint internalformat, GLenum format, GLenum type)
9743*8975f5c5SAndroid Build Coastguard Worker     {
9744*8975f5c5SAndroid Build Coastguard Worker         // TODO(http://anglebug.com/40096653) Fails on Win Intel OpenGL driver
9745*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL());
9746*8975f5c5SAndroid Build Coastguard Worker         // TODO(http://anglebug.com/42262873) Fails on Win AMD OpenGL driver
9747*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
9748*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
9749*8975f5c5SAndroid Build Coastguard Worker 
9750*8975f5c5SAndroid Build Coastguard Worker         GLushort pixelValue  = 0x6A35;
9751*8975f5c5SAndroid Build Coastguard Worker         GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue};
9752*8975f5c5SAndroid Build Coastguard Worker         GLColor16 color =
9753*8975f5c5SAndroid Build Coastguard Worker             SliceFormatColor16(format, GLColor16(pixelValue, pixelValue, pixelValue, pixelValue));
9754*8975f5c5SAndroid Build Coastguard Worker         // Size of drawing viewport
9755*8975f5c5SAndroid Build Coastguard Worker         constexpr GLint width = 8, height = 8;
9756*8975f5c5SAndroid Build Coastguard Worker 
9757*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
9758*8975f5c5SAndroid Build Coastguard Worker 
9759*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[1]);
9760*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, type, nullptr);
9761*8975f5c5SAndroid Build Coastguard Worker 
9762*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
9763*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
9764*8975f5c5SAndroid Build Coastguard Worker                                0);
9765*8975f5c5SAndroid Build Coastguard Worker 
9766*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[2]);
9767*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
9768*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9769*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9770*8975f5c5SAndroid Build Coastguard Worker 
9771*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
9772*8975f5c5SAndroid Build Coastguard Worker 
9773*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
9774*8975f5c5SAndroid Build Coastguard Worker 
9775*8975f5c5SAndroid Build Coastguard Worker         // ReadPixels against different width, height, pixel pack mode combinations to test
9776*8975f5c5SAndroid Build Coastguard Worker         // workaround of pixels rearrangement
9777*8975f5c5SAndroid Build Coastguard Worker 
9778*8975f5c5SAndroid Build Coastguard Worker         // {x, y, width, height}
9779*8975f5c5SAndroid Build Coastguard Worker         std::vector<std::array<GLint, 4>> areas = {
9780*8975f5c5SAndroid Build Coastguard Worker             {0, 0, 1, 1}, {0, 0, 1, 2}, {0, 0, 2, 1}, {0, 0, 2, 2},
9781*8975f5c5SAndroid Build Coastguard Worker             {0, 0, 3, 2}, {0, 0, 3, 3}, {0, 0, 4, 3}, {0, 0, 4, 4},
9782*8975f5c5SAndroid Build Coastguard Worker 
9783*8975f5c5SAndroid Build Coastguard Worker             {1, 3, 3, 2}, {1, 3, 3, 3}, {3, 2, 4, 3}, {3, 2, 4, 4},
9784*8975f5c5SAndroid Build Coastguard Worker 
9785*8975f5c5SAndroid Build Coastguard Worker             {0, 0, 5, 6}, {2, 1, 5, 6}, {0, 0, 6, 1}, {0, 0, 7, 1},
9786*8975f5c5SAndroid Build Coastguard Worker             {0, 0, 7, 3}, {0, 0, 7, 8}, {1, 0, 7, 8}, {0, 0, 8, 8},
9787*8975f5c5SAndroid Build Coastguard Worker         };
9788*8975f5c5SAndroid Build Coastguard Worker 
9789*8975f5c5SAndroid Build Coastguard Worker         // Put default settings at the last
9790*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLint> paramsPackRowLength = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0};
9791*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLint> paramsPackAlignment = {1, 2, 8, 4};
9792*8975f5c5SAndroid Build Coastguard Worker         std::vector<std::array<GLint, 2>> paramsPackSkipPixelsAndRows = {{1, 0}, {0, 1},   {1, 1},
9793*8975f5c5SAndroid Build Coastguard Worker                                                                          {3, 1}, {20, 20}, {0, 0}};
9794*8975f5c5SAndroid Build Coastguard Worker 
9795*8975f5c5SAndroid Build Coastguard Worker         // Restore pixel pack modes later
9796*8975f5c5SAndroid Build Coastguard Worker         GLint restorePackAlignment;
9797*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_PACK_ALIGNMENT, &restorePackAlignment);
9798*8975f5c5SAndroid Build Coastguard Worker         GLint restorePackRowLength;
9799*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_PACK_ROW_LENGTH, &restorePackRowLength);
9800*8975f5c5SAndroid Build Coastguard Worker         GLint restorePackSkipPixels;
9801*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_PACK_SKIP_PIXELS, &restorePackSkipPixels);
9802*8975f5c5SAndroid Build Coastguard Worker         GLint restorePackSkipRows;
9803*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_PACK_SKIP_ROWS, &restorePackSkipRows);
9804*8975f5c5SAndroid Build Coastguard Worker 
9805*8975f5c5SAndroid Build Coastguard Worker         // Variable symbols are based on:
9806*8975f5c5SAndroid Build Coastguard Worker         // https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glPixelStorei.xhtml
9807*8975f5c5SAndroid Build Coastguard Worker         for (const auto &skipped : paramsPackSkipPixelsAndRows)
9808*8975f5c5SAndroid Build Coastguard Worker         {
9809*8975f5c5SAndroid Build Coastguard Worker             glPixelStorei(GL_PACK_SKIP_PIXELS, skipped[0]);
9810*8975f5c5SAndroid Build Coastguard Worker             glPixelStorei(GL_PACK_SKIP_ROWS, skipped[1]);
9811*8975f5c5SAndroid Build Coastguard Worker             for (GLint a : paramsPackAlignment)
9812*8975f5c5SAndroid Build Coastguard Worker             {
9813*8975f5c5SAndroid Build Coastguard Worker                 glPixelStorei(GL_PACK_ALIGNMENT, a);
9814*8975f5c5SAndroid Build Coastguard Worker                 for (GLint l : paramsPackRowLength)
9815*8975f5c5SAndroid Build Coastguard Worker                 {
9816*8975f5c5SAndroid Build Coastguard Worker                     glPixelStorei(GL_PACK_ROW_LENGTH, l);
9817*8975f5c5SAndroid Build Coastguard Worker 
9818*8975f5c5SAndroid Build Coastguard Worker                     for (const auto &area : areas)
9819*8975f5c5SAndroid Build Coastguard Worker                     {
9820*8975f5c5SAndroid Build Coastguard Worker                         ASSERT(area[0] + area[2] <= width);
9821*8975f5c5SAndroid Build Coastguard Worker                         ASSERT(area[1] + area[3] <= height);
9822*8975f5c5SAndroid Build Coastguard Worker                         testReadPixelsRGBAWithRangeAndPixelStoreMode(area[0], area[1], area[2],
9823*8975f5c5SAndroid Build Coastguard Worker                                                                      area[3], l, a, skipped[0],
9824*8975f5c5SAndroid Build Coastguard Worker                                                                      skipped[1], type, color);
9825*8975f5c5SAndroid Build Coastguard Worker                     }
9826*8975f5c5SAndroid Build Coastguard Worker                 }
9827*8975f5c5SAndroid Build Coastguard Worker             }
9828*8975f5c5SAndroid Build Coastguard Worker         }
9829*8975f5c5SAndroid Build Coastguard Worker 
9830*8975f5c5SAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_ALIGNMENT, restorePackAlignment);
9831*8975f5c5SAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_ROW_LENGTH, restorePackRowLength);
9832*8975f5c5SAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_SKIP_PIXELS, restorePackSkipPixels);
9833*8975f5c5SAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_SKIP_ROWS, restorePackSkipRows);
9834*8975f5c5SAndroid Build Coastguard Worker 
9835*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
9836*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
9837*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
9838*8975f5c5SAndroid Build Coastguard Worker                                   mRenderbuffer);
9839*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, 0);
9840*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
9841*8975f5c5SAndroid Build Coastguard Worker 
9842*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
9843*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
9844*8975f5c5SAndroid Build Coastguard Worker 
9845*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR16_NEAR(
9846*8975f5c5SAndroid Build Coastguard Worker             0, 0, SliceFormatColor16(format, GLColor16(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF)), 0);
9847*8975f5c5SAndroid Build Coastguard Worker 
9848*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[1]);
9849*8975f5c5SAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
9850*8975f5c5SAndroid Build Coastguard Worker 
9851*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
9852*8975f5c5SAndroid Build Coastguard Worker                                0);
9853*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR16_NEAR(
9854*8975f5c5SAndroid Build Coastguard Worker             0, 0, SliceFormatColor16(format, GLColor16(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF)), 0);
9855*8975f5c5SAndroid Build Coastguard Worker 
9856*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9857*8975f5c5SAndroid Build Coastguard Worker 
9858*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
9859*8975f5c5SAndroid Build Coastguard Worker     }
9860*8975f5c5SAndroid Build Coastguard Worker 
9861*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextures[3];
9862*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
9863*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderbuffer;
9864*8975f5c5SAndroid Build Coastguard Worker };
9865*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16R16TextureTest)9866*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16R16TextureTest)
9867*8975f5c5SAndroid Build Coastguard Worker {
9868*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
9869*8975f5c5SAndroid Build Coastguard Worker }
9870*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16R16SNORMTextureTest)9871*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16R16SNORMTextureTest)
9872*8975f5c5SAndroid Build Coastguard Worker {
9873*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_R16_SNORM_EXT, GL_RED, GL_SHORT);
9874*8975f5c5SAndroid Build Coastguard Worker }
9875*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RG16TextureTest)9876*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RG16TextureTest)
9877*8975f5c5SAndroid Build Coastguard Worker {
9878*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
9879*8975f5c5SAndroid Build Coastguard Worker }
9880*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RG16SNORMTextureTest)9881*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RG16SNORMTextureTest)
9882*8975f5c5SAndroid Build Coastguard Worker {
9883*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_RG16_SNORM_EXT, GL_RG, GL_SHORT);
9884*8975f5c5SAndroid Build Coastguard Worker }
9885*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RGB16TextureTest)9886*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RGB16TextureTest)
9887*8975f5c5SAndroid Build Coastguard Worker {
9888*8975f5c5SAndroid Build Coastguard Worker     // (http://anglebug.com/40096662) Driver bug on some Qualcomm Adreno gpu
9889*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
9890*8975f5c5SAndroid Build Coastguard Worker 
9891*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_RGB16_EXT, GL_RGB, GL_UNSIGNED_SHORT);
9892*8975f5c5SAndroid Build Coastguard Worker }
9893*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RGB16SNORMTextureTest)9894*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RGB16SNORMTextureTest)
9895*8975f5c5SAndroid Build Coastguard Worker {
9896*8975f5c5SAndroid Build Coastguard Worker     // (http://anglebug.com/40096662) Driver bug on some Qualcomm Adreno gpu
9897*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
9898*8975f5c5SAndroid Build Coastguard Worker 
9899*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_RGB16_SNORM_EXT, GL_RGB, GL_SHORT);
9900*8975f5c5SAndroid Build Coastguard Worker }
9901*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RGBA16TextureTest)9902*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RGBA16TextureTest)
9903*8975f5c5SAndroid Build Coastguard Worker {
9904*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
9905*8975f5c5SAndroid Build Coastguard Worker }
9906*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RGBA16SNORMTextureTest)9907*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RGBA16SNORMTextureTest)
9908*8975f5c5SAndroid Build Coastguard Worker {
9909*8975f5c5SAndroid Build Coastguard Worker     testNorm16Texture(GL_RGBA16_SNORM_EXT, GL_RGBA, GL_SHORT);
9910*8975f5c5SAndroid Build Coastguard Worker }
9911*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16R16RenderTest)9912*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16R16RenderTest)
9913*8975f5c5SAndroid Build Coastguard Worker {
9914*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263714
9915*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsOpenGL() && IsNVIDIA());
9916*8975f5c5SAndroid Build Coastguard Worker 
9917*8975f5c5SAndroid Build Coastguard Worker     testNorm16RenderAndReadPixels(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
9918*8975f5c5SAndroid Build Coastguard Worker }
9919*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RG16RenderTest)9920*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RG16RenderTest)
9921*8975f5c5SAndroid Build Coastguard Worker {
9922*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263714
9923*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsOpenGL() && IsNVIDIA());
9924*8975f5c5SAndroid Build Coastguard Worker 
9925*8975f5c5SAndroid Build Coastguard Worker     testNorm16RenderAndReadPixels(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
9926*8975f5c5SAndroid Build Coastguard Worker }
9927*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(Texture2DNorm16TestES3,TextureNorm16RGBA16RenderTest)9928*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DNorm16TestES3, TextureNorm16RGBA16RenderTest)
9929*8975f5c5SAndroid Build Coastguard Worker {
9930*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263714
9931*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsOpenGL() && IsNVIDIA());
9932*8975f5c5SAndroid Build Coastguard Worker 
9933*8975f5c5SAndroid Build Coastguard Worker     testNorm16RenderAndReadPixels(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
9934*8975f5c5SAndroid Build Coastguard Worker }
9935*8975f5c5SAndroid Build Coastguard Worker 
9936*8975f5c5SAndroid Build Coastguard Worker class Texture2DRGTest : public Texture2DTest
9937*8975f5c5SAndroid Build Coastguard Worker {
9938*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DRGTest()9939*8975f5c5SAndroid Build Coastguard Worker     Texture2DRGTest()
9940*8975f5c5SAndroid Build Coastguard Worker         : Texture2DTest(), mRenderableTexture(0), mTestTexture(0), mFBO(0), mRenderbuffer(0)
9941*8975f5c5SAndroid Build Coastguard Worker     {}
9942*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()9943*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
9944*8975f5c5SAndroid Build Coastguard Worker     {
9945*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
9946*8975f5c5SAndroid Build Coastguard Worker 
9947*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
9948*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mRenderableTexture);
9949*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTestTexture);
9950*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
9951*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, &mRenderbuffer);
9952*8975f5c5SAndroid Build Coastguard Worker 
9953*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
9954*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9955*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9956*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTestTexture);
9957*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
9958*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
9959*8975f5c5SAndroid Build Coastguard Worker 
9960*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
9961*8975f5c5SAndroid Build Coastguard Worker 
9962*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
9963*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
9964*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTexture2DUniformLocation, 0);
9965*8975f5c5SAndroid Build Coastguard Worker 
9966*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
9967*8975f5c5SAndroid Build Coastguard Worker     }
9968*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()9969*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
9970*8975f5c5SAndroid Build Coastguard Worker     {
9971*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mRenderableTexture);
9972*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTestTexture);
9973*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
9974*8975f5c5SAndroid Build Coastguard Worker         glDeleteRenderbuffers(1, &mRenderbuffer);
9975*8975f5c5SAndroid Build Coastguard Worker 
9976*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testTearDown();
9977*8975f5c5SAndroid Build Coastguard Worker     }
9978*8975f5c5SAndroid Build Coastguard Worker 
setupFormatTextures(GLenum internalformat,GLenum format,GLenum type,GLvoid * imageData)9979*8975f5c5SAndroid Build Coastguard Worker     void setupFormatTextures(GLenum internalformat, GLenum format, GLenum type, GLvoid *imageData)
9980*8975f5c5SAndroid Build Coastguard Worker     {
9981*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
9982*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
9983*8975f5c5SAndroid Build Coastguard Worker 
9984*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
9985*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
9986*8975f5c5SAndroid Build Coastguard Worker                                mRenderableTexture, 0);
9987*8975f5c5SAndroid Build Coastguard Worker 
9988*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTestTexture);
9989*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData);
9990*8975f5c5SAndroid Build Coastguard Worker 
9991*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
9992*8975f5c5SAndroid Build Coastguard Worker     }
9993*8975f5c5SAndroid Build Coastguard Worker 
testRGTexture(GLColor expectedColor)9994*8975f5c5SAndroid Build Coastguard Worker     void testRGTexture(GLColor expectedColor)
9995*8975f5c5SAndroid Build Coastguard Worker     {
9996*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
9997*8975f5c5SAndroid Build Coastguard Worker 
9998*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
9999*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, kPixelTolerance);
10000*8975f5c5SAndroid Build Coastguard Worker     }
10001*8975f5c5SAndroid Build Coastguard Worker 
testRGRender(GLenum internalformat,GLenum format)10002*8975f5c5SAndroid Build Coastguard Worker     void testRGRender(GLenum internalformat, GLenum format)
10003*8975f5c5SAndroid Build Coastguard Worker     {
10004*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
10005*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1);
10006*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
10007*8975f5c5SAndroid Build Coastguard Worker                                   mRenderbuffer);
10008*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, 0);
10009*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
10010*8975f5c5SAndroid Build Coastguard Worker 
10011*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
10012*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
10013*8975f5c5SAndroid Build Coastguard Worker 
10014*8975f5c5SAndroid Build Coastguard Worker         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
10015*8975f5c5SAndroid Build Coastguard Worker 
10016*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10017*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor(255u, 255u, 255u, 255u)));
10018*8975f5c5SAndroid Build Coastguard Worker     }
10019*8975f5c5SAndroid Build Coastguard Worker 
10020*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderableTexture;
10021*8975f5c5SAndroid Build Coastguard Worker     GLuint mTestTexture;
10022*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
10023*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderbuffer;
10024*8975f5c5SAndroid Build Coastguard Worker };
10025*8975f5c5SAndroid Build Coastguard Worker 
10026*8975f5c5SAndroid Build Coastguard Worker // Test unorm texture formats enabled by the GL_EXT_texture_rg extension.
TEST_P(Texture2DRGTest,TextureRGUNormTest)10027*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DRGTest, TextureRGUNormTest)
10028*8975f5c5SAndroid Build Coastguard Worker {
10029*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
10030*8975f5c5SAndroid Build Coastguard Worker     // This workaround causes a GL error on Windows AMD, which is likely a driver bug.
10031*8975f5c5SAndroid Build Coastguard Worker     // The workaround is not intended to be enabled in this configuration so skip it.
10032*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
10033*8975f5c5SAndroid Build Coastguard Worker         getEGLWindow()->isFeatureEnabled(Feature::EmulateCopyTexImage2DFromRenderbuffers) &&
10034*8975f5c5SAndroid Build Coastguard Worker         IsWindows() && IsAMD());
10035*8975f5c5SAndroid Build Coastguard Worker 
10036*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixelValue  = 0xab;
10037*8975f5c5SAndroid Build Coastguard Worker     GLubyte imageData[] = {pixelValue, pixelValue};
10038*8975f5c5SAndroid Build Coastguard Worker 
10039*8975f5c5SAndroid Build Coastguard Worker     setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_UNSIGNED_BYTE, imageData);
10040*8975f5c5SAndroid Build Coastguard Worker     testRGTexture(
10041*8975f5c5SAndroid Build Coastguard Worker         SliceFormatColor(GL_RED_EXT, GLColor(pixelValue, pixelValue, pixelValue, pixelValue)));
10042*8975f5c5SAndroid Build Coastguard Worker     testRGRender(GL_R8_EXT, GL_RED_EXT);
10043*8975f5c5SAndroid Build Coastguard Worker 
10044*8975f5c5SAndroid Build Coastguard Worker     setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_UNSIGNED_BYTE, imageData);
10045*8975f5c5SAndroid Build Coastguard Worker     testRGTexture(
10046*8975f5c5SAndroid Build Coastguard Worker         SliceFormatColor(GL_RG_EXT, GLColor(pixelValue, pixelValue, pixelValue, pixelValue)));
10047*8975f5c5SAndroid Build Coastguard Worker     testRGRender(GL_RG8_EXT, GL_RG_EXT);
10048*8975f5c5SAndroid Build Coastguard Worker }
10049*8975f5c5SAndroid Build Coastguard Worker 
10050*8975f5c5SAndroid Build Coastguard Worker // Test float texture formats enabled by the GL_EXT_texture_rg extension.
TEST_P(Texture2DRGTest,TextureRGFloatTest)10051*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DRGTest, TextureRGFloatTest)
10052*8975f5c5SAndroid Build Coastguard Worker {
10053*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
10054*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10055*8975f5c5SAndroid Build Coastguard Worker 
10056*8975f5c5SAndroid Build Coastguard Worker     GLfloat pixelValue  = 0.54321;
10057*8975f5c5SAndroid Build Coastguard Worker     GLfloat imageData[] = {pixelValue, pixelValue};
10058*8975f5c5SAndroid Build Coastguard Worker 
10059*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedValue = static_cast<GLubyte>(pixelValue * 255.0f);
10060*8975f5c5SAndroid Build Coastguard Worker     GLColor expectedColor = GLColor(expectedValue, expectedValue, expectedValue, expectedValue);
10061*8975f5c5SAndroid Build Coastguard Worker 
10062*8975f5c5SAndroid Build Coastguard Worker     setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_FLOAT, imageData);
10063*8975f5c5SAndroid Build Coastguard Worker     testRGTexture(SliceFormatColor(GL_RED_EXT, expectedColor));
10064*8975f5c5SAndroid Build Coastguard Worker 
10065*8975f5c5SAndroid Build Coastguard Worker     setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_FLOAT, imageData);
10066*8975f5c5SAndroid Build Coastguard Worker     testRGTexture(SliceFormatColor(GL_RG_EXT, expectedColor));
10067*8975f5c5SAndroid Build Coastguard Worker }
10068*8975f5c5SAndroid Build Coastguard Worker 
10069*8975f5c5SAndroid Build Coastguard Worker // Test half-float texture formats enabled by the GL_EXT_texture_rg extension.
TEST_P(Texture2DRGTest,TextureRGHalfFloatTest)10070*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DRGTest, TextureRGHalfFloatTest)
10071*8975f5c5SAndroid Build Coastguard Worker {
10072*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_rg"));
10073*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
10074*8975f5c5SAndroid Build Coastguard Worker 
10075*8975f5c5SAndroid Build Coastguard Worker     GLfloat pixelValueFloat = 0.543f;
10076*8975f5c5SAndroid Build Coastguard Worker     GLhalf pixelValue       = 0x3858;
10077*8975f5c5SAndroid Build Coastguard Worker     GLhalf imageData[]      = {pixelValue, pixelValue};
10078*8975f5c5SAndroid Build Coastguard Worker 
10079*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedValue = static_cast<GLubyte>(pixelValueFloat * 255.0f);
10080*8975f5c5SAndroid Build Coastguard Worker     GLColor expectedColor = GLColor(expectedValue, expectedValue, expectedValue, expectedValue);
10081*8975f5c5SAndroid Build Coastguard Worker 
10082*8975f5c5SAndroid Build Coastguard Worker     setupFormatTextures(GL_RED_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES, imageData);
10083*8975f5c5SAndroid Build Coastguard Worker     testRGTexture(SliceFormatColor(GL_RED_EXT, expectedColor));
10084*8975f5c5SAndroid Build Coastguard Worker 
10085*8975f5c5SAndroid Build Coastguard Worker     setupFormatTextures(GL_RG_EXT, GL_RG_EXT, GL_HALF_FLOAT_OES, imageData);
10086*8975f5c5SAndroid Build Coastguard Worker     testRGTexture(SliceFormatColor(GL_RG_EXT, expectedColor));
10087*8975f5c5SAndroid Build Coastguard Worker }
10088*8975f5c5SAndroid Build Coastguard Worker 
10089*8975f5c5SAndroid Build Coastguard Worker class Texture2DFloatTest : public Texture2DTest
10090*8975f5c5SAndroid Build Coastguard Worker {
10091*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DFloatTest()10092*8975f5c5SAndroid Build Coastguard Worker     Texture2DFloatTest()
10093*8975f5c5SAndroid Build Coastguard Worker         : Texture2DTest(), mRenderableTexture(0), mTestTexture(0), mFBO(0), mRenderbuffer(0)
10094*8975f5c5SAndroid Build Coastguard Worker     {}
10095*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()10096*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
10097*8975f5c5SAndroid Build Coastguard Worker     {
10098*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testSetUp();
10099*8975f5c5SAndroid Build Coastguard Worker 
10100*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
10101*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mRenderableTexture);
10102*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTestTexture);
10103*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFBO);
10104*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, &mRenderbuffer);
10105*8975f5c5SAndroid Build Coastguard Worker 
10106*8975f5c5SAndroid Build Coastguard Worker         setUpProgram();
10107*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
10108*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTexture2DUniformLocation, 0);
10109*8975f5c5SAndroid Build Coastguard Worker 
10110*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mRenderableTexture);
10111*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
10112*8975f5c5SAndroid Build Coastguard Worker 
10113*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
10114*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
10115*8975f5c5SAndroid Build Coastguard Worker                                mRenderableTexture, 0);
10116*8975f5c5SAndroid Build Coastguard Worker 
10117*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10118*8975f5c5SAndroid Build Coastguard Worker     }
10119*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()10120*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
10121*8975f5c5SAndroid Build Coastguard Worker     {
10122*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mRenderableTexture);
10123*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTestTexture);
10124*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFBO);
10125*8975f5c5SAndroid Build Coastguard Worker         glDeleteRenderbuffers(1, &mRenderbuffer);
10126*8975f5c5SAndroid Build Coastguard Worker 
10127*8975f5c5SAndroid Build Coastguard Worker         Texture2DTest::testTearDown();
10128*8975f5c5SAndroid Build Coastguard Worker     }
10129*8975f5c5SAndroid Build Coastguard Worker 
testFloatTextureSample(GLenum internalFormat,GLenum format,GLenum type)10130*8975f5c5SAndroid Build Coastguard Worker     void testFloatTextureSample(GLenum internalFormat, GLenum format, GLenum type)
10131*8975f5c5SAndroid Build Coastguard Worker     {
10132*8975f5c5SAndroid Build Coastguard Worker         constexpr GLfloat imageDataFloat[] = {
10133*8975f5c5SAndroid Build Coastguard Worker             0.2f,
10134*8975f5c5SAndroid Build Coastguard Worker             0.3f,
10135*8975f5c5SAndroid Build Coastguard Worker             0.4f,
10136*8975f5c5SAndroid Build Coastguard Worker             0.5f,
10137*8975f5c5SAndroid Build Coastguard Worker         };
10138*8975f5c5SAndroid Build Coastguard Worker         constexpr GLhalf imageDataHalf[] = {
10139*8975f5c5SAndroid Build Coastguard Worker             0x3266,
10140*8975f5c5SAndroid Build Coastguard Worker             0x34CD,
10141*8975f5c5SAndroid Build Coastguard Worker             0x3666,
10142*8975f5c5SAndroid Build Coastguard Worker             0x3800,
10143*8975f5c5SAndroid Build Coastguard Worker         };
10144*8975f5c5SAndroid Build Coastguard Worker         GLColor expectedValue;
10145*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < 4; i++)
10146*8975f5c5SAndroid Build Coastguard Worker         {
10147*8975f5c5SAndroid Build Coastguard Worker             expectedValue[i] = static_cast<GLubyte>(imageDataFloat[i] * 255.0f);
10148*8975f5c5SAndroid Build Coastguard Worker         }
10149*8975f5c5SAndroid Build Coastguard Worker 
10150*8975f5c5SAndroid Build Coastguard Worker         const GLvoid *imageData;
10151*8975f5c5SAndroid Build Coastguard Worker         switch (type)
10152*8975f5c5SAndroid Build Coastguard Worker         {
10153*8975f5c5SAndroid Build Coastguard Worker             case GL_FLOAT:
10154*8975f5c5SAndroid Build Coastguard Worker                 imageData = imageDataFloat;
10155*8975f5c5SAndroid Build Coastguard Worker                 break;
10156*8975f5c5SAndroid Build Coastguard Worker             case GL_HALF_FLOAT:
10157*8975f5c5SAndroid Build Coastguard Worker             case GL_HALF_FLOAT_OES:
10158*8975f5c5SAndroid Build Coastguard Worker                 imageData = imageDataHalf;
10159*8975f5c5SAndroid Build Coastguard Worker                 break;
10160*8975f5c5SAndroid Build Coastguard Worker             default:
10161*8975f5c5SAndroid Build Coastguard Worker                 imageData = nullptr;
10162*8975f5c5SAndroid Build Coastguard Worker         }
10163*8975f5c5SAndroid Build Coastguard Worker         ASSERT(imageData != nullptr);
10164*8975f5c5SAndroid Build Coastguard Worker 
10165*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTestTexture);
10166*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, imageData);
10167*8975f5c5SAndroid Build Coastguard Worker 
10168*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
10169*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
10170*8975f5c5SAndroid Build Coastguard Worker 
10171*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
10172*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
10173*8975f5c5SAndroid Build Coastguard Worker 
10174*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
10175*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, SliceFormatColor(format, expectedValue), kPixelTolerance);
10176*8975f5c5SAndroid Build Coastguard Worker     }
10177*8975f5c5SAndroid Build Coastguard Worker 
testFloatTextureLinear(GLenum internalFormat,GLenum format,GLenum type)10178*8975f5c5SAndroid Build Coastguard Worker     void testFloatTextureLinear(GLenum internalFormat, GLenum format, GLenum type)
10179*8975f5c5SAndroid Build Coastguard Worker     {
10180*8975f5c5SAndroid Build Coastguard Worker         int numComponents;
10181*8975f5c5SAndroid Build Coastguard Worker         switch (format)
10182*8975f5c5SAndroid Build Coastguard Worker         {
10183*8975f5c5SAndroid Build Coastguard Worker             case GL_RGBA:
10184*8975f5c5SAndroid Build Coastguard Worker                 numComponents = 4;
10185*8975f5c5SAndroid Build Coastguard Worker                 break;
10186*8975f5c5SAndroid Build Coastguard Worker             case GL_RGB:
10187*8975f5c5SAndroid Build Coastguard Worker                 numComponents = 3;
10188*8975f5c5SAndroid Build Coastguard Worker                 break;
10189*8975f5c5SAndroid Build Coastguard Worker             case GL_LUMINANCE_ALPHA:
10190*8975f5c5SAndroid Build Coastguard Worker                 numComponents = 2;
10191*8975f5c5SAndroid Build Coastguard Worker                 break;
10192*8975f5c5SAndroid Build Coastguard Worker             case GL_LUMINANCE:
10193*8975f5c5SAndroid Build Coastguard Worker             case GL_ALPHA:
10194*8975f5c5SAndroid Build Coastguard Worker                 numComponents = 1;
10195*8975f5c5SAndroid Build Coastguard Worker                 break;
10196*8975f5c5SAndroid Build Coastguard Worker             default:
10197*8975f5c5SAndroid Build Coastguard Worker                 numComponents = 0;
10198*8975f5c5SAndroid Build Coastguard Worker         }
10199*8975f5c5SAndroid Build Coastguard Worker         ASSERT(numComponents > 0);
10200*8975f5c5SAndroid Build Coastguard Worker 
10201*8975f5c5SAndroid Build Coastguard Worker         constexpr GLfloat pixelIntensitiesFloat[] = {0.0f, 1.0f, 0.0f, 1.0f};
10202*8975f5c5SAndroid Build Coastguard Worker         constexpr GLhalf pixelIntensitiesHalf[]   = {0x0000, 0x3C00, 0x0000, 0x3C00};
10203*8975f5c5SAndroid Build Coastguard Worker 
10204*8975f5c5SAndroid Build Coastguard Worker         GLfloat imageDataFloat[16];
10205*8975f5c5SAndroid Build Coastguard Worker         GLhalf imageDataHalf[16];
10206*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < 4; i++)
10207*8975f5c5SAndroid Build Coastguard Worker         {
10208*8975f5c5SAndroid Build Coastguard Worker             for (int c = 0; c < numComponents; c++)
10209*8975f5c5SAndroid Build Coastguard Worker             {
10210*8975f5c5SAndroid Build Coastguard Worker                 imageDataFloat[i * numComponents + c] = pixelIntensitiesFloat[i];
10211*8975f5c5SAndroid Build Coastguard Worker                 imageDataHalf[i * numComponents + c]  = pixelIntensitiesHalf[i];
10212*8975f5c5SAndroid Build Coastguard Worker             }
10213*8975f5c5SAndroid Build Coastguard Worker         }
10214*8975f5c5SAndroid Build Coastguard Worker 
10215*8975f5c5SAndroid Build Coastguard Worker         const GLvoid *imageData;
10216*8975f5c5SAndroid Build Coastguard Worker         switch (type)
10217*8975f5c5SAndroid Build Coastguard Worker         {
10218*8975f5c5SAndroid Build Coastguard Worker             case GL_FLOAT:
10219*8975f5c5SAndroid Build Coastguard Worker                 imageData = imageDataFloat;
10220*8975f5c5SAndroid Build Coastguard Worker                 break;
10221*8975f5c5SAndroid Build Coastguard Worker             case GL_HALF_FLOAT:
10222*8975f5c5SAndroid Build Coastguard Worker             case GL_HALF_FLOAT_OES:
10223*8975f5c5SAndroid Build Coastguard Worker                 imageData = imageDataHalf;
10224*8975f5c5SAndroid Build Coastguard Worker                 break;
10225*8975f5c5SAndroid Build Coastguard Worker             default:
10226*8975f5c5SAndroid Build Coastguard Worker                 imageData = nullptr;
10227*8975f5c5SAndroid Build Coastguard Worker         }
10228*8975f5c5SAndroid Build Coastguard Worker         ASSERT(imageData != nullptr);
10229*8975f5c5SAndroid Build Coastguard Worker 
10230*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTestTexture);
10231*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 2, 2, 0, format, type, imageData);
10232*8975f5c5SAndroid Build Coastguard Worker 
10233*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
10234*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
10235*8975f5c5SAndroid Build Coastguard Worker 
10236*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
10237*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
10238*8975f5c5SAndroid Build Coastguard Worker 
10239*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
10240*8975f5c5SAndroid Build Coastguard Worker         // Source texture contains 2 black pixels and 2 white pixels, we sample in the center so we
10241*8975f5c5SAndroid Build Coastguard Worker         // should expect the final value to be gray (halfway in-between)
10242*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, SliceFormatColor(format, GLColor(127u, 127u, 127u, 127u)),
10243*8975f5c5SAndroid Build Coastguard Worker                                 kPixelTolerance);
10244*8975f5c5SAndroid Build Coastguard Worker     }
10245*8975f5c5SAndroid Build Coastguard Worker 
performFloatTextureRender(GLenum internalFormat,GLenum renderBufferFormat,GLenum format,GLenum type)10246*8975f5c5SAndroid Build Coastguard Worker     bool performFloatTextureRender(GLenum internalFormat,
10247*8975f5c5SAndroid Build Coastguard Worker                                    GLenum renderBufferFormat,
10248*8975f5c5SAndroid Build Coastguard Worker                                    GLenum format,
10249*8975f5c5SAndroid Build Coastguard Worker                                    GLenum type)
10250*8975f5c5SAndroid Build Coastguard Worker     {
10251*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTestTexture);
10252*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, format, type, nullptr);
10253*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
10254*8975f5c5SAndroid Build Coastguard Worker 
10255*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
10256*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, renderBufferFormat, 1, 1);
10257*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
10258*8975f5c5SAndroid Build Coastguard Worker                                   mRenderbuffer);
10259*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, 0);
10260*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
10261*8975f5c5SAndroid Build Coastguard Worker 
10262*8975f5c5SAndroid Build Coastguard Worker         if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
10263*8975f5c5SAndroid Build Coastguard Worker         {
10264*8975f5c5SAndroid Build Coastguard Worker             return false;
10265*8975f5c5SAndroid Build Coastguard Worker         }
10266*8975f5c5SAndroid Build Coastguard Worker 
10267*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
10268*8975f5c5SAndroid Build Coastguard Worker 
10269*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
10270*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
10271*8975f5c5SAndroid Build Coastguard Worker 
10272*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
10273*8975f5c5SAndroid Build Coastguard Worker         return true;
10274*8975f5c5SAndroid Build Coastguard Worker     }
10275*8975f5c5SAndroid Build Coastguard Worker 
10276*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderableTexture;
10277*8975f5c5SAndroid Build Coastguard Worker     GLuint mTestTexture;
10278*8975f5c5SAndroid Build Coastguard Worker     GLuint mFBO;
10279*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderbuffer;
10280*8975f5c5SAndroid Build Coastguard Worker };
10281*8975f5c5SAndroid Build Coastguard Worker 
10282*8975f5c5SAndroid Build Coastguard Worker class Texture2DFloatTestES3 : public Texture2DFloatTest
10283*8975f5c5SAndroid Build Coastguard Worker {
10284*8975f5c5SAndroid Build Coastguard Worker   protected:
testFloatTextureRender(GLenum internalFormat,GLenum format,GLenum type)10285*8975f5c5SAndroid Build Coastguard Worker     void testFloatTextureRender(GLenum internalFormat, GLenum format, GLenum type)
10286*8975f5c5SAndroid Build Coastguard Worker     {
10287*8975f5c5SAndroid Build Coastguard Worker         bool framebufferComplete =
10288*8975f5c5SAndroid Build Coastguard Worker             performFloatTextureRender(internalFormat, internalFormat, format, type);
10289*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(framebufferComplete);
10290*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
10291*8975f5c5SAndroid Build Coastguard Worker                                    SliceFormatColor32F(format, GLColor32F(1.0f, 1.0f, 1.0f, 1.0f)),
10292*8975f5c5SAndroid Build Coastguard Worker                                    kPixelTolerance32F);
10293*8975f5c5SAndroid Build Coastguard Worker     }
10294*8975f5c5SAndroid Build Coastguard Worker };
10295*8975f5c5SAndroid Build Coastguard Worker 
10296*8975f5c5SAndroid Build Coastguard Worker class Texture2DFloatTestES2 : public Texture2DFloatTest
10297*8975f5c5SAndroid Build Coastguard Worker {
10298*8975f5c5SAndroid Build Coastguard Worker   protected:
checkFloatTextureRender(GLenum renderBufferFormat,GLenum format,GLenum type)10299*8975f5c5SAndroid Build Coastguard Worker     bool checkFloatTextureRender(GLenum renderBufferFormat, GLenum format, GLenum type)
10300*8975f5c5SAndroid Build Coastguard Worker     {
10301*8975f5c5SAndroid Build Coastguard Worker         bool framebufferComplete =
10302*8975f5c5SAndroid Build Coastguard Worker             performFloatTextureRender(format, renderBufferFormat, format, type);
10303*8975f5c5SAndroid Build Coastguard Worker 
10304*8975f5c5SAndroid Build Coastguard Worker         if (!framebufferComplete)
10305*8975f5c5SAndroid Build Coastguard Worker         {
10306*8975f5c5SAndroid Build Coastguard Worker             return false;
10307*8975f5c5SAndroid Build Coastguard Worker         }
10308*8975f5c5SAndroid Build Coastguard Worker 
10309*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
10310*8975f5c5SAndroid Build Coastguard Worker                                    SliceFormatColor32F(format, GLColor32F(1.0f, 1.0f, 1.0f, 1.0f)),
10311*8975f5c5SAndroid Build Coastguard Worker                                    kPixelTolerance32F);
10312*8975f5c5SAndroid Build Coastguard Worker         return true;
10313*8975f5c5SAndroid Build Coastguard Worker     }
10314*8975f5c5SAndroid Build Coastguard Worker };
10315*8975f5c5SAndroid Build Coastguard Worker 
10316*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for ES3 float texture formats
TEST_P(Texture2DFloatTestES3,TextureFloatSampleBasicTest)10317*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureFloatSampleBasicTest)
10318*8975f5c5SAndroid Build Coastguard Worker {
10319*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGBA32F, GL_RGBA, GL_FLOAT);
10320*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGB32F, GL_RGB, GL_FLOAT);
10321*8975f5c5SAndroid Build Coastguard Worker }
10322*8975f5c5SAndroid Build Coastguard Worker 
10323*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for ES2 float texture formats
TEST_P(Texture2DFloatTestES2,TextureFloatSampleBasicTest)10324*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureFloatSampleBasicTest)
10325*8975f5c5SAndroid Build Coastguard Worker {
10326*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10327*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGBA, GL_RGBA, GL_FLOAT);
10328*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGB, GL_RGB, GL_FLOAT);
10329*8975f5c5SAndroid Build Coastguard Worker }
10330*8975f5c5SAndroid Build Coastguard Worker 
10331*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for ES3 half float texture formats
TEST_P(Texture2DFloatTestES3,TextureHalfFloatSampleBasicTest)10332*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureHalfFloatSampleBasicTest)
10333*8975f5c5SAndroid Build Coastguard Worker {
10334*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
10335*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
10336*8975f5c5SAndroid Build Coastguard Worker }
10337*8975f5c5SAndroid Build Coastguard Worker 
10338*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for ES2 half float texture formats
TEST_P(Texture2DFloatTestES2,TextureHalfFloatSampleBasicTest)10339*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureHalfFloatSampleBasicTest)
10340*8975f5c5SAndroid Build Coastguard Worker {
10341*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
10342*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES);
10343*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_RGB, GL_RGB, GL_HALF_FLOAT_OES);
10344*8975f5c5SAndroid Build Coastguard Worker }
10345*8975f5c5SAndroid Build Coastguard Worker 
10346*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for legacy GLES 2.0 float texture formats in ES3
TEST_P(Texture2DFloatTestES3,TextureFloatSampleLegacyTest)10347*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureFloatSampleLegacyTest)
10348*8975f5c5SAndroid Build Coastguard Worker {
10349*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10350*8975f5c5SAndroid Build Coastguard Worker 
10351*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
10352*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_FLOAT);
10353*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
10354*8975f5c5SAndroid Build Coastguard Worker 
10355*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
10356*8975f5c5SAndroid Build Coastguard Worker     {
10357*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureSample(GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT);
10358*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureSample(GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT);
10359*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureSample(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT);
10360*8975f5c5SAndroid Build Coastguard Worker     }
10361*8975f5c5SAndroid Build Coastguard Worker }
10362*8975f5c5SAndroid Build Coastguard Worker 
10363*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for legacy GLES 2.0 float texture formats in ES2
TEST_P(Texture2DFloatTestES2,TextureFloatSampleLegacyTest)10364*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureFloatSampleLegacyTest)
10365*8975f5c5SAndroid Build Coastguard Worker {
10366*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10367*8975f5c5SAndroid Build Coastguard Worker 
10368*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
10369*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_FLOAT);
10370*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
10371*8975f5c5SAndroid Build Coastguard Worker }
10372*8975f5c5SAndroid Build Coastguard Worker 
10373*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for legacy GLES 2.0 half float texture formats in ES3
TEST_P(Texture2DFloatTestES3,TextureHalfFloatSampleLegacyTest)10374*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureHalfFloatSampleLegacyTest)
10375*8975f5c5SAndroid Build Coastguard Worker {
10376*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
10377*8975f5c5SAndroid Build Coastguard Worker 
10378*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
10379*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
10380*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
10381*8975f5c5SAndroid Build Coastguard Worker 
10382*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
10383*8975f5c5SAndroid Build Coastguard Worker     {
10384*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureSample(GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT);
10385*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureSample(GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT);
10386*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureSample(GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT);
10387*8975f5c5SAndroid Build Coastguard Worker     }
10388*8975f5c5SAndroid Build Coastguard Worker }
10389*8975f5c5SAndroid Build Coastguard Worker // Test texture sampling for legacy GLES 2.0 half float texture formats in ES2
TEST_P(Texture2DFloatTestES2,TextureHalfFloatSampleLegacyTest)10390*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureHalfFloatSampleLegacyTest)
10391*8975f5c5SAndroid Build Coastguard Worker {
10392*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
10393*8975f5c5SAndroid Build Coastguard Worker 
10394*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
10395*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
10396*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureSample(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
10397*8975f5c5SAndroid Build Coastguard Worker }
10398*8975f5c5SAndroid Build Coastguard Worker 
10399*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for ES3 32F formats
TEST_P(Texture2DFloatTestES3,TextureFloatLinearTest)10400*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureFloatLinearTest)
10401*8975f5c5SAndroid Build Coastguard Worker {
10402*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/40096747): Failing on ARM-based Apple DTKs.
10403*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && (IsDesktopOpenGL()));
10404*8975f5c5SAndroid Build Coastguard Worker 
10405*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
10406*8975f5c5SAndroid Build Coastguard Worker 
10407*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGBA32F, GL_RGBA, GL_FLOAT);
10408*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGB32F, GL_RGB, GL_FLOAT);
10409*8975f5c5SAndroid Build Coastguard Worker }
10410*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for ES2 32F formats
TEST_P(Texture2DFloatTestES2,TextureFloatLinearTest)10411*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureFloatLinearTest)
10412*8975f5c5SAndroid Build Coastguard Worker {
10413*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/40096747): Failing on ARM-based Apple DTKs.
10414*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && (IsDesktopOpenGL()));
10415*8975f5c5SAndroid Build Coastguard Worker 
10416*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
10417*8975f5c5SAndroid Build Coastguard Worker 
10418*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10419*8975f5c5SAndroid Build Coastguard Worker 
10420*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGBA, GL_RGBA, GL_FLOAT);
10421*8975f5c5SAndroid Build Coastguard Worker }
10422*8975f5c5SAndroid Build Coastguard Worker 
10423*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for ES3 16F formats
TEST_P(Texture2DFloatTestES3,TextureHalfFloatLinearTest)10424*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureHalfFloatLinearTest)
10425*8975f5c5SAndroid Build Coastguard Worker {
10426*8975f5c5SAndroid Build Coastguard Worker     // Half float formats must be linearly filterable in GLES 3.0 core
10427*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
10428*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGB16F, GL_RGB, GL_HALF_FLOAT);
10429*8975f5c5SAndroid Build Coastguard Worker }
10430*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for ES2 16F formats
TEST_P(Texture2DFloatTestES2,TextureHalfFloatLinearTest)10431*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureHalfFloatLinearTest)
10432*8975f5c5SAndroid Build Coastguard Worker {
10433*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
10434*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES);
10435*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_RGB, GL_RGB, GL_HALF_FLOAT_OES);
10436*8975f5c5SAndroid Build Coastguard Worker }
10437*8975f5c5SAndroid Build Coastguard Worker 
10438*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for legacy GLES 2.0 32F formats in ES3
TEST_P(Texture2DFloatTestES3,TextureFloatLinearLegacyTest)10439*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureFloatLinearLegacyTest)
10440*8975f5c5SAndroid Build Coastguard Worker {
10441*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/40096747): Failing on ARM-based Apple DTKs.
10442*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && (IsDesktopOpenGL()));
10443*8975f5c5SAndroid Build Coastguard Worker 
10444*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10445*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
10446*8975f5c5SAndroid Build Coastguard Worker 
10447*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
10448*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_FLOAT);
10449*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
10450*8975f5c5SAndroid Build Coastguard Worker 
10451*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
10452*8975f5c5SAndroid Build Coastguard Worker     {
10453*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureLinear(GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT);
10454*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureLinear(GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT);
10455*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureLinear(GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT);
10456*8975f5c5SAndroid Build Coastguard Worker     }
10457*8975f5c5SAndroid Build Coastguard Worker }
10458*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for legacy GLES 2.0 32F formats in ES2
TEST_P(Texture2DFloatTestES2,TextureFloatLinearLegacyTest)10459*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureFloatLinearLegacyTest)
10460*8975f5c5SAndroid Build Coastguard Worker {
10461*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/40096747): Failing on ARM-based Apple DTKs.
10462*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && (IsDesktopOpenGL()));
10463*8975f5c5SAndroid Build Coastguard Worker 
10464*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float"));
10465*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_float_linear"));
10466*8975f5c5SAndroid Build Coastguard Worker 
10467*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
10468*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_FLOAT);
10469*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
10470*8975f5c5SAndroid Build Coastguard Worker }
10471*8975f5c5SAndroid Build Coastguard Worker 
10472*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for legacy GLES 2.0 16F formats in ES3
TEST_P(Texture2DFloatTestES3,TextureHalfFloatLinearLegacyTest)10473*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureHalfFloatLinearLegacyTest)
10474*8975f5c5SAndroid Build Coastguard Worker {
10475*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
10476*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
10477*8975f5c5SAndroid Build Coastguard Worker 
10478*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
10479*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
10480*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
10481*8975f5c5SAndroid Build Coastguard Worker 
10482*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_texture_storage"))
10483*8975f5c5SAndroid Build Coastguard Worker     {
10484*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureLinear(GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT);
10485*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureLinear(GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT);
10486*8975f5c5SAndroid Build Coastguard Worker         testFloatTextureLinear(GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT);
10487*8975f5c5SAndroid Build Coastguard Worker     }
10488*8975f5c5SAndroid Build Coastguard Worker }
10489*8975f5c5SAndroid Build Coastguard Worker // Test linear sampling for legacy GLES 2.0 16F formats in ES2
TEST_P(Texture2DFloatTestES2,TextureHalfFloatLinearLegacyTest)10490*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureHalfFloatLinearLegacyTest)
10491*8975f5c5SAndroid Build Coastguard Worker {
10492*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
10493*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float_linear"));
10494*8975f5c5SAndroid Build Coastguard Worker 
10495*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
10496*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
10497*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureLinear(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
10498*8975f5c5SAndroid Build Coastguard Worker }
10499*8975f5c5SAndroid Build Coastguard Worker 
10500*8975f5c5SAndroid Build Coastguard Worker // Test color-renderability for ES3 float and half float textures
TEST_P(Texture2DFloatTestES3,TextureFloatRenderTest)10501*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES3, TextureFloatRenderTest)
10502*8975f5c5SAndroid Build Coastguard Worker {
10503*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096654
10504*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D9());
10505*8975f5c5SAndroid Build Coastguard Worker     // EXT_color_buffer_float covers float, half float, and 11-11-10 float formats
10506*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
10507*8975f5c5SAndroid Build Coastguard Worker 
10508*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_R32F, GL_RED, GL_FLOAT);
10509*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_RG32F, GL_RG, GL_FLOAT);
10510*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_RGBA32F, GL_RGBA, GL_FLOAT);
10511*8975f5c5SAndroid Build Coastguard Worker 
10512*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_R16F, GL_RED, GL_HALF_FLOAT);
10513*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_RG16F, GL_RG, GL_HALF_FLOAT);
10514*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT);
10515*8975f5c5SAndroid Build Coastguard Worker 
10516*8975f5c5SAndroid Build Coastguard Worker     testFloatTextureRender(GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT);
10517*8975f5c5SAndroid Build Coastguard Worker }
10518*8975f5c5SAndroid Build Coastguard Worker 
10519*8975f5c5SAndroid Build Coastguard Worker // Test color-renderability for ES2 half float textures
TEST_P(Texture2DFloatTestES2,TextureFloatRenderTest)10520*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DFloatTestES2, TextureFloatRenderTest)
10521*8975f5c5SAndroid Build Coastguard Worker {
10522*8975f5c5SAndroid Build Coastguard Worker     // EXT_color_buffer_half_float requires at least one format to be renderable, but does not
10523*8975f5c5SAndroid Build Coastguard Worker     // require a specific one
10524*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_half_float"));
10525*8975f5c5SAndroid Build Coastguard Worker     // https://crbug.com/1003971
10526*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
10527*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096654
10528*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D9());
10529*8975f5c5SAndroid Build Coastguard Worker 
10530*8975f5c5SAndroid Build Coastguard Worker     bool atLeastOneSupported = false;
10531*8975f5c5SAndroid Build Coastguard Worker 
10532*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_texture_half_float") ||
10533*8975f5c5SAndroid Build Coastguard Worker         IsGLExtensionEnabled("GL_OES_texture_half_float"))
10534*8975f5c5SAndroid Build Coastguard Worker     {
10535*8975f5c5SAndroid Build Coastguard Worker         atLeastOneSupported |= checkFloatTextureRender(GL_R16F_EXT, GL_RED_EXT, GL_HALF_FLOAT_OES);
10536*8975f5c5SAndroid Build Coastguard Worker         atLeastOneSupported |= checkFloatTextureRender(GL_RG16F_EXT, GL_RG_EXT, GL_HALF_FLOAT_OES);
10537*8975f5c5SAndroid Build Coastguard Worker     }
10538*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_texture_half_float"))
10539*8975f5c5SAndroid Build Coastguard Worker     {
10540*8975f5c5SAndroid Build Coastguard Worker         atLeastOneSupported |= checkFloatTextureRender(GL_RGB16F_EXT, GL_RGB, GL_HALF_FLOAT_OES);
10541*8975f5c5SAndroid Build Coastguard Worker 
10542*8975f5c5SAndroid Build Coastguard Worker         // If OES_texture_half_float is supported, then RGBA half float textures must be renderable
10543*8975f5c5SAndroid Build Coastguard Worker         bool rgbaSupported = checkFloatTextureRender(GL_RGBA16F_EXT, GL_RGBA, GL_HALF_FLOAT_OES);
10544*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(rgbaSupported);
10545*8975f5c5SAndroid Build Coastguard Worker         atLeastOneSupported |= rgbaSupported;
10546*8975f5c5SAndroid Build Coastguard Worker     }
10547*8975f5c5SAndroid Build Coastguard Worker 
10548*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(atLeastOneSupported);
10549*8975f5c5SAndroid Build Coastguard Worker }
10550*8975f5c5SAndroid Build Coastguard Worker 
10551*8975f5c5SAndroid Build Coastguard Worker // Test that UNPACK_SKIP_IMAGES doesn't have an effect on 2D texture uploads.
10552*8975f5c5SAndroid Build Coastguard Worker // GLES 3.0.4 section 3.8.3.
TEST_P(Texture2DTestES3,UnpackSkipImages2D)10553*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UnpackSkipImages2D)
10554*8975f5c5SAndroid Build Coastguard Worker {
10555*8975f5c5SAndroid Build Coastguard Worker     // Crashes on Nexus 5X due to a driver bug. http://anglebug.com/42260424
10556*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
10557*8975f5c5SAndroid Build Coastguard Worker 
10558*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
10559*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
10560*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
10561*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10562*8975f5c5SAndroid Build Coastguard Worker 
10563*8975f5c5SAndroid Build Coastguard Worker     // SKIP_IMAGES should not have an effect on uploading 2D textures
10564*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_SKIP_IMAGES, 1000);
10565*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10566*8975f5c5SAndroid Build Coastguard Worker 
10567*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
10568*8975f5c5SAndroid Build Coastguard Worker 
10569*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE,
10570*8975f5c5SAndroid Build Coastguard Worker                  pixelsGreen.data());
10571*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10572*8975f5c5SAndroid Build Coastguard Worker 
10573*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE,
10574*8975f5c5SAndroid Build Coastguard Worker                     pixelsGreen.data());
10575*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10576*8975f5c5SAndroid Build Coastguard Worker 
10577*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
10578*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
10579*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10580*8975f5c5SAndroid Build Coastguard Worker 
10581*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
10582*8975f5c5SAndroid Build Coastguard Worker }
10583*8975f5c5SAndroid Build Coastguard Worker 
10584*8975f5c5SAndroid Build Coastguard Worker // Test that skip defined in unpack parameters is taken into account when determining whether
10585*8975f5c5SAndroid Build Coastguard Worker // unpacking source extends outside unpack buffer bounds.
TEST_P(Texture2DTestES3,UnpackSkipPixelsOutOfBounds)10586*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UnpackSkipPixelsOutOfBounds)
10587*8975f5c5SAndroid Build Coastguard Worker {
10588*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
10589*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
10590*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
10591*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10592*8975f5c5SAndroid Build Coastguard Worker 
10593*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buf;
10594*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
10595*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
10596*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
10597*8975f5c5SAndroid Build Coastguard Worker                  GL_DYNAMIC_COPY);
10598*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10599*8975f5c5SAndroid Build Coastguard Worker 
10600*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
10601*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10602*8975f5c5SAndroid Build Coastguard Worker 
10603*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_SKIP_PIXELS, 1);
10604*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10605*8975f5c5SAndroid Build Coastguard Worker 
10606*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
10607*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
10608*8975f5c5SAndroid Build Coastguard Worker 
10609*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
10610*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_SKIP_ROWS, 1);
10611*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10612*8975f5c5SAndroid Build Coastguard Worker 
10613*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
10614*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
10615*8975f5c5SAndroid Build Coastguard Worker }
10616*8975f5c5SAndroid Build Coastguard Worker 
10617*8975f5c5SAndroid Build Coastguard Worker // Test unpacking to texture from a buffer with a compatible format but different type.
10618*8975f5c5SAndroid Build Coastguard Worker // Compatible formats can be found in "Table 8.2: Valid combinations of format, type, and sized
10619*8975f5c5SAndroid Build Coastguard Worker // internal format." of the OpenGL ES 3.2 spec.
TEST_P(Texture2DTestES3,UnpackCompatibleFormatButDifferentType)10620*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UnpackCompatibleFormatButDifferentType)
10621*8975f5c5SAndroid Build Coastguard Worker {
10622*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
10623*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
10624*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
10625*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10626*8975f5c5SAndroid Build Coastguard Worker 
10627*8975f5c5SAndroid Build Coastguard Worker     // Create texture with GL_RGBA4 format and fill with red
10628*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(128u * 128u, GLColor::red);
10629*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE,
10630*8975f5c5SAndroid Build Coastguard Worker                  pixelsRed.data());
10631*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10632*8975f5c5SAndroid Build Coastguard Worker 
10633*8975f5c5SAndroid Build Coastguard Worker     // Call glTexSubImage2D with incompatible format and expect an error
10634*8975f5c5SAndroid Build Coastguard Worker     std::array<GLubyte, 2> rgColor = {255, 255};
10635*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RG, GL_UNSIGNED_BYTE, rgColor.data());
10636*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
10637*8975f5c5SAndroid Build Coastguard Worker 
10638*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
10639*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
10640*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10641*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
10642*8975f5c5SAndroid Build Coastguard Worker 
10643*8975f5c5SAndroid Build Coastguard Worker     // Create unpack buffer with GL_RGBA8
10644*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buf;
10645*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
10646*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green);
10647*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
10648*8975f5c5SAndroid Build Coastguard Worker                  GL_DYNAMIC_COPY);
10649*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10650*8975f5c5SAndroid Build Coastguard Worker 
10651*8975f5c5SAndroid Build Coastguard Worker     // Unpack GL_RGBA8 buffer data to GL_RGBA4 texture
10652*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0);
10653*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10654*8975f5c5SAndroid Build Coastguard Worker 
10655*8975f5c5SAndroid Build Coastguard Worker     // Validate that the data was unpacked correctly
10656*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
10657*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
10658*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10659*8975f5c5SAndroid Build Coastguard Worker 
10660*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
10661*8975f5c5SAndroid Build Coastguard Worker }
10662*8975f5c5SAndroid Build Coastguard Worker 
10663*8975f5c5SAndroid Build Coastguard Worker // Test that unpacking rows that overlap in a pixel unpack buffer works as expected.
TEST_P(Texture2DTestES3,UnpackOverlappingRowsFromUnpackBuffer)10664*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UnpackOverlappingRowsFromUnpackBuffer)
10665*8975f5c5SAndroid Build Coastguard Worker {
10666*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D11());
10667*8975f5c5SAndroid Build Coastguard Worker 
10668*8975f5c5SAndroid Build Coastguard Worker     // Incorrect rendering results seen on OSX AMD.
10669*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsMac() && IsAMD());
10670*8975f5c5SAndroid Build Coastguard Worker 
10671*8975f5c5SAndroid Build Coastguard Worker     const GLuint width            = 8u;
10672*8975f5c5SAndroid Build Coastguard Worker     const GLuint height           = 8u;
10673*8975f5c5SAndroid Build Coastguard Worker     const GLuint unpackRowLength  = 5u;
10674*8975f5c5SAndroid Build Coastguard Worker     const GLuint unpackSkipPixels = 1u;
10675*8975f5c5SAndroid Build Coastguard Worker 
10676*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
10677*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
10678*8975f5c5SAndroid Build Coastguard Worker 
10679*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
10680*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
10681*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
10682*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10683*8975f5c5SAndroid Build Coastguard Worker 
10684*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buf;
10685*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
10686*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen((height - 1u) * unpackRowLength + width + unpackSkipPixels,
10687*8975f5c5SAndroid Build Coastguard Worker                                      GLColor::green);
10688*8975f5c5SAndroid Build Coastguard Worker 
10689*8975f5c5SAndroid Build Coastguard Worker     for (GLuint skippedPixel = 0u; skippedPixel < unpackSkipPixels; ++skippedPixel)
10690*8975f5c5SAndroid Build Coastguard Worker     {
10691*8975f5c5SAndroid Build Coastguard Worker         pixelsGreen[skippedPixel] = GLColor(255, 0, 0, 255);
10692*8975f5c5SAndroid Build Coastguard Worker     }
10693*8975f5c5SAndroid Build Coastguard Worker 
10694*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
10695*8975f5c5SAndroid Build Coastguard Worker                  GL_DYNAMIC_COPY);
10696*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10697*8975f5c5SAndroid Build Coastguard Worker 
10698*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength);
10699*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackSkipPixels);
10700*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10701*8975f5c5SAndroid Build Coastguard Worker 
10702*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
10703*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10704*8975f5c5SAndroid Build Coastguard Worker 
10705*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
10706*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
10707*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10708*8975f5c5SAndroid Build Coastguard Worker 
10709*8975f5c5SAndroid Build Coastguard Worker     GLuint windowPixelCount = getWindowWidth() * getWindowHeight();
10710*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> actual(windowPixelCount, GLColor::black);
10711*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
10712*8975f5c5SAndroid Build Coastguard Worker                  actual.data());
10713*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> expected(windowPixelCount, GLColor::green);
10714*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(expected, actual);
10715*8975f5c5SAndroid Build Coastguard Worker }
10716*8975f5c5SAndroid Build Coastguard Worker 
10717*8975f5c5SAndroid Build Coastguard Worker template <typename T>
UNorm(double value)10718*8975f5c5SAndroid Build Coastguard Worker T UNorm(double value)
10719*8975f5c5SAndroid Build Coastguard Worker {
10720*8975f5c5SAndroid Build Coastguard Worker     return static_cast<T>(value * static_cast<double>(std::numeric_limits<T>::max()));
10721*8975f5c5SAndroid Build Coastguard Worker }
10722*8975f5c5SAndroid Build Coastguard Worker 
10723*8975f5c5SAndroid Build Coastguard Worker // Test rendering a depth texture with mipmaps.
TEST_P(Texture2DTestES3,DepthTexturesWithMipmaps)10724*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, DepthTexturesWithMipmaps)
10725*8975f5c5SAndroid Build Coastguard Worker {
10726*8975f5c5SAndroid Build Coastguard Worker     // TODO(cwallez) this is failing on Intel Win7 OpenGL.
10727*8975f5c5SAndroid Build Coastguard Worker     // TODO(zmo) this is faling on Win Intel HD 530 Debug.
10728*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42260646
10729*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
10730*8975f5c5SAndroid Build Coastguard Worker 
10731*8975f5c5SAndroid Build Coastguard Worker     // Seems to fail on AMD D3D11. Possibly driver bug. http://anglebug.com/40096577
10732*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsD3D11());
10733*8975f5c5SAndroid Build Coastguard Worker 
10734*8975f5c5SAndroid Build Coastguard Worker     // TODO(cnorthrop): Also failing on Vulkan/Windows/AMD. http://anglebug.com/42262590
10735*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsVulkan());
10736*8975f5c5SAndroid Build Coastguard Worker 
10737*8975f5c5SAndroid Build Coastguard Worker     const int size = getWindowWidth();
10738*8975f5c5SAndroid Build Coastguard Worker 
10739*8975f5c5SAndroid Build Coastguard Worker     auto dim   = [size](int level) { return size >> level; };
10740*8975f5c5SAndroid Build Coastguard Worker     int levels = gl::log2(size);
10741*8975f5c5SAndroid Build Coastguard Worker 
10742*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
10743*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
10744*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, levels, GL_DEPTH_COMPONENT24, size, size);
10745*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
10746*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
10747*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
10748*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
10749*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
10750*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10751*8975f5c5SAndroid Build Coastguard Worker 
10752*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
10753*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
10754*8975f5c5SAndroid Build Coastguard Worker 
10755*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> expected;
10756*8975f5c5SAndroid Build Coastguard Worker 
10757*8975f5c5SAndroid Build Coastguard Worker     for (int level = 0; level < levels; ++level)
10758*8975f5c5SAndroid Build Coastguard Worker     {
10759*8975f5c5SAndroid Build Coastguard Worker         double value = (static_cast<double>(level) / static_cast<double>(levels - 1));
10760*8975f5c5SAndroid Build Coastguard Worker         expected.push_back(UNorm<unsigned char>(value));
10761*8975f5c5SAndroid Build Coastguard Worker 
10762*8975f5c5SAndroid Build Coastguard Worker         int levelDim = dim(level);
10763*8975f5c5SAndroid Build Coastguard Worker 
10764*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GT(levelDim, 0);
10765*8975f5c5SAndroid Build Coastguard Worker 
10766*8975f5c5SAndroid Build Coastguard Worker         std::vector<unsigned int> initData(levelDim * levelDim, UNorm<unsigned int>(value));
10767*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, levelDim, levelDim, GL_DEPTH_COMPONENT,
10768*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_INT, initData.data());
10769*8975f5c5SAndroid Build Coastguard Worker     }
10770*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10771*8975f5c5SAndroid Build Coastguard Worker 
10772*8975f5c5SAndroid Build Coastguard Worker     for (int level = 0; level < levels; ++level)
10773*8975f5c5SAndroid Build Coastguard Worker     {
10774*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, dim(level), dim(level));
10775*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
10776*8975f5c5SAndroid Build Coastguard Worker         GLColor actual = ReadColor(0, 0);
10777*8975f5c5SAndroid Build Coastguard Worker         EXPECT_NEAR(expected[level], actual.R, 10u);
10778*8975f5c5SAndroid Build Coastguard Worker     }
10779*8975f5c5SAndroid Build Coastguard Worker 
10780*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10781*8975f5c5SAndroid Build Coastguard Worker }
10782*8975f5c5SAndroid Build Coastguard Worker 
10783*8975f5c5SAndroid Build Coastguard Worker class Texture2DDepthTest : public Texture2DTest
10784*8975f5c5SAndroid Build Coastguard Worker {
10785*8975f5c5SAndroid Build Coastguard Worker   protected:
Texture2DDepthTest()10786*8975f5c5SAndroid Build Coastguard Worker     Texture2DDepthTest() : Texture2DTest() {}
10787*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()10788*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() override
10789*8975f5c5SAndroid Build Coastguard Worker     {
10790*8975f5c5SAndroid Build Coastguard Worker         return "attribute vec4 vPosition;\n"
10791*8975f5c5SAndroid Build Coastguard Worker                "void main() {\n"
10792*8975f5c5SAndroid Build Coastguard Worker                "  gl_Position = vPosition;\n"
10793*8975f5c5SAndroid Build Coastguard Worker                "}\n";
10794*8975f5c5SAndroid Build Coastguard Worker     }
10795*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()10796*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource() override
10797*8975f5c5SAndroid Build Coastguard Worker     {
10798*8975f5c5SAndroid Build Coastguard Worker         return "precision mediump float;\n"
10799*8975f5c5SAndroid Build Coastguard Worker                "uniform sampler2D ShadowMap;"
10800*8975f5c5SAndroid Build Coastguard Worker                "void main() {\n"
10801*8975f5c5SAndroid Build Coastguard Worker                "  vec4 shadow_value = texture2D(ShadowMap, vec2(0.5, 0.5));"
10802*8975f5c5SAndroid Build Coastguard Worker                "  if (shadow_value.x == shadow_value.z && shadow_value.x != 0.0) {"
10803*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
10804*8975f5c5SAndroid Build Coastguard Worker                "  } else {"
10805*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
10806*8975f5c5SAndroid Build Coastguard Worker                "  }"
10807*8975f5c5SAndroid Build Coastguard Worker                "}\n";
10808*8975f5c5SAndroid Build Coastguard Worker     }
10809*8975f5c5SAndroid Build Coastguard Worker 
checkTexImageFormatSupport(GLenum format,GLenum internalformat,GLenum type)10810*8975f5c5SAndroid Build Coastguard Worker     bool checkTexImageFormatSupport(GLenum format, GLenum internalformat, GLenum type)
10811*8975f5c5SAndroid Build Coastguard Worker     {
10812*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
10813*8975f5c5SAndroid Build Coastguard Worker 
10814*8975f5c5SAndroid Build Coastguard Worker         GLTexture tex;
10815*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
10816*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, format, 1, 1, 0, format, type, nullptr);
10817*8975f5c5SAndroid Build Coastguard Worker 
10818*8975f5c5SAndroid Build Coastguard Worker         return (glGetError() == GL_NO_ERROR);
10819*8975f5c5SAndroid Build Coastguard Worker     }
10820*8975f5c5SAndroid Build Coastguard Worker 
testBehavior(bool useSizedComponent)10821*8975f5c5SAndroid Build Coastguard Worker     void testBehavior(bool useSizedComponent)
10822*8975f5c5SAndroid Build Coastguard Worker     {
10823*8975f5c5SAndroid Build Coastguard Worker         int w                 = getWindowWidth();
10824*8975f5c5SAndroid Build Coastguard Worker         int h                 = getWindowHeight();
10825*8975f5c5SAndroid Build Coastguard Worker         GLuint format         = GL_DEPTH_COMPONENT;
10826*8975f5c5SAndroid Build Coastguard Worker         GLuint internalFormat = GL_DEPTH_COMPONENT;
10827*8975f5c5SAndroid Build Coastguard Worker 
10828*8975f5c5SAndroid Build Coastguard Worker         if (useSizedComponent)
10829*8975f5c5SAndroid Build Coastguard Worker         {
10830*8975f5c5SAndroid Build Coastguard Worker             internalFormat = GL_DEPTH_COMPONENT24;
10831*8975f5c5SAndroid Build Coastguard Worker         }
10832*8975f5c5SAndroid Build Coastguard Worker 
10833*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
10834*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10835*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10836*8975f5c5SAndroid Build Coastguard Worker 
10837*8975f5c5SAndroid Build Coastguard Worker         GLTexture depthTexture;
10838*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthTexture);
10839*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
10840*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
10841*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
10842*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
10843*8975f5c5SAndroid Build Coastguard Worker 
10844*8975f5c5SAndroid Build Coastguard Worker         TexCoordDrawTest::setUpProgram();
10845*8975f5c5SAndroid Build Coastguard Worker         GLint shadowMapLocation = glGetUniformLocation(mProgram, "ShadowMap");
10846*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, shadowMapLocation);
10847*8975f5c5SAndroid Build Coastguard Worker 
10848*8975f5c5SAndroid Build Coastguard Worker         GLint positionLocation = glGetAttribLocation(mProgram, "vPosition");
10849*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, positionLocation);
10850*8975f5c5SAndroid Build Coastguard Worker 
10851*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!checkTexImageFormatSupport(format, internalFormat, GL_UNSIGNED_INT));
10852*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthTexture);
10853*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, w, h, 0, format, GL_UNSIGNED_INT, nullptr);
10854*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10855*8975f5c5SAndroid Build Coastguard Worker 
10856*8975f5c5SAndroid Build Coastguard Worker         // try adding a color buffer.
10857*8975f5c5SAndroid Build Coastguard Worker         GLTexture colorTex;
10858*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, colorTex);
10859*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
10860*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
10861*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
10862*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
10863*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
10864*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
10865*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
10866*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
10867*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10868*8975f5c5SAndroid Build Coastguard Worker 
10869*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, w, h);
10870*8975f5c5SAndroid Build Coastguard Worker         // Fill depthTexture with 0.75
10871*8975f5c5SAndroid Build Coastguard Worker         glClearDepthf(0.75);
10872*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_DEPTH_BUFFER_BIT);
10873*8975f5c5SAndroid Build Coastguard Worker 
10874*8975f5c5SAndroid Build Coastguard Worker         // Revert to normal framebuffer to test depth shader
10875*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
10876*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, w, h);
10877*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
10878*8975f5c5SAndroid Build Coastguard Worker         glClearDepthf(0.0f);
10879*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10880*8975f5c5SAndroid Build Coastguard Worker 
10881*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
10882*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10883*8975f5c5SAndroid Build Coastguard Worker 
10884*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
10885*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthTexture);
10886*8975f5c5SAndroid Build Coastguard Worker 
10887*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
10888*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10889*8975f5c5SAndroid Build Coastguard Worker 
10890*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(shadowMapLocation, 0);
10891*8975f5c5SAndroid Build Coastguard Worker 
10892*8975f5c5SAndroid Build Coastguard Worker         const GLfloat gTriangleVertices[] = {-0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f};
10893*8975f5c5SAndroid Build Coastguard Worker 
10894*8975f5c5SAndroid Build Coastguard Worker         glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices);
10895*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10896*8975f5c5SAndroid Build Coastguard Worker         glEnableVertexAttribArray(positionLocation);
10897*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10898*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10899*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10900*8975f5c5SAndroid Build Coastguard Worker 
10901*8975f5c5SAndroid Build Coastguard Worker         GLuint pixels[1];
10902*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(w / 2, h / 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
10903*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
10904*8975f5c5SAndroid Build Coastguard Worker 
10905*8975f5c5SAndroid Build Coastguard Worker         // The GLES 3.x spec says that the depth texture sample can be found in the RED component.
10906*8975f5c5SAndroid Build Coastguard Worker         // However, the OES_depth_texture indicates that the depth value is treated as luminance and
10907*8975f5c5SAndroid Build Coastguard Worker         // is in all the color components. Multiple implementations implement a workaround that
10908*8975f5c5SAndroid Build Coastguard Worker         // follows the OES_depth_texture behavior if the internalformat given at glTexImage2D was a
10909*8975f5c5SAndroid Build Coastguard Worker         // unsized format (e.g. DEPTH_COMPONENT) and the GLES 3.x behavior if it was a sized
10910*8975f5c5SAndroid Build Coastguard Worker         // internalformat such as GL_DEPTH_COMPONENT24. The shader will write out a different color
10911*8975f5c5SAndroid Build Coastguard Worker         // depending on if it sees the texture sample in only the RED component.
10912*8975f5c5SAndroid Build Coastguard Worker         if (useSizedComponent)
10913*8975f5c5SAndroid Build Coastguard Worker         {
10914*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(pixels[0], 0xff0000ff);
10915*8975f5c5SAndroid Build Coastguard Worker         }
10916*8975f5c5SAndroid Build Coastguard Worker         else
10917*8975f5c5SAndroid Build Coastguard Worker         {
10918*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(pixels[0], 0xff0000ff);
10919*8975f5c5SAndroid Build Coastguard Worker         }
10920*8975f5c5SAndroid Build Coastguard Worker 
10921*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
10922*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mProgram);
10923*8975f5c5SAndroid Build Coastguard Worker     }
10924*8975f5c5SAndroid Build Coastguard Worker };
10925*8975f5c5SAndroid Build Coastguard Worker 
10926*8975f5c5SAndroid Build Coastguard Worker // Test depth texture compatibility with OES_depth_texture. Uses unsized internal format.
TEST_P(Texture2DDepthTest,DepthTextureES2Compatibility)10927*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthTest, DepthTextureES2Compatibility)
10928*8975f5c5SAndroid Build Coastguard Worker {
10929*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D11());
10930*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
10931*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_depth_texture") &&
10932*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_OES_depth_texture"));
10933*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096654
10934*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() || IsOpenGLES());
10935*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsARM64() && IsWindows() && IsD3D());
10936*8975f5c5SAndroid Build Coastguard Worker 
10937*8975f5c5SAndroid Build Coastguard Worker     // When the depth texture is specified with unsized internalformat implementations follow
10938*8975f5c5SAndroid Build Coastguard Worker     // OES_depth_texture behavior. Otherwise they follow GLES 3.0 behavior.
10939*8975f5c5SAndroid Build Coastguard Worker     testBehavior(false);
10940*8975f5c5SAndroid Build Coastguard Worker }
10941*8975f5c5SAndroid Build Coastguard Worker 
10942*8975f5c5SAndroid Build Coastguard Worker // Test depth texture compatibility with GLES3 using sized internalformat.
TEST_P(Texture2DDepthTest,DepthTextureES3Compatibility)10943*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DDepthTest, DepthTextureES3Compatibility)
10944*8975f5c5SAndroid Build Coastguard Worker {
10945*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
10946*8975f5c5SAndroid Build Coastguard Worker 
10947*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263796
10948*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMetal() && !IsMetalTextureSwizzleAvailable());
10949*8975f5c5SAndroid Build Coastguard Worker 
10950*8975f5c5SAndroid Build Coastguard Worker     testBehavior(true);
10951*8975f5c5SAndroid Build Coastguard Worker }
10952*8975f5c5SAndroid Build Coastguard Worker 
10953*8975f5c5SAndroid Build Coastguard Worker // Tests unpacking into the unsized GL_ALPHA format.
TEST_P(Texture2DTestES3,UnsizedAlphaUnpackBuffer)10954*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UnsizedAlphaUnpackBuffer)
10955*8975f5c5SAndroid Build Coastguard Worker {
10956*8975f5c5SAndroid Build Coastguard Worker     // Initialize the texure.
10957*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
10958*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, getWindowWidth(), getWindowHeight(), 0, GL_ALPHA,
10959*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
10960*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
10961*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
10962*8975f5c5SAndroid Build Coastguard Worker 
10963*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> bufferData(getWindowWidth() * getWindowHeight(), 127);
10964*8975f5c5SAndroid Build Coastguard Worker 
10965*8975f5c5SAndroid Build Coastguard Worker     // Pull in the color data from the unpack buffer.
10966*8975f5c5SAndroid Build Coastguard Worker     GLBuffer unpackBuffer;
10967*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
10968*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
10969*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, getWindowWidth() * getWindowHeight(), bufferData.data(),
10970*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
10971*8975f5c5SAndroid Build Coastguard Worker 
10972*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth(), getWindowHeight(), GL_ALPHA,
10973*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, nullptr);
10974*8975f5c5SAndroid Build Coastguard Worker 
10975*8975f5c5SAndroid Build Coastguard Worker     // Clear to a weird color to make sure we're drawing something.
10976*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.8f, 1.0f, 0.2f);
10977*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
10978*8975f5c5SAndroid Build Coastguard Worker 
10979*8975f5c5SAndroid Build Coastguard Worker     // Draw with the alpha texture and verify.
10980*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
10981*8975f5c5SAndroid Build Coastguard Worker 
10982*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
10983*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 127, 1);
10984*8975f5c5SAndroid Build Coastguard Worker }
10985*8975f5c5SAndroid Build Coastguard Worker 
10986*8975f5c5SAndroid Build Coastguard Worker // Ensure stale unpack data doesn't propagate in D3D11.
TEST_P(Texture2DTestES3,StaleUnpackData)10987*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, StaleUnpackData)
10988*8975f5c5SAndroid Build Coastguard Worker {
10989*8975f5c5SAndroid Build Coastguard Worker     // Init unpack buffer.
10990*8975f5c5SAndroid Build Coastguard Worker     GLsizei pixelCount = getWindowWidth() * getWindowHeight() / 2;
10991*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(pixelCount, GLColor::red);
10992*8975f5c5SAndroid Build Coastguard Worker 
10993*8975f5c5SAndroid Build Coastguard Worker     GLBuffer unpackBuffer;
10994*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
10995*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
10996*8975f5c5SAndroid Build Coastguard Worker     GLsizei bufferSize = pixelCount * sizeof(GLColor);
10997*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, pixels.data(), GL_STATIC_DRAW);
10998*8975f5c5SAndroid Build Coastguard Worker 
10999*8975f5c5SAndroid Build Coastguard Worker     // Create from unpack buffer.
11000*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
11001*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth() / 2, getWindowHeight() / 2, 0,
11002*8975f5c5SAndroid Build Coastguard Worker                  GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11003*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
11004*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11005*8975f5c5SAndroid Build Coastguard Worker 
11006*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11007*8975f5c5SAndroid Build Coastguard Worker 
11008*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11009*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
11010*8975f5c5SAndroid Build Coastguard Worker 
11011*8975f5c5SAndroid Build Coastguard Worker     // Fill unpack with green, recreating buffer.
11012*8975f5c5SAndroid Build Coastguard Worker     pixels.assign(getWindowWidth() * getWindowHeight(), GLColor::green);
11013*8975f5c5SAndroid Build Coastguard Worker     GLsizei size2 = getWindowWidth() * getWindowHeight() * sizeof(GLColor);
11014*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, size2, pixels.data(), GL_STATIC_DRAW);
11015*8975f5c5SAndroid Build Coastguard Worker 
11016*8975f5c5SAndroid Build Coastguard Worker     // Reinit texture with green.
11017*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GL_RGBA,
11018*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, nullptr);
11019*8975f5c5SAndroid Build Coastguard Worker 
11020*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11021*8975f5c5SAndroid Build Coastguard Worker 
11022*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11023*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
11024*8975f5c5SAndroid Build Coastguard Worker }
11025*8975f5c5SAndroid Build Coastguard Worker 
11026*8975f5c5SAndroid Build Coastguard Worker // Ensure that texture parameters passed as floats that are converted to ints are rounded before
11027*8975f5c5SAndroid Build Coastguard Worker // validating they are less than 0.
TEST_P(Texture2DTestES3,TextureBaseMaxLevelRoundingValidation)11028*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TextureBaseMaxLevelRoundingValidation)
11029*8975f5c5SAndroid Build Coastguard Worker {
11030*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
11031*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
11032*8975f5c5SAndroid Build Coastguard Worker 
11033*8975f5c5SAndroid Build Coastguard Worker     // Use a negative number that will round to zero when converted to an integer
11034*8975f5c5SAndroid Build Coastguard Worker     // According to the spec(2.3.1 Data Conversion For State - Setting Commands):
11035*8975f5c5SAndroid Build Coastguard Worker     // "Validation of values performed by state-setting commands is performed after conversion,
11036*8975f5c5SAndroid Build Coastguard Worker     // unless specified otherwise for a specific command."
11037*8975f5c5SAndroid Build Coastguard Worker     GLfloat param = -7.30157126e-07f;
11038*8975f5c5SAndroid Build Coastguard Worker     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, param);
11039*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11040*8975f5c5SAndroid Build Coastguard Worker 
11041*8975f5c5SAndroid Build Coastguard Worker     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, param);
11042*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11043*8975f5c5SAndroid Build Coastguard Worker }
11044*8975f5c5SAndroid Build Coastguard Worker 
11045*8975f5c5SAndroid Build Coastguard Worker // This test covers a D3D format redefinition bug for 3D textures. The base level format was not
11046*8975f5c5SAndroid Build Coastguard Worker // being properly checked, and the texture storage of the previous texture format was persisting.
11047*8975f5c5SAndroid Build Coastguard Worker // This would result in an ASSERT in debug and incorrect rendering in release.
11048*8975f5c5SAndroid Build Coastguard Worker // See http://anglebug.com/42260575 and WebGL 2 test conformance2/misc/views-with-offsets.html.
TEST_P(Texture3DTestES3,FormatRedefinitionBug)11049*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, FormatRedefinitionBug)
11050*8975f5c5SAndroid Build Coastguard Worker {
11051*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11052*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, tex);
11053*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11054*8975f5c5SAndroid Build Coastguard Worker 
11055*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
11056*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
11057*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
11058*8975f5c5SAndroid Build Coastguard Worker 
11059*8975f5c5SAndroid Build Coastguard Worker     glCheckFramebufferStatus(GL_FRAMEBUFFER);
11060*8975f5c5SAndroid Build Coastguard Worker 
11061*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> pixelData(100, 0);
11062*8975f5c5SAndroid Build Coastguard Worker 
11063*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB565, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, nullptr);
11064*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 1, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
11065*8975f5c5SAndroid Build Coastguard Worker                     pixelData.data());
11066*8975f5c5SAndroid Build Coastguard Worker 
11067*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11068*8975f5c5SAndroid Build Coastguard Worker }
11069*8975f5c5SAndroid Build Coastguard Worker 
11070*8975f5c5SAndroid Build Coastguard Worker // Test glTexSubImage using PBO to 3D texture that expose the regression bug
11071*8975f5c5SAndroid Build Coastguard Worker // https://issuetracker.google.com/170657065
TEST_P(Texture3DTestES3,TexSubImageWithPBO)11072*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, TexSubImageWithPBO)
11073*8975f5c5SAndroid Build Coastguard Worker {
11074*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11075*8975f5c5SAndroid Build Coastguard Worker 
11076*8975f5c5SAndroid Build Coastguard Worker     GLuint pbo;
11077*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &pbo);
11078*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
11079*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> pixelData(128 * 128 * 8 * 4, 0x1f);
11080*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, 128 * 128 * 8 * 4, pixelData.data(), GL_STATIC_DRAW);
11081*8975f5c5SAndroid Build Coastguard Worker 
11082*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, tex);
11083*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 8, GL_RGBA8, 128, 128, 8);
11084*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
11085*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
11086*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 128, 128, 8, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11087*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 1, 0, 0, 0, 64, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11088*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 2, 0, 0, 0, 32, 32, 2, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11089*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 3, 0, 0, 0, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11090*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 4, 0, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11091*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 5, 0, 0, 0, 4, 4, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11092*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 6, 0, 0, 0, 2, 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11093*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 7, 0, 0, 0, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11094*8975f5c5SAndroid Build Coastguard Worker 
11095*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11096*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11097*8975f5c5SAndroid Build Coastguard Worker 
11098*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 128, 128, 8, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11099*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 1, 0, 0, 0, 64, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11100*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 2, 0, 0, 0, 32, 32, 2, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11101*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11102*8975f5c5SAndroid Build Coastguard Worker 
11103*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11104*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11105*8975f5c5SAndroid Build Coastguard Worker }
11106*8975f5c5SAndroid Build Coastguard Worker 
11107*8975f5c5SAndroid Build Coastguard Worker // Test basic pixel unpack buffer OOB checks when uploading to a 2D or 3D texture
TEST_P(Texture3DTestES3,BasicUnpackBufferOOB)11108*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DTestES3, BasicUnpackBufferOOB)
11109*8975f5c5SAndroid Build Coastguard Worker {
11110*8975f5c5SAndroid Build Coastguard Worker     // 2D tests
11111*8975f5c5SAndroid Build Coastguard Worker     {
11112*8975f5c5SAndroid Build Coastguard Worker         GLTexture tex;
11113*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
11114*8975f5c5SAndroid Build Coastguard Worker 
11115*8975f5c5SAndroid Build Coastguard Worker         GLBuffer pbo;
11116*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
11117*8975f5c5SAndroid Build Coastguard Worker 
11118*8975f5c5SAndroid Build Coastguard Worker         // Test OOB
11119*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 - 1, nullptr, GL_STATIC_DRAW);
11120*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11121*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_ERROR(GL_INVALID_OPERATION);
11122*8975f5c5SAndroid Build Coastguard Worker 
11123*8975f5c5SAndroid Build Coastguard Worker         // Test OOB
11124*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2, nullptr, GL_STATIC_DRAW);
11125*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11126*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
11127*8975f5c5SAndroid Build Coastguard Worker     }
11128*8975f5c5SAndroid Build Coastguard Worker 
11129*8975f5c5SAndroid Build Coastguard Worker     // 3D tests
11130*8975f5c5SAndroid Build Coastguard Worker     {
11131*8975f5c5SAndroid Build Coastguard Worker         GLTexture tex;
11132*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, tex);
11133*8975f5c5SAndroid Build Coastguard Worker 
11134*8975f5c5SAndroid Build Coastguard Worker         GLBuffer pbo;
11135*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
11136*8975f5c5SAndroid Build Coastguard Worker 
11137*8975f5c5SAndroid Build Coastguard Worker         // Test OOB
11138*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 * 2 - 1, nullptr,
11139*8975f5c5SAndroid Build Coastguard Worker                      GL_STATIC_DRAW);
11140*8975f5c5SAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11141*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_ERROR(GL_INVALID_OPERATION);
11142*8975f5c5SAndroid Build Coastguard Worker 
11143*8975f5c5SAndroid Build Coastguard Worker         // Test OOB
11144*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(GLColor) * 2 * 2 * 2, nullptr, GL_STATIC_DRAW);
11145*8975f5c5SAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11146*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
11147*8975f5c5SAndroid Build Coastguard Worker     }
11148*8975f5c5SAndroid Build Coastguard Worker }
11149*8975f5c5SAndroid Build Coastguard Worker 
11150*8975f5c5SAndroid Build Coastguard Worker // Tests behaviour with a single texture and multiple sampler objects.
TEST_P(Texture2DTestES3,SingleTextureMultipleSamplers)11151*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, SingleTextureMultipleSamplers)
11152*8975f5c5SAndroid Build Coastguard Worker {
11153*8975f5c5SAndroid Build Coastguard Worker     GLint maxTextureUnits = 0;
11154*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
11155*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(maxTextureUnits < 4);
11156*8975f5c5SAndroid Build Coastguard Worker 
11157*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
11158*8975f5c5SAndroid Build Coastguard Worker 
11159*8975f5c5SAndroid Build Coastguard Worker     // Make a single-level texture, fill it with red.
11160*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redColors(kSize * kSize, GLColor::red);
11161*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11162*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
11163*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11164*8975f5c5SAndroid Build Coastguard Worker                  redColors.data());
11165*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
11166*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11167*8975f5c5SAndroid Build Coastguard Worker 
11168*8975f5c5SAndroid Build Coastguard Worker     // Simple confidence check.
11169*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, true);
11170*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11171*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
11172*8975f5c5SAndroid Build Coastguard Worker 
11173*8975f5c5SAndroid Build Coastguard Worker     // Bind texture to unit 1 with a sampler object making it incomplete.
11174*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
11175*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
11176*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
11177*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11178*8975f5c5SAndroid Build Coastguard Worker 
11179*8975f5c5SAndroid Build Coastguard Worker     // Make a mipmap texture, fill it with blue.
11180*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> blueColors(kSize * kSize, GLColor::blue);
11181*8975f5c5SAndroid Build Coastguard Worker     GLTexture mipmapTex;
11182*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mipmapTex);
11183*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11184*8975f5c5SAndroid Build Coastguard Worker                  blueColors.data());
11185*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
11186*8975f5c5SAndroid Build Coastguard Worker 
11187*8975f5c5SAndroid Build Coastguard Worker     // Draw with the sampler, expect blue.
11188*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, true);
11189*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11190*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
11191*8975f5c5SAndroid Build Coastguard Worker 
11192*8975f5c5SAndroid Build Coastguard Worker     // Simple multitexturing program.
11193*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
11194*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
11195*8975f5c5SAndroid Build Coastguard Worker         "in vec2 position;\n"
11196*8975f5c5SAndroid Build Coastguard Worker         "out vec2 texCoord;\n"
11197*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
11198*8975f5c5SAndroid Build Coastguard Worker         "{\n"
11199*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
11200*8975f5c5SAndroid Build Coastguard Worker         "    texCoord = position * 0.5 + vec2(0.5);\n"
11201*8975f5c5SAndroid Build Coastguard Worker         "}";
11202*8975f5c5SAndroid Build Coastguard Worker 
11203*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
11204*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
11205*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
11206*8975f5c5SAndroid Build Coastguard Worker         "in vec2 texCoord;\n"
11207*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex1;\n"
11208*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex2;\n"
11209*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex3;\n"
11210*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex4;\n"
11211*8975f5c5SAndroid Build Coastguard Worker         "out vec4 color;\n"
11212*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
11213*8975f5c5SAndroid Build Coastguard Worker         "{\n"
11214*8975f5c5SAndroid Build Coastguard Worker         "    color = (texture(tex1, texCoord) + texture(tex2, texCoord) \n"
11215*8975f5c5SAndroid Build Coastguard Worker         "          +  texture(tex3, texCoord) + texture(tex4, texCoord)) * 0.25;\n"
11216*8975f5c5SAndroid Build Coastguard Worker         "}";
11217*8975f5c5SAndroid Build Coastguard Worker 
11218*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
11219*8975f5c5SAndroid Build Coastguard Worker 
11220*8975f5c5SAndroid Build Coastguard Worker     std::array<GLint, 4> texLocations = {
11221*8975f5c5SAndroid Build Coastguard Worker         {glGetUniformLocation(program, "tex1"), glGetUniformLocation(program, "tex2"),
11222*8975f5c5SAndroid Build Coastguard Worker          glGetUniformLocation(program, "tex3"), glGetUniformLocation(program, "tex4")}};
11223*8975f5c5SAndroid Build Coastguard Worker     for (GLint location : texLocations)
11224*8975f5c5SAndroid Build Coastguard Worker     {
11225*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, location);
11226*8975f5c5SAndroid Build Coastguard Worker     }
11227*8975f5c5SAndroid Build Coastguard Worker 
11228*8975f5c5SAndroid Build Coastguard Worker     // Init the uniform data.
11229*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
11230*8975f5c5SAndroid Build Coastguard Worker     for (GLint location = 0; location < 4; ++location)
11231*8975f5c5SAndroid Build Coastguard Worker     {
11232*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(texLocations[location], location);
11233*8975f5c5SAndroid Build Coastguard Worker     }
11234*8975f5c5SAndroid Build Coastguard Worker 
11235*8975f5c5SAndroid Build Coastguard Worker     // Initialize four samplers
11236*8975f5c5SAndroid Build Coastguard Worker     GLSampler samplers[4];
11237*8975f5c5SAndroid Build Coastguard Worker 
11238*8975f5c5SAndroid Build Coastguard Worker     // 0: non-mipped.
11239*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, samplers[0]);
11240*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
11241*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11242*8975f5c5SAndroid Build Coastguard Worker 
11243*8975f5c5SAndroid Build Coastguard Worker     // 1: mipped.
11244*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(1, samplers[1]);
11245*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[1], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
11246*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[1], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11247*8975f5c5SAndroid Build Coastguard Worker 
11248*8975f5c5SAndroid Build Coastguard Worker     // 2: non-mipped.
11249*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(2, samplers[2]);
11250*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[2], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
11251*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[2], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11252*8975f5c5SAndroid Build Coastguard Worker 
11253*8975f5c5SAndroid Build Coastguard Worker     // 3: mipped.
11254*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(3, samplers[3]);
11255*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[3], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
11256*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(samplers[3], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11257*8975f5c5SAndroid Build Coastguard Worker 
11258*8975f5c5SAndroid Build Coastguard Worker     // Bind two blue mipped textures and two single layer textures, should all draw.
11259*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11260*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
11261*8975f5c5SAndroid Build Coastguard Worker 
11262*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
11263*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mipmapTex);
11264*8975f5c5SAndroid Build Coastguard Worker 
11265*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE2);
11266*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
11267*8975f5c5SAndroid Build Coastguard Worker 
11268*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE3);
11269*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mipmapTex);
11270*8975f5c5SAndroid Build Coastguard Worker 
11271*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11272*8975f5c5SAndroid Build Coastguard Worker 
11273*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
11274*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11275*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 0, 128, 255, 2);
11276*8975f5c5SAndroid Build Coastguard Worker 
11277*8975f5c5SAndroid Build Coastguard Worker     // Bind four single layer textures, two should be incomplete.
11278*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
11279*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
11280*8975f5c5SAndroid Build Coastguard Worker 
11281*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE3);
11282*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
11283*8975f5c5SAndroid Build Coastguard Worker 
11284*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
11285*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11286*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 0, 0, 255, 2);
11287*8975f5c5SAndroid Build Coastguard Worker }
11288*8975f5c5SAndroid Build Coastguard Worker 
11289*8975f5c5SAndroid Build Coastguard Worker // The test is added to cover http://anglebug.com/42260889. Cubemap completeness checks used to
11290*8975f5c5SAndroid Build Coastguard Worker // start always at level 0 instead of the base level resulting in an incomplete texture if the faces
11291*8975f5c5SAndroid Build Coastguard Worker // at level 0 are not created. The test creates a cubemap texture, specifies the images only for mip
11292*8975f5c5SAndroid Build Coastguard Worker // level 1 filled with white color, updates the base level to be 1 and renders a quad. The program
11293*8975f5c5SAndroid Build Coastguard Worker // samples the cubemap using a direction vector (1,1,1).
TEST_P(TextureCubeTestES3,SpecifyAndSampleFromBaseLevel1)11294*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, SpecifyAndSampleFromBaseLevel1)
11295*8975f5c5SAndroid Build Coastguard Worker {
11296*8975f5c5SAndroid Build Coastguard Worker     // Check http://anglebug.com/42260891.
11297*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA());
11298*8975f5c5SAndroid Build Coastguard Worker 
11299*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
11300*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
11301*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
11302*8975f5c5SAndroid Build Coastguard Worker         in vec3 pos;
11303*8975f5c5SAndroid Build Coastguard Worker         void main() {
11304*8975f5c5SAndroid Build Coastguard Worker             gl_Position = vec4(pos, 1.0);
11305*8975f5c5SAndroid Build Coastguard Worker         })";
11306*8975f5c5SAndroid Build Coastguard Worker 
11307*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
11308*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
11309*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
11310*8975f5c5SAndroid Build Coastguard Worker         out vec4 color;
11311*8975f5c5SAndroid Build Coastguard Worker         uniform samplerCube uTex;
11312*8975f5c5SAndroid Build Coastguard Worker         void main(){
11313*8975f5c5SAndroid Build Coastguard Worker             color = texture(uTex, vec3(1.0));
11314*8975f5c5SAndroid Build Coastguard Worker         })";
11315*8975f5c5SAndroid Build Coastguard Worker 
11316*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
11317*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
11318*8975f5c5SAndroid Build Coastguard Worker 
11319*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(glGetUniformLocation(program, "uTex"), 0);
11320*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11321*8975f5c5SAndroid Build Coastguard Worker 
11322*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeTex;
11323*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex);
11324*8975f5c5SAndroid Build Coastguard Worker 
11325*8975f5c5SAndroid Build Coastguard Worker     const int kFaceWidth  = 1;
11326*8975f5c5SAndroid Build Coastguard Worker     const int kFaceHeight = 1;
11327*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> texData(kFaceWidth * kFaceHeight, 0xFFFFFFFF);
11328*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
11329*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, texData.data());
11330*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
11331*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, texData.data());
11332*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
11333*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, texData.data());
11334*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
11335*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, texData.data());
11336*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
11337*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, texData.data());
11338*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 1, GL_RGBA8, kFaceWidth, kFaceHeight, 0, GL_RGBA,
11339*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, texData.data());
11340*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11341*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
11342*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
11343*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
11344*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);
11345*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1);
11346*8975f5c5SAndroid Build Coastguard Worker 
11347*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "pos", 0.5f, 1.0f, true);
11348*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11349*8975f5c5SAndroid Build Coastguard Worker 
11350*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white);
11351*8975f5c5SAndroid Build Coastguard Worker }
11352*8975f5c5SAndroid Build Coastguard Worker 
11353*8975f5c5SAndroid Build Coastguard Worker // Test GL_PIXEL_UNPACK_BUFFER with GL_TEXTURE_CUBE_MAP.
TEST_P(TextureCubeTestES3,CubeMapPixelUnpackBuffer)11354*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, CubeMapPixelUnpackBuffer)
11355*8975f5c5SAndroid Build Coastguard Worker {
11356*8975f5c5SAndroid Build Coastguard Worker     // Check http://anglebug.com/42260891.
11357*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA());
11358*8975f5c5SAndroid Build Coastguard Worker 
11359*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
11360*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
11361*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
11362*8975f5c5SAndroid Build Coastguard Worker         in vec3 pos;
11363*8975f5c5SAndroid Build Coastguard Worker         void main() {
11364*8975f5c5SAndroid Build Coastguard Worker             gl_Position = vec4(pos, 1.0);
11365*8975f5c5SAndroid Build Coastguard Worker         })";
11366*8975f5c5SAndroid Build Coastguard Worker 
11367*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
11368*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
11369*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
11370*8975f5c5SAndroid Build Coastguard Worker         out vec4 color;
11371*8975f5c5SAndroid Build Coastguard Worker         uniform samplerCube uTex;
11372*8975f5c5SAndroid Build Coastguard Worker         void main(){
11373*8975f5c5SAndroid Build Coastguard Worker             color = texture(uTex, vec3(1.0));
11374*8975f5c5SAndroid Build Coastguard Worker         })";
11375*8975f5c5SAndroid Build Coastguard Worker 
11376*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
11377*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
11378*8975f5c5SAndroid Build Coastguard Worker 
11379*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(glGetUniformLocation(program, "uTex"), 0);
11380*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11381*8975f5c5SAndroid Build Coastguard Worker 
11382*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeTex;
11383*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex);
11384*8975f5c5SAndroid Build Coastguard Worker 
11385*8975f5c5SAndroid Build Coastguard Worker     const int kFaceWidth  = 4;
11386*8975f5c5SAndroid Build Coastguard Worker     const int kFaceHeight = 4;
11387*8975f5c5SAndroid Build Coastguard Worker 
11388*8975f5c5SAndroid Build Coastguard Worker     uint16_t kHalfFloatOne  = 0x3C00;
11389*8975f5c5SAndroid Build Coastguard Worker     uint16_t kHalfFloatZero = 0;
11390*8975f5c5SAndroid Build Coastguard Worker 
11391*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA16F, kFaceWidth, kFaceHeight);
11392*8975f5c5SAndroid Build Coastguard Worker     struct RGBA16F
11393*8975f5c5SAndroid Build Coastguard Worker     {
11394*8975f5c5SAndroid Build Coastguard Worker         uint16_t R, G, B, A;
11395*8975f5c5SAndroid Build Coastguard Worker     };
11396*8975f5c5SAndroid Build Coastguard Worker     RGBA16F redColor = {kHalfFloatOne, kHalfFloatZero, kHalfFloatZero, kHalfFloatOne};
11397*8975f5c5SAndroid Build Coastguard Worker 
11398*8975f5c5SAndroid Build Coastguard Worker     std::vector<RGBA16F> pixels(kFaceWidth * kFaceHeight, redColor);
11399*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
11400*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
11401*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixels.size() * sizeof(RGBA16F), pixels.data(),
11402*8975f5c5SAndroid Build Coastguard Worker                  GL_DYNAMIC_DRAW);
11403*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11404*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
11405*8975f5c5SAndroid Build Coastguard Worker 
11406*8975f5c5SAndroid Build Coastguard Worker     for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
11407*8975f5c5SAndroid Build Coastguard Worker     {
11408*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, 0, 0, 0, kFaceWidth,
11409*8975f5c5SAndroid Build Coastguard Worker                         kFaceHeight, GL_RGBA, GL_HALF_FLOAT, 0);
11410*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
11411*8975f5c5SAndroid Build Coastguard Worker     }
11412*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
11413*8975f5c5SAndroid Build Coastguard Worker 
11414*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
11415*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
11416*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
11417*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
11418*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);
11419*8975f5c5SAndroid Build Coastguard Worker 
11420*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "pos", 0.5f, 1.0f, true);
11421*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11422*8975f5c5SAndroid Build Coastguard Worker 
11423*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::red);
11424*8975f5c5SAndroid Build Coastguard Worker }
11425*8975f5c5SAndroid Build Coastguard Worker 
11426*8975f5c5SAndroid Build Coastguard Worker // Test creating a mutable cubemap, committing it, and then incomaptibly redefining one layer, while
11427*8975f5c5SAndroid Build Coastguard Worker // compatibly redefining another layer.
TEST_P(TextureCubeTestES3,IncompatibleLayerAThenCompatibleLayerB)11428*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, IncompatibleLayerAThenCompatibleLayerB)
11429*8975f5c5SAndroid Build Coastguard Worker {
11430*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11431*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11432*8975f5c5SAndroid Build Coastguard Worker 
11433*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data(32 * 32 * 4, 0xC00FFC00);
11434*8975f5c5SAndroid Build Coastguard Worker 
11435*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11436*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11437*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11438*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11439*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11440*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11441*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11442*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11443*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11444*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11445*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11446*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11447*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
11448*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, 32, 32, 0, GL_RGBA,
11449*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11450*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11451*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11452*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11453*8975f5c5SAndroid Build Coastguard Worker }
11454*8975f5c5SAndroid Build Coastguard Worker 
11455*8975f5c5SAndroid Build Coastguard Worker // Test creating a mutable cubemap, committing it, and then comaptibly redefining one layer, while
11456*8975f5c5SAndroid Build Coastguard Worker // incompatibly redefining another layer.
TEST_P(TextureCubeTestES3,CompatibleLayerAThenIncompatibleLayerB)11457*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, CompatibleLayerAThenIncompatibleLayerB)
11458*8975f5c5SAndroid Build Coastguard Worker {
11459*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11460*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11461*8975f5c5SAndroid Build Coastguard Worker 
11462*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data(32 * 32 * 4, 0xC00FFC00);
11463*8975f5c5SAndroid Build Coastguard Worker 
11464*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11465*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11466*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11467*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11468*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11469*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11470*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11471*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11472*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11473*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11474*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11475*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11476*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
11477*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11478*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11479*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, 32, 32, 0, GL_RGBA,
11480*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11481*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11482*8975f5c5SAndroid Build Coastguard Worker }
11483*8975f5c5SAndroid Build Coastguard Worker 
11484*8975f5c5SAndroid Build Coastguard Worker // Test creating a mutable cubemap, committing it, and then incomaptibly redefining two layers,
11485*8975f5c5SAndroid Build Coastguard Worker // while compatibly redefining another layer.
TEST_P(TextureCubeTestES3,IncompatibleLayerABThenCompatibleLayerC)11486*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, IncompatibleLayerABThenCompatibleLayerC)
11487*8975f5c5SAndroid Build Coastguard Worker {
11488*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11489*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11490*8975f5c5SAndroid Build Coastguard Worker 
11491*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data(32 * 32 * 4, 0xC00FFC00);
11492*8975f5c5SAndroid Build Coastguard Worker 
11493*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11494*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11495*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11496*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11497*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11498*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11499*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11500*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11501*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11502*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11503*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11504*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11505*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
11506*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, 32, 32, 0, GL_RGBA,
11507*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11508*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, 32, 32, 0, GL_RGBA,
11509*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11510*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, 16, 16, 0, GL_RGBA,
11511*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11512*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11513*8975f5c5SAndroid Build Coastguard Worker }
11514*8975f5c5SAndroid Build Coastguard Worker 
11515*8975f5c5SAndroid Build Coastguard Worker // Test creating a mutable cubemap, committing it, and then incomaptibly redefining two layers and
11516*8975f5c5SAndroid Build Coastguard Worker // compatibly redefining them again.
TEST_P(TextureCubeTestES3,IncompatibleLayerABThenCompatibleLayerAB)11517*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, IncompatibleLayerABThenCompatibleLayerAB)
11518*8975f5c5SAndroid Build Coastguard Worker {
11519*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11520*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11521*8975f5c5SAndroid Build Coastguard Worker 
11522*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize = 64;
11523*8975f5c5SAndroid Build Coastguard Worker 
11524*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data(kSize * kSize * 4 * 4, 0xC00FFC00);
11525*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data2(kSize * kSize * 4 * 4, 0xC00003FF);
11526*8975f5c5SAndroid Build Coastguard Worker 
11527*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11528*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11529*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11530*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11531*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11532*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11533*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11534*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11535*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11536*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11537*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11538*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11539*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
11540*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, kSize * 2, kSize * 2, 0, GL_RGBA,
11541*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11542*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, kSize * 2, kSize * 2, 0, GL_RGBA,
11543*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11544*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11545*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data2.data());
11546*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11547*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data2.data());
11548*8975f5c5SAndroid Build Coastguard Worker 
11549*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11550*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
11551*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
11552*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11553*8975f5c5SAndroid Build Coastguard Worker 
11554*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
11555*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
11556*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 1);
11557*8975f5c5SAndroid Build Coastguard Worker 
11558*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
11559*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
11560*8975f5c5SAndroid Build Coastguard Worker 
11561*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 6; ++i)
11562*8975f5c5SAndroid Build Coastguard Worker     {
11563*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureCubeFaceUniformLocation, i);
11564*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
11565*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
11566*8975f5c5SAndroid Build Coastguard Worker 
11567*8975f5c5SAndroid Build Coastguard Worker         const bool expectRed = i == 2 || i == 5;
11568*8975f5c5SAndroid Build Coastguard Worker         const GLColor expect = expectRed ? GLColor::red : GLColor::green;
11569*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(2, 2, w - 4, h - 4, expect);
11570*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
11571*8975f5c5SAndroid Build Coastguard Worker     }
11572*8975f5c5SAndroid Build Coastguard Worker }
11573*8975f5c5SAndroid Build Coastguard Worker 
11574*8975f5c5SAndroid Build Coastguard Worker // Similar to IncompatibleLayerABThenCompatibleLayerAB, but with a single-level texture
TEST_P(TextureCubeTestES3,IncompatibleLayerABThenCompatibleLayerABSingleLevel)11575*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES3, IncompatibleLayerABThenCompatibleLayerABSingleLevel)
11576*8975f5c5SAndroid Build Coastguard Worker {
11577*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
11578*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11579*8975f5c5SAndroid Build Coastguard Worker 
11580*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize = 64;
11581*8975f5c5SAndroid Build Coastguard Worker 
11582*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data(kSize * kSize * 4 * 4, 0xC00FFC00);
11583*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint32_t> data2(kSize * kSize * 4 * 4, 0xC00003FF);
11584*8975f5c5SAndroid Build Coastguard Worker 
11585*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11586*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11587*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11588*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11589*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11590*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11591*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11592*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11593*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11594*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11595*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11596*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11597*8975f5c5SAndroid Build Coastguard Worker 
11598*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
11599*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
11600*8975f5c5SAndroid Build Coastguard Worker 
11601*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11602*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
11603*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
11604*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
11605*8975f5c5SAndroid Build Coastguard Worker 
11606*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
11607*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
11608*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 1);
11609*8975f5c5SAndroid Build Coastguard Worker 
11610*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
11611*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
11612*8975f5c5SAndroid Build Coastguard Worker 
11613*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 6; ++i)
11614*8975f5c5SAndroid Build Coastguard Worker     {
11615*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureCubeFaceUniformLocation, i);
11616*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
11617*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
11618*8975f5c5SAndroid Build Coastguard Worker 
11619*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::green);
11620*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
11621*8975f5c5SAndroid Build Coastguard Worker     }
11622*8975f5c5SAndroid Build Coastguard Worker 
11623*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, kSize * 2, kSize * 2, 0, GL_RGBA,
11624*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11625*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, kSize * 2, kSize * 2, 0, GL_RGBA,
11626*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data.data());
11627*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11628*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data2.data());
11629*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB10_A2, kSize, kSize, 0, GL_RGBA,
11630*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_2_10_10_10_REV, data2.data());
11631*8975f5c5SAndroid Build Coastguard Worker 
11632*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 6; ++i)
11633*8975f5c5SAndroid Build Coastguard Worker     {
11634*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureCubeFaceUniformLocation, i);
11635*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
11636*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
11637*8975f5c5SAndroid Build Coastguard Worker 
11638*8975f5c5SAndroid Build Coastguard Worker         const bool expectRed = i == 2 || i == 5;
11639*8975f5c5SAndroid Build Coastguard Worker         const GLColor expect = expectRed ? GLColor::red : GLColor::green;
11640*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(2, 2, w - 4, h - 4, expect);
11641*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
11642*8975f5c5SAndroid Build Coastguard Worker     }
11643*8975f5c5SAndroid Build Coastguard Worker }
11644*8975f5c5SAndroid Build Coastguard Worker 
11645*8975f5c5SAndroid Build Coastguard Worker // Tests defining a cube map array texture using glTexImage3D().
TEST_P(TextureCubeTestES32,ValidateCubeMapArrayTexImage)11646*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES32, ValidateCubeMapArrayTexImage)
11647*8975f5c5SAndroid Build Coastguard Worker {
11648*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeMapArrayTexture;
11649*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubeMapArrayTexture);
11650*8975f5c5SAndroid Build Coastguard Worker 
11651*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 256, 256, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11652*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11653*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA, 128, 128, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11654*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11655*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 2, GL_RGBA, 64, 64, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11656*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11657*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 3, GL_RGBA, 32, 32, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11658*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11659*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 4, GL_RGBA, 16, 16, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11660*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11661*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 5, GL_RGBA, 8, 8, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11662*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11663*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 6, GL_RGBA, 4, 4, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11664*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11665*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 7, GL_RGBA, 2, 2, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11666*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11667*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 8, GL_RGBA, 1, 1, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11668*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11669*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11670*8975f5c5SAndroid Build Coastguard Worker }
11671*8975f5c5SAndroid Build Coastguard Worker 
11672*8975f5c5SAndroid Build Coastguard Worker // Tests defining a cube map array texture using glTexStorage3D() and filling all levels using
11673*8975f5c5SAndroid Build Coastguard Worker // glTexSubImage3D().
TEST_P(TextureCubeTestES32,ValidateCubeMapArrayTexStorage)11674*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES32, ValidateCubeMapArrayTexStorage)
11675*8975f5c5SAndroid Build Coastguard Worker {
11676*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeMapArrayTexture;
11677*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> cubeMapArrayData(256 * 256 * 24, GLColor::red);
11678*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubeMapArrayTexture);
11679*8975f5c5SAndroid Build Coastguard Worker 
11680*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 9, GL_RGBA8, 256, 256, 24);
11681*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, 256, 256, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11682*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11683*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, 0, 0, 0, 128, 128, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11684*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11685*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 2, 0, 0, 0, 64, 64, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11686*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11687*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 3, 0, 0, 0, 32, 32, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11688*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11689*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 4, 0, 0, 0, 16, 16, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11690*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11691*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 5, 0, 0, 0, 8, 8, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11692*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11693*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 6, 0, 0, 0, 4, 4, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11694*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11695*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 7, 0, 0, 0, 2, 2, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11696*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11697*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 8, 0, 0, 0, 1, 1, 24, GL_RGBA, GL_UNSIGNED_BYTE,
11698*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11699*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11700*8975f5c5SAndroid Build Coastguard Worker }
11701*8975f5c5SAndroid Build Coastguard Worker 
11702*8975f5c5SAndroid Build Coastguard Worker // Tests defining a single-level cube map array texture and modifying a part of it with unequal
11703*8975f5c5SAndroid Build Coastguard Worker // width and height and a depth that is not a multiple of 6.
TEST_P(TextureCubeTestES32,ValidateCubeMapArrayTexStorageModifyPartially)11704*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES32, ValidateCubeMapArrayTexStorageModifyPartially)
11705*8975f5c5SAndroid Build Coastguard Worker {
11706*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeMapArrayTexture;
11707*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubeMapArrayTexture);
11708*8975f5c5SAndroid Build Coastguard Worker 
11709*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> cubeMapArrayData(256 * 256 * 6, GLColor::red);
11710*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 256, 256, 6);
11711*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, 256, 100, 1, GL_RGBA, GL_UNSIGNED_BYTE,
11712*8975f5c5SAndroid Build Coastguard Worker                     cubeMapArrayData.data());
11713*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11714*8975f5c5SAndroid Build Coastguard Worker }
11715*8975f5c5SAndroid Build Coastguard Worker 
11716*8975f5c5SAndroid Build Coastguard Worker // Tests TexSubImage3D with cube map arrays using dims beyond the size limit.
TEST_P(TextureCubeTestES32,ValidateCubeMapArrayTexSubImageGreaterThanSizeLimit)11717*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES32, ValidateCubeMapArrayTexSubImageGreaterThanSizeLimit)
11718*8975f5c5SAndroid Build Coastguard Worker {
11719*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeMapArrayTexture;
11720*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubeMapArrayTexture);
11721*8975f5c5SAndroid Build Coastguard Worker 
11722*8975f5c5SAndroid Build Coastguard Worker     GLint max3DTextureSize = -1;
11723*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max3DTextureSize);
11724*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(max3DTextureSize, 0);
11725*8975f5c5SAndroid Build Coastguard Worker 
11726*8975f5c5SAndroid Build Coastguard Worker     GLint maxCubeTextureSize = -1;
11727*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTextureSize);
11728*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(maxCubeTextureSize, 0);
11729*8975f5c5SAndroid Build Coastguard Worker 
11730*8975f5c5SAndroid Build Coastguard Worker     GLint maxSizeLimit = std::min(maxCubeTextureSize, max3DTextureSize);
11731*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, maxSizeLimit, maxSizeLimit, 6, 0, GL_RGBA,
11732*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
11733*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
11734*8975f5c5SAndroid Build Coastguard Worker 
11735*8975f5c5SAndroid Build Coastguard Worker     // TexSubImage3D can take unequal values for width and height for cube map arrays. However, they
11736*8975f5c5SAndroid Build Coastguard Worker     // should stay below the size limit.
11737*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, maxSizeLimit + 1, maxSizeLimit, 6,
11738*8975f5c5SAndroid Build Coastguard Worker                     GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
11739*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11740*8975f5c5SAndroid Build Coastguard Worker 
11741*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, maxSizeLimit, maxSizeLimit + 1, 6,
11742*8975f5c5SAndroid Build Coastguard Worker                     GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
11743*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11744*8975f5c5SAndroid Build Coastguard Worker }
11745*8975f5c5SAndroid Build Coastguard Worker 
11746*8975f5c5SAndroid Build Coastguard Worker // Tests invalid dim/level input for TexImage3D with cube map arrays.
TEST_P(TextureCubeTestES32,ValidateCubeMapArrayTexImageInvalidInputs)11747*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES32, ValidateCubeMapArrayTexImageInvalidInputs)
11748*8975f5c5SAndroid Build Coastguard Worker {
11749*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeMapArrayTexture;
11750*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubeMapArrayTexture);
11751*8975f5c5SAndroid Build Coastguard Worker 
11752*8975f5c5SAndroid Build Coastguard Worker     // Negative level and dimensions are not accepted.
11753*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, -1, GL_RGBA, 256, 256, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11754*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11755*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11756*8975f5c5SAndroid Build Coastguard Worker 
11757*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, -1, 256, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11758*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11759*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11760*8975f5c5SAndroid Build Coastguard Worker 
11761*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 256, -1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11762*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11763*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11764*8975f5c5SAndroid Build Coastguard Worker 
11765*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 256, 256, -6, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11766*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11767*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11768*8975f5c5SAndroid Build Coastguard Worker 
11769*8975f5c5SAndroid Build Coastguard Worker     // As the number of layer-faces, depth should be a multiple of 6, unless it is partially being
11770*8975f5c5SAndroid Build Coastguard Worker     // modified (via TexSubImage).
11771*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 256, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11772*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11773*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11774*8975f5c5SAndroid Build Coastguard Worker 
11775*8975f5c5SAndroid Build Coastguard Worker     // Width and height should be equal, unless it is partially being modified (via TexSubImage).
11776*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 256, 100, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11777*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
11778*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11779*8975f5c5SAndroid Build Coastguard Worker 
11780*8975f5c5SAndroid Build Coastguard Worker     // Width and height should not exceed the maximum cube map texture size for that mip level.
11781*8975f5c5SAndroid Build Coastguard Worker     GLint maxCubeTextureSize = -1;
11782*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTextureSize);
11783*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(maxCubeTextureSize, 0);
11784*8975f5c5SAndroid Build Coastguard Worker 
11785*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, maxCubeTextureSize + 1, maxCubeTextureSize,
11786*8975f5c5SAndroid Build Coastguard Worker                  6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11787*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11788*8975f5c5SAndroid Build Coastguard Worker 
11789*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, maxCubeTextureSize, maxCubeTextureSize + 1,
11790*8975f5c5SAndroid Build Coastguard Worker                  6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11791*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11792*8975f5c5SAndroid Build Coastguard Worker 
11793*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, maxCubeTextureSize + 1,
11794*8975f5c5SAndroid Build Coastguard Worker                  maxCubeTextureSize + 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11795*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11796*8975f5c5SAndroid Build Coastguard Worker 
11797*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA, maxCubeTextureSize / 2 + 1,
11798*8975f5c5SAndroid Build Coastguard Worker                  maxCubeTextureSize / 2 + 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11799*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11800*8975f5c5SAndroid Build Coastguard Worker 
11801*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 2, GL_RGBA, maxCubeTextureSize / 4 + 1,
11802*8975f5c5SAndroid Build Coastguard Worker                  maxCubeTextureSize / 4 + 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11803*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11804*8975f5c5SAndroid Build Coastguard Worker 
11805*8975f5c5SAndroid Build Coastguard Worker     // Width and height and depth should not exceed the maximum 3D texture size.
11806*8975f5c5SAndroid Build Coastguard Worker     GLint max3DTextureSize = -1;
11807*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max3DTextureSize);
11808*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(max3DTextureSize, 0);
11809*8975f5c5SAndroid Build Coastguard Worker 
11810*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 256, 256, max3DTextureSize + 1, 0, GL_RGBA,
11811*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
11812*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11813*8975f5c5SAndroid Build Coastguard Worker 
11814*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, max3DTextureSize + 1, max3DTextureSize + 1,
11815*8975f5c5SAndroid Build Coastguard Worker                  6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11816*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11817*8975f5c5SAndroid Build Coastguard Worker 
11818*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA, max3DTextureSize / 2 + 1,
11819*8975f5c5SAndroid Build Coastguard Worker                  max3DTextureSize / 2 + 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11820*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11821*8975f5c5SAndroid Build Coastguard Worker 
11822*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 2, GL_RGBA, max3DTextureSize / 4 + 1,
11823*8975f5c5SAndroid Build Coastguard Worker                  max3DTextureSize / 4 + 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
11824*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11825*8975f5c5SAndroid Build Coastguard Worker }
11826*8975f5c5SAndroid Build Coastguard Worker 
11827*8975f5c5SAndroid Build Coastguard Worker // Tests invalid dim/level input for TexStorage3D with cube map arrays.
TEST_P(TextureCubeTestES32,ValidateCubeMapArrayTexStorageInvalidInputs)11828*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeTestES32, ValidateCubeMapArrayTexStorageInvalidInputs)
11829*8975f5c5SAndroid Build Coastguard Worker {
11830*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeMapArrayTexture;
11831*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubeMapArrayTexture);
11832*8975f5c5SAndroid Build Coastguard Worker 
11833*8975f5c5SAndroid Build Coastguard Worker     // Negative level and dimensions are not accepted.
11834*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, -1, GL_RGBA8, 256, 256, 6);
11835*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11836*8975f5c5SAndroid Build Coastguard Worker 
11837*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, -1, 256, 6);
11838*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11839*8975f5c5SAndroid Build Coastguard Worker 
11840*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 256, -1, 6);
11841*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11842*8975f5c5SAndroid Build Coastguard Worker 
11843*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 256, 256, -6);
11844*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11845*8975f5c5SAndroid Build Coastguard Worker 
11846*8975f5c5SAndroid Build Coastguard Worker     // As the number of layer-faces, depth should be a multiple of 6.
11847*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 256, 256, 1);
11848*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11849*8975f5c5SAndroid Build Coastguard Worker 
11850*8975f5c5SAndroid Build Coastguard Worker     // Width and height should be equal.
11851*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 256, 100, 6);
11852*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11853*8975f5c5SAndroid Build Coastguard Worker 
11854*8975f5c5SAndroid Build Coastguard Worker     // Width and height should not exceed the maximum cube map texture size.
11855*8975f5c5SAndroid Build Coastguard Worker     GLint maxCubeTextureSize = -1;
11856*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTextureSize);
11857*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(maxCubeTextureSize, 0);
11858*8975f5c5SAndroid Build Coastguard Worker 
11859*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, maxCubeTextureSize + 1,
11860*8975f5c5SAndroid Build Coastguard Worker                    maxCubeTextureSize + 1, 6);
11861*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11862*8975f5c5SAndroid Build Coastguard Worker 
11863*8975f5c5SAndroid Build Coastguard Worker     // Width and height and depth should not exceed the maximum 3D texture size.
11864*8975f5c5SAndroid Build Coastguard Worker     GLint max3DTextureSize = -1;
11865*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max3DTextureSize);
11866*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(max3DTextureSize, 0);
11867*8975f5c5SAndroid Build Coastguard Worker 
11868*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, max3DTextureSize + 1,
11869*8975f5c5SAndroid Build Coastguard Worker                    max3DTextureSize + 1, 6);
11870*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11871*8975f5c5SAndroid Build Coastguard Worker 
11872*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 256, 256, max3DTextureSize + 1);
11873*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11874*8975f5c5SAndroid Build Coastguard Worker 
11875*8975f5c5SAndroid Build Coastguard Worker     // Level count must not exceed log2(max(width, height)) + 1.
11876*8975f5c5SAndroid Build Coastguard Worker     GLint maxLevelCount256 = 1 + static_cast<GLint>(std::log2(256));
11877*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, maxLevelCount256 + 1, GL_RGBA8, 256, 256, 6);
11878*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
11879*8975f5c5SAndroid Build Coastguard Worker }
11880*8975f5c5SAndroid Build Coastguard Worker 
11881*8975f5c5SAndroid Build Coastguard Worker // Verify that using negative texture base level and max level generates GL_INVALID_VALUE.
TEST_P(Texture2DTestES3,NegativeTextureBaseLevelAndMaxLevel)11882*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, NegativeTextureBaseLevelAndMaxLevel)
11883*8975f5c5SAndroid Build Coastguard Worker {
11884*8975f5c5SAndroid Build Coastguard Worker     GLuint texture = create2DTexture();
11885*8975f5c5SAndroid Build Coastguard Worker 
11886*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, -1);
11887*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11888*8975f5c5SAndroid Build Coastguard Worker 
11889*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, -1);
11890*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11891*8975f5c5SAndroid Build Coastguard Worker 
11892*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &texture);
11893*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11894*8975f5c5SAndroid Build Coastguard Worker }
11895*8975f5c5SAndroid Build Coastguard Worker 
11896*8975f5c5SAndroid Build Coastguard Worker // Test setting base level after calling generateMipmap on a LUMA texture.
11897*8975f5c5SAndroid Build Coastguard Worker // Covers http://anglebug.com/42261204
TEST_P(Texture2DTestES3,GenerateMipmapAndBaseLevelLUMA)11898*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, GenerateMipmapAndBaseLevelLUMA)
11899*8975f5c5SAndroid Build Coastguard Worker {
11900*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11901*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
11902*8975f5c5SAndroid Build Coastguard Worker 
11903*8975f5c5SAndroid Build Coastguard Worker     constexpr const GLsizei kWidth  = 8;
11904*8975f5c5SAndroid Build Coastguard Worker     constexpr const GLsizei kHeight = 8;
11905*8975f5c5SAndroid Build Coastguard Worker     std::array<GLubyte, kWidth * kHeight * 2> whiteData;
11906*8975f5c5SAndroid Build Coastguard Worker     whiteData.fill(255u);
11907*8975f5c5SAndroid Build Coastguard Worker 
11908*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, kWidth, kHeight, 0, GL_LUMINANCE_ALPHA,
11909*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, whiteData.data());
11910*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
11911*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
11912*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
11913*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
11914*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11915*8975f5c5SAndroid Build Coastguard Worker 
11916*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11917*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white);
11918*8975f5c5SAndroid Build Coastguard Worker }
11919*8975f5c5SAndroid Build Coastguard Worker 
11920*8975f5c5SAndroid Build Coastguard Worker // Incompatible levels with non-mipmap filtering should work.
TEST_P(Texture2DTestES3,IncompatibleMipsButNoMipmapFiltering)11921*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, IncompatibleMipsButNoMipmapFiltering)
11922*8975f5c5SAndroid Build Coastguard Worker {
11923*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263372
11924*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL() && IsWindows() && (IsAMD() || IsIntel()));
11925*8975f5c5SAndroid Build Coastguard Worker 
11926*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096708
11927*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGLES() && IsNVIDIAShield());
11928*8975f5c5SAndroid Build Coastguard Worker 
11929*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
11930*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
11931*8975f5c5SAndroid Build Coastguard Worker 
11932*8975f5c5SAndroid Build Coastguard Worker     constexpr const GLsizei kSize = 8;
11933*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevel0Data(kSize * kSize, GLColor::blue);
11934*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevel1Data(kSize * kSize, GLColor::red);
11935*8975f5c5SAndroid Build Coastguard Worker 
11936*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11937*8975f5c5SAndroid Build Coastguard Worker                  kLevel0Data.data());
11938*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
11939*8975f5c5SAndroid Build Coastguard Worker                  kLevel1Data.data());
11940*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
11941*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
11942*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11943*8975f5c5SAndroid Build Coastguard Worker 
11944*8975f5c5SAndroid Build Coastguard Worker     // Draw with base level 0.  The GL_LINEAR filtering ensures the texture's image is not created
11945*8975f5c5SAndroid Build Coastguard Worker     // with mipmap.
11946*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11947*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kLevel0Data[0]);
11948*8975f5c5SAndroid Build Coastguard Worker 
11949*8975f5c5SAndroid Build Coastguard Worker     // Verify draw with level 1.
11950*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
11951*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11952*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11953*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kLevel1Data[0]);
11954*8975f5c5SAndroid Build Coastguard Worker 
11955*8975f5c5SAndroid Build Coastguard Worker     // Verify draw with level 0 again
11956*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
11957*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
11958*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11959*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kLevel0Data[0]);
11960*8975f5c5SAndroid Build Coastguard Worker }
11961*8975f5c5SAndroid Build Coastguard Worker 
11962*8975f5c5SAndroid Build Coastguard Worker // A collection of negative tests for QCOM foveated rendering extensions
TEST_P(Texture2DTestES3Foveation,NegativeTests)11963*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, NegativeTests)
11964*8975f5c5SAndroid Build Coastguard Worker {
11965*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated") ||
11966*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_QCOM_texture_foveated"));
11967*8975f5c5SAndroid Build Coastguard Worker 
11968*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
11969*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
11970*8975f5c5SAndroid Build Coastguard Worker 
11971*8975f5c5SAndroid Build Coastguard Worker     // QCOM framebuffer foveated tests
11972*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
11973*8975f5c5SAndroid Build Coastguard Worker 
11974*8975f5c5SAndroid Build Coastguard Worker     // Test invalid numLayers
11975*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, std::numeric_limits<uint32_t>::max(), 1,
11976*8975f5c5SAndroid Build Coastguard Worker                                      GL_FOVEATION_ENABLE_BIT_QCOM, &providedFeatures);
11977*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11978*8975f5c5SAndroid Build Coastguard Worker 
11979*8975f5c5SAndroid Build Coastguard Worker     // Test invalid focal points
11980*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, std::numeric_limits<uint32_t>::max(),
11981*8975f5c5SAndroid Build Coastguard Worker                                      GL_FOVEATION_ENABLE_BIT_QCOM, &providedFeatures);
11982*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11983*8975f5c5SAndroid Build Coastguard Worker 
11984*8975f5c5SAndroid Build Coastguard Worker     // Test setting foveation parameters on a framebuffer that is not configured
11985*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
11986*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
11987*8975f5c5SAndroid Build Coastguard Worker 
11988*8975f5c5SAndroid Build Coastguard Worker     // Configure framebuffer correctly
11989*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
11990*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
11991*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
11992*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
11993*8975f5c5SAndroid Build Coastguard Worker 
11994*8975f5c5SAndroid Build Coastguard Worker     // Try to configure it again
11995*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
11996*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
11997*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
11998*8975f5c5SAndroid Build Coastguard Worker 
11999*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12000*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12001*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12002*8975f5c5SAndroid Build Coastguard Worker 
12003*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12004*8975f5c5SAndroid Build Coastguard Worker 
12005*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
12006*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12007*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
12008*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
12009*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
12010*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12011*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12012*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12013*8975f5c5SAndroid Build Coastguard Worker 
12014*8975f5c5SAndroid Build Coastguard Worker     // Change attachments and try to perform a clear and draw
12015*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
12016*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12017*8975f5c5SAndroid Build Coastguard Worker 
12018*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
12019*8975f5c5SAndroid Build Coastguard Worker 
12020*8975f5c5SAndroid Build Coastguard Worker     // Clear
12021*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.8f, 1.0f, 0.2f);
12022*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12023*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
12024*8975f5c5SAndroid Build Coastguard Worker 
12025*8975f5c5SAndroid Build Coastguard Worker     // Draw
12026*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
12027*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
12028*8975f5c5SAndroid Build Coastguard Worker 
12029*8975f5c5SAndroid Build Coastguard Worker     // QCOM texture foveated tests
12030*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
12031*8975f5c5SAndroid Build Coastguard Worker     // Test invalid feature bit
12032*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM,
12033*8975f5c5SAndroid Build Coastguard Worker                     GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM);
12034*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
12035*8975f5c5SAndroid Build Coastguard Worker 
12036*8975f5c5SAndroid Build Coastguard Worker     // Test setting foveation parameters on a framebuffer that is not configured
12037*8975f5c5SAndroid Build Coastguard Worker     glTextureFoveationParametersQCOM(texture, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12038*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
12039*8975f5c5SAndroid Build Coastguard Worker 
12040*8975f5c5SAndroid Build Coastguard Worker     // Configure texture
12041*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM,
12042*8975f5c5SAndroid Build Coastguard Worker                     GL_FOVEATION_ENABLE_BIT_QCOM);
12043*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12044*8975f5c5SAndroid Build Coastguard Worker 
12045*8975f5c5SAndroid Build Coastguard Worker     // Test invalid focal points
12046*8975f5c5SAndroid Build Coastguard Worker     GLint supportedNumFocalPoints = 0;
12047*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM,
12048*8975f5c5SAndroid Build Coastguard Worker                         &supportedNumFocalPoints);
12049*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12050*8975f5c5SAndroid Build Coastguard Worker 
12051*8975f5c5SAndroid Build Coastguard Worker     glTextureFoveationParametersQCOM(texture, 0, supportedNumFocalPoints + 1, 0.0f, 0.0f, 8.0f,
12052*8975f5c5SAndroid Build Coastguard Worker                                      8.0f, 0.0f);
12053*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
12054*8975f5c5SAndroid Build Coastguard Worker 
12055*8975f5c5SAndroid Build Coastguard Worker     // Attach foveated texture while framebuffer is also fovated and check framebuffer completeness
12056*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
12057*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12058*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM,
12059*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
12060*8975f5c5SAndroid Build Coastguard Worker 
12061*8975f5c5SAndroid Build Coastguard Worker     // Attach multiple foveated textures to an un-foveated framebuffer and check completeness
12062*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
12063*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
12064*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
12065*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12066*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12067*8975f5c5SAndroid Build Coastguard Worker 
12068*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mFramebufferColorTexture);
12069*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
12070*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
12071*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12072*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12073*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12074*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM,
12075*8975f5c5SAndroid Build Coastguard Worker                     GL_FOVEATION_ENABLE_BIT_QCOM);
12076*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12077*8975f5c5SAndroid Build Coastguard Worker 
12078*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
12079*8975f5c5SAndroid Build Coastguard Worker                            mFramebufferColorTexture, 0);
12080*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12081*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM,
12082*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
12083*8975f5c5SAndroid Build Coastguard Worker }
12084*8975f5c5SAndroid Build Coastguard Worker 
12085*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering + clear
TEST_P(Texture2DTestES3Foveation,Clear)12086*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, Clear)
12087*8975f5c5SAndroid Build Coastguard Worker {
12088*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12089*8975f5c5SAndroid Build Coastguard Worker 
12090*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12091*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12092*8975f5c5SAndroid Build Coastguard Worker 
12093*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12094*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12095*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12096*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12097*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12098*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12099*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12100*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12101*8975f5c5SAndroid Build Coastguard Worker 
12102*8975f5c5SAndroid Build Coastguard Worker     // Clear
12103*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12104*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12105*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12106*8975f5c5SAndroid Build Coastguard Worker 
12107*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12108*8975f5c5SAndroid Build Coastguard Worker }
12109*8975f5c5SAndroid Build Coastguard Worker 
12110*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering + clear then draw
TEST_P(Texture2DTestES3Foveation,ClearThenDraw)12111*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, ClearThenDraw)
12112*8975f5c5SAndroid Build Coastguard Worker {
12113*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12114*8975f5c5SAndroid Build Coastguard Worker 
12115*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12116*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12117*8975f5c5SAndroid Build Coastguard Worker 
12118*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12119*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12120*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12121*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12122*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12123*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12124*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12125*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12126*8975f5c5SAndroid Build Coastguard Worker 
12127*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12128*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12129*8975f5c5SAndroid Build Coastguard Worker 
12130*8975f5c5SAndroid Build Coastguard Worker     // Clear
12131*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12132*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12133*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12134*8975f5c5SAndroid Build Coastguard Worker 
12135*8975f5c5SAndroid Build Coastguard Worker     // Draw
12136*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
12137*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12138*8975f5c5SAndroid Build Coastguard Worker 
12139*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12140*8975f5c5SAndroid Build Coastguard Worker }
12141*8975f5c5SAndroid Build Coastguard Worker 
12142*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering with rendebuffer attachment + clear then draw
TEST_P(Texture2DTestES3Foveation,RenderbufferAttachmentClearThenDraw)12143*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, RenderbufferAttachmentClearThenDraw)
12144*8975f5c5SAndroid Build Coastguard Worker {
12145*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12146*8975f5c5SAndroid Build Coastguard Worker 
12147*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer and attach a renderbuffer
12148*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12149*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
12150*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
12151*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, getWindowWidth(), getWindowHeight());
12152*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
12153*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12154*8975f5c5SAndroid Build Coastguard Worker 
12155*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12156*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12157*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12158*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12159*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12160*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12161*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12162*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12163*8975f5c5SAndroid Build Coastguard Worker 
12164*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12165*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12166*8975f5c5SAndroid Build Coastguard Worker 
12167*8975f5c5SAndroid Build Coastguard Worker     // Clear
12168*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12169*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12170*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12171*8975f5c5SAndroid Build Coastguard Worker 
12172*8975f5c5SAndroid Build Coastguard Worker     // Draw
12173*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
12174*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12175*8975f5c5SAndroid Build Coastguard Worker 
12176*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12177*8975f5c5SAndroid Build Coastguard Worker }
12178*8975f5c5SAndroid Build Coastguard Worker 
12179*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering + draw, clear then draw
TEST_P(Texture2DTestES3Foveation,DrawClearDraw)12180*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawClearDraw)
12181*8975f5c5SAndroid Build Coastguard Worker {
12182*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12183*8975f5c5SAndroid Build Coastguard Worker 
12184*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12185*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12186*8975f5c5SAndroid Build Coastguard Worker 
12187*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12188*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12189*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12190*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12191*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12192*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12193*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12194*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12195*8975f5c5SAndroid Build Coastguard Worker 
12196*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12197*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
12198*8975f5c5SAndroid Build Coastguard Worker 
12199*8975f5c5SAndroid Build Coastguard Worker     // Draw
12200*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f);
12201*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12202*8975f5c5SAndroid Build Coastguard Worker 
12203*8975f5c5SAndroid Build Coastguard Worker     // Clear
12204*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
12205*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12206*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12207*8975f5c5SAndroid Build Coastguard Worker 
12208*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
12209*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
12210*8975f5c5SAndroid Build Coastguard Worker 
12211*8975f5c5SAndroid Build Coastguard Worker     // Draw
12212*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
12213*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12214*8975f5c5SAndroid Build Coastguard Worker 
12215*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12216*8975f5c5SAndroid Build Coastguard Worker }
12217*8975f5c5SAndroid Build Coastguard Worker 
12218*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering - draw before and after enabling foveation
TEST_P(Texture2DTestES3Foveation,DrawThenEnableFoveationAndDraw)12219*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawThenEnableFoveationAndDraw)
12220*8975f5c5SAndroid Build Coastguard Worker {
12221*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12222*8975f5c5SAndroid Build Coastguard Worker 
12223*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12224*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12225*8975f5c5SAndroid Build Coastguard Worker 
12226*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12227*8975f5c5SAndroid Build Coastguard Worker 
12228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12229*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12230*8975f5c5SAndroid Build Coastguard Worker 
12231*8975f5c5SAndroid Build Coastguard Worker     // Clear
12232*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12233*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12234*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12235*8975f5c5SAndroid Build Coastguard Worker 
12236*8975f5c5SAndroid Build Coastguard Worker     // Draw
12237*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
12238*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12239*8975f5c5SAndroid Build Coastguard Worker 
12240*8975f5c5SAndroid Build Coastguard Worker     // Configure foveated rendering for framebuffer
12241*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12242*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12243*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12244*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12245*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12246*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12247*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12248*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12249*8975f5c5SAndroid Build Coastguard Worker 
12250*8975f5c5SAndroid Build Coastguard Worker     // Draw
12251*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
12252*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12253*8975f5c5SAndroid Build Coastguard Worker 
12254*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12255*8975f5c5SAndroid Build Coastguard Worker }
12256*8975f5c5SAndroid Build Coastguard Worker 
12257*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering + draw, change foveation parameters and then draw
TEST_P(Texture2DTestES3Foveation,DrawChangeFoveationParametersThenDraw)12258*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawChangeFoveationParametersThenDraw)
12259*8975f5c5SAndroid Build Coastguard Worker {
12260*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12261*8975f5c5SAndroid Build Coastguard Worker 
12262*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12263*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12264*8975f5c5SAndroid Build Coastguard Worker 
12265*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12266*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12267*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12268*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12269*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12270*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12271*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12272*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12273*8975f5c5SAndroid Build Coastguard Worker 
12274*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12275*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
12276*8975f5c5SAndroid Build Coastguard Worker 
12277*8975f5c5SAndroid Build Coastguard Worker     // Draw
12278*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f);
12279*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12280*8975f5c5SAndroid Build Coastguard Worker 
12281*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12282*8975f5c5SAndroid Build Coastguard Worker 
12283*8975f5c5SAndroid Build Coastguard Worker     // Change foveation parameters
12284*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.5f, 0.5f, 3.0f, 3.0f, 3.0f);
12285*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12286*8975f5c5SAndroid Build Coastguard Worker 
12287*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
12288*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
12289*8975f5c5SAndroid Build Coastguard Worker 
12290*8975f5c5SAndroid Build Coastguard Worker     // Draw
12291*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
12292*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12293*8975f5c5SAndroid Build Coastguard Worker 
12294*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12295*8975f5c5SAndroid Build Coastguard Worker }
12296*8975f5c5SAndroid Build Coastguard Worker 
12297*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering + draw and use as blit source
TEST_P(Texture2DTestES3Foveation,DrawThenUseAsBlitSource)12298*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawThenUseAsBlitSource)
12299*8975f5c5SAndroid Build Coastguard Worker {
12300*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12301*8975f5c5SAndroid Build Coastguard Worker 
12302*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12303*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12304*8975f5c5SAndroid Build Coastguard Worker 
12305*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12306*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12307*8975f5c5SAndroid Build Coastguard Worker 
12308*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kSizeW = getWindowWidth();
12309*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kSizeH = getWindowHeight();
12310*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> data(kSizeW * kSizeH, GLColor::blue);
12311*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSizeW, kSizeH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12312*8975f5c5SAndroid Build Coastguard Worker                  data.data());
12313*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12314*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12315*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12316*8975f5c5SAndroid Build Coastguard Worker 
12317*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12318*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12319*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12320*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12321*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12322*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12323*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12324*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12325*8975f5c5SAndroid Build Coastguard Worker 
12326*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
12327*8975f5c5SAndroid Build Coastguard Worker 
12328*8975f5c5SAndroid Build Coastguard Worker     // Verify
12329*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
12330*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12331*8975f5c5SAndroid Build Coastguard Worker 
12332*8975f5c5SAndroid Build Coastguard Worker     // Blit data from foveated framebuffer into default framebuffer
12333*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
12334*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
12335*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
12336*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
12337*8975f5c5SAndroid Build Coastguard Worker 
12338*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12339*8975f5c5SAndroid Build Coastguard Worker }
12340*8975f5c5SAndroid Build Coastguard Worker 
12341*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering + draw and use as blit target
TEST_P(Texture2DTestES3Foveation,DrawThenUseAsBlitTarget)12342*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawThenUseAsBlitTarget)
12343*8975f5c5SAndroid Build Coastguard Worker {
12344*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12345*8975f5c5SAndroid Build Coastguard Worker 
12346*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12347*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12348*8975f5c5SAndroid Build Coastguard Worker 
12349*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12350*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12351*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12352*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12353*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12354*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12355*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12356*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12357*8975f5c5SAndroid Build Coastguard Worker 
12358*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12359*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
12360*8975f5c5SAndroid Build Coastguard Worker 
12361*8975f5c5SAndroid Build Coastguard Worker     // Draw
12362*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f);
12363*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12364*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12365*8975f5c5SAndroid Build Coastguard Worker 
12366*8975f5c5SAndroid Build Coastguard Worker     // Switch to default framebuffer and clear to blue
12367*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
12368*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12369*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12370*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12371*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12372*8975f5c5SAndroid Build Coastguard Worker 
12373*8975f5c5SAndroid Build Coastguard Worker     // Blit data from default framebuffer into foveated framebuffer
12374*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
12375*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
12376*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
12377*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
12378*8975f5c5SAndroid Build Coastguard Worker 
12379*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12380*8975f5c5SAndroid Build Coastguard Worker }
12381*8975f5c5SAndroid Build Coastguard Worker 
12382*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering, reuse texture between 2 foveated framebuffers
TEST_P(Texture2DTestES3Foveation,ReuseTextureForFoveatedDraw)12383*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, ReuseTextureForFoveatedDraw)
12384*8975f5c5SAndroid Build Coastguard Worker {
12385*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12386*8975f5c5SAndroid Build Coastguard Worker 
12387*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12388*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12389*8975f5c5SAndroid Build Coastguard Worker 
12390*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12391*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12392*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12393*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12394*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12395*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12396*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12397*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12398*8975f5c5SAndroid Build Coastguard Worker 
12399*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12400*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
12401*8975f5c5SAndroid Build Coastguard Worker 
12402*8975f5c5SAndroid Build Coastguard Worker     // Draw
12403*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f);
12404*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12405*8975f5c5SAndroid Build Coastguard Worker 
12406*8975f5c5SAndroid Build Coastguard Worker     // Create another framebuffer
12407*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
12408*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
12409*8975f5c5SAndroid Build Coastguard Worker 
12410*8975f5c5SAndroid Build Coastguard Worker     // Resuse texture from mFramebuffer
12411*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
12412*8975f5c5SAndroid Build Coastguard Worker                            mFramebufferColorTexture, 0);
12413*8975f5c5SAndroid Build Coastguard Worker 
12414*8975f5c5SAndroid Build Coastguard Worker     // Configure foveation parameters of the new framebuffer
12415*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12416*8975f5c5SAndroid Build Coastguard Worker     providedFeatures = 0;
12417*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(framebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12418*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12419*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12420*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12421*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(framebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12422*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12423*8975f5c5SAndroid Build Coastguard Worker 
12424*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
12425*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
12426*8975f5c5SAndroid Build Coastguard Worker 
12427*8975f5c5SAndroid Build Coastguard Worker     // Draw
12428*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
12429*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12430*8975f5c5SAndroid Build Coastguard Worker 
12431*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12432*8975f5c5SAndroid Build Coastguard Worker }
12433*8975f5c5SAndroid Build Coastguard Worker 
12434*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering with MSAA framebuffer
TEST_P(Texture2DTestES3Foveation,DrawWithMsaaFramebuffer)12435*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawWithMsaaFramebuffer)
12436*8975f5c5SAndroid Build Coastguard Worker {
12437*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12438*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
12439*8975f5c5SAndroid Build Coastguard Worker 
12440*8975f5c5SAndroid Build Coastguard Worker     // Create a new MSAA framebuffer
12441*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFramebuffer;
12442*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer);
12443*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
12444*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12445*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
12446*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
12447*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
12448*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12449*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12450*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12451*8975f5c5SAndroid Build Coastguard Worker 
12452*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
12453*8975f5c5SAndroid Build Coastguard Worker                                          texture, 0, 4);
12454*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12455*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12456*8975f5c5SAndroid Build Coastguard Worker 
12457*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12458*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12459*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12460*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12461*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12462*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12463*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12464*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12465*8975f5c5SAndroid Build Coastguard Worker 
12466*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12467*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12468*8975f5c5SAndroid Build Coastguard Worker 
12469*8975f5c5SAndroid Build Coastguard Worker     // Clear
12470*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12471*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12472*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12473*8975f5c5SAndroid Build Coastguard Worker 
12474*8975f5c5SAndroid Build Coastguard Worker     // Draw
12475*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
12476*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12477*8975f5c5SAndroid Build Coastguard Worker 
12478*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12479*8975f5c5SAndroid Build Coastguard Worker }
12480*8975f5c5SAndroid Build Coastguard Worker 
12481*8975f5c5SAndroid Build Coastguard Worker // QCOM framebuffer foveated rendering with multiple attachments
TEST_P(Texture2DTestES3Foveation,DrawWithMultipleAttachments)12482*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, DrawWithMultipleAttachments)
12483*8975f5c5SAndroid Build Coastguard Worker {
12484*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_framebuffer_foveated"));
12485*8975f5c5SAndroid Build Coastguard Worker 
12486*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kSizeW = getWindowWidth();
12487*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kSizeH = getWindowHeight();
12488*8975f5c5SAndroid Build Coastguard Worker 
12489*8975f5c5SAndroid Build Coastguard Worker     // Setup sampling texture
12490*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12491*8975f5c5SAndroid Build Coastguard Worker 
12492*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> data(kSizeW * kSizeH);
12493*8975f5c5SAndroid Build Coastguard Worker     // Generate red / blue checkered pattern
12494*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < kSizeH; i++)
12495*8975f5c5SAndroid Build Coastguard Worker     {
12496*8975f5c5SAndroid Build Coastguard Worker         for (int j = 0; j < kSizeW; j++)
12497*8975f5c5SAndroid Build Coastguard Worker         {
12498*8975f5c5SAndroid Build Coastguard Worker             data[(i * kSizeW) + j] = ((i + j) % 2 == 0) ? GLColor::red : GLColor::blue;
12499*8975f5c5SAndroid Build Coastguard Worker         }
12500*8975f5c5SAndroid Build Coastguard Worker     }
12501*8975f5c5SAndroid Build Coastguard Worker 
12502*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSizeW, kSizeH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12503*8975f5c5SAndroid Build Coastguard Worker                  data.data());
12504*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12505*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12506*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12507*8975f5c5SAndroid Build Coastguard Worker 
12508*8975f5c5SAndroid Build Coastguard Worker     // Draw without foveation
12509*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12510*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12511*8975f5c5SAndroid Build Coastguard Worker 
12512*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
12513*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
12514*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
12515*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12516*8975f5c5SAndroid Build Coastguard Worker 
12517*8975f5c5SAndroid Build Coastguard Worker     // Record original data
12518*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> originalData(kSizeW * kSizeH, {0, 0, 0, 0});
12519*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSizeW, kSizeH, GL_RGBA, GL_UNSIGNED_BYTE, originalData.data());
12520*8975f5c5SAndroid Build Coastguard Worker 
12521*8975f5c5SAndroid Build Coastguard Worker     // Switch to foveated framebuffer
12522*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
12523*8975f5c5SAndroid Build Coastguard Worker 
12524*8975f5c5SAndroid Build Coastguard Worker     // Setup mutliple color attachments
12525*8975f5c5SAndroid Build Coastguard Worker     std::array<GLTexture, 3> colorAttachments;
12526*8975f5c5SAndroid Build Coastguard Worker     GLenum attachmentBase  = GL_COLOR_ATTACHMENT0;
12527*8975f5c5SAndroid Build Coastguard Worker     GLuint attachmentIndex = 0;
12528*8975f5c5SAndroid Build Coastguard Worker     for (GLTexture &attachment : colorAttachments)
12529*8975f5c5SAndroid Build Coastguard Worker     {
12530*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, attachment);
12531*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSizeW, kSizeH, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12532*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
12533*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12534*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12535*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
12536*8975f5c5SAndroid Build Coastguard Worker 
12537*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentBase + attachmentIndex, GL_TEXTURE_2D,
12538*8975f5c5SAndroid Build Coastguard Worker                                attachment, 0);
12539*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
12540*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12541*8975f5c5SAndroid Build Coastguard Worker 
12542*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
12543*8975f5c5SAndroid Build Coastguard Worker 
12544*8975f5c5SAndroid Build Coastguard Worker         attachmentIndex++;
12545*8975f5c5SAndroid Build Coastguard Worker     }
12546*8975f5c5SAndroid Build Coastguard Worker 
12547*8975f5c5SAndroid Build Coastguard Worker     // Setup foveation parameters, just need 1 focal point
12548*8975f5c5SAndroid Build Coastguard Worker     GLuint providedFeatures = 0;
12549*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationConfigQCOM(mFramebuffer, 1, 1, GL_FOVEATION_ENABLE_BIT_QCOM,
12550*8975f5c5SAndroid Build Coastguard Worker                                      &providedFeatures);
12551*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(providedFeatures & GL_FOVEATION_ENABLE_BIT_QCOM, 0u);
12552*8975f5c5SAndroid Build Coastguard Worker 
12553*8975f5c5SAndroid Build Coastguard Worker     glFramebufferFoveationParametersQCOM(mFramebuffer, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12554*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12555*8975f5c5SAndroid Build Coastguard Worker 
12556*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
12557*8975f5c5SAndroid Build Coastguard Worker precision highp float;
12558*8975f5c5SAndroid Build Coastguard Worker 
12559*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
12560*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
12561*8975f5c5SAndroid Build Coastguard Worker 
12562*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color0;
12563*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 color1;
12564*8975f5c5SAndroid Build Coastguard Worker layout(location = 2) out vec4 color2;
12565*8975f5c5SAndroid Build Coastguard Worker 
12566*8975f5c5SAndroid Build Coastguard Worker void main()
12567*8975f5c5SAndroid Build Coastguard Worker {
12568*8975f5c5SAndroid Build Coastguard Worker     vec4 fragColor = texture(tex, texcoord);
12569*8975f5c5SAndroid Build Coastguard Worker     color0 = fragColor;
12570*8975f5c5SAndroid Build Coastguard Worker     color1 = fragColor;
12571*8975f5c5SAndroid Build Coastguard Worker     color2 = fragColor;
12572*8975f5c5SAndroid Build Coastguard Worker })";
12573*8975f5c5SAndroid Build Coastguard Worker 
12574*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, getVertexShaderSource(), kFS);
12575*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12576*8975f5c5SAndroid Build Coastguard Worker 
12577*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 3> drawBuffers = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
12578*8975f5c5SAndroid Build Coastguard Worker                                          GL_COLOR_ATTACHMENT2};
12579*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(3, drawBuffers.data());
12580*8975f5c5SAndroid Build Coastguard Worker 
12581*8975f5c5SAndroid Build Coastguard Worker     // Draw with foveation into multiple attachments
12582*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12583*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12584*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
12585*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12586*8975f5c5SAndroid Build Coastguard Worker 
12587*8975f5c5SAndroid Build Coastguard Worker     // Verify
12588*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFBO;
12589*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
12590*8975f5c5SAndroid Build Coastguard Worker 
12591*8975f5c5SAndroid Build Coastguard Worker     // Use colorAttachments[0]'s content as reference data
12592*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> referenceData(kSizeW * kSizeH, {0, 0, 0, 0});
12593*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> result(kSizeW * kSizeH, {0, 0, 0, 0});
12594*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
12595*8975f5c5SAndroid Build Coastguard Worker                            colorAttachments[0], 0);
12596*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
12597*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSizeW, kSizeH, GL_RGBA, GL_UNSIGNED_BYTE, referenceData.data());
12598*8975f5c5SAndroid Build Coastguard Worker 
12599*8975f5c5SAndroid Build Coastguard Worker     // Foveated rendering should produce content that differs from original data
12600*8975f5c5SAndroid Build Coastguard Worker     ASSERT(originalData != referenceData);
12601*8975f5c5SAndroid Build Coastguard Worker 
12602*8975f5c5SAndroid Build Coastguard Worker     // Verify rest of the attachments
12603*8975f5c5SAndroid Build Coastguard Worker     for (size_t index = 1; index < colorAttachments.size(); index++)
12604*8975f5c5SAndroid Build Coastguard Worker     {
12605*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
12606*8975f5c5SAndroid Build Coastguard Worker                                colorAttachments[index], 0);
12607*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
12608*8975f5c5SAndroid Build Coastguard Worker 
12609*8975f5c5SAndroid Build Coastguard Worker         result.assign(result.size(), {0, 0, 0, 0});
12610*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, kSizeW, kSizeH, GL_RGBA, GL_UNSIGNED_BYTE, result.data());
12611*8975f5c5SAndroid Build Coastguard Worker 
12612*8975f5c5SAndroid Build Coastguard Worker         ASSERT(referenceData == result);
12613*8975f5c5SAndroid Build Coastguard Worker     }
12614*8975f5c5SAndroid Build Coastguard Worker }
12615*8975f5c5SAndroid Build Coastguard Worker 
12616*8975f5c5SAndroid Build Coastguard Worker // QCOM texture foveated rendering, basic draw
TEST_P(Texture2DTestES3Foveation,FoveatedTextureDraw)12617*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3Foveation, FoveatedTextureDraw)
12618*8975f5c5SAndroid Build Coastguard Worker {
12619*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_texture_foveated"));
12620*8975f5c5SAndroid Build Coastguard Worker 
12621*8975f5c5SAndroid Build Coastguard Worker     // Create non-foveated framebuffer
12622*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
12623*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
12624*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12625*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mFramebufferColorTexture);
12626*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
12627*8975f5c5SAndroid Build Coastguard Worker                            mFramebufferColorTexture, 0);
12628*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12629*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12630*8975f5c5SAndroid Build Coastguard Worker 
12631*8975f5c5SAndroid Build Coastguard Worker     // Render before configuring foveation on the texture
12632*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12633*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
12634*8975f5c5SAndroid Build Coastguard Worker 
12635*8975f5c5SAndroid Build Coastguard Worker     // Clear
12636*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12637*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12638*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12639*8975f5c5SAndroid Build Coastguard Worker 
12640*8975f5c5SAndroid Build Coastguard Worker     // Draw
12641*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f);
12642*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12643*8975f5c5SAndroid Build Coastguard Worker 
12644*8975f5c5SAndroid Build Coastguard Worker     // Configure foveation for the texture
12645*8975f5c5SAndroid Build Coastguard Worker     GLint supportedFoveationFeatures = 0;
12646*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM,
12647*8975f5c5SAndroid Build Coastguard Worker                         &supportedFoveationFeatures);
12648*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(supportedFoveationFeatures & GL_FOVEATION_ENABLE_BIT_QCOM,
12649*8975f5c5SAndroid Build Coastguard Worker               GL_FOVEATION_ENABLE_BIT_QCOM);
12650*8975f5c5SAndroid Build Coastguard Worker     GLint supportedNumFocalPoints = 0;
12651*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM,
12652*8975f5c5SAndroid Build Coastguard Worker                         &supportedNumFocalPoints);
12653*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(supportedNumFocalPoints, 1);
12654*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM,
12655*8975f5c5SAndroid Build Coastguard Worker                     GL_FOVEATION_ENABLE_BIT_QCOM);
12656*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12657*8975f5c5SAndroid Build Coastguard Worker 
12658*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12659*8975f5c5SAndroid Build Coastguard Worker     glTextureFoveationParametersQCOM(mFramebufferColorTexture, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12660*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12661*8975f5c5SAndroid Build Coastguard Worker 
12662*8975f5c5SAndroid Build Coastguard Worker     // Render and verify after configuring foveation on the texture
12663*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
12664*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
12665*8975f5c5SAndroid Build Coastguard Worker 
12666*8975f5c5SAndroid Build Coastguard Worker     // Clear
12667*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
12668*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12669*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12670*8975f5c5SAndroid Build Coastguard Worker 
12671*8975f5c5SAndroid Build Coastguard Worker     // Draw
12672*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
12673*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12674*8975f5c5SAndroid Build Coastguard Worker 
12675*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::blue);
12676*8975f5c5SAndroid Build Coastguard Worker }
12677*8975f5c5SAndroid Build Coastguard Worker 
12678*8975f5c5SAndroid Build Coastguard Worker // QCOM texture foveated rendering to MSAA texture followed by a blit
TEST_P(Texture2DTestES31Foveation,MsaaTextureDrawThenUseAsBlitSource)12679*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES31Foveation, MsaaTextureDrawThenUseAsBlitSource)
12680*8975f5c5SAndroid Build Coastguard Worker {
12681*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_texture_foveated"));
12682*8975f5c5SAndroid Build Coastguard Worker 
12683*8975f5c5SAndroid Build Coastguard Worker     // Create a non-foveated framebuffer
12684*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
12685*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
12686*8975f5c5SAndroid Build Coastguard Worker 
12687*8975f5c5SAndroid Build Coastguard Worker     // Create an msaa texture and bind to framebuffer
12688*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureMS;
12689*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12690*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureMS);
12691*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, getWindowWidth(),
12692*8975f5c5SAndroid Build Coastguard Worker                               getWindowHeight(), GL_TRUE);
12693*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12694*8975f5c5SAndroid Build Coastguard Worker 
12695*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
12696*8975f5c5SAndroid Build Coastguard Worker                            textureMS, 0);
12697*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12698*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
12699*8975f5c5SAndroid Build Coastguard Worker 
12700*8975f5c5SAndroid Build Coastguard Worker     // Just need 1 focal point
12701*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM,
12702*8975f5c5SAndroid Build Coastguard Worker                     GL_FOVEATION_ENABLE_BIT_QCOM);
12703*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12704*8975f5c5SAndroid Build Coastguard Worker 
12705*8975f5c5SAndroid Build Coastguard Worker     // Set foveation parameters
12706*8975f5c5SAndroid Build Coastguard Worker     glTextureFoveationParametersQCOM(textureMS, 0, 0, 0.0f, 0.0f, 8.0f, 8.0f, 0.0f);
12707*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12708*8975f5c5SAndroid Build Coastguard Worker 
12709*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
12710*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12711*8975f5c5SAndroid Build Coastguard Worker 
12712*8975f5c5SAndroid Build Coastguard Worker     // Clear
12713*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
12714*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12716*8975f5c5SAndroid Build Coastguard Worker 
12717*8975f5c5SAndroid Build Coastguard Worker     // Draw
12718*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
12719*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12720*8975f5c5SAndroid Build Coastguard Worker 
12721*8975f5c5SAndroid Build Coastguard Worker     // Blit data from framebuffer with foveated texture into default framebuffer
12722*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
12723*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
12724*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
12725*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
12726*8975f5c5SAndroid Build Coastguard Worker 
12727*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
12728*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::green);
12729*8975f5c5SAndroid Build Coastguard Worker }
12730*8975f5c5SAndroid Build Coastguard Worker 
12731*8975f5c5SAndroid Build Coastguard Worker // Enabling mipmap filtering after previously having used the texture without it should work.
TEST_P(Texture2DTestES3,NoMipmapDrawThenMipmapDraw)12732*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, NoMipmapDrawThenMipmapDraw)
12733*8975f5c5SAndroid Build Coastguard Worker {
12734*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12735*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12736*8975f5c5SAndroid Build Coastguard Worker 
12737*8975f5c5SAndroid Build Coastguard Worker     constexpr const GLsizei kSize = 8;
12738*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevel0Data(kSize * kSize, GLColor::blue);
12739*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevelOtherData(kSize * kSize, GLColor::red);
12740*8975f5c5SAndroid Build Coastguard Worker 
12741*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12742*8975f5c5SAndroid Build Coastguard Worker                  kLevel0Data.data());
12743*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12744*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12745*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12746*8975f5c5SAndroid Build Coastguard Worker 
12747*8975f5c5SAndroid Build Coastguard Worker     // Draw so the texture's image is allocated.
12748*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
12749*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, kLevel0Data[0]);
12750*8975f5c5SAndroid Build Coastguard Worker 
12751*8975f5c5SAndroid Build Coastguard Worker     // Specify the rest of the image
12752*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 1; (kSize >> mip) >= 1; ++mip)
12753*8975f5c5SAndroid Build Coastguard Worker     {
12754*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA, kSize >> mip, kSize >> mip, 0, GL_RGBA,
12755*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, kLevelOtherData.data());
12756*8975f5c5SAndroid Build Coastguard Worker     }
12757*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
12758*8975f5c5SAndroid Build Coastguard Worker 
12759*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
12760*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12761*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
12762*8975f5c5SAndroid Build Coastguard Worker     GLint lodLoc     = glGetUniformLocation(program, essl3_shaders::LodUniform());
12763*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLoc);
12764*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLoc);
12765*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 0);
12766*8975f5c5SAndroid Build Coastguard Worker 
12767*8975f5c5SAndroid Build Coastguard Worker     // Verify the mips
12768*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; (kSize >> mip) >= 1; ++mip)
12769*8975f5c5SAndroid Build Coastguard Worker     {
12770*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(lodLoc, mip);
12771*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
12772*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
12773*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, (mip == 0 ? kLevel0Data[0] : kLevelOtherData[0]));
12774*8975f5c5SAndroid Build Coastguard Worker     }
12775*8975f5c5SAndroid Build Coastguard Worker }
12776*8975f5c5SAndroid Build Coastguard Worker 
12777*8975f5c5SAndroid Build Coastguard Worker // Disabling mipmap filtering after previously having used the texture with it should work.
TEST_P(Texture2DTestES3,MipmapDrawThenNoMipmapDraw)12778*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, MipmapDrawThenNoMipmapDraw)
12779*8975f5c5SAndroid Build Coastguard Worker {
12780*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12781*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12782*8975f5c5SAndroid Build Coastguard Worker 
12783*8975f5c5SAndroid Build Coastguard Worker     constexpr const GLsizei kSize = 8;
12784*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevel0Data(kSize * kSize, GLColor::blue);
12785*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevelOtherData(kSize * kSize, GLColor::red);
12786*8975f5c5SAndroid Build Coastguard Worker 
12787*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12788*8975f5c5SAndroid Build Coastguard Worker                  kLevel0Data.data());
12789*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 1; (kSize >> mip) >= 1; ++mip)
12790*8975f5c5SAndroid Build Coastguard Worker     {
12791*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA, kSize >> mip, kSize >> mip, 0, GL_RGBA,
12792*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, kLevelOtherData.data());
12793*8975f5c5SAndroid Build Coastguard Worker     }
12794*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
12795*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12796*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12797*8975f5c5SAndroid Build Coastguard Worker 
12798*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
12799*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12800*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
12801*8975f5c5SAndroid Build Coastguard Worker     GLint lodLoc     = glGetUniformLocation(program, essl3_shaders::LodUniform());
12802*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLoc);
12803*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLoc);
12804*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 0);
12805*8975f5c5SAndroid Build Coastguard Worker 
12806*8975f5c5SAndroid Build Coastguard Worker     // Verify the mips.
12807*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; (kSize >> mip) >= 1; ++mip)
12808*8975f5c5SAndroid Build Coastguard Worker     {
12809*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(lodLoc, mip);
12810*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
12811*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
12812*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, (mip == 0 ? kLevel0Data[0] : kLevelOtherData[0]));
12813*8975f5c5SAndroid Build Coastguard Worker     }
12814*8975f5c5SAndroid Build Coastguard Worker 
12815*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping and verify mips again.
12816*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12817*8975f5c5SAndroid Build Coastguard Worker 
12818*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; (kSize >> mip) >= 1; ++mip)
12819*8975f5c5SAndroid Build Coastguard Worker     {
12820*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(lodLoc, mip);
12821*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
12822*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
12823*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kLevel0Data[0]);
12824*8975f5c5SAndroid Build Coastguard Worker     }
12825*8975f5c5SAndroid Build Coastguard Worker }
12826*8975f5c5SAndroid Build Coastguard Worker 
12827*8975f5c5SAndroid Build Coastguard Worker // Respecify texture with more mips.
TEST_P(Texture2DTestES3,RespecifyWithMoreMips)12828*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, RespecifyWithMoreMips)
12829*8975f5c5SAndroid Build Coastguard Worker {
12830*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12831*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12832*8975f5c5SAndroid Build Coastguard Worker 
12833*8975f5c5SAndroid Build Coastguard Worker     constexpr const GLsizei kSize = 8;
12834*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevelEvenData(kSize * kSize, GLColor::blue);
12835*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kLevelOddData(kSize * kSize * 4, GLColor::red);
12836*8975f5c5SAndroid Build Coastguard Worker 
12837*8975f5c5SAndroid Build Coastguard Worker     auto getLevelData = [&](GLint mip) {
12838*8975f5c5SAndroid Build Coastguard Worker         return mip % 2 == 0 ? kLevelEvenData.data() : kLevelOddData.data();
12839*8975f5c5SAndroid Build Coastguard Worker     };
12840*8975f5c5SAndroid Build Coastguard Worker 
12841*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; (kSize >> mip) >= 1; ++mip)
12842*8975f5c5SAndroid Build Coastguard Worker     {
12843*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA, kSize >> mip, kSize >> mip, 0, GL_RGBA,
12844*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, getLevelData(mip));
12845*8975f5c5SAndroid Build Coastguard Worker     }
12846*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
12847*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12848*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12849*8975f5c5SAndroid Build Coastguard Worker 
12850*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
12851*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
12852*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
12853*8975f5c5SAndroid Build Coastguard Worker     GLint lodLoc     = glGetUniformLocation(program, essl3_shaders::LodUniform());
12854*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLoc);
12855*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLoc);
12856*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 0);
12857*8975f5c5SAndroid Build Coastguard Worker 
12858*8975f5c5SAndroid Build Coastguard Worker     // Verify the mips.
12859*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; (kSize >> mip) >= 1; ++mip)
12860*8975f5c5SAndroid Build Coastguard Worker     {
12861*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(lodLoc, mip);
12862*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
12863*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
12864*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, getLevelData(mip)[0]);
12865*8975f5c5SAndroid Build Coastguard Worker     }
12866*8975f5c5SAndroid Build Coastguard Worker 
12867*8975f5c5SAndroid Build Coastguard Worker     // Respecify the texture with more mips, without changing any parameters.
12868*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize * 2, kSize * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12869*8975f5c5SAndroid Build Coastguard Worker                  kLevelOddData.data());
12870*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; (kSize >> mip) >= 1; ++mip)
12871*8975f5c5SAndroid Build Coastguard Worker     {
12872*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip + 1, GL_RGBA, kSize >> mip, kSize >> mip, 0, GL_RGBA,
12873*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, getLevelData(mip));
12874*8975f5c5SAndroid Build Coastguard Worker     }
12875*8975f5c5SAndroid Build Coastguard Worker 
12876*8975f5c5SAndroid Build Coastguard Worker     // Verify the mips.
12877*8975f5c5SAndroid Build Coastguard Worker     for (GLint mip = 0; ((kSize * 2) >> mip) >= 1; ++mip)
12878*8975f5c5SAndroid Build Coastguard Worker     {
12879*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(lodLoc, mip);
12880*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
12881*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
12882*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, getLevelData(mip - 1)[0]);
12883*8975f5c5SAndroid Build Coastguard Worker     }
12884*8975f5c5SAndroid Build Coastguard Worker }
12885*8975f5c5SAndroid Build Coastguard Worker 
12886*8975f5c5SAndroid Build Coastguard Worker // Covers a bug in the D3D11 backend: http://anglebug.com/42261476
12887*8975f5c5SAndroid Build Coastguard Worker // When using a sampler the texture was created as if it has mipmaps,
12888*8975f5c5SAndroid Build Coastguard Worker // regardless what you specified in GL_TEXTURE_MIN_FILTER via
12889*8975f5c5SAndroid Build Coastguard Worker // glSamplerParameteri() -- mistakenly the default value
12890*8975f5c5SAndroid Build Coastguard Worker // GL_NEAREST_MIPMAP_LINEAR or the value set via glTexParameteri() was
12891*8975f5c5SAndroid Build Coastguard Worker // evaluated.
12892*8975f5c5SAndroid Build Coastguard Worker // If you didn't provide mipmaps and didn't let the driver generate them
12893*8975f5c5SAndroid Build Coastguard Worker // this led to not sampling your texture data when minification occurred.
TEST_P(Texture2DTestES3,MinificationWithSamplerNoMipmapping)12894*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, MinificationWithSamplerNoMipmapping)
12895*8975f5c5SAndroid Build Coastguard Worker {
12896*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
12897*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
12898*8975f5c5SAndroid Build Coastguard Worker         "out vec2 texcoord;\n"
12899*8975f5c5SAndroid Build Coastguard Worker         "in vec4 position;\n"
12900*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
12901*8975f5c5SAndroid Build Coastguard Worker         "{\n"
12902*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position.xy * 0.1, 0.0, 1.0);\n"
12903*8975f5c5SAndroid Build Coastguard Worker         "    texcoord = (position.xy * 0.5) + 0.5;\n"
12904*8975f5c5SAndroid Build Coastguard Worker         "}\n";
12905*8975f5c5SAndroid Build Coastguard Worker 
12906*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
12907*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
12908*8975f5c5SAndroid Build Coastguard Worker         "precision highp float;\n"
12909*8975f5c5SAndroid Build Coastguard Worker         "uniform highp sampler2D tex;\n"
12910*8975f5c5SAndroid Build Coastguard Worker         "in vec2 texcoord;\n"
12911*8975f5c5SAndroid Build Coastguard Worker         "out vec4 fragColor;\n"
12912*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
12913*8975f5c5SAndroid Build Coastguard Worker         "{\n"
12914*8975f5c5SAndroid Build Coastguard Worker         "    fragColor = texture(tex, texcoord);\n"
12915*8975f5c5SAndroid Build Coastguard Worker         "}\n";
12916*8975f5c5SAndroid Build Coastguard Worker 
12917*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
12918*8975f5c5SAndroid Build Coastguard Worker 
12919*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
12920*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(0, sampler);
12921*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
12922*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
12923*8975f5c5SAndroid Build Coastguard Worker 
12924*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12925*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
12926*8975f5c5SAndroid Build Coastguard Worker 
12927*8975f5c5SAndroid Build Coastguard Worker     const GLsizei texWidth  = getWindowWidth();
12928*8975f5c5SAndroid Build Coastguard Worker     const GLsizei texHeight = getWindowHeight();
12929*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> whiteData(texWidth * texHeight, GLColor::white);
12930*8975f5c5SAndroid Build Coastguard Worker 
12931*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12932*8975f5c5SAndroid Build Coastguard Worker                  whiteData.data());
12933*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
12934*8975f5c5SAndroid Build Coastguard Worker 
12935*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
12936*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, angle::GLColor::white);
12937*8975f5c5SAndroid Build Coastguard Worker }
12938*8975f5c5SAndroid Build Coastguard Worker 
testUploadThenUseInDifferentStages(const std::vector<UploadThenUseStageParam> & uses)12939*8975f5c5SAndroid Build Coastguard Worker void Texture2DTest::testUploadThenUseInDifferentStages(
12940*8975f5c5SAndroid Build Coastguard Worker     const std::vector<UploadThenUseStageParam> &uses)
12941*8975f5c5SAndroid Build Coastguard Worker {
12942*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVSSampleVS[] = R"(attribute vec4 a_position;
12943*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D u_tex2D;
12944*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_color;
12945*8975f5c5SAndroid Build Coastguard Worker 
12946*8975f5c5SAndroid Build Coastguard Worker void main()
12947*8975f5c5SAndroid Build Coastguard Worker {
12948*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position.xy, 0.0, 1.0);
12949*8975f5c5SAndroid Build Coastguard Worker     v_color = texture2D(u_tex2D, a_position.xy * 0.5 + vec2(0.5));
12950*8975f5c5SAndroid Build Coastguard Worker })";
12951*8975f5c5SAndroid Build Coastguard Worker 
12952*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVSSampleFS[] = R"(precision mediump float;
12953*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_color;
12954*8975f5c5SAndroid Build Coastguard Worker 
12955*8975f5c5SAndroid Build Coastguard Worker void main()
12956*8975f5c5SAndroid Build Coastguard Worker {
12957*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = v_color;
12958*8975f5c5SAndroid Build Coastguard Worker })";
12959*8975f5c5SAndroid Build Coastguard Worker 
12960*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(sampleInVS, kVSSampleVS, kVSSampleFS);
12961*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(sampleInFS, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
12962*8975f5c5SAndroid Build Coastguard Worker 
12963*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo[2];
12964*8975f5c5SAndroid Build Coastguard Worker     GLTexture color[2];
12965*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 2; ++i)
12966*8975f5c5SAndroid Build Coastguard Worker     {
12967*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo[i]);
12968*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, color[i]);
12969*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
12970*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color[i], 0);
12971*8975f5c5SAndroid Build Coastguard Worker     }
12972*8975f5c5SAndroid Build Coastguard Worker 
12973*8975f5c5SAndroid Build Coastguard Worker     const GLColor kImageColor(63, 31, 0, 255);
12974*8975f5c5SAndroid Build Coastguard Worker 
12975*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
12976*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
12977*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kImageColor);
12978*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
12979*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
12980*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
12981*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
12982*8975f5c5SAndroid Build Coastguard Worker 
12983*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
12984*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
12985*8975f5c5SAndroid Build Coastguard Worker 
12986*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
12987*8975f5c5SAndroid Build Coastguard Worker 
12988*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo[1]);
12989*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12990*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]);
12991*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
12992*8975f5c5SAndroid Build Coastguard Worker 
12993*8975f5c5SAndroid Build Coastguard Worker     uint32_t curFboIndex     = 0;
12994*8975f5c5SAndroid Build Coastguard Worker     uint32_t fboDrawCount[2] = {};
12995*8975f5c5SAndroid Build Coastguard Worker 
12996*8975f5c5SAndroid Build Coastguard Worker     for (const UploadThenUseStageParam &use : uses)
12997*8975f5c5SAndroid Build Coastguard Worker     {
12998*8975f5c5SAndroid Build Coastguard Worker         const GLProgram &program = use.useStage == GL_VERTEX_SHADER ? sampleInVS : sampleInFS;
12999*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
13000*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
13001*8975f5c5SAndroid Build Coastguard Worker 
13002*8975f5c5SAndroid Build Coastguard Worker         ++fboDrawCount[curFboIndex];
13003*8975f5c5SAndroid Build Coastguard Worker 
13004*8975f5c5SAndroid Build Coastguard Worker         if (use.closeRenderPassAfterUse)
13005*8975f5c5SAndroid Build Coastguard Worker         {
13006*8975f5c5SAndroid Build Coastguard Worker             // Close the render pass without accidentally incurring additional barriers.
13007*8975f5c5SAndroid Build Coastguard Worker             curFboIndex = 1 - curFboIndex;
13008*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, fbo[curFboIndex]);
13009*8975f5c5SAndroid Build Coastguard Worker         }
13010*8975f5c5SAndroid Build Coastguard Worker     }
13011*8975f5c5SAndroid Build Coastguard Worker 
13012*8975f5c5SAndroid Build Coastguard Worker     // Make sure the transfer operations below aren't reordered with the rendering above and thus
13013*8975f5c5SAndroid Build Coastguard Worker     // introduce additional synchronization.
13014*8975f5c5SAndroid Build Coastguard Worker     glFinish();
13015*8975f5c5SAndroid Build Coastguard Worker 
13016*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < 2; ++i)
13017*8975f5c5SAndroid Build Coastguard Worker     {
13018*8975f5c5SAndroid Build Coastguard Worker         const GLColor kExpectedColor(63 * std::min(4u, fboDrawCount[i]),
13019*8975f5c5SAndroid Build Coastguard Worker                                      31 * std::min(8u, fboDrawCount[i]), 0, 255);
13020*8975f5c5SAndroid Build Coastguard Worker 
13021*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo[i]);
13022*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, kExpectedColor);
13023*8975f5c5SAndroid Build Coastguard Worker     }
13024*8975f5c5SAndroid Build Coastguard Worker }
13025*8975f5c5SAndroid Build Coastguard Worker 
13026*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13027*8975f5c5SAndroid Build Coastguard Worker //
13028*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13029*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
TEST_P(Texture2DTest,UploadThenVSThenFS)13030*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenVSThenFS)
13031*8975f5c5SAndroid Build Coastguard Worker {
13032*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13033*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13034*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13035*8975f5c5SAndroid Build Coastguard Worker     });
13036*8975f5c5SAndroid Build Coastguard Worker }
13037*8975f5c5SAndroid Build Coastguard Worker 
13038*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13039*8975f5c5SAndroid Build Coastguard Worker //
13040*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13041*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13042*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
TEST_P(Texture2DTest,UploadThenVSThenNewRPThenFS)13043*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenVSThenNewRPThenFS)
13044*8975f5c5SAndroid Build Coastguard Worker {
13045*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13046*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, true},
13047*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13048*8975f5c5SAndroid Build Coastguard Worker     });
13049*8975f5c5SAndroid Build Coastguard Worker }
13050*8975f5c5SAndroid Build Coastguard Worker 
13051*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13052*8975f5c5SAndroid Build Coastguard Worker //
13053*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13054*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
TEST_P(Texture2DTest,UploadThenFSThenVS)13055*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenFSThenVS)
13056*8975f5c5SAndroid Build Coastguard Worker {
13057*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13058*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13059*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13060*8975f5c5SAndroid Build Coastguard Worker     });
13061*8975f5c5SAndroid Build Coastguard Worker }
13062*8975f5c5SAndroid Build Coastguard Worker 
13063*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13064*8975f5c5SAndroid Build Coastguard Worker //
13065*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13066*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13067*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
TEST_P(Texture2DTest,UploadThenFSThenNewRPThenVS)13068*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenFSThenNewRPThenVS)
13069*8975f5c5SAndroid Build Coastguard Worker {
13070*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13071*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, true},
13072*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13073*8975f5c5SAndroid Build Coastguard Worker     });
13074*8975f5c5SAndroid Build Coastguard Worker }
13075*8975f5c5SAndroid Build Coastguard Worker 
13076*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13077*8975f5c5SAndroid Build Coastguard Worker //
13078*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13079*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13080*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
TEST_P(Texture2DTest,UploadThenVSThenFSThenVS)13081*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenVSThenFSThenVS)
13082*8975f5c5SAndroid Build Coastguard Worker {
13083*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13084*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13085*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13086*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13087*8975f5c5SAndroid Build Coastguard Worker     });
13088*8975f5c5SAndroid Build Coastguard Worker }
13089*8975f5c5SAndroid Build Coastguard Worker 
13090*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13091*8975f5c5SAndroid Build Coastguard Worker //
13092*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13093*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13094*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13095*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
TEST_P(Texture2DTest,UploadThenVSThenNewRPThenFSThenVS)13096*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenVSThenNewRPThenFSThenVS)
13097*8975f5c5SAndroid Build Coastguard Worker {
13098*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13099*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, true},
13100*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13101*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13102*8975f5c5SAndroid Build Coastguard Worker     });
13103*8975f5c5SAndroid Build Coastguard Worker }
13104*8975f5c5SAndroid Build Coastguard Worker 
13105*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13106*8975f5c5SAndroid Build Coastguard Worker //
13107*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13108*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13109*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13110*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13111*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
TEST_P(Texture2DTest,UploadThenVSThenNewRPThenFSThenNewRPThenVS)13112*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenVSThenNewRPThenFSThenNewRPThenVS)
13113*8975f5c5SAndroid Build Coastguard Worker {
13114*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13115*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, true},
13116*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, true},
13117*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13118*8975f5c5SAndroid Build Coastguard Worker     });
13119*8975f5c5SAndroid Build Coastguard Worker }
13120*8975f5c5SAndroid Build Coastguard Worker 
13121*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13122*8975f5c5SAndroid Build Coastguard Worker //
13123*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13124*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13125*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13126*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
TEST_P(Texture2DTest,UploadThenFSThenVSThenNewRPThenFS)13127*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenFSThenVSThenNewRPThenFS)
13128*8975f5c5SAndroid Build Coastguard Worker {
13129*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13130*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13131*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, true},
13132*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13133*8975f5c5SAndroid Build Coastguard Worker     });
13134*8975f5c5SAndroid Build Coastguard Worker }
13135*8975f5c5SAndroid Build Coastguard Worker 
13136*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13137*8975f5c5SAndroid Build Coastguard Worker //
13138*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13139*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13140*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
13141*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
TEST_P(Texture2DTest,UploadThenFSThenNewRPThenVSThenFS)13142*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenFSThenNewRPThenVSThenFS)
13143*8975f5c5SAndroid Build Coastguard Worker {
13144*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13145*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, true},
13146*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13147*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13148*8975f5c5SAndroid Build Coastguard Worker     });
13149*8975f5c5SAndroid Build Coastguard Worker }
13150*8975f5c5SAndroid Build Coastguard Worker 
13151*8975f5c5SAndroid Build Coastguard Worker // Test synchronization when a texture is used in different shader stages after data upload.
13152*8975f5c5SAndroid Build Coastguard Worker //
13153*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13154*8975f5c5SAndroid Build Coastguard Worker // - Break render pass
13155*8975f5c5SAndroid Build Coastguard Worker // - Use in FS
13156*8975f5c5SAndroid Build Coastguard Worker // - Use in VS
TEST_P(Texture2DTest,UploadThenFSThenNewRPThenFSThenVS)13157*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, UploadThenFSThenNewRPThenFSThenVS)
13158*8975f5c5SAndroid Build Coastguard Worker {
13159*8975f5c5SAndroid Build Coastguard Worker     testUploadThenUseInDifferentStages({
13160*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, true},
13161*8975f5c5SAndroid Build Coastguard Worker         {GL_FRAGMENT_SHADER, false},
13162*8975f5c5SAndroid Build Coastguard Worker         {GL_VERTEX_SHADER, false},
13163*8975f5c5SAndroid Build Coastguard Worker     });
13164*8975f5c5SAndroid Build Coastguard Worker }
13165*8975f5c5SAndroid Build Coastguard Worker 
13166*8975f5c5SAndroid Build Coastguard Worker // Test that interleaved updates and draw calls many times work
TEST_P(Texture2DTest,DrawThenUpdateMultipleTimes)13167*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTest, DrawThenUpdateMultipleTimes)
13168*8975f5c5SAndroid Build Coastguard Worker {
13169*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexWidth  = 16;
13170*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kTexHeight = 16;
13171*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kBpp       = 4;
13172*8975f5c5SAndroid Build Coastguard Worker 
13173*8975f5c5SAndroid Build Coastguard Worker     // Create the texture
13174*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13175*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13176*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13177*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13178*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
13179*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
13180*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
13181*8975f5c5SAndroid Build Coastguard Worker 
13182*8975f5c5SAndroid Build Coastguard Worker     constexpr GLubyte kInitialColor = 16;
13183*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedFinalColorValue = kInitialColor;
13184*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
13185*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
13186*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
13187*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
13188*8975f5c5SAndroid Build Coastguard Worker 
13189*8975f5c5SAndroid Build Coastguard Worker     // First draw the screen with initial color
13190*8975f5c5SAndroid Build Coastguard Worker     {
13191*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(colorProgram, angle::essl1_shaders::vs::Simple(),
13192*8975f5c5SAndroid Build Coastguard Worker                          angle::essl1_shaders::fs::UniformColor());
13193*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(colorProgram);
13194*8975f5c5SAndroid Build Coastguard Worker         GLint colorUniformLocation =
13195*8975f5c5SAndroid Build Coastguard Worker             glGetUniformLocation(colorProgram, angle::essl1_shaders::ColorUniform());
13196*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(colorUniformLocation, -1);
13197*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorUniformLocation, kInitialColor / 256.f, kInitialColor / 256.f,
13198*8975f5c5SAndroid Build Coastguard Worker                     kInitialColor / 256.f, kInitialColor / 256.f);
13199*8975f5c5SAndroid Build Coastguard Worker         drawQuad(colorProgram, angle::essl1_shaders::PositionAttrib(), 0.5f);
13200*8975f5c5SAndroid Build Coastguard Worker     }
13201*8975f5c5SAndroid Build Coastguard Worker 
13202*8975f5c5SAndroid Build Coastguard Worker     // Then update the texture then draw it multiple times
13203*8975f5c5SAndroid Build Coastguard Worker     constexpr GLubyte kColorsToUpdate[] = {16, 64, 64};
13204*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
13205*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13206*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
13207*8975f5c5SAndroid Build Coastguard Worker 
13208*8975f5c5SAndroid Build Coastguard Worker     for (auto color : kColorsToUpdate)
13209*8975f5c5SAndroid Build Coastguard Worker     {
13210*8975f5c5SAndroid Build Coastguard Worker         expectedFinalColorValue += color;
13211*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLubyte> fullTextureData(kTexWidth * kTexHeight * kBpp, color);
13212*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, GL_UNSIGNED_BYTE,
13213*8975f5c5SAndroid Build Coastguard Worker                         fullTextureData.data());
13214*8975f5c5SAndroid Build Coastguard Worker 
13215*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mProgram, "position", 0.5f);
13216*8975f5c5SAndroid Build Coastguard Worker     }
13217*8975f5c5SAndroid Build Coastguard Worker 
13218*8975f5c5SAndroid Build Coastguard Worker     // The final color should be sum of all updated colors.
13219*8975f5c5SAndroid Build Coastguard Worker     const GLColor expectedFinalColor(expectedFinalColorValue, expectedFinalColorValue,
13220*8975f5c5SAndroid Build Coastguard Worker                                      expectedFinalColorValue, expectedFinalColorValue);
13221*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13222*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1 * getWindowWidth() / 4, getWindowHeight() / 2, expectedFinalColor);
13223*8975f5c5SAndroid Build Coastguard Worker }
13224*8975f5c5SAndroid Build Coastguard Worker 
13225*8975f5c5SAndroid Build Coastguard Worker // Test that clears due to emulated formats are to the correct level given non-zero base level.
TEST_P(Texture2DTestES3,NonZeroBaseEmulatedClear)13226*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, NonZeroBaseEmulatedClear)
13227*8975f5c5SAndroid Build Coastguard Worker {
13228*8975f5c5SAndroid Build Coastguard Worker     // Tests behavior of the Vulkan backend with emulated formats.
13229*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
13230*8975f5c5SAndroid Build Coastguard Worker 
13231*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42266496): Skip when using VMA image suballocation on Linux/Intel.
13232*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() &&
13233*8975f5c5SAndroid Build Coastguard Worker                        getEGLWindow()->isFeatureEnabled(Feature::UseVmaForImageSuballocation));
13234*8975f5c5SAndroid Build Coastguard Worker 
13235*8975f5c5SAndroid Build Coastguard Worker     // This test assumes GL_RGB is always emulated, which overrides the
13236*8975f5c5SAndroid Build Coastguard Worker     // Feature::AllocateNonZeroMemory memory feature, clearing the memory to zero. However, if the
13237*8975f5c5SAndroid Build Coastguard Worker     // format is *not* emulated and the feature Feature::AllocateNonZeroMemory is enabled, the
13238*8975f5c5SAndroid Build Coastguard Worker     // texture memory will contain non-zero memory, which means the color is not black (causing the
13239*8975f5c5SAndroid Build Coastguard Worker     // test to fail).
13240*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getEGLWindow()->isFeatureEnabled(Feature::AllocateNonZeroMemory));
13241*8975f5c5SAndroid Build Coastguard Worker 
13242*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
13243*8975f5c5SAndroid Build Coastguard Worker 
13244*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13245*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13246*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
13247*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
13248*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, 4, 4, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
13249*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 3, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
13250*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 4, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
13251*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 4);
13252*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13253*8975f5c5SAndroid Build Coastguard Worker 
13254*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13255*8975f5c5SAndroid Build Coastguard Worker 
13256*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
13257*8975f5c5SAndroid Build Coastguard Worker }
13258*8975f5c5SAndroid Build Coastguard Worker 
13259*8975f5c5SAndroid Build Coastguard Worker // Test that uploading data to buffer that's in use then using it as PBO to update a texture works.
TEST_P(Texture2DTestES3,UseAsUBOThenUpdateThenAsPBO)13260*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UseAsUBOThenUpdateThenAsPBO)
13261*8975f5c5SAndroid Build Coastguard Worker {
13262*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kInitialData = {GLColor::red, GLColor::red, GLColor::red,
13263*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::red};
13264*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kUpdateData  = {GLColor::blue, GLColor::blue, GLColor::blue,
13265*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::blue};
13266*8975f5c5SAndroid Build Coastguard Worker 
13267*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
13268*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, buffer);
13269*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, sizeof(kInitialData), kInitialData.data(), GL_DYNAMIC_COPY);
13270*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
13271*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13272*8975f5c5SAndroid Build Coastguard Worker 
13273*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVerifyUBO[] = R"(#version 300 es
13274*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
13275*8975f5c5SAndroid Build Coastguard Worker uniform block {
13276*8975f5c5SAndroid Build Coastguard Worker     uvec4 data;
13277*8975f5c5SAndroid Build Coastguard Worker } ubo;
13278*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
13279*8975f5c5SAndroid Build Coastguard Worker void main()
13280*8975f5c5SAndroid Build Coastguard Worker {
13281*8975f5c5SAndroid Build Coastguard Worker     if (all(equal(ubo.data, uvec4(0xFF0000FFu))))
13282*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(0, 1.0, 0, 1.0);
13283*8975f5c5SAndroid Build Coastguard Worker     else
13284*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(1.0, 0, 0, 1.0);
13285*8975f5c5SAndroid Build Coastguard Worker })";
13286*8975f5c5SAndroid Build Coastguard Worker 
13287*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(verifyUbo, essl3_shaders::vs::Simple(), kVerifyUBO);
13288*8975f5c5SAndroid Build Coastguard Worker     drawQuad(verifyUbo, essl3_shaders::PositionAttrib(), 0.5);
13289*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13290*8975f5c5SAndroid Build Coastguard Worker 
13291*8975f5c5SAndroid Build Coastguard Worker     // Update buffer data
13292*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(kInitialData), kUpdateData.data());
13293*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13294*8975f5c5SAndroid Build Coastguard Worker 
13295*8975f5c5SAndroid Build Coastguard Worker     // Bind as PBO
13296*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
13297*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13298*8975f5c5SAndroid Build Coastguard Worker 
13299*8975f5c5SAndroid Build Coastguard Worker     // Upload from PBO to texture
13300*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
13301*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
13302*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
13303*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
13304*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13305*8975f5c5SAndroid Build Coastguard Worker 
13306*8975f5c5SAndroid Build Coastguard Worker     // Make sure uniform data is correct.
13307*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
13308*8975f5c5SAndroid Build Coastguard Worker 
13309*8975f5c5SAndroid Build Coastguard Worker     // Make sure the texture data is correct.
13310*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
13311*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
13312*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
13313*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13314*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
13315*8975f5c5SAndroid Build Coastguard Worker 
13316*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
13317*8975f5c5SAndroid Build Coastguard Worker }
13318*8975f5c5SAndroid Build Coastguard Worker 
13319*8975f5c5SAndroid Build Coastguard Worker // Test if the RenderTargetCache is updated when the TextureStorage object is freed
TEST_P(Texture2DTestES3,UpdateRenderTargetCacheOnDestroyTexStorage)13320*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, UpdateRenderTargetCacheOnDestroyTexStorage)
13321*8975f5c5SAndroid Build Coastguard Worker {
13322*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
13323*8975f5c5SAndroid Build Coastguard Worker     const GLenum attachments[] = {GL_COLOR_ATTACHMENT0};
13324*8975f5c5SAndroid Build Coastguard Worker 
13325*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
13326*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
13327*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
13328*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 100, 1);
13329*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
13330*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
13331*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments);
13332*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
13333*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl3_shaders::PositionAttrib(), 1.0f);
13334*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13335*8975f5c5SAndroid Build Coastguard Worker 
13336*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 100, 1, GLColor::red);
13337*8975f5c5SAndroid Build Coastguard Worker }
13338*8975f5c5SAndroid Build Coastguard Worker 
13339*8975f5c5SAndroid Build Coastguard Worker // Test that we can allocate at least 4096 images, which is the maximum allocation count on some
13340*8975f5c5SAndroid Build Coastguard Worker // platforms. Image suballocation should enable us to allocate more than this limit.
TEST_P(Texture2DTestES3,AllocateMoreThan4096Textures)13341*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, AllocateMoreThan4096Textures)
13342*8975f5c5SAndroid Build Coastguard Worker {
13343*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!getEGLWindow()->isFeatureEnabled(Feature::UseVmaForImageSuballocation));
13344*8975f5c5SAndroid Build Coastguard Worker 
13345*8975f5c5SAndroid Build Coastguard Worker     // The test is skipped when AllocateNonZeroMemory is enabled due to risk of timeout.
13346*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getEGLWindow()->isFeatureEnabled(Feature::AllocateNonZeroMemory));
13347*8975f5c5SAndroid Build Coastguard Worker 
13348*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kTextureCount = 8000;
13349*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLTexture> textures(kTextureCount);
13350*8975f5c5SAndroid Build Coastguard Worker     for (auto &texture : textures)
13351*8975f5c5SAndroid Build Coastguard Worker     {
13352*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
13353*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
13354*8975f5c5SAndroid Build Coastguard Worker     }
13355*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13356*8975f5c5SAndroid Build Coastguard Worker }
13357*8975f5c5SAndroid Build Coastguard Worker 
13358*8975f5c5SAndroid Build Coastguard Worker // Draw a quad with an integer texture with a non-zero base level, and test that the color of the
13359*8975f5c5SAndroid Build Coastguard Worker // texture is output.
TEST_P(Texture2DIntegerTestES3,IntegerTextureNonZeroBaseLevel)13360*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DIntegerTestES3, IntegerTextureNonZeroBaseLevel)
13361*8975f5c5SAndroid Build Coastguard Worker {
13362*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644690
13363*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsDesktopOpenGL());
13364*8975f5c5SAndroid Build Coastguard Worker 
13365*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13366*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13367*8975f5c5SAndroid Build Coastguard Worker     int width     = getWindowWidth();
13368*8975f5c5SAndroid Build Coastguard Worker     int height    = getWindowHeight();
13369*8975f5c5SAndroid Build Coastguard Worker     GLColor color = GLColor::green;
13370*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(width * height, color);
13371*8975f5c5SAndroid Build Coastguard Worker     GLint baseLevel = 1;
13372*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, baseLevel);
13373*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13374*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13375*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, baseLevel, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER,
13376*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixels.data());
13377*8975f5c5SAndroid Build Coastguard Worker 
13378*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
13379*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13380*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
13381*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13382*8975f5c5SAndroid Build Coastguard Worker 
13383*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13384*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, color);
13385*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
13386*8975f5c5SAndroid Build Coastguard Worker }
13387*8975f5c5SAndroid Build Coastguard Worker 
13388*8975f5c5SAndroid Build Coastguard Worker // Draw a quad with an integer cube texture with a non-zero base level, and test that the color of
13389*8975f5c5SAndroid Build Coastguard Worker // the texture is output.
TEST_P(TextureCubeIntegerTestES3,IntegerCubeTextureNonZeroBaseLevel)13390*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeIntegerTestES3, IntegerCubeTextureNonZeroBaseLevel)
13391*8975f5c5SAndroid Build Coastguard Worker {
13392*8975f5c5SAndroid Build Coastguard Worker     // All output checks returned black, rather than the texture color.
13393*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsOpenGL());
13394*8975f5c5SAndroid Build Coastguard Worker 
13395*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13396*8975f5c5SAndroid Build Coastguard Worker 
13397*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
13398*8975f5c5SAndroid Build Coastguard Worker     GLint baseLevel = 1;
13399*8975f5c5SAndroid Build Coastguard Worker     int width       = getWindowWidth();
13400*8975f5c5SAndroid Build Coastguard Worker     int height      = getWindowHeight();
13401*8975f5c5SAndroid Build Coastguard Worker     GLColor color   = GLColor::green;
13402*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(width * height, color);
13403*8975f5c5SAndroid Build Coastguard Worker     for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
13404*8975f5c5SAndroid Build Coastguard Worker     {
13405*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, baseLevel, GL_RGBA8UI, width,
13406*8975f5c5SAndroid Build Coastguard Worker                      height, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
13407*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
13408*8975f5c5SAndroid Build Coastguard Worker     }
13409*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, baseLevel);
13410*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13411*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13412*8975f5c5SAndroid Build Coastguard Worker 
13413*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13414*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 0);
13415*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13416*8975f5c5SAndroid Build Coastguard Worker 
13417*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13418*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, color);
13419*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(width - 1, 0, color);
13420*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, height - 1, color);
13421*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
13422*8975f5c5SAndroid Build Coastguard Worker }
13423*8975f5c5SAndroid Build Coastguard Worker 
13424*8975f5c5SAndroid Build Coastguard Worker // This test sets up a cube map with four distincly colored MIP levels.
13425*8975f5c5SAndroid Build Coastguard Worker // The size of the texture and the geometry is chosen such that levels 1 or 2 should be chosen at
13426*8975f5c5SAndroid Build Coastguard Worker // the corners of the screen.
TEST_P(TextureCubeIntegerEdgeTestES3,IntegerCubeTextureCorner)13427*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureCubeIntegerEdgeTestES3, IntegerCubeTextureCorner)
13428*8975f5c5SAndroid Build Coastguard Worker {
13429*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13430*8975f5c5SAndroid Build Coastguard Worker 
13431*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
13432*8975f5c5SAndroid Build Coastguard Worker     int width  = getWindowWidth();
13433*8975f5c5SAndroid Build Coastguard Worker     int height = getWindowHeight();
13434*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(width, height);
13435*8975f5c5SAndroid Build Coastguard Worker     GLColor color[4] = {GLColor::white, GLColor::green, GLColor::blue, GLColor::red};
13436*8975f5c5SAndroid Build Coastguard Worker     for (GLint level = 0; level < 4; level++)
13437*8975f5c5SAndroid Build Coastguard Worker     {
13438*8975f5c5SAndroid Build Coastguard Worker         for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++)
13439*8975f5c5SAndroid Build Coastguard Worker         {
13440*8975f5c5SAndroid Build Coastguard Worker             int levelWidth  = (2 * width) >> level;
13441*8975f5c5SAndroid Build Coastguard Worker             int levelHeight = (2 * height) >> level;
13442*8975f5c5SAndroid Build Coastguard Worker             std::vector<GLColor> pixels(levelWidth * levelHeight, color[level]);
13443*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, GL_RGBA8UI, levelWidth,
13444*8975f5c5SAndroid Build Coastguard Worker                          levelHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
13445*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
13446*8975f5c5SAndroid Build Coastguard Worker         }
13447*8975f5c5SAndroid Build Coastguard Worker     }
13448*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
13449*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13450*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 3);
13451*8975f5c5SAndroid Build Coastguard Worker 
13452*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13453*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureCubeUniformLocation, 0);
13454*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13455*8975f5c5SAndroid Build Coastguard Worker 
13456*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13457*8975f5c5SAndroid Build Coastguard Worker     // Check that we do not read from levels 0 or 3. Levels 1 and 2 are both acceptable.
13458*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ReadColor(0, 0).R, 0);
13459*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ReadColor(width - 1, 0).R, 0);
13460*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ReadColor(0, height - 1).R, 0);
13461*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ReadColor(width - 1, height - 1).R, 0);
13462*8975f5c5SAndroid Build Coastguard Worker }
13463*8975f5c5SAndroid Build Coastguard Worker 
13464*8975f5c5SAndroid Build Coastguard Worker // Draw a quad with an integer texture with a non-zero base level, and test that the color of the
13465*8975f5c5SAndroid Build Coastguard Worker // texture is output.
TEST_P(Texture2DIntegerProjectiveOffsetTestES3,NonZeroBaseLevel)13466*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DIntegerProjectiveOffsetTestES3, NonZeroBaseLevel)
13467*8975f5c5SAndroid Build Coastguard Worker {
13468*8975f5c5SAndroid Build Coastguard Worker     // Fails on AMD: http://crbug.com/967796
13469*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsOpenGL());
13470*8975f5c5SAndroid Build Coastguard Worker 
13471*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13472*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13473*8975f5c5SAndroid Build Coastguard Worker     int width     = getWindowWidth();
13474*8975f5c5SAndroid Build Coastguard Worker     int height    = getWindowHeight();
13475*8975f5c5SAndroid Build Coastguard Worker     GLColor color = GLColor::green;
13476*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(width * height, color);
13477*8975f5c5SAndroid Build Coastguard Worker     GLint baseLevel = 1;
13478*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, baseLevel);
13479*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13480*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13481*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, baseLevel, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER,
13482*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixels.data());
13483*8975f5c5SAndroid Build Coastguard Worker 
13484*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
13485*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13486*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
13487*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13488*8975f5c5SAndroid Build Coastguard Worker 
13489*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13490*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, color);
13491*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
13492*8975f5c5SAndroid Build Coastguard Worker }
13493*8975f5c5SAndroid Build Coastguard Worker 
13494*8975f5c5SAndroid Build Coastguard Worker // Draw a quad with an integer texture with a non-zero base level, and test that the color of the
13495*8975f5c5SAndroid Build Coastguard Worker // texture is output.
TEST_P(Texture2DArrayIntegerTestES3,NonZeroBaseLevel)13496*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DArrayIntegerTestES3, NonZeroBaseLevel)
13497*8975f5c5SAndroid Build Coastguard Worker {
13498*8975f5c5SAndroid Build Coastguard Worker     // Test fail: http://anglebug.com/42264492
13499*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
13500*8975f5c5SAndroid Build Coastguard Worker 
13501*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13502*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture);
13503*8975f5c5SAndroid Build Coastguard Worker     int width     = getWindowWidth();
13504*8975f5c5SAndroid Build Coastguard Worker     int height    = getWindowHeight();
13505*8975f5c5SAndroid Build Coastguard Worker     int depth     = 2;
13506*8975f5c5SAndroid Build Coastguard Worker     GLColor color = GLColor::green;
13507*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(width * height * depth, color);
13508*8975f5c5SAndroid Build Coastguard Worker     GLint baseLevel = 1;
13509*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, baseLevel, GL_RGBA8UI, width, height, depth, 0,
13510*8975f5c5SAndroid Build Coastguard Worker                  GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels.data());
13511*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, baseLevel);
13512*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13513*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13514*8975f5c5SAndroid Build Coastguard Worker 
13515*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13516*8975f5c5SAndroid Build Coastguard Worker 
13517*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13518*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, color);
13519*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
13520*8975f5c5SAndroid Build Coastguard Worker }
13521*8975f5c5SAndroid Build Coastguard Worker 
13522*8975f5c5SAndroid Build Coastguard Worker // Draw a quad with an integer 3D texture with a non-zero base level, and test that the color of the
13523*8975f5c5SAndroid Build Coastguard Worker // texture is output.
TEST_P(Texture3DIntegerTestES3,NonZeroBaseLevel)13524*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture3DIntegerTestES3, NonZeroBaseLevel)
13525*8975f5c5SAndroid Build Coastguard Worker {
13526*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13527*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, mTexture3D);
13528*8975f5c5SAndroid Build Coastguard Worker     int width     = getWindowWidth();
13529*8975f5c5SAndroid Build Coastguard Worker     int height    = getWindowHeight();
13530*8975f5c5SAndroid Build Coastguard Worker     int depth     = 2;
13531*8975f5c5SAndroid Build Coastguard Worker     GLColor color = GLColor::green;
13532*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(width * height * depth, color);
13533*8975f5c5SAndroid Build Coastguard Worker     GLint baseLevel = 1;
13534*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, baseLevel, GL_RGBA8UI, width, height, depth, 0, GL_RGBA_INTEGER,
13535*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixels.data());
13536*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, baseLevel);
13537*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13538*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13539*8975f5c5SAndroid Build Coastguard Worker 
13540*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13541*8975f5c5SAndroid Build Coastguard Worker 
13542*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13543*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, color);
13544*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
13545*8975f5c5SAndroid Build Coastguard Worker }
13546*8975f5c5SAndroid Build Coastguard Worker 
runCompressedSubImage()13547*8975f5c5SAndroid Build Coastguard Worker void PBOCompressedTextureTest::runCompressedSubImage()
13548*8975f5c5SAndroid Build Coastguard Worker {
13549*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
13550*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
13551*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42262750
13552*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsDesktopOpenGL());
13553*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsDesktopOpenGL());
13554*8975f5c5SAndroid Build Coastguard Worker 
13555*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
13556*8975f5c5SAndroid Build Coastguard Worker     {
13557*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
13558*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
13559*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC2_RGB8_texture"));
13560*8975f5c5SAndroid Build Coastguard Worker     }
13561*8975f5c5SAndroid Build Coastguard Worker 
13562*8975f5c5SAndroid Build Coastguard Worker     const GLuint width  = 4u;
13563*8975f5c5SAndroid Build Coastguard Worker     const GLuint height = 4u;
13564*8975f5c5SAndroid Build Coastguard Worker 
13565*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
13566*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
13567*8975f5c5SAndroid Build Coastguard Worker 
13568*8975f5c5SAndroid Build Coastguard Worker     // Setup primary Texture
13569*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13570*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
13571*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
13572*8975f5c5SAndroid Build Coastguard Worker 
13573*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
13574*8975f5c5SAndroid Build Coastguard Worker     {
13575*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, width, height);
13576*8975f5c5SAndroid Build Coastguard Worker     }
13577*8975f5c5SAndroid Build Coastguard Worker     else
13578*8975f5c5SAndroid Build Coastguard Worker     {
13579*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, width, height);
13580*8975f5c5SAndroid Build Coastguard Worker     }
13581*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13582*8975f5c5SAndroid Build Coastguard Worker 
13583*8975f5c5SAndroid Build Coastguard Worker     // Setup PBO and fill it with a red
13584*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mPBO);
13585*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height / 2u, kCompressedImageETC2, GL_STATIC_DRAW);
13586*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13587*8975f5c5SAndroid Build Coastguard Worker 
13588*8975f5c5SAndroid Build Coastguard Worker     // Write PBO to mTexture
13589*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_COMPRESSED_RGB8_ETC2,
13590*8975f5c5SAndroid Build Coastguard Worker                               width * height / 2u, nullptr);
13591*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13592*8975f5c5SAndroid Build Coastguard Worker 
13593*8975f5c5SAndroid Build Coastguard Worker     setUpProgram();
13594*8975f5c5SAndroid Build Coastguard Worker     // Draw using PBO updated texture
13595*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13596*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTexture2DUniformLocation, 0);
13597*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13598*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13599*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13600*8975f5c5SAndroid Build Coastguard Worker 
13601*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
13602*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13603*8975f5c5SAndroid Build Coastguard Worker }
13604*8975f5c5SAndroid Build Coastguard Worker 
13605*8975f5c5SAndroid Build Coastguard Worker // Test that uses glCompressedTexSubImage2D combined with a PBO
TEST_P(PBOCompressedTextureTest,PBOCompressedSubImage)13606*8975f5c5SAndroid Build Coastguard Worker TEST_P(PBOCompressedTextureTest, PBOCompressedSubImage)
13607*8975f5c5SAndroid Build Coastguard Worker {
13608*8975f5c5SAndroid Build Coastguard Worker     runCompressedSubImage();
13609*8975f5c5SAndroid Build Coastguard Worker }
13610*8975f5c5SAndroid Build Coastguard Worker 
13611*8975f5c5SAndroid Build Coastguard Worker // Verify the row length state is ignored when using compressed tex image calls.
TEST_P(PBOCompressedTextureTest,PBOCompressedSubImageWithUnpackRowLength)13612*8975f5c5SAndroid Build Coastguard Worker TEST_P(PBOCompressedTextureTest, PBOCompressedSubImageWithUnpackRowLength)
13613*8975f5c5SAndroid Build Coastguard Worker {
13614*8975f5c5SAndroid Build Coastguard Worker     // ROW_LENGTH requires ES3 or an extension.
13615*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
13616*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_unpack_subimage"));
13617*8975f5c5SAndroid Build Coastguard Worker 
13618*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ROW_LENGTH, 1);
13619*8975f5c5SAndroid Build Coastguard Worker     runCompressedSubImage();
13620*8975f5c5SAndroid Build Coastguard Worker }
13621*8975f5c5SAndroid Build Coastguard Worker 
13622*8975f5c5SAndroid Build Coastguard Worker class PBOCompressedTexture3DTest : public ANGLETest<>
13623*8975f5c5SAndroid Build Coastguard Worker {
13624*8975f5c5SAndroid Build Coastguard Worker   protected:
PBOCompressedTexture3DTest()13625*8975f5c5SAndroid Build Coastguard Worker     PBOCompressedTexture3DTest() {}
13626*8975f5c5SAndroid Build Coastguard Worker };
13627*8975f5c5SAndroid Build Coastguard Worker 
13628*8975f5c5SAndroid Build Coastguard Worker // Test that uses glCompressedTexSubImage3D combined with a PBO
13629*8975f5c5SAndroid Build Coastguard Worker TEST_P(PBOCompressedTexture3DTest, 2DArray)
13630*8975f5c5SAndroid Build Coastguard Worker {
13631*8975f5c5SAndroid Build Coastguard Worker     // We use GetTexImage to determine if the internal texture format is emulated
13632*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_get_image"));
13633*8975f5c5SAndroid Build Coastguard Worker 
13634*8975f5c5SAndroid Build Coastguard Worker     const GLuint width  = 4u;
13635*8975f5c5SAndroid Build Coastguard Worker     const GLuint height = 4u;
13636*8975f5c5SAndroid Build Coastguard Worker     const GLuint depth  = 1u;
13637*8975f5c5SAndroid Build Coastguard Worker 
13638*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
13639*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
13640*8975f5c5SAndroid Build Coastguard Worker 
13641*8975f5c5SAndroid Build Coastguard Worker     // Setup primary texture as a 2DArray holding ETC2 data
13642*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2DArray;
13643*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture2DArray);
13644*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
13645*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
13646*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_COMPRESSED_RGB8_ETC2, width, height, depth);
13647*8975f5c5SAndroid Build Coastguard Worker 
13648*8975f5c5SAndroid Build Coastguard Worker     // If the format emulated, we can't transfer it from a PBO
13649*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsFormatEmulated(GL_TEXTURE_2D_ARRAY));
13650*8975f5c5SAndroid Build Coastguard Worker 
13651*8975f5c5SAndroid Build Coastguard Worker     // Set up a VS that simply passes through position and texcord
13652*8975f5c5SAndroid Build Coastguard Worker     const char kVS[] = R"(#version 300 es
13653*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
13654*8975f5c5SAndroid Build Coastguard Worker out vec3 texCoord;
13655*8975f5c5SAndroid Build Coastguard Worker 
13656*8975f5c5SAndroid Build Coastguard Worker void main()
13657*8975f5c5SAndroid Build Coastguard Worker {
13658*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
13659*8975f5c5SAndroid Build Coastguard Worker     texCoord = vec3(position.xy * 0.5 + vec2(0.5), 0.0);
13660*8975f5c5SAndroid Build Coastguard Worker })";
13661*8975f5c5SAndroid Build Coastguard Worker 
13662*8975f5c5SAndroid Build Coastguard Worker     // and FS that pulls from the 2DArray, writing out color
13663*8975f5c5SAndroid Build Coastguard Worker     const char kFS[] = R"(#version 300 es
13664*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
13665*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DArray tex2DArray;
13666*8975f5c5SAndroid Build Coastguard Worker in vec3 texCoord;
13667*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
13668*8975f5c5SAndroid Build Coastguard Worker 
13669*8975f5c5SAndroid Build Coastguard Worker void main()
13670*8975f5c5SAndroid Build Coastguard Worker {
13671*8975f5c5SAndroid Build Coastguard Worker     fragColor = texture(tex2DArray, texCoord);
13672*8975f5c5SAndroid Build Coastguard Worker })";
13673*8975f5c5SAndroid Build Coastguard Worker 
13674*8975f5c5SAndroid Build Coastguard Worker     // Compile the shaders and create the program
13675*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
13676*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13677*8975f5c5SAndroid Build Coastguard Worker 
13678*8975f5c5SAndroid Build Coastguard Worker     // Setup PBO and fill it with a red
13679*8975f5c5SAndroid Build Coastguard Worker     GLBuffer pbo;
13680*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
13681*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * depth / 2u, kCompressedImageETC2,
13682*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
13683*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13684*8975f5c5SAndroid Build Coastguard Worker 
13685*8975f5c5SAndroid Build Coastguard Worker     // Write PBO to texture2DArray
13686*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, depth,
13687*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, width * height * depth / 2u, nullptr);
13688*8975f5c5SAndroid Build Coastguard Worker 
13689*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13690*8975f5c5SAndroid Build Coastguard Worker 
13691*8975f5c5SAndroid Build Coastguard Worker     // Draw using PBO updated texture
13692*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
13693*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(glGetUniformLocation(program, "tex2DArray"), 0);
13694*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture2DArray);
13695*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
13696*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13697*8975f5c5SAndroid Build Coastguard Worker 
13698*8975f5c5SAndroid Build Coastguard Worker     // Verify the texture now contains data from the PBO
13699*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
13700*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13701*8975f5c5SAndroid Build Coastguard Worker }
13702*8975f5c5SAndroid Build Coastguard Worker 
13703*8975f5c5SAndroid Build Coastguard Worker // Test using ETC1_RGB8 with subimage updates
TEST_P(ETC1CompressedTextureTest,ETC1CompressedSubImage)13704*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETC1CompressedTextureTest, ETC1CompressedSubImage)
13705*8975f5c5SAndroid Build Coastguard Worker {
13706*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
13707*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
13708*8975f5c5SAndroid Build Coastguard Worker 
13709*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
13710*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_storage"));
13711*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_compressed_ETC1_RGB8_sub_texture"));
13712*8975f5c5SAndroid Build Coastguard Worker 
13713*8975f5c5SAndroid Build Coastguard Worker     const GLuint width  = 4u;
13714*8975f5c5SAndroid Build Coastguard Worker     const GLuint height = 4u;
13715*8975f5c5SAndroid Build Coastguard Worker 
13716*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
13717*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
13718*8975f5c5SAndroid Build Coastguard Worker 
13719*8975f5c5SAndroid Build Coastguard Worker     // Setup primary Texture
13720*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
13721*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
13722*8975f5c5SAndroid Build Coastguard Worker 
13723*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
13724*8975f5c5SAndroid Build Coastguard Worker     {
13725*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_OES, width, height);
13726*8975f5c5SAndroid Build Coastguard Worker     }
13727*8975f5c5SAndroid Build Coastguard Worker     else
13728*8975f5c5SAndroid Build Coastguard Worker     {
13729*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_OES, width, height);
13730*8975f5c5SAndroid Build Coastguard Worker     }
13731*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13732*8975f5c5SAndroid Build Coastguard Worker 
13733*8975f5c5SAndroid Build Coastguard Worker     // Populate a subimage of the texture
13734*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_ETC1_RGB8_OES,
13735*8975f5c5SAndroid Build Coastguard Worker                               width * height / 2u, kCompressedImageETC2);
13736*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13737*8975f5c5SAndroid Build Coastguard Worker 
13738*8975f5c5SAndroid Build Coastguard Worker     // Render and ensure we get red
13739*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13740*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13741*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13742*8975f5c5SAndroid Build Coastguard Worker 
13743*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
13744*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13745*8975f5c5SAndroid Build Coastguard Worker }
13746*8975f5c5SAndroid Build Coastguard Worker 
13747*8975f5c5SAndroid Build Coastguard Worker // Fully-define a NPOT compressed texture and draw; set MAX_LEVEL and draw; then increase
13748*8975f5c5SAndroid Build Coastguard Worker // MAX_LEVEL and draw.  This used to cause Vulkan validation errors.
TEST_P(ETC1CompressedTextureTest,ETC1CompressedImageNPOT)13749*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETC1CompressedTextureTest, ETC1CompressedImageNPOT)
13750*8975f5c5SAndroid Build Coastguard Worker {
13751*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
13752*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
13753*8975f5c5SAndroid Build Coastguard Worker 
13754*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
13755*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_compressed_ETC1_RGB8_sub_texture"));
13756*8975f5c5SAndroid Build Coastguard Worker 
13757*8975f5c5SAndroid Build Coastguard Worker     const GLuint width  = 5u;
13758*8975f5c5SAndroid Build Coastguard Worker     const GLuint height = 5u;
13759*8975f5c5SAndroid Build Coastguard Worker     // round up to the nearest block size
13760*8975f5c5SAndroid Build Coastguard Worker     const GLsizei imageSize = 8 * 8 / 2;
13761*8975f5c5SAndroid Build Coastguard Worker     // smallest block size
13762*8975f5c5SAndroid Build Coastguard Worker     const GLsizei minImageSize = 4 * 4 / 2;
13763*8975f5c5SAndroid Build Coastguard Worker 
13764*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[imageSize] = {0};
13765*8975f5c5SAndroid Build Coastguard Worker 
13766*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
13767*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
13768*8975f5c5SAndroid Build Coastguard Worker 
13769*8975f5c5SAndroid Build Coastguard Worker     // Setup primary Texture
13770*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
13771*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
13772*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13773*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13774*8975f5c5SAndroid Build Coastguard Worker 
13775*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, width, height, 0, imageSize, data);
13776*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13777*8975f5c5SAndroid Build Coastguard Worker 
13778*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_OES, width / 2, height / 2, 0,
13779*8975f5c5SAndroid Build Coastguard Worker                            minImageSize, data);
13780*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13781*8975f5c5SAndroid Build Coastguard Worker 
13782*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_ETC1_RGB8_OES, width / 4, height / 4, 0,
13783*8975f5c5SAndroid Build Coastguard Worker                            minImageSize, data);
13784*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13785*8975f5c5SAndroid Build Coastguard Worker 
13786*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13787*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
13788*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
13789*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13790*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13791*8975f5c5SAndroid Build Coastguard Worker 
13792*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
13793*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13794*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13795*8975f5c5SAndroid Build Coastguard Worker }
13796*8975f5c5SAndroid Build Coastguard Worker 
13797*8975f5c5SAndroid Build Coastguard Worker // Define two NPOT compressed textures, set MAX_LEVEL, draw, and swap buffers
13798*8975f5c5SAndroid Build Coastguard Worker // with the two textures. This used to cause release of staging buffers
13799*8975f5c5SAndroid Build Coastguard Worker // that have not been flushed.
TEST_P(ETC1CompressedTextureTest,ETC1CompressedImageDraws)13800*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETC1CompressedTextureTest, ETC1CompressedImageDraws)
13801*8975f5c5SAndroid Build Coastguard Worker {
13802*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
13803*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
13804*8975f5c5SAndroid Build Coastguard Worker 
13805*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
13806*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_compressed_ETC1_RGB8_sub_texture"));
13807*8975f5c5SAndroid Build Coastguard Worker 
13808*8975f5c5SAndroid Build Coastguard Worker     const GLuint width  = 384u;
13809*8975f5c5SAndroid Build Coastguard Worker     const GLuint height = 384u;
13810*8975f5c5SAndroid Build Coastguard Worker     // round up to the nearest block size
13811*8975f5c5SAndroid Build Coastguard Worker     const GLsizei imageSize = width * height / 2;
13812*8975f5c5SAndroid Build Coastguard Worker 
13813*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[imageSize] = {0};
13814*8975f5c5SAndroid Build Coastguard Worker 
13815*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
13816*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
13817*8975f5c5SAndroid Build Coastguard Worker 
13818*8975f5c5SAndroid Build Coastguard Worker     const GLuint smallerWidth  = 384u;
13819*8975f5c5SAndroid Build Coastguard Worker     const GLuint smallerHeight = 320u;
13820*8975f5c5SAndroid Build Coastguard Worker     // round up to the nearest block size
13821*8975f5c5SAndroid Build Coastguard Worker     const GLsizei smallerImageSize = smallerWidth * smallerHeight / 2;
13822*8975f5c5SAndroid Build Coastguard Worker 
13823*8975f5c5SAndroid Build Coastguard Worker     // Setup primary Texture
13824*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
13825*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
13826*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
13827*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
13828*8975f5c5SAndroid Build Coastguard Worker 
13829*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, smallerWidth, smallerHeight, 0,
13830*8975f5c5SAndroid Build Coastguard Worker                            smallerImageSize, data);
13831*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13832*8975f5c5SAndroid Build Coastguard Worker 
13833*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_OES, 192, 160, 0, 15360, data);
13834*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13835*8975f5c5SAndroid Build Coastguard Worker 
13836*8975f5c5SAndroid Build Coastguard Worker     GLTexture largerTexture;
13837*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, largerTexture);
13838*8975f5c5SAndroid Build Coastguard Worker 
13839*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, width, height, 0, imageSize, data);
13840*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13841*8975f5c5SAndroid Build Coastguard Worker 
13842*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_OES, 192, 192, 0, 18432, data);
13843*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13844*8975f5c5SAndroid Build Coastguard Worker 
13845*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13846*8975f5c5SAndroid Build Coastguard Worker 
13847*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13848*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
13849*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
13850*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13851*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13852*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
13853*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
13854*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
13855*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13856*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13857*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
13858*8975f5c5SAndroid Build Coastguard Worker 
13859*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, largerTexture);
13860*8975f5c5SAndroid Build Coastguard Worker 
13861*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
13862*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
13863*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13864*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13865*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
13866*8975f5c5SAndroid Build Coastguard Worker 
13867*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
13868*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
13869*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13870*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13871*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
13872*8975f5c5SAndroid Build Coastguard Worker 
13873*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture2D);
13874*8975f5c5SAndroid Build Coastguard Worker 
13875*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
13876*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
13877*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13878*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
13879*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13880*8975f5c5SAndroid Build Coastguard Worker }
13881*8975f5c5SAndroid Build Coastguard Worker 
13882*8975f5c5SAndroid Build Coastguard Worker // Fully-define a compressed texture and draw; then decrease MAX_LEVEL and draw; then increase
13883*8975f5c5SAndroid Build Coastguard Worker // MAX_LEVEL and draw.  This used to cause Vulkan validation errors.
TEST_P(ETC1CompressedTextureTest,ETC1ShrinkThenGrowMaxLevels)13884*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETC1CompressedTextureTest, ETC1ShrinkThenGrowMaxLevels)
13885*8975f5c5SAndroid Build Coastguard Worker {
13886*8975f5c5SAndroid Build Coastguard Worker     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
13887*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
13888*8975f5c5SAndroid Build Coastguard Worker 
13889*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
13890*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_compressed_ETC1_RGB8_sub_texture"));
13891*8975f5c5SAndroid Build Coastguard Worker 
13892*8975f5c5SAndroid Build Coastguard Worker     const GLuint width  = 4u;
13893*8975f5c5SAndroid Build Coastguard Worker     const GLuint height = 4u;
13894*8975f5c5SAndroid Build Coastguard Worker 
13895*8975f5c5SAndroid Build Coastguard Worker     setWindowWidth(width);
13896*8975f5c5SAndroid Build Coastguard Worker     setWindowHeight(height);
13897*8975f5c5SAndroid Build Coastguard Worker 
13898*8975f5c5SAndroid Build Coastguard Worker     // Setup primary Texture
13899*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
13900*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
13901*8975f5c5SAndroid Build Coastguard Worker 
13902*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
13903*8975f5c5SAndroid Build Coastguard Worker     {
13904*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, 3, GL_ETC1_RGB8_OES, width, height);
13905*8975f5c5SAndroid Build Coastguard Worker     }
13906*8975f5c5SAndroid Build Coastguard Worker     else
13907*8975f5c5SAndroid Build Coastguard Worker     {
13908*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 3, GL_ETC1_RGB8_OES, width, height);
13909*8975f5c5SAndroid Build Coastguard Worker     }
13910*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13911*8975f5c5SAndroid Build Coastguard Worker 
13912*8975f5c5SAndroid Build Coastguard Worker     // Populate a subimage of the texture
13913*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_ETC1_RGB8_OES,
13914*8975f5c5SAndroid Build Coastguard Worker                               width * height / 2u, kCompressedImageETC2);
13915*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, width / 2, height / 2, GL_ETC1_RGB8_OES,
13916*8975f5c5SAndroid Build Coastguard Worker                               width * height / 2u, kCompressedImageETC2);
13917*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, width / 4, height / 4, GL_ETC1_RGB8_OES,
13918*8975f5c5SAndroid Build Coastguard Worker                               width * height / 2u, kCompressedImageETC2);
13919*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13920*8975f5c5SAndroid Build Coastguard Worker 
13921*8975f5c5SAndroid Build Coastguard Worker     // Set MAX_LEVEL to 2 (the highest level)
13922*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
13923*8975f5c5SAndroid Build Coastguard Worker 
13924*8975f5c5SAndroid Build Coastguard Worker     // Render and ensure we get red
13925*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
13926*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13927*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13928*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
13929*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13930*8975f5c5SAndroid Build Coastguard Worker 
13931*8975f5c5SAndroid Build Coastguard Worker     // Decrease MAX_LEVEL to 0, render, and ensure we still get red
13932*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
13933*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13934*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13935*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
13936*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13937*8975f5c5SAndroid Build Coastguard Worker 
13938*8975f5c5SAndroid Build Coastguard Worker     // Increase MAX_LEVEL back to 2, render, and ensure we still get red
13939*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2);
13940*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, "position", 0.5f);
13941*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13942*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
13943*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
13944*8975f5c5SAndroid Build Coastguard Worker }
13945*8975f5c5SAndroid Build Coastguard Worker 
13946*8975f5c5SAndroid Build Coastguard Worker class TextureBufferTestES31 : public ANGLETest<>
13947*8975f5c5SAndroid Build Coastguard Worker {
13948*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureBufferTestES31()13949*8975f5c5SAndroid Build Coastguard Worker     TextureBufferTestES31() {}
13950*8975f5c5SAndroid Build Coastguard Worker 
13951*8975f5c5SAndroid Build Coastguard Worker     void drawWithIncompleteOrZeroTexture(bool useCompleteTexture, bool useNonZeroTexture);
13952*8975f5c5SAndroid Build Coastguard Worker };
13953*8975f5c5SAndroid Build Coastguard Worker 
drawWithIncompleteOrZeroTexture(bool useCompleteTexture,bool useNonZeroTexture)13954*8975f5c5SAndroid Build Coastguard Worker void TextureBufferTestES31::drawWithIncompleteOrZeroTexture(bool useCompleteTexture,
13955*8975f5c5SAndroid Build Coastguard Worker                                                             bool useNonZeroTexture)
13956*8975f5c5SAndroid Build Coastguard Worker {
13957*8975f5c5SAndroid Build Coastguard Worker     constexpr char kSamplerBuffer[] = R"(#version 310 es
13958*8975f5c5SAndroid Build Coastguard Worker         #extension GL_OES_texture_buffer : require
13959*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
13960*8975f5c5SAndroid Build Coastguard Worker         uniform highp samplerBuffer s;
13961*8975f5c5SAndroid Build Coastguard Worker         out vec4 colorOut;
13962*8975f5c5SAndroid Build Coastguard Worker         void main()
13963*8975f5c5SAndroid Build Coastguard Worker         {
13964*8975f5c5SAndroid Build Coastguard Worker             colorOut = texelFetch(s, 0);
13965*8975f5c5SAndroid Build Coastguard Worker         })";
13966*8975f5c5SAndroid Build Coastguard Worker 
13967*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kSamplerBuffer);
13968*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
13969*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13970*8975f5c5SAndroid Build Coastguard Worker 
13971*8975f5c5SAndroid Build Coastguard Worker     // Bind as texture buffer
13972*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
13973*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
13974*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, useNonZeroTexture ? texture.get() : 0u);
13975*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13976*8975f5c5SAndroid Build Coastguard Worker 
13977*8975f5c5SAndroid Build Coastguard Worker     if (useCompleteTexture)
13978*8975f5c5SAndroid Build Coastguard Worker     {
13979*8975f5c5SAndroid Build Coastguard Worker         const std::array<GLColor, 4> kData = {GLColor::blue, GLColor::blue, GLColor::blue,
13980*8975f5c5SAndroid Build Coastguard Worker                                               GLColor::blue};
13981*8975f5c5SAndroid Build Coastguard Worker 
13982*8975f5c5SAndroid Build Coastguard Worker         // Create buffer and initialize with data
13983*8975f5c5SAndroid Build Coastguard Worker         GLBuffer buffer;
13984*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_TEXTURE_BUFFER, buffer);
13985*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_TEXTURE_BUFFER, sizeof(kData), kData.data(), GL_DYNAMIC_DRAW);
13986*8975f5c5SAndroid Build Coastguard Worker         glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
13987*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
13988*8975f5c5SAndroid Build Coastguard Worker     }
13989*8975f5c5SAndroid Build Coastguard Worker 
13990*8975f5c5SAndroid Build Coastguard Worker     // Draw texture buffer
13991*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5);
13992*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
13993*8975f5c5SAndroid Build Coastguard Worker 
13994*8975f5c5SAndroid Build Coastguard Worker     if (useCompleteTexture)
13995*8975f5c5SAndroid Build Coastguard Worker     {
13996*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
13997*8975f5c5SAndroid Build Coastguard Worker     }
13998*8975f5c5SAndroid Build Coastguard Worker }
13999*8975f5c5SAndroid Build Coastguard Worker 
14000*8975f5c5SAndroid Build Coastguard Worker // Test that mutating a buffer attached to a texture returns correct results in query.
TEST_P(TextureBufferTestES31,QueryWidthAfterBufferResize)14001*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, QueryWidthAfterBufferResize)
14002*8975f5c5SAndroid Build Coastguard Worker {
14003*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_buffer"));
14004*8975f5c5SAndroid Build Coastguard Worker 
14005*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kInitialSize                  = 128;
14006*8975f5c5SAndroid Build Coastguard Worker     constexpr std::array<GLint, 4> kModifiedSizes = {96, 192, 32, 256};
14007*8975f5c5SAndroid Build Coastguard Worker 
14008*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
14009*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
14010*8975f5c5SAndroid Build Coastguard Worker 
14011*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
14012*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_TEXTURE_BUFFER, buffer);
14013*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, kInitialSize, nullptr, GL_STATIC_DRAW);
14014*8975f5c5SAndroid Build Coastguard Worker 
14015*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
14016*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14017*8975f5c5SAndroid Build Coastguard Worker 
14018*8975f5c5SAndroid Build Coastguard Worker     GLint queryResult = 0;
14019*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameteriv(GL_TEXTURE_BUFFER, 0, GL_TEXTURE_WIDTH, &queryResult);
14020*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14021*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(queryResult, kInitialSize / 4);
14022*8975f5c5SAndroid Build Coastguard Worker 
14023*8975f5c5SAndroid Build Coastguard Worker     for (GLint modifiedSize : kModifiedSizes)
14024*8975f5c5SAndroid Build Coastguard Worker     {
14025*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_TEXTURE_BUFFER, modifiedSize, nullptr, GL_STATIC_DRAW);
14026*8975f5c5SAndroid Build Coastguard Worker         glGetTexLevelParameteriv(GL_TEXTURE_BUFFER, 0, GL_TEXTURE_WIDTH, &queryResult);
14027*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
14028*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(queryResult, modifiedSize / 4);
14029*8975f5c5SAndroid Build Coastguard Worker     }
14030*8975f5c5SAndroid Build Coastguard Worker }
14031*8975f5c5SAndroid Build Coastguard Worker 
14032*8975f5c5SAndroid Build Coastguard Worker // Test that glTexBufferEXT can be used in two draw calls.
14033*8975f5c5SAndroid Build Coastguard Worker // Covers a bug where TextureVk::setBuffer releases buffer views and doesn't init them.
TEST_P(TextureBufferTestES31,TexBufferDrawTwice)14034*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, TexBufferDrawTwice)
14035*8975f5c5SAndroid Build Coastguard Worker {
14036*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14037*8975f5c5SAndroid Build Coastguard Worker 
14038*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42264369): Claims to support GL_OES_texture_buffer, but fails
14039*8975f5c5SAndroid Build Coastguard Worker     // compilation of shader because "extension 'GL_OES_texture_buffer' is not supported".
14040*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsQualcomm() && IsOpenGLES());
14041*8975f5c5SAndroid Build Coastguard Worker 
14042*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 1> kTexData = {GLColor::red};
14043*8975f5c5SAndroid Build Coastguard Worker 
14044*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
14045*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_TEXTURE_BUFFER, buffer);
14046*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, sizeof(kTexData), kTexData.data(), GL_DYNAMIC_DRAW);
14047*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14048*8975f5c5SAndroid Build Coastguard Worker 
14049*8975f5c5SAndroid Build Coastguard Worker     constexpr char kSamplerBuffer[] = R"(#version 310 es
14050*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_buffer : require
14051*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
14052*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerBuffer s;
14053*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
14054*8975f5c5SAndroid Build Coastguard Worker void main()
14055*8975f5c5SAndroid Build Coastguard Worker {
14056*8975f5c5SAndroid Build Coastguard Worker     colorOut = texelFetch(s, 0);
14057*8975f5c5SAndroid Build Coastguard Worker })";
14058*8975f5c5SAndroid Build Coastguard Worker 
14059*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kSamplerBuffer);
14060*8975f5c5SAndroid Build Coastguard Worker 
14061*8975f5c5SAndroid Build Coastguard Worker     // Draw once
14062*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
14063*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5);
14064*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14065*8975f5c5SAndroid Build Coastguard Worker 
14066*8975f5c5SAndroid Build Coastguard Worker     // Draw twice
14067*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
14068*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5);
14069*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14070*8975f5c5SAndroid Build Coastguard Worker 
14071*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
14072*8975f5c5SAndroid Build Coastguard Worker }
14073*8975f5c5SAndroid Build Coastguard Worker 
14074*8975f5c5SAndroid Build Coastguard Worker // Test that uploading data to buffer that's in use then using it as texture buffer works.
TEST_P(TextureBufferTestES31,UseAsUBOThenUpdateThenAsTextureBuffer)14075*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, UseAsUBOThenUpdateThenAsTextureBuffer)
14076*8975f5c5SAndroid Build Coastguard Worker {
14077*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14078*8975f5c5SAndroid Build Coastguard Worker 
14079*8975f5c5SAndroid Build Coastguard Worker     // Claims to support GL_OES_texture_buffer, but fails compilation of shader because "extension
14080*8975f5c5SAndroid Build Coastguard Worker     // 'GL_OES_texture_buffer' is not supported".  http://anglebug.com/42264369
14081*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsQualcomm() && IsOpenGLES());
14082*8975f5c5SAndroid Build Coastguard Worker 
14083*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kInitialData = {GLColor::red, GLColor::red, GLColor::red,
14084*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::red};
14085*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kUpdateData  = {GLColor::blue, GLColor::blue, GLColor::blue,
14086*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::blue};
14087*8975f5c5SAndroid Build Coastguard Worker 
14088*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
14089*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, buffer);
14090*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, sizeof(kInitialData), kInitialData.data(), GL_DYNAMIC_DRAW);
14091*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
14092*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14093*8975f5c5SAndroid Build Coastguard Worker 
14094*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVerifyUBO[] = R"(#version 310 es
14095*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
14096*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0) uniform block {
14097*8975f5c5SAndroid Build Coastguard Worker     uvec4 data;
14098*8975f5c5SAndroid Build Coastguard Worker } ubo;
14099*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
14100*8975f5c5SAndroid Build Coastguard Worker void main()
14101*8975f5c5SAndroid Build Coastguard Worker {
14102*8975f5c5SAndroid Build Coastguard Worker     if (all(equal(ubo.data, uvec4(0xFF0000FFu))))
14103*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(0, 1.0, 0, 1.0);
14104*8975f5c5SAndroid Build Coastguard Worker     else
14105*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(1.0, 0, 0, 1.0);
14106*8975f5c5SAndroid Build Coastguard Worker })";
14107*8975f5c5SAndroid Build Coastguard Worker 
14108*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(verifyUbo, essl31_shaders::vs::Simple(), kVerifyUBO);
14109*8975f5c5SAndroid Build Coastguard Worker     drawQuad(verifyUbo, essl31_shaders::PositionAttrib(), 0.5);
14110*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14111*8975f5c5SAndroid Build Coastguard Worker 
14112*8975f5c5SAndroid Build Coastguard Worker     // Update buffer data
14113*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(kInitialData), kUpdateData.data());
14114*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14115*8975f5c5SAndroid Build Coastguard Worker 
14116*8975f5c5SAndroid Build Coastguard Worker     // Bind as texture buffer
14117*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
14118*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
14119*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
14120*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14121*8975f5c5SAndroid Build Coastguard Worker 
14122*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVerifySamplerBuffer[] = R"(#version 310 es
14123*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_buffer : require
14124*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
14125*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerBuffer s;
14126*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
14127*8975f5c5SAndroid Build Coastguard Worker void main()
14128*8975f5c5SAndroid Build Coastguard Worker {
14129*8975f5c5SAndroid Build Coastguard Worker     colorOut = texelFetch(s, 0);
14130*8975f5c5SAndroid Build Coastguard Worker })";
14131*8975f5c5SAndroid Build Coastguard Worker 
14132*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(verifySamplerBuffer, essl31_shaders::vs::Simple(), kVerifySamplerBuffer);
14133*8975f5c5SAndroid Build Coastguard Worker 
14134*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
14135*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
14136*8975f5c5SAndroid Build Coastguard Worker     drawQuad(verifySamplerBuffer, essl31_shaders::PositionAttrib(), 0.5);
14137*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14138*8975f5c5SAndroid Build Coastguard Worker 
14139*8975f5c5SAndroid Build Coastguard Worker     // Make sure both draw calls succeed
14140*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
14141*8975f5c5SAndroid Build Coastguard Worker }
14142*8975f5c5SAndroid Build Coastguard Worker 
14143*8975f5c5SAndroid Build Coastguard Worker // Test that mapping a texture buffer with GL_MAP_INVALIDATE_BUFFER_BIT and writing to it works
14144*8975f5c5SAndroid Build Coastguard Worker // correctly.
TEST_P(TextureBufferTestES31,MapTextureBufferInvalidateThenWrite)14145*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, MapTextureBufferInvalidateThenWrite)
14146*8975f5c5SAndroid Build Coastguard Worker {
14147*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14148*8975f5c5SAndroid Build Coastguard Worker 
14149*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42264369): Claims to support GL_OES_texture_buffer, but fails
14150*8975f5c5SAndroid Build Coastguard Worker     // compilation of shader because "extension 'GL_OES_texture_buffer' is not supported".
14151*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsQualcomm() && IsOpenGLES());
14152*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42264910): The OpenGL backend doesn't correctly handle texture
14153*8975f5c5SAndroid Build Coastguard Worker     // buffers being invalidated when mapped.
14154*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL());
14155*8975f5c5SAndroid Build Coastguard Worker 
14156*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kInitialData = {GLColor::red, GLColor::red, GLColor::red,
14157*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::red};
14158*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kUpdateData  = {GLColor::blue, GLColor::blue, GLColor::blue,
14159*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::blue};
14160*8975f5c5SAndroid Build Coastguard Worker 
14161*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
14162*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_TEXTURE_BUFFER, buffer);
14163*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, sizeof(kInitialData), kInitialData.data(), GL_DYNAMIC_DRAW);
14164*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
14165*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14166*8975f5c5SAndroid Build Coastguard Worker 
14167*8975f5c5SAndroid Build Coastguard Worker     // Bind as texture buffer
14168*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
14169*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
14170*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
14171*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14172*8975f5c5SAndroid Build Coastguard Worker 
14173*8975f5c5SAndroid Build Coastguard Worker     constexpr char kSamplerBuffer[] = R"(#version 310 es
14174*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_buffer : require
14175*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
14176*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerBuffer s;
14177*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
14178*8975f5c5SAndroid Build Coastguard Worker void main()
14179*8975f5c5SAndroid Build Coastguard Worker {
14180*8975f5c5SAndroid Build Coastguard Worker     colorOut = texelFetch(s, 0);
14181*8975f5c5SAndroid Build Coastguard Worker })";
14182*8975f5c5SAndroid Build Coastguard Worker 
14183*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(initialSamplerBuffer, essl31_shaders::vs::Simple(), kSamplerBuffer);
14184*8975f5c5SAndroid Build Coastguard Worker     drawQuad(initialSamplerBuffer, essl31_shaders::PositionAttrib(), 0.5);
14185*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14186*8975f5c5SAndroid Build Coastguard Worker 
14187*8975f5c5SAndroid Build Coastguard Worker     // Don't read back, so we don't break the render pass.
14188*8975f5c5SAndroid Build Coastguard Worker 
14189*8975f5c5SAndroid Build Coastguard Worker     // Map the buffer and update it.
14190*8975f5c5SAndroid Build Coastguard Worker     void *mappedBuffer = glMapBufferRange(GL_TEXTURE_BUFFER, 0, sizeof(kInitialData),
14191*8975f5c5SAndroid Build Coastguard Worker                                           GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
14192*8975f5c5SAndroid Build Coastguard Worker     memcpy(mappedBuffer, kUpdateData.data(), sizeof(kInitialData));
14193*8975f5c5SAndroid Build Coastguard Worker 
14194*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_TEXTURE_BUFFER);
14195*8975f5c5SAndroid Build Coastguard Worker 
14196*8975f5c5SAndroid Build Coastguard Worker     // Draw with the updated buffer data.
14197*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(updateSamplerBuffer, essl31_shaders::vs::Simple(), kSamplerBuffer);
14198*8975f5c5SAndroid Build Coastguard Worker     drawQuad(updateSamplerBuffer, essl31_shaders::PositionAttrib(), 0.5);
14199*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14200*8975f5c5SAndroid Build Coastguard Worker 
14201*8975f5c5SAndroid Build Coastguard Worker     // Make sure both draw calls succeed
14202*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
14203*8975f5c5SAndroid Build Coastguard Worker }
14204*8975f5c5SAndroid Build Coastguard Worker 
14205*8975f5c5SAndroid Build Coastguard Worker // Test that calling glBufferData on a buffer that is used as texture buffer still works correctly.
TEST_P(TextureBufferTestES31,TextureBufferThenBufferData)14206*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, TextureBufferThenBufferData)
14207*8975f5c5SAndroid Build Coastguard Worker {
14208*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14209*8975f5c5SAndroid Build Coastguard Worker 
14210*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kInitialData = {GLColor::red, GLColor::red, GLColor::red,
14211*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::red};
14212*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> kUpdateData  = {GLColor::blue, GLColor::blue, GLColor::blue,
14213*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::blue};
14214*8975f5c5SAndroid Build Coastguard Worker     // Create buffer and initialize with data
14215*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
14216*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_TEXTURE_BUFFER, buffer);
14217*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, sizeof(kInitialData), kInitialData.data(), GL_DYNAMIC_DRAW);
14218*8975f5c5SAndroid Build Coastguard Worker 
14219*8975f5c5SAndroid Build Coastguard Worker     // Bind as texture buffer
14220*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
14221*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
14222*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGBA8, buffer);
14223*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14224*8975f5c5SAndroid Build Coastguard Worker 
14225*8975f5c5SAndroid Build Coastguard Worker     constexpr char kSamplerBuffer[] = R"(#version 310 es
14226*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_buffer : require
14227*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
14228*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerBuffer s;
14229*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
14230*8975f5c5SAndroid Build Coastguard Worker void main()
14231*8975f5c5SAndroid Build Coastguard Worker {
14232*8975f5c5SAndroid Build Coastguard Worker     colorOut = texelFetch(s, 0);
14233*8975f5c5SAndroid Build Coastguard Worker })";
14234*8975f5c5SAndroid Build Coastguard Worker 
14235*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(initialSamplerBuffer, essl31_shaders::vs::Simple(), kSamplerBuffer);
14236*8975f5c5SAndroid Build Coastguard Worker     drawQuad(initialSamplerBuffer, essl31_shaders::PositionAttrib(), 0.5);
14237*8975f5c5SAndroid Build Coastguard Worker 
14238*8975f5c5SAndroid Build Coastguard Worker     // Don't read back, so we keep the original buffer busy. Issue a glBufferData call with same
14239*8975f5c5SAndroid Build Coastguard Worker     // size and nullptr so that the old buffer storage gets orphaned.
14240*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, sizeof(kUpdateData), nullptr, GL_DYNAMIC_DRAW);
14241*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_TEXTURE_BUFFER, 0, sizeof(kUpdateData), kUpdateData.data());
14242*8975f5c5SAndroid Build Coastguard Worker 
14243*8975f5c5SAndroid Build Coastguard Worker     // Draw with the updated buffer data.
14244*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(updateSamplerBuffer, essl31_shaders::vs::Simple(), kSamplerBuffer);
14245*8975f5c5SAndroid Build Coastguard Worker     drawQuad(updateSamplerBuffer, essl31_shaders::PositionAttrib(), 0.5);
14246*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14247*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
14248*8975f5c5SAndroid Build Coastguard Worker }
14249*8975f5c5SAndroid Build Coastguard Worker 
14250*8975f5c5SAndroid Build Coastguard Worker // Test workaround in Vulkan backend for mismatched texture buffer and sampler formats
TEST_P(TextureBufferTestES31,TexBufferFormatMismatch)14251*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, TexBufferFormatMismatch)
14252*8975f5c5SAndroid Build Coastguard Worker {
14253*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
14254*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_buffer"));
14255*8975f5c5SAndroid Build Coastguard Worker 
14256*8975f5c5SAndroid Build Coastguard Worker     auto runTestCase = [&](auto texData, GLenum format, const char *samplerType) {
14257*8975f5c5SAndroid Build Coastguard Worker         std::stringstream fsStream;
14258*8975f5c5SAndroid Build Coastguard Worker         fsStream << R"(#version 310 es
14259*8975f5c5SAndroid Build Coastguard Worker     #extension GL_EXT_texture_buffer : require
14260*8975f5c5SAndroid Build Coastguard Worker     precision mediump float;
14261*8975f5c5SAndroid Build Coastguard Worker     uniform highp )"
14262*8975f5c5SAndroid Build Coastguard Worker                  << samplerType << R"( s;
14263*8975f5c5SAndroid Build Coastguard Worker     out vec4 colorOut;
14264*8975f5c5SAndroid Build Coastguard Worker     void main()
14265*8975f5c5SAndroid Build Coastguard Worker     {
14266*8975f5c5SAndroid Build Coastguard Worker         colorOut = vec4(texelFetch(s, 0).r, 0, 0, 1);
14267*8975f5c5SAndroid Build Coastguard Worker     })";
14268*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), fsStream.str().c_str());
14269*8975f5c5SAndroid Build Coastguard Worker 
14270*8975f5c5SAndroid Build Coastguard Worker         GLBuffer buffer;
14271*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_TEXTURE_BUFFER, buffer);
14272*8975f5c5SAndroid Build Coastguard Worker 
14273*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_TEXTURE_BUFFER, sizeof(texData), texData.data(), GL_DYNAMIC_DRAW);
14274*8975f5c5SAndroid Build Coastguard Worker         glTexBufferEXT(GL_TEXTURE_BUFFER, format, buffer);
14275*8975f5c5SAndroid Build Coastguard Worker 
14276*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5);
14277*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
14278*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
14279*8975f5c5SAndroid Build Coastguard Worker     };
14280*8975f5c5SAndroid Build Coastguard Worker 
14281*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint8_t, 4> kTexData8n{255};  // 8-bit normalized {1,0,0,0}
14282*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint8_t, 4> kTexData8i{1};    // 8-bit (u)int {1,0,0,0}
14283*8975f5c5SAndroid Build Coastguard Worker 
14284*8975f5c5SAndroid Build Coastguard Worker     // Test all 8-bit formats from EXT_texture_buffer.txt Table texbo.1
14285*8975f5c5SAndroid Build Coastguard Worker     for (auto format :
14286*8975f5c5SAndroid Build Coastguard Worker          {GL_R8, GL_R8I, GL_R8UI, GL_RG8, GL_RG8I, GL_RG8UI, GL_RGBA8, GL_RGBA8I, GL_RGBA8UI})
14287*8975f5c5SAndroid Build Coastguard Worker     {
14288*8975f5c5SAndroid Build Coastguard Worker         // float sampler
14289*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData8n, format, "samplerBuffer");
14290*8975f5c5SAndroid Build Coastguard Worker         // integer samplers
14291*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData8i, format, "isamplerBuffer");
14292*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData8i, format, "usamplerBuffer");
14293*8975f5c5SAndroid Build Coastguard Worker     }
14294*8975f5c5SAndroid Build Coastguard Worker 
14295*8975f5c5SAndroid Build Coastguard Worker     const uint16_t kHalfFloatOne = 0x3C00;
14296*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint16_t, 4> kTexData16f{kHalfFloatOne};  // 16-bit float {1,0,0,0}
14297*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint16_t, 4> kTexData16i{1};              // 16-bit (u)int {1,0,0,0}
14298*8975f5c5SAndroid Build Coastguard Worker 
14299*8975f5c5SAndroid Build Coastguard Worker     // Test all 16-bit formats from EXT_texture_buffer.txt Table texbo.1
14300*8975f5c5SAndroid Build Coastguard Worker     for (auto format : {GL_R16F, GL_R16I, GL_R16UI, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RGBA16F,
14301*8975f5c5SAndroid Build Coastguard Worker                         GL_RGBA16I, GL_RGBA16UI})
14302*8975f5c5SAndroid Build Coastguard Worker     {
14303*8975f5c5SAndroid Build Coastguard Worker         // float sampler
14304*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData16f, format, "samplerBuffer");
14305*8975f5c5SAndroid Build Coastguard Worker         // integer samplers
14306*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData16i, format, "isamplerBuffer");
14307*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData16i, format, "usamplerBuffer");
14308*8975f5c5SAndroid Build Coastguard Worker     }
14309*8975f5c5SAndroid Build Coastguard Worker 
14310*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLfloat, 4> kTexData32f{1.0f};  // 32-bit float {1,0,0,0}
14311*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint32_t, 4> kTexData32i{1};    // 32-bit (u)int {1,0,0,0}
14312*8975f5c5SAndroid Build Coastguard Worker 
14313*8975f5c5SAndroid Build Coastguard Worker     // Test all 32-bit formats from EXT_texture_buffer.txt Table texbo.1
14314*8975f5c5SAndroid Build Coastguard Worker     for (auto format : {GL_R32F, GL_R32I, GL_R32UI, GL_RG32F, GL_RG32I, GL_RG32UI, GL_RGB32F,
14315*8975f5c5SAndroid Build Coastguard Worker                         GL_RGB32I, GL_RGB32UI, GL_RGBA32F, GL_RGBA32I, GL_RGBA32UI})
14316*8975f5c5SAndroid Build Coastguard Worker     {
14317*8975f5c5SAndroid Build Coastguard Worker         // float sampler
14318*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData32f, format, "samplerBuffer");
14319*8975f5c5SAndroid Build Coastguard Worker         // integer samplers
14320*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData32i, format, "isamplerBuffer");
14321*8975f5c5SAndroid Build Coastguard Worker         runTestCase(kTexData32i, format, "usamplerBuffer");
14322*8975f5c5SAndroid Build Coastguard Worker     }
14323*8975f5c5SAndroid Build Coastguard Worker }
14324*8975f5c5SAndroid Build Coastguard Worker 
14325*8975f5c5SAndroid Build Coastguard Worker // Create an integer format texture but specify a FLOAT sampler. OpenGL
14326*8975f5c5SAndroid Build Coastguard Worker // tolerates this but it causes a Vulkan validation error.
TEST_P(Texture2DTestES3,TexImageFormatMismatch)14327*8975f5c5SAndroid Build Coastguard Worker TEST_P(Texture2DTestES3, TexImageFormatMismatch)
14328*8975f5c5SAndroid Build Coastguard Worker {
14329*8975f5c5SAndroid Build Coastguard Worker     GLint textureUnit = 2;
14330*8975f5c5SAndroid Build Coastguard Worker     GLuint genericBuffer;
14331*8975f5c5SAndroid Build Coastguard Worker     GLubyte genericBufferMemory[1024];
14332*8975f5c5SAndroid Build Coastguard Worker     GLuint texture;
14333*8975f5c5SAndroid Build Coastguard Worker     GLuint sampler;
14334*8975f5c5SAndroid Build Coastguard Worker     GLuint vertexArray;
14335*8975f5c5SAndroid Build Coastguard Worker 
14336*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &genericBuffer);
14337*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, genericBuffer);
14338*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, 1024, &genericBufferMemory, GL_STATIC_DRAW);
14339*8975f5c5SAndroid Build Coastguard Worker 
14340*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &texture);
14341*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
14342*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
14343*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, 8, 8, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT,
14344*8975f5c5SAndroid Build Coastguard Worker                  &genericBufferMemory);
14345*8975f5c5SAndroid Build Coastguard Worker 
14346*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = getVertexShaderSource();
14347*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = getFragmentShaderSource();
14348*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(testProgram, vertexShaderSource, fragmentShaderSource);
14349*8975f5c5SAndroid Build Coastguard Worker 
14350*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(testProgram, "tex");
14351*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(testProgram);
14352*8975f5c5SAndroid Build Coastguard Worker 
14353*8975f5c5SAndroid Build Coastguard Worker     glUniform1iv(texLocation, 1, &textureUnit);
14354*8975f5c5SAndroid Build Coastguard Worker 
14355*8975f5c5SAndroid Build Coastguard Worker     glGenSamplers(1, &sampler);
14356*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
14357*8975f5c5SAndroid Build Coastguard Worker     glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
14358*8975f5c5SAndroid Build Coastguard Worker 
14359*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, genericBuffer);
14360*8975f5c5SAndroid Build Coastguard Worker 
14361*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0 + textureUnit);
14362*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
14363*8975f5c5SAndroid Build Coastguard Worker     glBindSampler(textureUnit, sampler);
14364*8975f5c5SAndroid Build Coastguard Worker 
14365*8975f5c5SAndroid Build Coastguard Worker     glGenVertexArrays(1, &vertexArray);
14366*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(vertexArray);
14367*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, genericBuffer);
14368*8975f5c5SAndroid Build Coastguard Worker 
14369*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, genericBuffer);
14370*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(vertexArray);
14371*8975f5c5SAndroid Build Coastguard Worker     glDrawElementsInstanced(GL_TRIANGLES, 4, GL_UNSIGNED_SHORT, 0, 1);
14372*8975f5c5SAndroid Build Coastguard Worker }
14373*8975f5c5SAndroid Build Coastguard Worker 
14374*8975f5c5SAndroid Build Coastguard Worker // Checks that drawing incomplete zero texture buffer does not crash.
TEST_P(TextureBufferTestES31,DrawIncompleteZeroTexture)14375*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, DrawIncompleteZeroTexture)
14376*8975f5c5SAndroid Build Coastguard Worker {
14377*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14378*8975f5c5SAndroid Build Coastguard Worker 
14379*8975f5c5SAndroid Build Coastguard Worker     drawWithIncompleteOrZeroTexture(false, false);
14380*8975f5c5SAndroid Build Coastguard Worker }
14381*8975f5c5SAndroid Build Coastguard Worker 
14382*8975f5c5SAndroid Build Coastguard Worker // Checks that drawing incomplete non-zero texture buffer does not crash.
TEST_P(TextureBufferTestES31,DrawIncompleteNonZeroTexture)14383*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, DrawIncompleteNonZeroTexture)
14384*8975f5c5SAndroid Build Coastguard Worker {
14385*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14386*8975f5c5SAndroid Build Coastguard Worker 
14387*8975f5c5SAndroid Build Coastguard Worker     drawWithIncompleteOrZeroTexture(false, true);
14388*8975f5c5SAndroid Build Coastguard Worker }
14389*8975f5c5SAndroid Build Coastguard Worker 
14390*8975f5c5SAndroid Build Coastguard Worker // Checks that drawing complete zero texture buffer produces expected results.
TEST_P(TextureBufferTestES31,DrawCompleteZeroTexture)14391*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, DrawCompleteZeroTexture)
14392*8975f5c5SAndroid Build Coastguard Worker {
14393*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14394*8975f5c5SAndroid Build Coastguard Worker 
14395*8975f5c5SAndroid Build Coastguard Worker     drawWithIncompleteOrZeroTexture(true, false);
14396*8975f5c5SAndroid Build Coastguard Worker }
14397*8975f5c5SAndroid Build Coastguard Worker 
14398*8975f5c5SAndroid Build Coastguard Worker // Checks that drawing complete non-zero texture buffer produces expected results.
TEST_P(TextureBufferTestES31,DrawCompleteNonZeroTexture)14399*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, DrawCompleteNonZeroTexture)
14400*8975f5c5SAndroid Build Coastguard Worker {
14401*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_buffer"));
14402*8975f5c5SAndroid Build Coastguard Worker 
14403*8975f5c5SAndroid Build Coastguard Worker     drawWithIncompleteOrZeroTexture(true, true);
14404*8975f5c5SAndroid Build Coastguard Worker }
14405*8975f5c5SAndroid Build Coastguard Worker 
14406*8975f5c5SAndroid Build Coastguard Worker // Test that the correct error is generated if texture buffer support used anyway when not enabled.
TEST_P(TextureBufferTestES31,TestErrorWhenNotEnabled)14407*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureBufferTestES31, TestErrorWhenNotEnabled)
14408*8975f5c5SAndroid Build Coastguard Worker {
14409*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_EXT_texture_buffer"));
14410*8975f5c5SAndroid Build Coastguard Worker 
14411*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
14412*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
14413*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_ENUM);
14414*8975f5c5SAndroid Build Coastguard Worker }
14415*8975f5c5SAndroid Build Coastguard Worker 
14416*8975f5c5SAndroid Build Coastguard Worker class CopyImageTestES31 : public ANGLETest<>
14417*8975f5c5SAndroid Build Coastguard Worker {
14418*8975f5c5SAndroid Build Coastguard Worker   protected:
CopyImageTestES31()14419*8975f5c5SAndroid Build Coastguard Worker     CopyImageTestES31() {}
14420*8975f5c5SAndroid Build Coastguard Worker };
14421*8975f5c5SAndroid Build Coastguard Worker 
14422*8975f5c5SAndroid Build Coastguard Worker // Test that copies between RGB formats doesn't affect the emulated alpha channel, if any.
TEST_P(CopyImageTestES31,PreserveEmulatedAlpha)14423*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyImageTestES31, PreserveEmulatedAlpha)
14424*8975f5c5SAndroid Build Coastguard Worker {
14425*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
14426*8975f5c5SAndroid Build Coastguard Worker 
14427*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 1;
14428*8975f5c5SAndroid Build Coastguard Worker 
14429*8975f5c5SAndroid Build Coastguard Worker     GLTexture src, dst;
14430*8975f5c5SAndroid Build Coastguard Worker 
14431*8975f5c5SAndroid Build Coastguard Worker     // Set up the textures
14432*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, src);
14433*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, kSize, kSize);
14434*8975f5c5SAndroid Build Coastguard Worker 
14435*8975f5c5SAndroid Build Coastguard Worker     const GLColor kInitColor(50, 100, 150, 200);
14436*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGB, GL_UNSIGNED_BYTE, &kInitColor);
14437*8975f5c5SAndroid Build Coastguard Worker 
14438*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, dst);
14439*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8UI, kSize, kSize);
14440*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
14441*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
14442*8975f5c5SAndroid Build Coastguard Worker 
14443*8975f5c5SAndroid Build Coastguard Worker     // Copy from src to dst
14444*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(src, GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL_TEXTURE_2D, 0, 0, 0, 0, kSize,
14445*8975f5c5SAndroid Build Coastguard Worker                           kSize, 1);
14446*8975f5c5SAndroid Build Coastguard Worker 
14447*8975f5c5SAndroid Build Coastguard Worker     // Bind dst as image
14448*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, dst, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
14449*8975f5c5SAndroid Build Coastguard Worker 
14450*8975f5c5SAndroid Build Coastguard Worker     // Create a buffer for output
14451*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kBufferSize = kSize * kSize * sizeof(uint32_t) * 4;
14452*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
14453*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
14454*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
14455*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, buffer);
14456*8975f5c5SAndroid Build Coastguard Worker 
14457*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCS[] = R"(#version 310 es
14458*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
14459*8975f5c5SAndroid Build Coastguard Worker layout(rgba8ui, binding = 0) readonly uniform highp uimage2D imageIn;
14460*8975f5c5SAndroid Build Coastguard Worker  layout(std140, binding = 1) buffer dataOut {
14461*8975f5c5SAndroid Build Coastguard Worker      uvec4 data[];
14462*8975f5c5SAndroid Build Coastguard Worker  };
14463*8975f5c5SAndroid Build Coastguard Worker void main()
14464*8975f5c5SAndroid Build Coastguard Worker {
14465*8975f5c5SAndroid Build Coastguard Worker     uvec4 color = imageLoad(imageIn, ivec2(0));
14466*8975f5c5SAndroid Build Coastguard Worker     data[0] = color;
14467*8975f5c5SAndroid Build Coastguard Worker })";
14468*8975f5c5SAndroid Build Coastguard Worker 
14469*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
14470*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
14471*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(1, 1, 1);
14472*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14473*8975f5c5SAndroid Build Coastguard Worker 
14474*8975f5c5SAndroid Build Coastguard Worker     glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
14475*8975f5c5SAndroid Build Coastguard Worker 
14476*8975f5c5SAndroid Build Coastguard Worker     const uint32_t *ptr = reinterpret_cast<uint32_t *>(
14477*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, kBufferSize, GL_MAP_READ_BIT));
14478*8975f5c5SAndroid Build Coastguard Worker 
14479*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ptr[0], kInitColor.R);
14480*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ptr[1], kInitColor.G);
14481*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ptr[2], kInitColor.B);
14482*8975f5c5SAndroid Build Coastguard Worker 
14483*8975f5c5SAndroid Build Coastguard Worker     // Expect alpha to be 1, even if the RGB format is emulated with RGBA.
14484*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(ptr[3], 1u);
14485*8975f5c5SAndroid Build Coastguard Worker 
14486*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
14487*8975f5c5SAndroid Build Coastguard Worker }
14488*8975f5c5SAndroid Build Coastguard Worker 
14489*8975f5c5SAndroid Build Coastguard Worker // Verify a common pattern used by the Unreal Engine that trips up the tracer
TEST_P(CopyImageTestES31,CubeMapCopyImageSubData)14490*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyImageTestES31, CubeMapCopyImageSubData)
14491*8975f5c5SAndroid Build Coastguard Worker {
14492*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
14493*8975f5c5SAndroid Build Coastguard Worker 
14494*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
14495*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
14496*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
14497*8975f5c5SAndroid Build Coastguard Worker         in vec3 pos;
14498*8975f5c5SAndroid Build Coastguard Worker         void main() {
14499*8975f5c5SAndroid Build Coastguard Worker             gl_Position = vec4(pos, 1.0);
14500*8975f5c5SAndroid Build Coastguard Worker         })";
14501*8975f5c5SAndroid Build Coastguard Worker 
14502*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
14503*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
14504*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
14505*8975f5c5SAndroid Build Coastguard Worker         out vec4 color;
14506*8975f5c5SAndroid Build Coastguard Worker         uniform samplerCube uTex;
14507*8975f5c5SAndroid Build Coastguard Worker         void main(){
14508*8975f5c5SAndroid Build Coastguard Worker             // sample from lod 1.0
14509*8975f5c5SAndroid Build Coastguard Worker             color = textureLod(uTex, vec3(1.0), 1.0);
14510*8975f5c5SAndroid Build Coastguard Worker         })";
14511*8975f5c5SAndroid Build Coastguard Worker 
14512*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
14513*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
14514*8975f5c5SAndroid Build Coastguard Worker 
14515*8975f5c5SAndroid Build Coastguard Worker     // Set up two cube maps, then verify we can copy between them
14516*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kSize = 2;
14517*8975f5c5SAndroid Build Coastguard Worker     constexpr int levels   = 2;
14518*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(kSize * kSize, GLColor::green);
14519*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(kSize * kSize, GLColor::red);
14520*8975f5c5SAndroid Build Coastguard Worker 
14521*8975f5c5SAndroid Build Coastguard Worker     // Initialize src to green
14522*8975f5c5SAndroid Build Coastguard Worker     GLTexture texCubeSrc;
14523*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texCubeSrc);
14524*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < levels; i++)
14525*8975f5c5SAndroid Build Coastguard Worker     {
14526*8975f5c5SAndroid Build Coastguard Worker         for (GLenum face = 0; face < 6; face++)
14527*8975f5c5SAndroid Build Coastguard Worker         {
14528*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, i, GL_RGBA, kSize >> i, kSize >> i,
14529*8975f5c5SAndroid Build Coastguard Worker                          0, GL_RGBA, GL_UNSIGNED_BYTE, pixelsGreen.data());
14530*8975f5c5SAndroid Build Coastguard Worker         }
14531*8975f5c5SAndroid Build Coastguard Worker     }
14532*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14533*8975f5c5SAndroid Build Coastguard Worker 
14534*8975f5c5SAndroid Build Coastguard Worker     // Initialize dst to red
14535*8975f5c5SAndroid Build Coastguard Worker     GLTexture texCubeDst;
14536*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texCubeDst);
14537*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < levels; i++)
14538*8975f5c5SAndroid Build Coastguard Worker     {
14539*8975f5c5SAndroid Build Coastguard Worker         for (GLenum face = 0; face < 6; face++)
14540*8975f5c5SAndroid Build Coastguard Worker         {
14541*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, i, GL_RGBA, kSize >> i, kSize >> i,
14542*8975f5c5SAndroid Build Coastguard Worker                          0, GL_RGBA, GL_UNSIGNED_BYTE, pixelsRed.data());
14543*8975f5c5SAndroid Build Coastguard Worker         }
14544*8975f5c5SAndroid Build Coastguard Worker     }
14545*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14546*8975f5c5SAndroid Build Coastguard Worker 
14547*8975f5c5SAndroid Build Coastguard Worker     // Clear to blue
14548*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
14549*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
14550*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
14551*8975f5c5SAndroid Build Coastguard Worker 
14552*8975f5c5SAndroid Build Coastguard Worker     // Sample from the dst texture to ensure it has the right color
14553*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, "uTex");
14554*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLoc);
14555*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 0);
14556*8975f5c5SAndroid Build Coastguard Worker 
14557*8975f5c5SAndroid Build Coastguard Worker     // Draw once and sample from level 1, which is red
14558*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "pos", 0.5f);
14559*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
14560*8975f5c5SAndroid Build Coastguard Worker 
14561*8975f5c5SAndroid Build Coastguard Worker     // Swap to trigger MEC
14562*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
14563*8975f5c5SAndroid Build Coastguard Worker 
14564*8975f5c5SAndroid Build Coastguard Worker     // Copy level 1 from src to dst
14565*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(texCubeSrc, GL_TEXTURE_CUBE_MAP, 1, 0, 0, 0, texCubeDst,
14566*8975f5c5SAndroid Build Coastguard Worker                           GL_TEXTURE_CUBE_MAP, 1, 0, 0, 0, kSize >> 1, kSize >> 1, 6);
14567*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14568*8975f5c5SAndroid Build Coastguard Worker 
14569*8975f5c5SAndroid Build Coastguard Worker     // Draw again and verify we get green
14570*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "pos", 0.5f);
14571*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
14572*8975f5c5SAndroid Build Coastguard Worker 
14573*8975f5c5SAndroid Build Coastguard Worker     // Swap again to end the capture
14574*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
14575*8975f5c5SAndroid Build Coastguard Worker 
14576*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14577*8975f5c5SAndroid Build Coastguard Worker }
14578*8975f5c5SAndroid Build Coastguard Worker 
14579*8975f5c5SAndroid Build Coastguard Worker // Verify that copies between texture layers works, including when there is a read after write in a
14580*8975f5c5SAndroid Build Coastguard Worker // level/layer.
TEST_P(CopyImageTestES31,ArraySelfCopyImageSubDataWithReadAfterWrite)14581*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyImageTestES31, ArraySelfCopyImageSubDataWithReadAfterWrite)
14582*8975f5c5SAndroid Build Coastguard Worker {
14583*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
14584*8975f5c5SAndroid Build Coastguard Worker 
14585*8975f5c5SAndroid Build Coastguard Worker     // Set up a texture with multiple layers, then verify we can copy between them
14586*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 13;
14587*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 57;
14588*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kLayers = 5;
14589*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kLevels = 2;
14590*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(kWidth * kHeight, GLColor::red);
14591*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(kWidth * kHeight, GLColor::green);
14592*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsBlue(kWidth * kHeight, GLColor::blue);
14593*8975f5c5SAndroid Build Coastguard Worker 
14594*8975f5c5SAndroid Build Coastguard Worker     const GLColor *colors[3] = {
14595*8975f5c5SAndroid Build Coastguard Worker         pixelsRed.data(),
14596*8975f5c5SAndroid Build Coastguard Worker         pixelsGreen.data(),
14597*8975f5c5SAndroid Build Coastguard Worker         pixelsBlue.data(),
14598*8975f5c5SAndroid Build Coastguard Worker     };
14599*8975f5c5SAndroid Build Coastguard Worker 
14600*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
14601*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
14602*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, kLevels, GL_RGBA8, kWidth, kHeight, kLayers);
14603*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t level = 0; level < kLevels; ++level)
14604*8975f5c5SAndroid Build Coastguard Worker     {
14605*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t layer = 0; layer < kLayers; ++layer)
14606*8975f5c5SAndroid Build Coastguard Worker         {
14607*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, layer, kWidth >> level,
14608*8975f5c5SAndroid Build Coastguard Worker                             kHeight >> level, 1, GL_RGBA, GL_UNSIGNED_BYTE,
14609*8975f5c5SAndroid Build Coastguard Worker                             colors[(level + layer) % 3]);
14610*8975f5c5SAndroid Build Coastguard Worker         }
14611*8975f5c5SAndroid Build Coastguard Worker     }
14612*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14613*8975f5c5SAndroid Build Coastguard Worker 
14614*8975f5c5SAndroid Build Coastguard Worker     // The texture has the following colors:
14615*8975f5c5SAndroid Build Coastguard Worker     //              Layer 0   Layer 1   Layer 2   Layer 3   Layer 4
14616*8975f5c5SAndroid Build Coastguard Worker     // Level  0      Red       Green     Blue      Red       Green
14617*8975f5c5SAndroid Build Coastguard Worker     // Level  1      Green     Blue      Red       Green     Blue
14618*8975f5c5SAndroid Build Coastguard Worker 
14619*8975f5c5SAndroid Build Coastguard Worker     // Copy level 0, layer 0 to level 0, layer 2
14620*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
14621*8975f5c5SAndroid Build Coastguard Worker                           2, kWidth, kHeight, 1);
14622*8975f5c5SAndroid Build Coastguard Worker 
14623*8975f5c5SAndroid Build Coastguard Worker     // Copy level 1, layers 3, 4 to level 1, layers 1, 2
14624*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 1, 0, 0, 3, tex, GL_TEXTURE_2D_ARRAY, 1, 0, 0,
14625*8975f5c5SAndroid Build Coastguard Worker                           1, kWidth >> 1, kHeight >> 1, 2);
14626*8975f5c5SAndroid Build Coastguard Worker 
14627*8975f5c5SAndroid Build Coastguard Worker     // Partially copy level 1, layer 1 to level 0, layer 3
14628*8975f5c5SAndroid Build Coastguard Worker     // Level 1/layer 1 will be read from after being written to
14629*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 1, kWidth / 8, kHeight / 8, 1, tex,
14630*8975f5c5SAndroid Build Coastguard Worker                           GL_TEXTURE_2D_ARRAY, 0, kWidth / 4, kHeight / 4, 3, kWidth / 4,
14631*8975f5c5SAndroid Build Coastguard Worker                           kHeight / 4, 1);
14632*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14633*8975f5c5SAndroid Build Coastguard Worker 
14634*8975f5c5SAndroid Build Coastguard Worker     // Verify colors
14635*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer FBO;
14636*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, FBO);
14637*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
14638*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14639*8975f5c5SAndroid Build Coastguard Worker 
14640*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
14641*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
14642*8975f5c5SAndroid Build Coastguard Worker 
14643*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 2);
14644*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14645*8975f5c5SAndroid Build Coastguard Worker 
14646*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 3);
14647*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight / 4, GLColor::red);
14648*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth / 4, kHeight, GLColor::red);
14649*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, kHeight / 4 + kHeight / 4, kWidth,
14650*8975f5c5SAndroid Build Coastguard Worker                          kHeight - (kHeight / 4 + kHeight / 4), GLColor::red);
14651*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kWidth / 4 + kWidth / 4, 0, kWidth - (kWidth / 4 + kWidth / 4), kHeight,
14652*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
14653*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kWidth / 4, kHeight / 4, kWidth / 4, kHeight / 4, GLColor::green);
14654*8975f5c5SAndroid Build Coastguard Worker 
14655*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 4);
14656*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
14657*8975f5c5SAndroid Build Coastguard Worker 
14658*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 0);
14659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
14660*8975f5c5SAndroid Build Coastguard Worker 
14661*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 1);
14662*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
14663*8975f5c5SAndroid Build Coastguard Worker 
14664*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 2);
14665*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
14666*8975f5c5SAndroid Build Coastguard Worker 
14667*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 3);
14668*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
14669*8975f5c5SAndroid Build Coastguard Worker 
14670*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 4);
14671*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
14672*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14673*8975f5c5SAndroid Build Coastguard Worker }
14674*8975f5c5SAndroid Build Coastguard Worker 
14675*8975f5c5SAndroid Build Coastguard Worker // Verify that copies between texture layers works, including when there is a write after read in a
14676*8975f5c5SAndroid Build Coastguard Worker // level/layer.
TEST_P(CopyImageTestES31,ArraySelfCopyImageSubDataWithWriteAfterRead)14677*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyImageTestES31, ArraySelfCopyImageSubDataWithWriteAfterRead)
14678*8975f5c5SAndroid Build Coastguard Worker {
14679*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
14680*8975f5c5SAndroid Build Coastguard Worker 
14681*8975f5c5SAndroid Build Coastguard Worker     // Set up a texture with multiple layers, then verify we can copy between them
14682*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 13;
14683*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 57;
14684*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kLayers = 5;
14685*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kLevels = 2;
14686*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(kWidth * kHeight, GLColor::red);
14687*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(kWidth * kHeight, GLColor::green);
14688*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsBlue(kWidth * kHeight, GLColor::blue);
14689*8975f5c5SAndroid Build Coastguard Worker 
14690*8975f5c5SAndroid Build Coastguard Worker     const GLColor *colors[3] = {
14691*8975f5c5SAndroid Build Coastguard Worker         pixelsRed.data(),
14692*8975f5c5SAndroid Build Coastguard Worker         pixelsGreen.data(),
14693*8975f5c5SAndroid Build Coastguard Worker         pixelsBlue.data(),
14694*8975f5c5SAndroid Build Coastguard Worker     };
14695*8975f5c5SAndroid Build Coastguard Worker 
14696*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
14697*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
14698*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, kLevels, GL_RGBA8, kWidth, kHeight, kLayers);
14699*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t level = 0; level < kLevels; ++level)
14700*8975f5c5SAndroid Build Coastguard Worker     {
14701*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t layer = 0; layer < kLayers; ++layer)
14702*8975f5c5SAndroid Build Coastguard Worker         {
14703*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, layer, kWidth >> level,
14704*8975f5c5SAndroid Build Coastguard Worker                             kHeight >> level, 1, GL_RGBA, GL_UNSIGNED_BYTE,
14705*8975f5c5SAndroid Build Coastguard Worker                             colors[(level + layer) % 3]);
14706*8975f5c5SAndroid Build Coastguard Worker         }
14707*8975f5c5SAndroid Build Coastguard Worker     }
14708*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14709*8975f5c5SAndroid Build Coastguard Worker 
14710*8975f5c5SAndroid Build Coastguard Worker     // The texture has the following colors:
14711*8975f5c5SAndroid Build Coastguard Worker     //              Layer 0   Layer 1   Layer 2   Layer 3   Layer 4
14712*8975f5c5SAndroid Build Coastguard Worker     // Level  0      Red       Green     Blue      Red       Green
14713*8975f5c5SAndroid Build Coastguard Worker     // Level  1      Green     Blue      Red       Green     Blue
14714*8975f5c5SAndroid Build Coastguard Worker 
14715*8975f5c5SAndroid Build Coastguard Worker     // Copy level 0, layer 0 to level 0, layer 2
14716*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
14717*8975f5c5SAndroid Build Coastguard Worker                           2, kWidth, kHeight, 1);
14718*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14719*8975f5c5SAndroid Build Coastguard Worker 
14720*8975f5c5SAndroid Build Coastguard Worker     // Copy level 0, layer 1 to level 0, layer 3
14721*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
14722*8975f5c5SAndroid Build Coastguard Worker                           3, kWidth, kHeight, 1);
14723*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14724*8975f5c5SAndroid Build Coastguard Worker 
14725*8975f5c5SAndroid Build Coastguard Worker     // Copy level 0, layer 0 to level 0, layer 1
14726*8975f5c5SAndroid Build Coastguard Worker     // Level 0/layer 1 will be written to from after being read from
14727*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, tex, GL_TEXTURE_2D_ARRAY, 0, 0, 0,
14728*8975f5c5SAndroid Build Coastguard Worker                           1, kWidth, kHeight, 1);
14729*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14730*8975f5c5SAndroid Build Coastguard Worker 
14731*8975f5c5SAndroid Build Coastguard Worker     // Verify colors
14732*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer FBO;
14733*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, FBO);
14734*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
14735*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14736*8975f5c5SAndroid Build Coastguard Worker 
14737*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
14738*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14739*8975f5c5SAndroid Build Coastguard Worker 
14740*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 2);
14741*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14742*8975f5c5SAndroid Build Coastguard Worker 
14743*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 3);
14744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
14745*8975f5c5SAndroid Build Coastguard Worker 
14746*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 4);
14747*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
14748*8975f5c5SAndroid Build Coastguard Worker 
14749*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 0);
14750*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
14751*8975f5c5SAndroid Build Coastguard Worker 
14752*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 1);
14753*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
14754*8975f5c5SAndroid Build Coastguard Worker 
14755*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 2);
14756*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::red);
14757*8975f5c5SAndroid Build Coastguard Worker 
14758*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 3);
14759*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::green);
14760*8975f5c5SAndroid Build Coastguard Worker 
14761*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 4);
14762*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
14763*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14764*8975f5c5SAndroid Build Coastguard Worker }
14765*8975f5c5SAndroid Build Coastguard Worker 
14766*8975f5c5SAndroid Build Coastguard Worker // Verify that copies between 3D texture slices work
TEST_P(CopyImageTestES31,Texture3DSelfCopyImageSubData)14767*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyImageTestES31, Texture3DSelfCopyImageSubData)
14768*8975f5c5SAndroid Build Coastguard Worker {
14769*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
14770*8975f5c5SAndroid Build Coastguard Worker 
14771*8975f5c5SAndroid Build Coastguard Worker     // Set up a texture with multiple layers, then verify we can copy between them
14772*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 23;
14773*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 47;
14774*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 5;
14775*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kLevels = 2;
14776*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsRed(kWidth * kHeight, GLColor::red);
14777*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsGreen(kWidth * kHeight, GLColor::green);
14778*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelsBlue(kWidth * kHeight, GLColor::blue);
14779*8975f5c5SAndroid Build Coastguard Worker 
14780*8975f5c5SAndroid Build Coastguard Worker     const GLColor *colors[3] = {
14781*8975f5c5SAndroid Build Coastguard Worker         pixelsRed.data(),
14782*8975f5c5SAndroid Build Coastguard Worker         pixelsGreen.data(),
14783*8975f5c5SAndroid Build Coastguard Worker         pixelsBlue.data(),
14784*8975f5c5SAndroid Build Coastguard Worker     };
14785*8975f5c5SAndroid Build Coastguard Worker 
14786*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
14787*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, tex);
14788*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, kLevels, GL_RGBA8, kWidth, kHeight, kDepth);
14789*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t level = 0; level < kLevels; ++level)
14790*8975f5c5SAndroid Build Coastguard Worker     {
14791*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t depth = 0; depth < kDepth >> level; ++depth)
14792*8975f5c5SAndroid Build Coastguard Worker         {
14793*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage3D(GL_TEXTURE_3D, level, 0, 0, depth, kWidth >> level, kHeight >> level, 1,
14794*8975f5c5SAndroid Build Coastguard Worker                             GL_RGBA, GL_UNSIGNED_BYTE, colors[(level + depth) % 3]);
14795*8975f5c5SAndroid Build Coastguard Worker         }
14796*8975f5c5SAndroid Build Coastguard Worker     }
14797*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14798*8975f5c5SAndroid Build Coastguard Worker 
14799*8975f5c5SAndroid Build Coastguard Worker     // The texture has the following colors:
14800*8975f5c5SAndroid Build Coastguard Worker     //              Slice 0   Slice 1   Slice 2   Slice 3   Slice 4
14801*8975f5c5SAndroid Build Coastguard Worker     // Level  0      Red       Green     Blue      Red       Green
14802*8975f5c5SAndroid Build Coastguard Worker     // Level  1      Green     Blue
14803*8975f5c5SAndroid Build Coastguard Worker 
14804*8975f5c5SAndroid Build Coastguard Worker     // Copy level 1, slice 1 to level 1, slice 0
14805*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_3D, 1, 0, 0, 1, tex, GL_TEXTURE_3D, 1, 0, 0, 0,
14806*8975f5c5SAndroid Build Coastguard Worker                           kWidth >> 1, kHeight >> 1, 1);
14807*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14808*8975f5c5SAndroid Build Coastguard Worker 
14809*8975f5c5SAndroid Build Coastguard Worker     // Copy level 0, slice 3, 4 to level 0, slice 1, 2
14810*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_3D, 0, 0, 0, 3, tex, GL_TEXTURE_3D, 0, 0, 0, 1, kWidth,
14811*8975f5c5SAndroid Build Coastguard Worker                           kHeight, 2);
14812*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14813*8975f5c5SAndroid Build Coastguard Worker 
14814*8975f5c5SAndroid Build Coastguard Worker     // Partially copy level 1, slice 1 to level 0, slice 3
14815*8975f5c5SAndroid Build Coastguard Worker     glCopyImageSubDataEXT(tex, GL_TEXTURE_3D, 1, kWidth / 8, kHeight / 8, 1, tex, GL_TEXTURE_3D, 0,
14816*8975f5c5SAndroid Build Coastguard Worker                           kWidth / 4, kHeight / 4, 3, kWidth / 4, kHeight / 4, 1);
14817*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14818*8975f5c5SAndroid Build Coastguard Worker 
14819*8975f5c5SAndroid Build Coastguard Worker     // Verify colors
14820*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer FBO;
14821*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, FBO);
14822*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
14823*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14824*8975f5c5SAndroid Build Coastguard Worker 
14825*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
14826*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
14827*8975f5c5SAndroid Build Coastguard Worker 
14828*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 2);
14829*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
14830*8975f5c5SAndroid Build Coastguard Worker 
14831*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 3);
14832*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight / 4, GLColor::red);
14833*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth / 4, kHeight, GLColor::red);
14834*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, kHeight / 4 + kHeight / 4, kWidth,
14835*8975f5c5SAndroid Build Coastguard Worker                          kHeight - (kHeight / 4 + kHeight / 4), GLColor::red);
14836*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kWidth / 4 + kWidth / 4, 0, kWidth - (kWidth / 4 + kWidth / 4), kHeight,
14837*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
14838*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kWidth / 4, kHeight / 4, kWidth / 4, kHeight / 4, GLColor::blue);
14839*8975f5c5SAndroid Build Coastguard Worker 
14840*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 4);
14841*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
14842*8975f5c5SAndroid Build Coastguard Worker 
14843*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 0);
14844*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
14845*8975f5c5SAndroid Build Coastguard Worker 
14846*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 1, 1);
14847*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth >> 1, kHeight >> 1, GLColor::blue);
14848*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
14849*8975f5c5SAndroid Build Coastguard Worker }
14850*8975f5c5SAndroid Build Coastguard Worker 
14851*8975f5c5SAndroid Build Coastguard Worker class TextureChangeStorageUploadTest : public ANGLETest<>
14852*8975f5c5SAndroid Build Coastguard Worker {
14853*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureChangeStorageUploadTest()14854*8975f5c5SAndroid Build Coastguard Worker     TextureChangeStorageUploadTest()
14855*8975f5c5SAndroid Build Coastguard Worker     {
14856*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(256);
14857*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(256);
14858*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
14859*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
14860*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
14861*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
14862*8975f5c5SAndroid Build Coastguard Worker     }
14863*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()14864*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
14865*8975f5c5SAndroid Build Coastguard Worker     {
14866*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
14867*8975f5c5SAndroid Build Coastguard Worker         if (mProgram == 0)
14868*8975f5c5SAndroid Build Coastguard Worker         {
14869*8975f5c5SAndroid Build Coastguard Worker             FAIL() << "shader compilation failed.";
14870*8975f5c5SAndroid Build Coastguard Worker         }
14871*8975f5c5SAndroid Build Coastguard Worker 
14872*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
14873*8975f5c5SAndroid Build Coastguard Worker 
14874*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0, 0, 0, 0);
14875*8975f5c5SAndroid Build Coastguard Worker         glClearDepthf(0.0);
14876*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
14877*8975f5c5SAndroid Build Coastguard Worker 
14878*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_BLEND);
14879*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_DEPTH_TEST);
14880*8975f5c5SAndroid Build Coastguard Worker 
14881*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
14882*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
14883*8975f5c5SAndroid Build Coastguard Worker     }
14884*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()14885*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
14886*8975f5c5SAndroid Build Coastguard Worker     {
14887*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
14888*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mProgram);
14889*8975f5c5SAndroid Build Coastguard Worker     }
14890*8975f5c5SAndroid Build Coastguard Worker 
14891*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
14892*8975f5c5SAndroid Build Coastguard Worker     GLint mColorLocation;
14893*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture;
14894*8975f5c5SAndroid Build Coastguard Worker };
14895*8975f5c5SAndroid Build Coastguard Worker 
14896*8975f5c5SAndroid Build Coastguard Worker // Verify that respecifying storage and re-uploading doesn't crash.
TEST_P(TextureChangeStorageUploadTest,Basic)14897*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureChangeStorageUploadTest, Basic)
14898*8975f5c5SAndroid Build Coastguard Worker {
14899*8975f5c5SAndroid Build Coastguard Worker     constexpr int kImageSize        = 8;  // 4 doesn't trip ASAN
14900*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSmallerImageSize = kImageSize / 2;
14901*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(kImageSize, kSmallerImageSize);
14902*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GT(kSmallerImageSize / 2, 0);
14903*8975f5c5SAndroid Build Coastguard Worker 
14904*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kImageSize * kImageSize> kColor;
14905*8975f5c5SAndroid Build Coastguard Worker 
14906*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
14907*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kImageSize, kImageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
14908*8975f5c5SAndroid Build Coastguard Worker                  kColor.data());
14909*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSmallerImageSize, kSmallerImageSize);
14910*8975f5c5SAndroid Build Coastguard Worker     // need partial update to sidestep optimizations that remove the full upload
14911*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSmallerImageSize / 2, kSmallerImageSize / 2, GL_RGBA,
14912*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, kColor.data());
14913*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
14914*8975f5c5SAndroid Build Coastguard Worker }
14915*8975f5c5SAndroid Build Coastguard Worker 
14916*8975f5c5SAndroid Build Coastguard Worker class ExtraSamplerCubeShadowUseTest : public ANGLETest<>
14917*8975f5c5SAndroid Build Coastguard Worker {
14918*8975f5c5SAndroid Build Coastguard Worker   protected:
ExtraSamplerCubeShadowUseTest()14919*8975f5c5SAndroid Build Coastguard Worker     ExtraSamplerCubeShadowUseTest() : ANGLETest() {}
14920*8975f5c5SAndroid Build Coastguard Worker 
getVertexShaderSource()14921*8975f5c5SAndroid Build Coastguard Worker     const char *getVertexShaderSource() { return "#version 300 es\nvoid main() {}"; }
14922*8975f5c5SAndroid Build Coastguard Worker 
getFragmentShaderSource()14923*8975f5c5SAndroid Build Coastguard Worker     const char *getFragmentShaderSource()
14924*8975f5c5SAndroid Build Coastguard Worker     {
14925*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
14926*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
14927*8975f5c5SAndroid Build Coastguard Worker 
14928*8975f5c5SAndroid Build Coastguard Worker uniform mediump samplerCube var_0002; // this has to be there
14929*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerCubeShadow var_0004; // this has to be a cube shadow sampler
14930*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
14931*8975f5c5SAndroid Build Coastguard Worker void main() {
14932*8975f5c5SAndroid Build Coastguard Worker 
14933*8975f5c5SAndroid Build Coastguard Worker     vec4 var_0031 = texture(var_0002, vec3(1,1,1));
14934*8975f5c5SAndroid Build Coastguard Worker     ivec2 size = textureSize(var_0004, 0) ;
14935*8975f5c5SAndroid Build Coastguard Worker     var_0031.x += float(size.y);
14936*8975f5c5SAndroid Build Coastguard Worker 
14937*8975f5c5SAndroid Build Coastguard Worker     color = var_0031;
14938*8975f5c5SAndroid Build Coastguard Worker })";
14939*8975f5c5SAndroid Build Coastguard Worker     }
14940*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()14941*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
14942*8975f5c5SAndroid Build Coastguard Worker     {
14943*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(getVertexShaderSource(), getFragmentShaderSource());
14944*8975f5c5SAndroid Build Coastguard Worker         if (mProgram == 0)
14945*8975f5c5SAndroid Build Coastguard Worker         {
14946*8975f5c5SAndroid Build Coastguard Worker             FAIL() << "shader compilation failed.";
14947*8975f5c5SAndroid Build Coastguard Worker         }
14948*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
14949*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
14950*8975f5c5SAndroid Build Coastguard Worker     }
14951*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()14952*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { glDeleteProgram(mProgram); }
14953*8975f5c5SAndroid Build Coastguard Worker 
14954*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
14955*8975f5c5SAndroid Build Coastguard Worker };
14956*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ExtraSamplerCubeShadowUseTest,Basic)14957*8975f5c5SAndroid Build Coastguard Worker TEST_P(ExtraSamplerCubeShadowUseTest, Basic)
14958*8975f5c5SAndroid Build Coastguard Worker {
14959*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_FAN, 0, 3);
14960*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
14961*8975f5c5SAndroid Build Coastguard Worker }
14962*8975f5c5SAndroid Build Coastguard Worker 
14963*8975f5c5SAndroid Build Coastguard Worker // Tests covering RBG->RGBA emulation path
14964*8975f5c5SAndroid Build Coastguard Worker class RGBTextureBufferTestES31 : public ANGLETest<>
14965*8975f5c5SAndroid Build Coastguard Worker {
14966*8975f5c5SAndroid Build Coastguard Worker   protected:
RGBTextureBufferTestES31()14967*8975f5c5SAndroid Build Coastguard Worker     RGBTextureBufferTestES31()
14968*8975f5c5SAndroid Build Coastguard Worker     {
14969*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
14970*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
14971*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
14972*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
14973*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
14974*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
14975*8975f5c5SAndroid Build Coastguard Worker     }
14976*8975f5c5SAndroid Build Coastguard Worker     void TestInt(GLuint format);
14977*8975f5c5SAndroid Build Coastguard Worker };
14978*8975f5c5SAndroid Build Coastguard Worker 
SetupTextureBufferDrawProgram(GLProgram & program,GLuint format)14979*8975f5c5SAndroid Build Coastguard Worker void SetupTextureBufferDrawProgram(GLProgram &program, GLuint format)
14980*8975f5c5SAndroid Build Coastguard Worker {
14981*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 310 es
14982*8975f5c5SAndroid Build Coastguard Worker     precision highp float;
14983*8975f5c5SAndroid Build Coastguard Worker     in vec4 inputAttribute;
14984*8975f5c5SAndroid Build Coastguard Worker 
14985*8975f5c5SAndroid Build Coastguard Worker     void main()
14986*8975f5c5SAndroid Build Coastguard Worker     {
14987*8975f5c5SAndroid Build Coastguard Worker         gl_Position = inputAttribute;
14988*8975f5c5SAndroid Build Coastguard Worker     })";
14989*8975f5c5SAndroid Build Coastguard Worker 
14990*8975f5c5SAndroid Build Coastguard Worker     if (format == GL_RGB32UI)
14991*8975f5c5SAndroid Build Coastguard Worker     {
14992*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] = R"(#version 310 es
14993*8975f5c5SAndroid Build Coastguard Worker         #extension GL_EXT_texture_buffer : require
14994*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
14995*8975f5c5SAndroid Build Coastguard Worker         uniform highp usamplerBuffer tex;
14996*8975f5c5SAndroid Build Coastguard Worker         layout(location = 0) out mediump vec4 color;
14997*8975f5c5SAndroid Build Coastguard Worker 
14998*8975f5c5SAndroid Build Coastguard Worker         void main()
14999*8975f5c5SAndroid Build Coastguard Worker         {
15000*8975f5c5SAndroid Build Coastguard Worker             uvec4 v = texelFetch(tex, 1);
15001*8975f5c5SAndroid Build Coastguard Worker             color = vec4(float(v.r)/255.0, float(v.g)/255.0, float(v.b)/255.0, v.a);
15002*8975f5c5SAndroid Build Coastguard Worker         })";
15003*8975f5c5SAndroid Build Coastguard Worker         program.makeRaster(kVS, kFS);
15004*8975f5c5SAndroid Build Coastguard Worker     }
15005*8975f5c5SAndroid Build Coastguard Worker     if (format == GL_RGB32I)
15006*8975f5c5SAndroid Build Coastguard Worker     {
15007*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] = R"(#version 310 es
15008*8975f5c5SAndroid Build Coastguard Worker         #extension GL_EXT_texture_buffer : require
15009*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
15010*8975f5c5SAndroid Build Coastguard Worker         uniform highp isamplerBuffer tex;
15011*8975f5c5SAndroid Build Coastguard Worker         layout(location = 0) out mediump vec4 color;
15012*8975f5c5SAndroid Build Coastguard Worker 
15013*8975f5c5SAndroid Build Coastguard Worker         void main()
15014*8975f5c5SAndroid Build Coastguard Worker         {
15015*8975f5c5SAndroid Build Coastguard Worker             ivec4 v = texelFetch(tex, 1);
15016*8975f5c5SAndroid Build Coastguard Worker             color = vec4(float(v.r)/255.0, float(v.g)/255.0, float(v.b)/255.0, v.a);
15017*8975f5c5SAndroid Build Coastguard Worker         })";
15018*8975f5c5SAndroid Build Coastguard Worker         program.makeRaster(kVS, kFS);
15019*8975f5c5SAndroid Build Coastguard Worker     }
15020*8975f5c5SAndroid Build Coastguard Worker     if (format == GL_RGB32F)
15021*8975f5c5SAndroid Build Coastguard Worker     {
15022*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] = R"(#version 310 es
15023*8975f5c5SAndroid Build Coastguard Worker         #extension GL_EXT_texture_buffer : require
15024*8975f5c5SAndroid Build Coastguard Worker         precision mediump float;
15025*8975f5c5SAndroid Build Coastguard Worker         uniform highp samplerBuffer tex;
15026*8975f5c5SAndroid Build Coastguard Worker         layout(location = 0) out mediump vec4 color;
15027*8975f5c5SAndroid Build Coastguard Worker 
15028*8975f5c5SAndroid Build Coastguard Worker         void main()
15029*8975f5c5SAndroid Build Coastguard Worker         {
15030*8975f5c5SAndroid Build Coastguard Worker             vec4 v = texelFetch(tex, 1);
15031*8975f5c5SAndroid Build Coastguard Worker             color = vec4(float(v.r)/255.0, float(v.g)/255.0, float(v.b)/255.0, v.a);
15032*8975f5c5SAndroid Build Coastguard Worker         })";
15033*8975f5c5SAndroid Build Coastguard Worker         program.makeRaster(kVS, kFS);
15034*8975f5c5SAndroid Build Coastguard Worker     }
15035*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(program.valid());
15036*8975f5c5SAndroid Build Coastguard Worker }
15037*8975f5c5SAndroid Build Coastguard Worker 
TestInt(GLuint format)15038*8975f5c5SAndroid Build Coastguard Worker void RGBTextureBufferTestES31::TestInt(GLuint format)
15039*8975f5c5SAndroid Build Coastguard Worker {
15040*8975f5c5SAndroid Build Coastguard Worker     const GLint pixelSize = sizeof(GLuint) * 3;
15041*8975f5c5SAndroid Build Coastguard Worker 
15042*8975f5c5SAndroid Build Coastguard Worker     // Offset must be aligned to GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT (16, 64, ...)
15043*8975f5c5SAndroid Build Coastguard Worker     GLint offsetAlignment = 0;
15044*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &offsetAlignment);
15045*8975f5c5SAndroid Build Coastguard Worker     ASSERT(offsetAlignment % sizeof(GLuint) == 0);
15046*8975f5c5SAndroid Build Coastguard Worker     GLint byteOffset = ((pixelSize * 2) / offsetAlignment + 1) * offsetAlignment;
15047*8975f5c5SAndroid Build Coastguard Worker 
15048*8975f5c5SAndroid Build Coastguard Worker     GLint intOffset = byteOffset / sizeof(GLuint);
15049*8975f5c5SAndroid Build Coastguard Worker 
15050*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> texData(intOffset + 3 * 2);
15051*8975f5c5SAndroid Build Coastguard Worker 
15052*8975f5c5SAndroid Build Coastguard Worker     // first texel(1) col
15053*8975f5c5SAndroid Build Coastguard Worker     GLColor col = MakeGLColor(11, 22, 33, 255);
15054*8975f5c5SAndroid Build Coastguard Worker     texData[3]  = col.R;
15055*8975f5c5SAndroid Build Coastguard Worker     texData[4]  = col.G;
15056*8975f5c5SAndroid Build Coastguard Worker     texData[5]  = col.B;
15057*8975f5c5SAndroid Build Coastguard Worker 
15058*8975f5c5SAndroid Build Coastguard Worker     // second texel(1) col2
15059*8975f5c5SAndroid Build Coastguard Worker     GLColor col2           = MakeGLColor(44, 55, 66, 255);
15060*8975f5c5SAndroid Build Coastguard Worker     texData[intOffset + 3] = col2.R;
15061*8975f5c5SAndroid Build Coastguard Worker     texData[intOffset + 4] = col2.G;
15062*8975f5c5SAndroid Build Coastguard Worker     texData[intOffset + 5] = col2.B;
15063*8975f5c5SAndroid Build Coastguard Worker 
15064*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
15065*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
15066*8975f5c5SAndroid Build Coastguard Worker 
15067*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
15068*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_TEXTURE_BUFFER, buffer);
15069*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, sizeof(GLuint) * texData.size(), texData.data(),
15070*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
15071*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15072*8975f5c5SAndroid Build Coastguard Worker 
15073*8975f5c5SAndroid Build Coastguard Worker     GLProgram program;
15074*8975f5c5SAndroid Build Coastguard Worker     SetupTextureBufferDrawProgram(program, format);
15075*8975f5c5SAndroid Build Coastguard Worker 
15076*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, format, buffer);
15077*8975f5c5SAndroid Build Coastguard Worker 
15078*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15079*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15080*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, col, 1);
15081*8975f5c5SAndroid Build Coastguard Worker 
15082*8975f5c5SAndroid Build Coastguard Worker     glTexBufferRangeEXT(GL_TEXTURE_BUFFER, format, buffer, byteOffset, pixelSize * 2);
15083*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15084*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15085*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, col2, 1);
15086*8975f5c5SAndroid Build Coastguard Worker 
15087*8975f5c5SAndroid Build Coastguard Worker     // Now update the buffer to check the converted data also gets updated.
15088*8975f5c5SAndroid Build Coastguard Worker     GLColor colUpd      = MakeGLColor(77, 88, 99, 255);
15089*8975f5c5SAndroid Build Coastguard Worker     GLuint texDataUpd[] = {0, 0, 0, colUpd.R, colUpd.G, colUpd.B};  // second texel(1) colUpd
15090*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_TEXTURE_BUFFER, byteOffset, sizeof(texDataUpd), texDataUpd);
15091*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15092*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15093*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, colUpd, 1);
15094*8975f5c5SAndroid Build Coastguard Worker 
15095*8975f5c5SAndroid Build Coastguard Worker     // Update with glMapBuffer (hits a different code path...)
15096*8975f5c5SAndroid Build Coastguard Worker     GLColor colUpd2      = MakeGLColor(111, 122, 133, 255);
15097*8975f5c5SAndroid Build Coastguard Worker     GLuint texDataUpd2[] = {0, 0, 0, colUpd2.R, colUpd2.G, colUpd2.B};  // second texel(1) colUpd2
15098*8975f5c5SAndroid Build Coastguard Worker     void *mappedBuffer =
15099*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_TEXTURE_BUFFER, byteOffset, sizeof(texDataUpd2), GL_MAP_WRITE_BIT);
15100*8975f5c5SAndroid Build Coastguard Worker     memcpy(mappedBuffer, texDataUpd2, sizeof(texDataUpd2));
15101*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_TEXTURE_BUFFER);
15102*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15103*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15104*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, colUpd2, 1);
15105*8975f5c5SAndroid Build Coastguard Worker }
15106*8975f5c5SAndroid Build Coastguard Worker 
15107*8975f5c5SAndroid Build Coastguard Worker // Tests GL_RGB32UI texture buffer
TEST_P(RGBTextureBufferTestES31,Uint)15108*8975f5c5SAndroid Build Coastguard Worker TEST_P(RGBTextureBufferTestES31, Uint)
15109*8975f5c5SAndroid Build Coastguard Worker {
15110*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_buffer"));
15111*8975f5c5SAndroid Build Coastguard Worker 
15112*8975f5c5SAndroid Build Coastguard Worker     TestInt(GL_RGB32UI);
15113*8975f5c5SAndroid Build Coastguard Worker }
15114*8975f5c5SAndroid Build Coastguard Worker 
15115*8975f5c5SAndroid Build Coastguard Worker // Tests GL_RGB32I texture buffer
TEST_P(RGBTextureBufferTestES31,Sint)15116*8975f5c5SAndroid Build Coastguard Worker TEST_P(RGBTextureBufferTestES31, Sint)
15117*8975f5c5SAndroid Build Coastguard Worker {
15118*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_buffer"));
15119*8975f5c5SAndroid Build Coastguard Worker 
15120*8975f5c5SAndroid Build Coastguard Worker     TestInt(GL_RGB32I);
15121*8975f5c5SAndroid Build Coastguard Worker }
15122*8975f5c5SAndroid Build Coastguard Worker 
15123*8975f5c5SAndroid Build Coastguard Worker // Tests GL_RGB32F texture buffer
TEST_P(RGBTextureBufferTestES31,Float)15124*8975f5c5SAndroid Build Coastguard Worker TEST_P(RGBTextureBufferTestES31, Float)
15125*8975f5c5SAndroid Build Coastguard Worker {
15126*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_buffer"));
15127*8975f5c5SAndroid Build Coastguard Worker 
15128*8975f5c5SAndroid Build Coastguard Worker     // first texel(1) col
15129*8975f5c5SAndroid Build Coastguard Worker     GLColor col = MakeGLColor(11, 22, 33, 255);
15130*8975f5c5SAndroid Build Coastguard Worker     GLfloat texData[6]{};
15131*8975f5c5SAndroid Build Coastguard Worker     texData[3] = col.R;
15132*8975f5c5SAndroid Build Coastguard Worker     texData[4] = col.G;
15133*8975f5c5SAndroid Build Coastguard Worker     texData[5] = col.B;
15134*8975f5c5SAndroid Build Coastguard Worker 
15135*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
15136*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_BUFFER, texture);
15137*8975f5c5SAndroid Build Coastguard Worker 
15138*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
15139*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_TEXTURE_BUFFER, buffer);
15140*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_TEXTURE_BUFFER, sizeof(texData), texData, GL_STATIC_DRAW);
15141*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15142*8975f5c5SAndroid Build Coastguard Worker 
15143*8975f5c5SAndroid Build Coastguard Worker     GLProgram program;
15144*8975f5c5SAndroid Build Coastguard Worker     SetupTextureBufferDrawProgram(program, GL_RGB32F);
15145*8975f5c5SAndroid Build Coastguard Worker 
15146*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGB32F, buffer);
15147*8975f5c5SAndroid Build Coastguard Worker 
15148*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15149*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15150*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, col, 1);
15151*8975f5c5SAndroid Build Coastguard Worker 
15152*8975f5c5SAndroid Build Coastguard Worker     // Now update the buffer to check the converted data also gets updated.
15153*8975f5c5SAndroid Build Coastguard Worker     GLColor colUpd = MakeGLColor(77, 88, 99, 255);
15154*8975f5c5SAndroid Build Coastguard Worker     GLfloat texDataUpd[6]{};
15155*8975f5c5SAndroid Build Coastguard Worker     texDataUpd[3] = colUpd.R;
15156*8975f5c5SAndroid Build Coastguard Worker     texDataUpd[4] = colUpd.G;
15157*8975f5c5SAndroid Build Coastguard Worker     texDataUpd[5] = colUpd.B;
15158*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_TEXTURE_BUFFER, 0, sizeof(texDataUpd), texDataUpd);
15159*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15160*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15161*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, colUpd, 1);
15162*8975f5c5SAndroid Build Coastguard Worker 
15163*8975f5c5SAndroid Build Coastguard Worker     // Update with glMapBuffer (hits a different code path...)
15164*8975f5c5SAndroid Build Coastguard Worker     GLColor colUpd2 = MakeGLColor(111, 122, 133, 255);
15165*8975f5c5SAndroid Build Coastguard Worker     GLfloat texDataUpd2[6]{};
15166*8975f5c5SAndroid Build Coastguard Worker     texDataUpd2[3] = colUpd2.R;
15167*8975f5c5SAndroid Build Coastguard Worker     texDataUpd2[4] = colUpd2.G;
15168*8975f5c5SAndroid Build Coastguard Worker     texDataUpd2[5] = colUpd2.B;
15169*8975f5c5SAndroid Build Coastguard Worker     void *mappedBuffer =
15170*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_TEXTURE_BUFFER, 0, sizeof(texDataUpd2), GL_MAP_WRITE_BIT);
15171*8975f5c5SAndroid Build Coastguard Worker     memcpy(mappedBuffer, texDataUpd2, sizeof(texDataUpd2));
15172*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_TEXTURE_BUFFER);
15173*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15174*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "inputAttribute", 0.5f);
15175*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, colUpd2, 1);
15176*8975f5c5SAndroid Build Coastguard Worker }
15177*8975f5c5SAndroid Build Coastguard Worker 
SetupSSBOProgram(GLProgram & program)15178*8975f5c5SAndroid Build Coastguard Worker void SetupSSBOProgram(GLProgram &program)
15179*8975f5c5SAndroid Build Coastguard Worker {
15180*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 310 es
15181*8975f5c5SAndroid Build Coastguard Worker     precision highp float;
15182*8975f5c5SAndroid Build Coastguard Worker     in vec4 inputAttribute;
15183*8975f5c5SAndroid Build Coastguard Worker 
15184*8975f5c5SAndroid Build Coastguard Worker     void main()
15185*8975f5c5SAndroid Build Coastguard Worker     {
15186*8975f5c5SAndroid Build Coastguard Worker         gl_Position = inputAttribute;
15187*8975f5c5SAndroid Build Coastguard Worker     })";
15188*8975f5c5SAndroid Build Coastguard Worker 
15189*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
15190*8975f5c5SAndroid Build Coastguard Worker     layout(location = 0) out mediump vec4 color;
15191*8975f5c5SAndroid Build Coastguard Worker     layout(std140, binding = 0) buffer outBlock {
15192*8975f5c5SAndroid Build Coastguard Worker         uvec4 data[2];  // uvec4 to avoid padding
15193*8975f5c5SAndroid Build Coastguard Worker     };
15194*8975f5c5SAndroid Build Coastguard Worker     void main (void)
15195*8975f5c5SAndroid Build Coastguard Worker     {
15196*8975f5c5SAndroid Build Coastguard Worker         data[0] = uvec4(11u, 22u, 33u, 44u);
15197*8975f5c5SAndroid Build Coastguard Worker         data[1] = uvec4(55u, 66u, 0u, 0u);
15198*8975f5c5SAndroid Build Coastguard Worker         color = vec4(0);
15199*8975f5c5SAndroid Build Coastguard Worker     })";
15200*8975f5c5SAndroid Build Coastguard Worker 
15201*8975f5c5SAndroid Build Coastguard Worker     program.makeRaster(kVS, kFS);
15202*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(program.valid());
15203*8975f5c5SAndroid Build Coastguard Worker }
15204*8975f5c5SAndroid Build Coastguard Worker 
15205*8975f5c5SAndroid Build Coastguard Worker // Tests RGB32 texture buffer with a SSBO write
TEST_P(RGBTextureBufferTestES31,SSBOWrite)15206*8975f5c5SAndroid Build Coastguard Worker TEST_P(RGBTextureBufferTestES31, SSBOWrite)
15207*8975f5c5SAndroid Build Coastguard Worker {
15208*8975f5c5SAndroid Build Coastguard Worker     GLProgram programSSBO;
15209*8975f5c5SAndroid Build Coastguard Worker     SetupSSBOProgram(programSSBO);
15210*8975f5c5SAndroid Build Coastguard Worker 
15211*8975f5c5SAndroid Build Coastguard Worker     GLProgram programBufferDraw;
15212*8975f5c5SAndroid Build Coastguard Worker     SetupTextureBufferDrawProgram(programBufferDraw, GL_RGB32UI);
15213*8975f5c5SAndroid Build Coastguard Worker 
15214*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kBufferSize = 2 * 4 * sizeof(GLuint);
15215*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
15216*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
15217*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
15218*8975f5c5SAndroid Build Coastguard Worker     glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 0, buffer, 0, kBufferSize);
15219*8975f5c5SAndroid Build Coastguard Worker 
15220*8975f5c5SAndroid Build Coastguard Worker     drawQuad(programSSBO, "inputAttribute", 0.5f);
15221*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15222*8975f5c5SAndroid Build Coastguard Worker 
15223*8975f5c5SAndroid Build Coastguard Worker     glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
15224*8975f5c5SAndroid Build Coastguard Worker 
15225*8975f5c5SAndroid Build Coastguard Worker     glTexBufferEXT(GL_TEXTURE_BUFFER, GL_RGB32UI, buffer);
15226*8975f5c5SAndroid Build Coastguard Worker     drawQuad(programBufferDraw, "inputAttribute", 0.5f);
15227*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(44, 55, 66, 255), 1);
15228*8975f5c5SAndroid Build Coastguard Worker }
15229*8975f5c5SAndroid Build Coastguard Worker 
15230*8975f5c5SAndroid Build Coastguard Worker class TextureTestES31 : public ANGLETest<>
15231*8975f5c5SAndroid Build Coastguard Worker {
15232*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureTestES31()15233*8975f5c5SAndroid Build Coastguard Worker     TextureTestES31()
15234*8975f5c5SAndroid Build Coastguard Worker     {
15235*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
15236*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
15237*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
15238*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
15239*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
15240*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
15241*8975f5c5SAndroid Build Coastguard Worker     }
15242*8975f5c5SAndroid Build Coastguard Worker };
15243*8975f5c5SAndroid Build Coastguard Worker 
15244*8975f5c5SAndroid Build Coastguard Worker // Verify that image uniforms can link in separable programs
TEST_P(TextureTestES31,LinkedImageUniforms)15245*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureTestES31, LinkedImageUniforms)
15246*8975f5c5SAndroid Build Coastguard Worker {
15247*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
15248*8975f5c5SAndroid Build Coastguard Worker 
15249*8975f5c5SAndroid Build Coastguard Worker     GLint maxVertexImageUniforms;
15250*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_VERTEX_IMAGE_UNIFORMS, &maxVertexImageUniforms);
15251*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(maxVertexImageUniforms == 0);
15252*8975f5c5SAndroid Build Coastguard Worker 
15253*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 310 es
15254*8975f5c5SAndroid Build Coastguard Worker precision highp float;
15255*8975f5c5SAndroid Build Coastguard Worker precision highp image2D;
15256*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, r32f) uniform image2D img;
15257*8975f5c5SAndroid Build Coastguard Worker 
15258*8975f5c5SAndroid Build Coastguard Worker void main()
15259*8975f5c5SAndroid Build Coastguard Worker {
15260*8975f5c5SAndroid Build Coastguard Worker     vec2 position = -imageLoad(img, ivec2(0, 0)).rr;
15261*8975f5c5SAndroid Build Coastguard Worker     if (gl_VertexID == 1)
15262*8975f5c5SAndroid Build Coastguard Worker         position = vec2(3, -1);
15263*8975f5c5SAndroid Build Coastguard Worker     else if (gl_VertexID == 2)
15264*8975f5c5SAndroid Build Coastguard Worker         position = vec2(-1, 3);
15265*8975f5c5SAndroid Build Coastguard Worker 
15266*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position, 0, 1);
15267*8975f5c5SAndroid Build Coastguard Worker })";
15268*8975f5c5SAndroid Build Coastguard Worker 
15269*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
15270*8975f5c5SAndroid Build Coastguard Worker precision highp float;
15271*8975f5c5SAndroid Build Coastguard Worker precision highp image2D;
15272*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, r32f) uniform image2D img;
15273*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color;
15274*8975f5c5SAndroid Build Coastguard Worker 
15275*8975f5c5SAndroid Build Coastguard Worker void main()
15276*8975f5c5SAndroid Build Coastguard Worker {
15277*8975f5c5SAndroid Build Coastguard Worker     color = imageLoad(img, ivec2(0, 0));
15278*8975f5c5SAndroid Build Coastguard Worker })";
15279*8975f5c5SAndroid Build Coastguard Worker 
15280*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
15281*8975f5c5SAndroid Build Coastguard Worker 
15282*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
15283*8975f5c5SAndroid Build Coastguard Worker     GLfloat value = 1.0;
15284*8975f5c5SAndroid Build Coastguard Worker 
15285*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
15286*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, 1, 1);
15287*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RED, GL_FLOAT, &value);
15288*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
15289*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
15290*8975f5c5SAndroid Build Coastguard Worker 
15291*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32F);
15292*8975f5c5SAndroid Build Coastguard Worker 
15293*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
15294*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
15295*8975f5c5SAndroid Build Coastguard Worker 
15296*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
15297*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15298*8975f5c5SAndroid Build Coastguard Worker }
15299*8975f5c5SAndroid Build Coastguard Worker 
15300*8975f5c5SAndroid Build Coastguard Worker // Test that layer-related parameters are ignored when binding a 2D texture
TEST_P(TextureTestES31,Texture2DLayered)15301*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureTestES31, Texture2DLayered)
15302*8975f5c5SAndroid Build Coastguard Worker {
15303*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
15304*8975f5c5SAndroid Build Coastguard Worker precision highp float;
15305*8975f5c5SAndroid Build Coastguard Worker precision highp image2D;
15306*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, r32f) uniform image2D img;
15307*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color;
15308*8975f5c5SAndroid Build Coastguard Worker 
15309*8975f5c5SAndroid Build Coastguard Worker void main()
15310*8975f5c5SAndroid Build Coastguard Worker {
15311*8975f5c5SAndroid Build Coastguard Worker     color = imageLoad(img, ivec2(0, 0));
15312*8975f5c5SAndroid Build Coastguard Worker })";
15313*8975f5c5SAndroid Build Coastguard Worker 
15314*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS);
15315*8975f5c5SAndroid Build Coastguard Worker 
15316*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
15317*8975f5c5SAndroid Build Coastguard Worker     GLfloat value = 1.0;
15318*8975f5c5SAndroid Build Coastguard Worker 
15319*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
15320*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, 1, 1);
15321*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RED, GL_FLOAT, &value);
15322*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
15323*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
15324*8975f5c5SAndroid Build Coastguard Worker 
15325*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 1.0, 0.0, 1.0);
15326*8975f5c5SAndroid Build Coastguard Worker     for (const bool layered : {true, false})
15327*8975f5c5SAndroid Build Coastguard Worker     {
15328*8975f5c5SAndroid Build Coastguard Worker         for (const GLint layer : {0, 1})
15329*8975f5c5SAndroid Build Coastguard Worker         {
15330*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
15331*8975f5c5SAndroid Build Coastguard Worker             glBindImageTexture(0, texture, 0, layered, layer, GL_READ_ONLY, GL_R32F);
15332*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
15333*8975f5c5SAndroid Build Coastguard Worker 
15334*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15335*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red)
15336*8975f5c5SAndroid Build Coastguard Worker                 << "Layered: " << (layered ? "true" : "false") << ", Layer: " << layer;
15337*8975f5c5SAndroid Build Coastguard Worker         }
15338*8975f5c5SAndroid Build Coastguard Worker     }
15339*8975f5c5SAndroid Build Coastguard Worker }
15340*8975f5c5SAndroid Build Coastguard Worker 
15341*8975f5c5SAndroid Build Coastguard Worker // Test that rebinding the shader image level without changing the program works
TEST_P(TextureTestES31,Texture2DChangeLevel)15342*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureTestES31, Texture2DChangeLevel)
15343*8975f5c5SAndroid Build Coastguard Worker {
15344*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
15345*8975f5c5SAndroid Build Coastguard Worker precision highp float;
15346*8975f5c5SAndroid Build Coastguard Worker precision highp image2D;
15347*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, r32f) uniform image2D img;
15348*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color;
15349*8975f5c5SAndroid Build Coastguard Worker 
15350*8975f5c5SAndroid Build Coastguard Worker void main()
15351*8975f5c5SAndroid Build Coastguard Worker {
15352*8975f5c5SAndroid Build Coastguard Worker     color = imageLoad(img, ivec2(0, 0));
15353*8975f5c5SAndroid Build Coastguard Worker })";
15354*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS);
15355*8975f5c5SAndroid Build Coastguard Worker 
15356*8975f5c5SAndroid Build Coastguard Worker     // Must be active before calling drawQuad to avoid program switches
15357*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
15358*8975f5c5SAndroid Build Coastguard Worker 
15359*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
15360*8975f5c5SAndroid Build Coastguard Worker     const GLfloat level0[4] = {0.5, 0.5, 0.5, 0.5};
15361*8975f5c5SAndroid Build Coastguard Worker     const GLfloat level1[1] = {1.0};
15362*8975f5c5SAndroid Build Coastguard Worker 
15363*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
15364*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_R32F, 2, 2);
15365*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RED, GL_FLOAT, level0);
15366*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL_RED, GL_FLOAT, level1);
15367*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
15368*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
15369*8975f5c5SAndroid Build Coastguard Worker 
15370*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15371*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15372*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15373*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(127, 0, 0, 255), 1);
15374*8975f5c5SAndroid Build Coastguard Worker 
15375*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 1, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15376*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15377*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15378*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
15379*8975f5c5SAndroid Build Coastguard Worker }
15380*8975f5c5SAndroid Build Coastguard Worker 
15381*8975f5c5SAndroid Build Coastguard Worker // Test that rebinding the shader image layer/level without changing the program works
TEST_P(TextureTestES31,Texture2DArrayChangeLayerLevel)15382*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureTestES31, Texture2DArrayChangeLayerLevel)
15383*8975f5c5SAndroid Build Coastguard Worker {
15384*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
15385*8975f5c5SAndroid Build Coastguard Worker precision highp float;
15386*8975f5c5SAndroid Build Coastguard Worker precision highp image2D;
15387*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, r32f) uniform image2D img;
15388*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color;
15389*8975f5c5SAndroid Build Coastguard Worker 
15390*8975f5c5SAndroid Build Coastguard Worker void main()
15391*8975f5c5SAndroid Build Coastguard Worker {
15392*8975f5c5SAndroid Build Coastguard Worker     color = imageLoad(img, ivec2(0, 0));
15393*8975f5c5SAndroid Build Coastguard Worker })";
15394*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS);
15395*8975f5c5SAndroid Build Coastguard Worker 
15396*8975f5c5SAndroid Build Coastguard Worker     // Must be active before calling drawQuad to avoid program switches
15397*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
15398*8975f5c5SAndroid Build Coastguard Worker 
15399*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
15400*8975f5c5SAndroid Build Coastguard Worker     const GLfloat level0layer0[4] = {0.25, 0.25, 0.25, 0.25};
15401*8975f5c5SAndroid Build Coastguard Worker     const GLfloat level0layer1[4] = {0.50, 0.50, 0.50, 0.50};
15402*8975f5c5SAndroid Build Coastguard Worker     const GLfloat level1layer0[1] = {0.75};
15403*8975f5c5SAndroid Build Coastguard Worker     const GLfloat level1layer1[1] = {1.00};
15404*8975f5c5SAndroid Build Coastguard Worker 
15405*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
15406*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 2, GL_R32F, 2, 2, 2);
15407*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 2, 2, 1, GL_RED, GL_FLOAT, level0layer0);
15408*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, 2, 2, 1, GL_RED, GL_FLOAT, level0layer1);
15409*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 0, 1, 1, 1, GL_RED, GL_FLOAT, level1layer0);
15410*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 1, 1, 1, 1, GL_RED, GL_FLOAT, level1layer1);
15411*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
15412*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
15413*8975f5c5SAndroid Build Coastguard Worker 
15414*8975f5c5SAndroid Build Coastguard Worker     // Level 0, layer 0
15415*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15416*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15417*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15418*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(63, 0, 0, 255), 1);
15419*8975f5c5SAndroid Build Coastguard Worker 
15420*8975f5c5SAndroid Build Coastguard Worker     // Level 0, layer 1
15421*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 0, GL_FALSE, 1, GL_READ_WRITE, GL_R32F);
15422*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15423*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15424*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(127, 0, 0, 255), 1);
15425*8975f5c5SAndroid Build Coastguard Worker 
15426*8975f5c5SAndroid Build Coastguard Worker     // Level 1, layer 0
15427*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 1, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15428*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15429*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15430*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(191, 0, 0, 255), 1);
15431*8975f5c5SAndroid Build Coastguard Worker 
15432*8975f5c5SAndroid Build Coastguard Worker     // Level 1, layer 1
15433*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture, 1, GL_FALSE, 1, GL_READ_WRITE, GL_R32F);
15434*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15435*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15436*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 0, 0, 255), 1);
15437*8975f5c5SAndroid Build Coastguard Worker }
15438*8975f5c5SAndroid Build Coastguard Worker 
15439*8975f5c5SAndroid Build Coastguard Worker // Test that switching between a 2D texture and a layer of a 2D array texture works
TEST_P(TextureTestES31,Texture2DTo2DArraySwitch)15440*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureTestES31, Texture2DTo2DArraySwitch)
15441*8975f5c5SAndroid Build Coastguard Worker {
15442*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
15443*8975f5c5SAndroid Build Coastguard Worker precision highp float;
15444*8975f5c5SAndroid Build Coastguard Worker precision highp image2D;
15445*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, r32f) uniform image2D img;
15446*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color;
15447*8975f5c5SAndroid Build Coastguard Worker 
15448*8975f5c5SAndroid Build Coastguard Worker void main()
15449*8975f5c5SAndroid Build Coastguard Worker {
15450*8975f5c5SAndroid Build Coastguard Worker     color = imageLoad(img, ivec2(0, 0));
15451*8975f5c5SAndroid Build Coastguard Worker })";
15452*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS);
15453*8975f5c5SAndroid Build Coastguard Worker 
15454*8975f5c5SAndroid Build Coastguard Worker     // Must be active before calling drawQuad to avoid program switches
15455*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
15456*8975f5c5SAndroid Build Coastguard Worker 
15457*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2D;
15458*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2DArray;
15459*8975f5c5SAndroid Build Coastguard Worker     const GLfloat data2D[1]       = {0.50};
15460*8975f5c5SAndroid Build Coastguard Worker     const GLfloat data2DArray0[1] = {0.25};
15461*8975f5c5SAndroid Build Coastguard Worker     const GLfloat data2DArray1[1] = {0.75};
15462*8975f5c5SAndroid Build Coastguard Worker 
15463*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2D);
15464*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, 1, 1);
15465*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RED, GL_FLOAT, data2D);
15466*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
15467*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
15468*8975f5c5SAndroid Build Coastguard Worker 
15469*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture2DArray);
15470*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R32F, 1, 1, 2);
15471*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 1, 1, 1, GL_RED, GL_FLOAT, data2DArray0);
15472*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, 1, 1, 1, GL_RED, GL_FLOAT, data2DArray1);
15473*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
15474*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
15475*8975f5c5SAndroid Build Coastguard Worker 
15476*8975f5c5SAndroid Build Coastguard Worker     // Texture2D
15477*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture2D, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15478*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15479*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15480*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(127, 0, 0, 255), 1);
15481*8975f5c5SAndroid Build Coastguard Worker 
15482*8975f5c5SAndroid Build Coastguard Worker     // Texture2D array, layer 0
15483*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture2DArray, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15484*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15485*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15486*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(63, 0, 0, 255), 1);
15487*8975f5c5SAndroid Build Coastguard Worker 
15488*8975f5c5SAndroid Build Coastguard Worker     // Texture2D again
15489*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture2D, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
15490*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15491*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15492*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(127, 0, 0, 255), 1);
15493*8975f5c5SAndroid Build Coastguard Worker 
15494*8975f5c5SAndroid Build Coastguard Worker     // Texture2D array, layer 1
15495*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, texture2DArray, 0, GL_FALSE, 1, GL_READ_WRITE, GL_R32F);
15496*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
15497*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.0f);
15498*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(191, 0, 0, 255), 1);
15499*8975f5c5SAndroid Build Coastguard Worker }
15500*8975f5c5SAndroid Build Coastguard Worker 
15501*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
15502*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
15503*8975f5c5SAndroid Build Coastguard Worker #define ES2_EMULATE_COPY_TEX_IMAGE_VIA_SUB()             \
15504*8975f5c5SAndroid Build Coastguard Worker     ES2_OPENGL().enable(Feature::EmulateCopyTexImage2D), \
15505*8975f5c5SAndroid Build Coastguard Worker         ES2_OPENGLES().enable(Feature::EmulateCopyTexImage2D)
15506*8975f5c5SAndroid Build Coastguard Worker #define ES3_EMULATE_COPY_TEX_IMAGE_VIA_SUB()             \
15507*8975f5c5SAndroid Build Coastguard Worker     ES3_OPENGL().enable(Feature::EmulateCopyTexImage2D), \
15508*8975f5c5SAndroid Build Coastguard Worker         ES3_OPENGLES().enable(Feature::EmulateCopyTexImage2D)
15509*8975f5c5SAndroid Build Coastguard Worker #define ES2_EMULATE_COPY_TEX_IMAGE()                                      \
15510*8975f5c5SAndroid Build Coastguard Worker     ES2_OPENGL().enable(Feature::EmulateCopyTexImage2DFromRenderbuffers), \
15511*8975f5c5SAndroid Build Coastguard Worker         ES2_OPENGLES().enable(Feature::EmulateCopyTexImage2DFromRenderbuffers)
15512*8975f5c5SAndroid Build Coastguard Worker #define ES3_EMULATE_COPY_TEX_IMAGE()                                      \
15513*8975f5c5SAndroid Build Coastguard Worker     ES3_OPENGL().enable(Feature::EmulateCopyTexImage2DFromRenderbuffers), \
15514*8975f5c5SAndroid Build Coastguard Worker         ES3_OPENGLES().enable(Feature::EmulateCopyTexImage2DFromRenderbuffers)
15515*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(Texture2DTest,
15516*8975f5c5SAndroid Build Coastguard Worker                        ANGLE_ALL_TEST_PLATFORMS_ES2,
15517*8975f5c5SAndroid Build Coastguard Worker                        ES2_EMULATE_COPY_TEX_IMAGE_VIA_SUB(),
15518*8975f5c5SAndroid Build Coastguard Worker                        ES2_EMULATE_COPY_TEX_IMAGE(),
15519*8975f5c5SAndroid Build Coastguard Worker                        ES2_WEBGPU());
15520*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(TextureCubeTest);
15521*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(Texture2DTestWithDrawScale);
15522*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(Sampler2DAsFunctionParameterTest);
15523*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerArrayTest);
15524*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerArrayAsFunctionParameterTest);
15525*8975f5c5SAndroid Build Coastguard Worker 
15526*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES3);
15527*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(Texture2DTestES3,
15528*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::AllocateNonZeroMemory),
15529*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::ForceFallbackFormat));
15530*8975f5c5SAndroid Build Coastguard Worker 
15531*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DMemoryTestES3);
15532*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DMemoryTestES3);
15533*8975f5c5SAndroid Build Coastguard Worker 
15534*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES3YUV);
15535*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(Texture2DTestES3YUV,
15536*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::PreferLinearFilterForYUV),
15537*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::DisableProgramCaching));
15538*8975f5c5SAndroid Build Coastguard Worker 
15539*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES3RobustInit);
15540*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DTestES3RobustInit);
15541*8975f5c5SAndroid Build Coastguard Worker 
15542*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES3Foveation);
15543*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(
15544*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestES3Foveation,
15545*8975f5c5SAndroid Build Coastguard Worker     ES3_VULKAN().enable(Feature::GenerateFragmentShadingRateAttchementWithCpu));
15546*8975f5c5SAndroid Build Coastguard Worker 
15547*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES31Foveation);
15548*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31_AND(
15549*8975f5c5SAndroid Build Coastguard Worker     Texture2DTestES31Foveation,
15550*8975f5c5SAndroid Build Coastguard Worker     ES31_VULKAN().enable(Feature::GenerateFragmentShadingRateAttchementWithCpu));
15551*8975f5c5SAndroid Build Coastguard Worker 
15552*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES31PPO);
15553*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(Texture2DTestES31PPO);
15554*8975f5c5SAndroid Build Coastguard Worker 
15555*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DBaseMaxTestES3);
15556*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DBaseMaxTestES3);
15557*8975f5c5SAndroid Build Coastguard Worker 
15558*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(Texture3DTestES2);
15559*8975f5c5SAndroid Build Coastguard Worker 
15560*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture3DTestES3);
15561*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture3DTestES3);
15562*8975f5c5SAndroid Build Coastguard Worker 
15563*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DIntegerAlpha1TestES3);
15564*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DIntegerAlpha1TestES3);
15565*8975f5c5SAndroid Build Coastguard Worker 
15566*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DUnsignedIntegerAlpha1TestES3);
15567*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DUnsignedIntegerAlpha1TestES3);
15568*8975f5c5SAndroid Build Coastguard Worker 
15569*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ShadowSamplerPlusSampler3DTestES3);
15570*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ShadowSamplerPlusSampler3DTestES3);
15571*8975f5c5SAndroid Build Coastguard Worker 
15572*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SamplerTypeMixTestES3);
15573*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(SamplerTypeMixTestES3);
15574*8975f5c5SAndroid Build Coastguard Worker 
15575*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DArrayTestES3);
15576*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayTestES3);
15577*8975f5c5SAndroid Build Coastguard Worker 
15578*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureSizeTextureArrayTest);
15579*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureSizeTextureArrayTest);
15580*8975f5c5SAndroid Build Coastguard Worker 
15581*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructTest);
15582*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructAsFunctionParameterTest);
15583*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructArrayAsFunctionParameterTest);
15584*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerInNestedStructAsFunctionParameterTest);
15585*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SamplerInStructAndOtherVariableTest);
15586*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(TextureAnisotropyTest);
15587*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(TextureBorderClampTest);
15588*8975f5c5SAndroid Build Coastguard Worker 
15589*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureBorderClampTestES3);
15590*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureBorderClampTestES3);
15591*8975f5c5SAndroid Build Coastguard Worker 
15592*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureBorderClampIntegerTestES3);
15593*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureBorderClampIntegerTestES3);
15594*8975f5c5SAndroid Build Coastguard Worker 
15595*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(TextureMirrorClampToEdgeTest);
15596*8975f5c5SAndroid Build Coastguard Worker 
15597*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureMirrorClampToEdgeTestES3);
15598*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureMirrorClampToEdgeTestES3);
15599*8975f5c5SAndroid Build Coastguard Worker 
15600*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureMirrorClampToEdgeIntegerTestES3);
15601*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureMirrorClampToEdgeIntegerTestES3);
15602*8975f5c5SAndroid Build Coastguard Worker 
15603*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(TextureLimitsTest);
15604*8975f5c5SAndroid Build Coastguard Worker 
15605*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DNorm16TestES3);
15606*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DNorm16TestES3);
15607*8975f5c5SAndroid Build Coastguard Worker 
15608*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(Texture2DRGTest,
15609*8975f5c5SAndroid Build Coastguard Worker                        ANGLE_ALL_TEST_PLATFORMS_ES2,
15610*8975f5c5SAndroid Build Coastguard Worker                        ANGLE_ALL_TEST_PLATFORMS_ES3,
15611*8975f5c5SAndroid Build Coastguard Worker                        ES2_EMULATE_COPY_TEX_IMAGE_VIA_SUB(),
15612*8975f5c5SAndroid Build Coastguard Worker                        ES3_EMULATE_COPY_TEX_IMAGE_VIA_SUB(),
15613*8975f5c5SAndroid Build Coastguard Worker                        ES2_EMULATE_COPY_TEX_IMAGE(),
15614*8975f5c5SAndroid Build Coastguard Worker                        ES3_EMULATE_COPY_TEX_IMAGE());
15615*8975f5c5SAndroid Build Coastguard Worker 
15616*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DFloatTestES3);
15617*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DFloatTestES3);
15618*8975f5c5SAndroid Build Coastguard Worker 
15619*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(Texture2DFloatTestES2);
15620*8975f5c5SAndroid Build Coastguard Worker 
15621*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureCubeTestES3);
15622*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureCubeTestES3);
15623*8975f5c5SAndroid Build Coastguard Worker 
15624*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureCubeTestES32);
15625*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES32(TextureCubeTestES32);
15626*8975f5c5SAndroid Build Coastguard Worker 
15627*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DIntegerTestES3);
15628*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DIntegerTestES3);
15629*8975f5c5SAndroid Build Coastguard Worker 
15630*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureCubeIntegerTestES3);
15631*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureCubeIntegerTestES3);
15632*8975f5c5SAndroid Build Coastguard Worker 
15633*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureCubeIntegerEdgeTestES3);
15634*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureCubeIntegerEdgeTestES3);
15635*8975f5c5SAndroid Build Coastguard Worker 
15636*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DIntegerProjectiveOffsetTestES3);
15637*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DIntegerProjectiveOffsetTestES3);
15638*8975f5c5SAndroid Build Coastguard Worker 
15639*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DArrayIntegerTestES3);
15640*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayIntegerTestES3);
15641*8975f5c5SAndroid Build Coastguard Worker 
15642*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture3DIntegerTestES3);
15643*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(Texture3DIntegerTestES3);
15644*8975f5c5SAndroid Build Coastguard Worker 
15645*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(Texture2DDepthTest);
15646*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(PBOCompressedTextureTest);
15647*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ETC1CompressedTextureTest);
15648*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(PBOCompressedTexture3DTest);
15649*8975f5c5SAndroid Build Coastguard Worker 
15650*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureBufferTestES31);
15651*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(TextureBufferTestES31);
15652*8975f5c5SAndroid Build Coastguard Worker 
15653*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureTestES31);
15654*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(TextureTestES31);
15655*8975f5c5SAndroid Build Coastguard Worker 
15656*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CopyImageTestES31);
15657*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(CopyImageTestES31);
15658*8975f5c5SAndroid Build Coastguard Worker 
15659*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(TextureChangeStorageUploadTest);
15660*8975f5c5SAndroid Build Coastguard Worker 
15661*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ExtraSamplerCubeShadowUseTest);
15662*8975f5c5SAndroid Build Coastguard Worker 
15663*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DDepthStencilTestES3);
15664*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(Texture2DDepthStencilTestES3,
15665*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::ForceFallbackFormat));
15666*8975f5c5SAndroid Build Coastguard Worker 
15667*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RGBTextureBufferTestES31);
15668*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(RGBTextureBufferTestES31);
15669*8975f5c5SAndroid Build Coastguard Worker 
15670*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
15671