xref: /aosp_15_r20/external/angle/src/tests/gl_tests/RobustResourceInitTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 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 // RobustResourceInitTest: Tests for GL_ANGLE_robust_resource_initialization.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "util/gles_loader_autogen.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker namespace angle
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker constexpr char kSimpleTextureVertexShader[] =
17*8975f5c5SAndroid Build Coastguard Worker     "#version 300 es\n"
18*8975f5c5SAndroid Build Coastguard Worker     "in vec4 position;\n"
19*8975f5c5SAndroid Build Coastguard Worker     "out vec2 texcoord;\n"
20*8975f5c5SAndroid Build Coastguard Worker     "void main()\n"
21*8975f5c5SAndroid Build Coastguard Worker     "{\n"
22*8975f5c5SAndroid Build Coastguard Worker     "    gl_Position = position;\n"
23*8975f5c5SAndroid Build Coastguard Worker     "    texcoord = vec2(position.xy * 0.5 - 0.5);\n"
24*8975f5c5SAndroid Build Coastguard Worker     "}";
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Would be useful in a shared place in a utils folder.
UncompressDXTBlock(int destX,int destY,int destWidth,const std::vector<uint8_t> & src,int srcOffset,GLenum format,std::vector<GLColor> * colorsOut)27*8975f5c5SAndroid Build Coastguard Worker void UncompressDXTBlock(int destX,
28*8975f5c5SAndroid Build Coastguard Worker                         int destY,
29*8975f5c5SAndroid Build Coastguard Worker                         int destWidth,
30*8975f5c5SAndroid Build Coastguard Worker                         const std::vector<uint8_t> &src,
31*8975f5c5SAndroid Build Coastguard Worker                         int srcOffset,
32*8975f5c5SAndroid Build Coastguard Worker                         GLenum format,
33*8975f5c5SAndroid Build Coastguard Worker                         std::vector<GLColor> *colorsOut)
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker     auto make565 = [src](int offset) {
36*8975f5c5SAndroid Build Coastguard Worker         return static_cast<int>(src[offset + 0]) + static_cast<int>(src[offset + 1]) * 256;
37*8975f5c5SAndroid Build Coastguard Worker     };
38*8975f5c5SAndroid Build Coastguard Worker     auto make8888From565 = [](int c) {
39*8975f5c5SAndroid Build Coastguard Worker         return GLColor(
40*8975f5c5SAndroid Build Coastguard Worker             static_cast<GLubyte>(floor(static_cast<float>((c >> 11) & 0x1F) * (255.0f / 31.0f))),
41*8975f5c5SAndroid Build Coastguard Worker             static_cast<GLubyte>(floor(static_cast<float>((c >> 5) & 0x3F) * (255.0f / 63.0f))),
42*8975f5c5SAndroid Build Coastguard Worker             static_cast<GLubyte>(floor(static_cast<float>((c >> 0) & 0x1F) * (255.0f / 31.0f))),
43*8975f5c5SAndroid Build Coastguard Worker             255);
44*8975f5c5SAndroid Build Coastguard Worker     };
45*8975f5c5SAndroid Build Coastguard Worker     auto mix = [](int mult, GLColor c0, GLColor c1, float div) {
46*8975f5c5SAndroid Build Coastguard Worker         GLColor r = GLColor::transparentBlack;
47*8975f5c5SAndroid Build Coastguard Worker         for (int ii = 0; ii < 4; ++ii)
48*8975f5c5SAndroid Build Coastguard Worker         {
49*8975f5c5SAndroid Build Coastguard Worker             r[ii] = static_cast<GLubyte>(floor(static_cast<float>(c0[ii] * mult + c1[ii]) / div));
50*8975f5c5SAndroid Build Coastguard Worker         }
51*8975f5c5SAndroid Build Coastguard Worker         return r;
52*8975f5c5SAndroid Build Coastguard Worker     };
53*8975f5c5SAndroid Build Coastguard Worker     bool isDXT1 =
54*8975f5c5SAndroid Build Coastguard Worker         (format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) || (format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
55*8975f5c5SAndroid Build Coastguard Worker     int colorOffset               = srcOffset + (isDXT1 ? 0 : 8);
56*8975f5c5SAndroid Build Coastguard Worker     int color0                    = make565(colorOffset + 0);
57*8975f5c5SAndroid Build Coastguard Worker     int color1                    = make565(colorOffset + 2);
58*8975f5c5SAndroid Build Coastguard Worker     bool c0gtc1                   = color0 > color1 || !isDXT1;
59*8975f5c5SAndroid Build Coastguard Worker     GLColor rgba0                 = make8888From565(color0);
60*8975f5c5SAndroid Build Coastguard Worker     GLColor rgba1                 = make8888From565(color1);
61*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 4> colors = {{rgba0, rgba1,
62*8975f5c5SAndroid Build Coastguard Worker                                       c0gtc1 ? mix(2, rgba0, rgba1, 3) : mix(1, rgba0, rgba1, 2),
63*8975f5c5SAndroid Build Coastguard Worker                                       c0gtc1 ? mix(2, rgba1, rgba0, 3) : GLColor::black}};
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker     // Original comment preserved below for posterity:
66*8975f5c5SAndroid Build Coastguard Worker     // "yea I know there is a lot of math in this inner loop. so sue me."
67*8975f5c5SAndroid Build Coastguard Worker     for (int yy = 0; yy < 4; ++yy)
68*8975f5c5SAndroid Build Coastguard Worker     {
69*8975f5c5SAndroid Build Coastguard Worker         uint8_t pixels = src[colorOffset + 4 + yy];
70*8975f5c5SAndroid Build Coastguard Worker         for (int xx = 0; xx < 4; ++xx)
71*8975f5c5SAndroid Build Coastguard Worker         {
72*8975f5c5SAndroid Build Coastguard Worker             uint8_t code     = (pixels >> (xx * 2)) & 0x3;
73*8975f5c5SAndroid Build Coastguard Worker             GLColor srcColor = colors[code];
74*8975f5c5SAndroid Build Coastguard Worker             uint8_t alpha    = 0;
75*8975f5c5SAndroid Build Coastguard Worker             switch (format)
76*8975f5c5SAndroid Build Coastguard Worker             {
77*8975f5c5SAndroid Build Coastguard Worker                 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
78*8975f5c5SAndroid Build Coastguard Worker                     alpha = 255;
79*8975f5c5SAndroid Build Coastguard Worker                     break;
80*8975f5c5SAndroid Build Coastguard Worker                 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
81*8975f5c5SAndroid Build Coastguard Worker                     alpha = (code == 3 && !c0gtc1) ? 0 : 255;
82*8975f5c5SAndroid Build Coastguard Worker                     break;
83*8975f5c5SAndroid Build Coastguard Worker                 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
84*8975f5c5SAndroid Build Coastguard Worker                 {
85*8975f5c5SAndroid Build Coastguard Worker                     uint8_t alpha0 = src[srcOffset + yy * 2 + (xx >> 1)];
86*8975f5c5SAndroid Build Coastguard Worker                     uint8_t alpha1 = (alpha0 >> ((xx % 2) * 4)) & 0xF;
87*8975f5c5SAndroid Build Coastguard Worker                     alpha          = alpha1 | (alpha1 << 4);
88*8975f5c5SAndroid Build Coastguard Worker                 }
89*8975f5c5SAndroid Build Coastguard Worker                 break;
90*8975f5c5SAndroid Build Coastguard Worker                 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
91*8975f5c5SAndroid Build Coastguard Worker                 {
92*8975f5c5SAndroid Build Coastguard Worker                     uint8_t alpha0 = src[srcOffset + 0];
93*8975f5c5SAndroid Build Coastguard Worker                     uint8_t alpha1 = src[srcOffset + 1];
94*8975f5c5SAndroid Build Coastguard Worker                     int alphaOff   = (yy >> 1) * 3 + 2;
95*8975f5c5SAndroid Build Coastguard Worker                     uint32_t alphaBits =
96*8975f5c5SAndroid Build Coastguard Worker                         static_cast<uint32_t>(src[srcOffset + alphaOff + 0]) +
97*8975f5c5SAndroid Build Coastguard Worker                         static_cast<uint32_t>(src[srcOffset + alphaOff + 1]) * 256 +
98*8975f5c5SAndroid Build Coastguard Worker                         static_cast<uint32_t>(src[srcOffset + alphaOff + 2]) * 65536;
99*8975f5c5SAndroid Build Coastguard Worker                     int alphaShift    = (yy % 2) * 12 + xx * 3;
100*8975f5c5SAndroid Build Coastguard Worker                     uint8_t alphaCode = static_cast<uint8_t>((alphaBits >> alphaShift) & 0x7);
101*8975f5c5SAndroid Build Coastguard Worker                     if (alpha0 > alpha1)
102*8975f5c5SAndroid Build Coastguard Worker                     {
103*8975f5c5SAndroid Build Coastguard Worker                         switch (alphaCode)
104*8975f5c5SAndroid Build Coastguard Worker                         {
105*8975f5c5SAndroid Build Coastguard Worker                             case 0:
106*8975f5c5SAndroid Build Coastguard Worker                                 alpha = alpha0;
107*8975f5c5SAndroid Build Coastguard Worker                                 break;
108*8975f5c5SAndroid Build Coastguard Worker                             case 1:
109*8975f5c5SAndroid Build Coastguard Worker                                 alpha = alpha1;
110*8975f5c5SAndroid Build Coastguard Worker                                 break;
111*8975f5c5SAndroid Build Coastguard Worker                             default:
112*8975f5c5SAndroid Build Coastguard Worker                                 // TODO(jmadill): fix rounding
113*8975f5c5SAndroid Build Coastguard Worker                                 alpha = ((8 - alphaCode) * alpha0 + (alphaCode - 1) * alpha1) / 7;
114*8975f5c5SAndroid Build Coastguard Worker                                 break;
115*8975f5c5SAndroid Build Coastguard Worker                         }
116*8975f5c5SAndroid Build Coastguard Worker                     }
117*8975f5c5SAndroid Build Coastguard Worker                     else
118*8975f5c5SAndroid Build Coastguard Worker                     {
119*8975f5c5SAndroid Build Coastguard Worker                         switch (alphaCode)
120*8975f5c5SAndroid Build Coastguard Worker                         {
121*8975f5c5SAndroid Build Coastguard Worker                             case 0:
122*8975f5c5SAndroid Build Coastguard Worker                                 alpha = alpha0;
123*8975f5c5SAndroid Build Coastguard Worker                                 break;
124*8975f5c5SAndroid Build Coastguard Worker                             case 1:
125*8975f5c5SAndroid Build Coastguard Worker                                 alpha = alpha1;
126*8975f5c5SAndroid Build Coastguard Worker                                 break;
127*8975f5c5SAndroid Build Coastguard Worker                             case 6:
128*8975f5c5SAndroid Build Coastguard Worker                                 alpha = 0;
129*8975f5c5SAndroid Build Coastguard Worker                                 break;
130*8975f5c5SAndroid Build Coastguard Worker                             case 7:
131*8975f5c5SAndroid Build Coastguard Worker                                 alpha = 255;
132*8975f5c5SAndroid Build Coastguard Worker                                 break;
133*8975f5c5SAndroid Build Coastguard Worker                             default:
134*8975f5c5SAndroid Build Coastguard Worker                                 // TODO(jmadill): fix rounding
135*8975f5c5SAndroid Build Coastguard Worker                                 alpha = ((6 - alphaCode) * alpha0 + (alphaCode - 1) * alpha1) / 5;
136*8975f5c5SAndroid Build Coastguard Worker                                 break;
137*8975f5c5SAndroid Build Coastguard Worker                         }
138*8975f5c5SAndroid Build Coastguard Worker                     }
139*8975f5c5SAndroid Build Coastguard Worker                 }
140*8975f5c5SAndroid Build Coastguard Worker                 break;
141*8975f5c5SAndroid Build Coastguard Worker                 default:
142*8975f5c5SAndroid Build Coastguard Worker                     ASSERT_FALSE(true);
143*8975f5c5SAndroid Build Coastguard Worker                     break;
144*8975f5c5SAndroid Build Coastguard Worker             }
145*8975f5c5SAndroid Build Coastguard Worker             int dstOff           = ((destY + yy) * destWidth + destX + xx);
146*8975f5c5SAndroid Build Coastguard Worker             (*colorsOut)[dstOff] = GLColor(srcColor[0], srcColor[1], srcColor[2], alpha);
147*8975f5c5SAndroid Build Coastguard Worker         }
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker }
150*8975f5c5SAndroid Build Coastguard Worker 
GetBlockSize(GLenum format)151*8975f5c5SAndroid Build Coastguard Worker int GetBlockSize(GLenum format)
152*8975f5c5SAndroid Build Coastguard Worker {
153*8975f5c5SAndroid Build Coastguard Worker     bool isDXT1 =
154*8975f5c5SAndroid Build Coastguard Worker         format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
155*8975f5c5SAndroid Build Coastguard Worker     return isDXT1 ? 8 : 16;
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker 
UncompressDXTIntoSubRegion(int width,int height,int subX0,int subY0,int subWidth,int subHeight,const std::vector<uint8_t> & data,GLenum format)158*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> UncompressDXTIntoSubRegion(int width,
159*8975f5c5SAndroid Build Coastguard Worker                                                 int height,
160*8975f5c5SAndroid Build Coastguard Worker                                                 int subX0,
161*8975f5c5SAndroid Build Coastguard Worker                                                 int subY0,
162*8975f5c5SAndroid Build Coastguard Worker                                                 int subWidth,
163*8975f5c5SAndroid Build Coastguard Worker                                                 int subHeight,
164*8975f5c5SAndroid Build Coastguard Worker                                                 const std::vector<uint8_t> &data,
165*8975f5c5SAndroid Build Coastguard Worker                                                 GLenum format)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> dest(width * height, GLColor::transparentBlack);
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker     if ((width % 4) != 0 || (height % 4) != 0 || (subX0 % 4) != 0 || (subY0 % 4) != 0 ||
170*8975f5c5SAndroid Build Coastguard Worker         (subWidth % 4) != 0 || (subHeight % 4) != 0)
171*8975f5c5SAndroid Build Coastguard Worker     {
172*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Implementation error in UncompressDXTIntoSubRegion.";
173*8975f5c5SAndroid Build Coastguard Worker         return dest;
174*8975f5c5SAndroid Build Coastguard Worker     }
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker     int blocksAcross = subWidth / 4;
177*8975f5c5SAndroid Build Coastguard Worker     int blocksDown   = subHeight / 4;
178*8975f5c5SAndroid Build Coastguard Worker     int blockSize    = GetBlockSize(format);
179*8975f5c5SAndroid Build Coastguard Worker     for (int yy = 0; yy < blocksDown; ++yy)
180*8975f5c5SAndroid Build Coastguard Worker     {
181*8975f5c5SAndroid Build Coastguard Worker         for (int xx = 0; xx < blocksAcross; ++xx)
182*8975f5c5SAndroid Build Coastguard Worker         {
183*8975f5c5SAndroid Build Coastguard Worker             UncompressDXTBlock(subX0 + xx * 4, subY0 + yy * 4, width, data,
184*8975f5c5SAndroid Build Coastguard Worker                                (yy * blocksAcross + xx) * blockSize, format, &dest);
185*8975f5c5SAndroid Build Coastguard Worker         }
186*8975f5c5SAndroid Build Coastguard Worker     }
187*8975f5c5SAndroid Build Coastguard Worker     return dest;
188*8975f5c5SAndroid Build Coastguard Worker }
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker class RobustResourceInitTest : public ANGLETest<>
191*8975f5c5SAndroid Build Coastguard Worker {
192*8975f5c5SAndroid Build Coastguard Worker   protected:
193*8975f5c5SAndroid Build Coastguard Worker     constexpr static int kWidth  = 128;
194*8975f5c5SAndroid Build Coastguard Worker     constexpr static int kHeight = 128;
195*8975f5c5SAndroid Build Coastguard Worker 
RobustResourceInitTest()196*8975f5c5SAndroid Build Coastguard Worker     RobustResourceInitTest()
197*8975f5c5SAndroid Build Coastguard Worker     {
198*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(kWidth);
199*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(kHeight);
200*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
201*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
202*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
203*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
204*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
205*8975f5c5SAndroid Build Coastguard Worker         setConfigStencilBits(8);
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker         setRobustResourceInit(true);
208*8975f5c5SAndroid Build Coastguard Worker 
209*8975f5c5SAndroid Build Coastguard Worker         // Test flakiness was noticed when reusing displays.
210*8975f5c5SAndroid Build Coastguard Worker         forceNewDisplay();
211*8975f5c5SAndroid Build Coastguard Worker     }
212*8975f5c5SAndroid Build Coastguard Worker 
hasGLExtension()213*8975f5c5SAndroid Build Coastguard Worker     bool hasGLExtension()
214*8975f5c5SAndroid Build Coastguard Worker     {
215*8975f5c5SAndroid Build Coastguard Worker         return IsGLExtensionEnabled("GL_ANGLE_robust_resource_initialization");
216*8975f5c5SAndroid Build Coastguard Worker     }
217*8975f5c5SAndroid Build Coastguard Worker 
hasEGLExtension()218*8975f5c5SAndroid Build Coastguard Worker     bool hasEGLExtension()
219*8975f5c5SAndroid Build Coastguard Worker     {
220*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(),
221*8975f5c5SAndroid Build Coastguard Worker                                             "EGL_ANGLE_robust_resource_initialization");
222*8975f5c5SAndroid Build Coastguard Worker     }
223*8975f5c5SAndroid Build Coastguard Worker 
hasRobustSurfaceInit()224*8975f5c5SAndroid Build Coastguard Worker     bool hasRobustSurfaceInit()
225*8975f5c5SAndroid Build Coastguard Worker     {
226*8975f5c5SAndroid Build Coastguard Worker         if (!hasEGLExtension())
227*8975f5c5SAndroid Build Coastguard Worker         {
228*8975f5c5SAndroid Build Coastguard Worker             return false;
229*8975f5c5SAndroid Build Coastguard Worker         }
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker         EGLint robustSurfaceInit = EGL_FALSE;
232*8975f5c5SAndroid Build Coastguard Worker         eglQuerySurface(getEGLWindow()->getDisplay(), getEGLWindow()->getSurface(),
233*8975f5c5SAndroid Build Coastguard Worker                         EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, &robustSurfaceInit);
234*8975f5c5SAndroid Build Coastguard Worker         return robustSurfaceInit;
235*8975f5c5SAndroid Build Coastguard Worker     }
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker     void setupTexture(GLTexture *tex);
238*8975f5c5SAndroid Build Coastguard Worker     void setup3DTexture(GLTexture *tex);
239*8975f5c5SAndroid Build Coastguard Worker 
240*8975f5c5SAndroid Build Coastguard Worker     // Checks for uninitialized (non-zero pixels) in a Texture.
241*8975f5c5SAndroid Build Coastguard Worker     void checkNonZeroPixels(GLTexture *texture,
242*8975f5c5SAndroid Build Coastguard Worker                             int skipX,
243*8975f5c5SAndroid Build Coastguard Worker                             int skipY,
244*8975f5c5SAndroid Build Coastguard Worker                             int skipWidth,
245*8975f5c5SAndroid Build Coastguard Worker                             int skipHeight,
246*8975f5c5SAndroid Build Coastguard Worker                             const GLColor &skip);
247*8975f5c5SAndroid Build Coastguard Worker     void checkNonZeroPixels3D(GLTexture *texture,
248*8975f5c5SAndroid Build Coastguard Worker                               int skipX,
249*8975f5c5SAndroid Build Coastguard Worker                               int skipY,
250*8975f5c5SAndroid Build Coastguard Worker                               int skipWidth,
251*8975f5c5SAndroid Build Coastguard Worker                               int skipHeight,
252*8975f5c5SAndroid Build Coastguard Worker                               int textureLayer,
253*8975f5c5SAndroid Build Coastguard Worker                               const GLColor &skip);
254*8975f5c5SAndroid Build Coastguard Worker     void checkFramebufferNonZeroPixels(int skipX,
255*8975f5c5SAndroid Build Coastguard Worker                                        int skipY,
256*8975f5c5SAndroid Build Coastguard Worker                                        int skipWidth,
257*8975f5c5SAndroid Build Coastguard Worker                                        int skipHeight,
258*8975f5c5SAndroid Build Coastguard Worker                                        const GLColor &skip);
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker     void checkCustomFramebufferNonZeroPixels(int fboWidth,
261*8975f5c5SAndroid Build Coastguard Worker                                              int fboHeight,
262*8975f5c5SAndroid Build Coastguard Worker                                              int skipX,
263*8975f5c5SAndroid Build Coastguard Worker                                              int skipY,
264*8975f5c5SAndroid Build Coastguard Worker                                              int skipWidth,
265*8975f5c5SAndroid Build Coastguard Worker                                              int skipHeight,
266*8975f5c5SAndroid Build Coastguard Worker                                              const GLColor &skip);
267*8975f5c5SAndroid Build Coastguard Worker 
GetSimpleTextureFragmentShader(const char * samplerType)268*8975f5c5SAndroid Build Coastguard Worker     static std::string GetSimpleTextureFragmentShader(const char *samplerType)
269*8975f5c5SAndroid Build Coastguard Worker     {
270*8975f5c5SAndroid Build Coastguard Worker         std::stringstream fragmentStream;
271*8975f5c5SAndroid Build Coastguard Worker         fragmentStream << "#version 300 es\n"
272*8975f5c5SAndroid Build Coastguard Worker                           "precision mediump "
273*8975f5c5SAndroid Build Coastguard Worker                        << samplerType
274*8975f5c5SAndroid Build Coastguard Worker                        << "sampler2D;\n"
275*8975f5c5SAndroid Build Coastguard Worker                           "precision mediump float;\n"
276*8975f5c5SAndroid Build Coastguard Worker                           "out "
277*8975f5c5SAndroid Build Coastguard Worker                        << samplerType
278*8975f5c5SAndroid Build Coastguard Worker                        << "vec4 color;\n"
279*8975f5c5SAndroid Build Coastguard Worker                           "in vec2 texcoord;\n"
280*8975f5c5SAndroid Build Coastguard Worker                           "uniform "
281*8975f5c5SAndroid Build Coastguard Worker                        << samplerType
282*8975f5c5SAndroid Build Coastguard Worker                        << "sampler2D tex;\n"
283*8975f5c5SAndroid Build Coastguard Worker                           "void main()\n"
284*8975f5c5SAndroid Build Coastguard Worker                           "{\n"
285*8975f5c5SAndroid Build Coastguard Worker                           "    color = texture(tex, texcoord);\n"
286*8975f5c5SAndroid Build Coastguard Worker                           "}";
287*8975f5c5SAndroid Build Coastguard Worker         return fragmentStream.str();
288*8975f5c5SAndroid Build Coastguard Worker     }
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker     template <typename ClearFunc>
291*8975f5c5SAndroid Build Coastguard Worker     void maskedDepthClear(ClearFunc clearFunc);
292*8975f5c5SAndroid Build Coastguard Worker 
293*8975f5c5SAndroid Build Coastguard Worker     template <typename ClearFunc>
294*8975f5c5SAndroid Build Coastguard Worker     void maskedStencilClear(ClearFunc clearFunc);
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker     void copyTexSubImage2DCustomFBOTest(int offsetX, int offsetY);
297*8975f5c5SAndroid Build Coastguard Worker };
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker class RobustResourceInitTestES3 : public RobustResourceInitTest
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker   protected:
302*8975f5c5SAndroid Build Coastguard Worker     template <typename PixelT>
303*8975f5c5SAndroid Build Coastguard Worker     void testIntegerTextureInit(const char *samplerType,
304*8975f5c5SAndroid Build Coastguard Worker                                 GLenum internalFormatRGBA,
305*8975f5c5SAndroid Build Coastguard Worker                                 GLenum internalFormatRGB,
306*8975f5c5SAndroid Build Coastguard Worker                                 GLenum type);
307*8975f5c5SAndroid Build Coastguard Worker };
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker class RobustResourceInitTestES31 : public RobustResourceInitTest
310*8975f5c5SAndroid Build Coastguard Worker {};
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker // Robust resource initialization is not based on hardware support or native extensions, check that
313*8975f5c5SAndroid Build Coastguard Worker // it only works on the implemented renderers
TEST_P(RobustResourceInitTest,ExpectedRendererSupport)314*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, ExpectedRendererSupport)
315*8975f5c5SAndroid Build Coastguard Worker {
316*8975f5c5SAndroid Build Coastguard Worker     bool shouldHaveSupport =
317*8975f5c5SAndroid Build Coastguard Worker         IsD3D11() || IsD3D9() || IsOpenGL() || IsOpenGLES() || IsVulkan() || IsMetal();
318*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(shouldHaveSupport, hasGLExtension());
319*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(shouldHaveSupport, hasEGLExtension());
320*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(shouldHaveSupport, hasRobustSurfaceInit());
321*8975f5c5SAndroid Build Coastguard Worker }
322*8975f5c5SAndroid Build Coastguard Worker 
323*8975f5c5SAndroid Build Coastguard Worker // Tests of the GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE query.
TEST_P(RobustResourceInitTest,Queries)324*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, Queries)
325*8975f5c5SAndroid Build Coastguard Worker {
326*8975f5c5SAndroid Build Coastguard Worker     // If context extension string exposed, check queries.
327*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_ANGLE_robust_resource_initialization"))
328*8975f5c5SAndroid Build Coastguard Worker     {
329*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = 0;
330*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, &enabled);
331*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_TRUE(enabled);
332*8975f5c5SAndroid Build Coastguard Worker 
333*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_TRUE(glIsEnabled(GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE));
334*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
337*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
338*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker         // Can't verify the init state after glTexImage2D, the implementation is free to initialize
341*8975f5c5SAndroid Build Coastguard Worker         // any time before the resource is read.
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker         {
344*8975f5c5SAndroid Build Coastguard Worker             // Force to uninitialized
345*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, GL_FALSE);
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker             GLint initState = 0;
348*8975f5c5SAndroid Build Coastguard Worker             glGetTexParameteriv(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
349*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_FALSE(initState);
350*8975f5c5SAndroid Build Coastguard Worker         }
351*8975f5c5SAndroid Build Coastguard Worker         {
352*8975f5c5SAndroid Build Coastguard Worker             // Force to initialized
353*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, GL_TRUE);
354*8975f5c5SAndroid Build Coastguard Worker 
355*8975f5c5SAndroid Build Coastguard Worker             GLint initState = 0;
356*8975f5c5SAndroid Build Coastguard Worker             glGetTexParameteriv(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
357*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_TRUE(initState);
358*8975f5c5SAndroid Build Coastguard Worker         }
359*8975f5c5SAndroid Build Coastguard Worker     }
360*8975f5c5SAndroid Build Coastguard Worker     else
361*8975f5c5SAndroid Build Coastguard Worker     {
362*8975f5c5SAndroid Build Coastguard Worker         // Querying robust resource init should return INVALID_ENUM.
363*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = 0;
364*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, &enabled);
365*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
366*8975f5c5SAndroid Build Coastguard Worker     }
367*8975f5c5SAndroid Build Coastguard Worker }
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker // Tests that buffers start zero-filled if the data pointer is null.
TEST_P(RobustResourceInitTest,BufferData)370*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, BufferData)
371*8975f5c5SAndroid Build Coastguard Worker {
372*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
375*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
376*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, getWindowWidth() * getWindowHeight() * sizeof(GLfloat), nullptr,
377*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
380*8975f5c5SAndroid Build Coastguard Worker         "attribute vec2 position;\n"
381*8975f5c5SAndroid Build Coastguard Worker         "attribute float testValue;\n"
382*8975f5c5SAndroid Build Coastguard Worker         "varying vec4 colorOut;\n"
383*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
384*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
385*8975f5c5SAndroid Build Coastguard Worker         "    colorOut = testValue == 0.0 ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);\n"
386*8975f5c5SAndroid Build Coastguard Worker         "}";
387*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
388*8975f5c5SAndroid Build Coastguard Worker         "varying mediump vec4 colorOut;\n"
389*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
390*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = colorOut;\n"
391*8975f5c5SAndroid Build Coastguard Worker         "}";
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     GLint testValueLoc = glGetAttribLocation(program, "testValue");
396*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, testValueLoc);
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
399*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(testValueLoc, 1, GL_FLOAT, GL_FALSE, 4, nullptr);
400*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(testValueLoc);
401*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, 0);
402*8975f5c5SAndroid Build Coastguard Worker 
403*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
406*8975f5c5SAndroid Build Coastguard Worker 
407*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> expected(getWindowWidth() * getWindowHeight(), GLColor::green);
408*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> actual(getWindowWidth() * getWindowHeight());
409*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
410*8975f5c5SAndroid Build Coastguard Worker                  actual.data());
411*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(expected, actual);
412*8975f5c5SAndroid Build Coastguard Worker 
413*8975f5c5SAndroid Build Coastguard Worker     GLint initState = 0;
414*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
415*8975f5c5SAndroid Build Coastguard Worker     glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
416*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_TRUE(initState);
417*8975f5c5SAndroid Build Coastguard Worker }
418*8975f5c5SAndroid Build Coastguard Worker 
419*8975f5c5SAndroid Build Coastguard Worker // Regression test for passing a zero size init buffer with the extension.
TEST_P(RobustResourceInitTest,BufferDataZeroSize)420*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, BufferDataZeroSize)
421*8975f5c5SAndroid Build Coastguard Worker {
422*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
423*8975f5c5SAndroid Build Coastguard Worker 
424*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
425*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
426*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, 0, nullptr, GL_STATIC_DRAW);
427*8975f5c5SAndroid Build Coastguard Worker }
428*8975f5c5SAndroid Build Coastguard Worker 
429*8975f5c5SAndroid Build Coastguard Worker // Test robust initialization of PVRTC1 textures.
TEST_P(RobustResourceInitTest,CompressedTexImagePVRTC1)430*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, CompressedTexImagePVRTC1)
431*8975f5c5SAndroid Build Coastguard Worker {
432*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_IMG_texture_compression_pvrtc"));
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(testProgram, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
435*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(testProgram);
436*8975f5c5SAndroid Build Coastguard Worker 
437*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::pair<GLenum, GLColor>> formats = {
438*8975f5c5SAndroid Build Coastguard Worker         {GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, GLColor::black},
439*8975f5c5SAndroid Build Coastguard Worker         {GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GLColor::black},
440*8975f5c5SAndroid Build Coastguard Worker         {GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, GLColor::transparentBlack},
441*8975f5c5SAndroid Build Coastguard Worker         {GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GLColor::transparentBlack}};
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_pvrtc_sRGB"))
444*8975f5c5SAndroid Build Coastguard Worker     {
445*8975f5c5SAndroid Build Coastguard Worker         formats.insert(formats.end(),
446*8975f5c5SAndroid Build Coastguard Worker                        {{GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT, GLColor::black},
447*8975f5c5SAndroid Build Coastguard Worker                         {GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT, GLColor::black},
448*8975f5c5SAndroid Build Coastguard Worker                         {GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT, GLColor::transparentBlack},
449*8975f5c5SAndroid Build Coastguard Worker                         {GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT, GLColor::transparentBlack}});
450*8975f5c5SAndroid Build Coastguard Worker     }
451*8975f5c5SAndroid Build Coastguard Worker 
452*8975f5c5SAndroid Build Coastguard Worker     for (auto format : formats)
453*8975f5c5SAndroid Build Coastguard Worker     {
454*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
455*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
456*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
457*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
458*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, format.first, 8, 8, 0, 32, nullptr);
459*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
460*8975f5c5SAndroid Build Coastguard Worker 
461*8975f5c5SAndroid Build Coastguard Worker         drawQuad(testProgram, essl1_shaders::PositionAttrib(), 0.0f);
462*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, format.second);
463*8975f5c5SAndroid Build Coastguard Worker     }
464*8975f5c5SAndroid Build Coastguard Worker }
465*8975f5c5SAndroid Build Coastguard Worker 
466*8975f5c5SAndroid Build Coastguard Worker // Regression test for images being recovered from storage not re-syncing to storage after being
467*8975f5c5SAndroid Build Coastguard Worker // initialized
TEST_P(RobustResourceInitTestES3,D3D11RecoverFromStorageBug)468*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, D3D11RecoverFromStorageBug)
469*8975f5c5SAndroid Build Coastguard Worker {
470*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
471*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42264306
474*8975f5c5SAndroid Build Coastguard Worker     // Vulkan uses incorrect copy sizes when redefining/zero initializing NPOT compressed textures.
475*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan());
476*8975f5c5SAndroid Build Coastguard Worker 
477*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint8_t img_8x8_rgb_dxt1[] = {
478*8975f5c5SAndroid Build Coastguard Worker         0xe0, 0x07, 0x00, 0xf8, 0x11, 0x10, 0x15, 0x00, 0x1f, 0x00, 0xe0,
479*8975f5c5SAndroid Build Coastguard Worker         0xff, 0x11, 0x10, 0x15, 0x00, 0xe0, 0x07, 0x1f, 0xf8, 0x44, 0x45,
480*8975f5c5SAndroid Build Coastguard Worker         0x40, 0x55, 0x1f, 0x00, 0xff, 0x07, 0x44, 0x45, 0x40, 0x55,
481*8975f5c5SAndroid Build Coastguard Worker     };
482*8975f5c5SAndroid Build Coastguard Worker 
483*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint8_t img_4x4_rgb_dxt1[] = {
484*8975f5c5SAndroid Build Coastguard Worker         0xe0, 0x07, 0x00, 0xf8, 0x11, 0x10, 0x15, 0x00,
485*8975f5c5SAndroid Build Coastguard Worker     };
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint8_t img_4x4_rgb_dxt1_zeroes[] = {
488*8975f5c5SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489*8975f5c5SAndroid Build Coastguard Worker     };
490*8975f5c5SAndroid Build Coastguard Worker 
491*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 8; i++)
492*8975f5c5SAndroid Build Coastguard Worker     {
493*8975f5c5SAndroid Build Coastguard Worker         {
494*8975f5c5SAndroid Build Coastguard Worker             GLTexture texture;
495*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, texture);
496*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, 8);
497*8975f5c5SAndroid Build Coastguard Worker             glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
498*8975f5c5SAndroid Build Coastguard Worker                                       ArraySize(img_8x8_rgb_dxt1), img_8x8_rgb_dxt1);
499*8975f5c5SAndroid Build Coastguard Worker             glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 4, 4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
500*8975f5c5SAndroid Build Coastguard Worker                                       ArraySize(img_4x4_rgb_dxt1), img_4x4_rgb_dxt1);
501*8975f5c5SAndroid Build Coastguard Worker             glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, 2, 2, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
502*8975f5c5SAndroid Build Coastguard Worker                                       ArraySize(img_4x4_rgb_dxt1), img_4x4_rgb_dxt1);
503*8975f5c5SAndroid Build Coastguard Worker             glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, 1, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
504*8975f5c5SAndroid Build Coastguard Worker                                       ArraySize(img_4x4_rgb_dxt1), img_4x4_rgb_dxt1);
505*8975f5c5SAndroid Build Coastguard Worker         }
506*8975f5c5SAndroid Build Coastguard Worker         {
507*8975f5c5SAndroid Build Coastguard Worker             GLTexture texture;
508*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, texture);
509*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 12, 12);
510*8975f5c5SAndroid Build Coastguard Worker             glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, 1, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
511*8975f5c5SAndroid Build Coastguard Worker                                       ArraySize(img_4x4_rgb_dxt1_zeroes), img_4x4_rgb_dxt1_zeroes);
512*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
513*8975f5c5SAndroid Build Coastguard Worker 
514*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, 0);
515*8975f5c5SAndroid Build Coastguard Worker             glViewport(0, 0, 1, 1);
516*8975f5c5SAndroid Build Coastguard Worker             glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
517*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
518*8975f5c5SAndroid Build Coastguard Worker             draw2DTexturedQuad(0.5f, 1.0f, true);
519*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
520*8975f5c5SAndroid Build Coastguard Worker         }
521*8975f5c5SAndroid Build Coastguard Worker     }
522*8975f5c5SAndroid Build Coastguard Worker }
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker // The following test code translated from WebGL 1 test:
525*8975f5c5SAndroid Build Coastguard Worker // https://www.khronos.org/registry/webgl/sdk/tests/conformance/misc/uninitialized-test.html
setupTexture(GLTexture * tex)526*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::setupTexture(GLTexture *tex)
527*8975f5c5SAndroid Build Coastguard Worker {
528*8975f5c5SAndroid Build Coastguard Worker     GLuint tempTexture;
529*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &tempTexture);
530*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tempTexture);
531*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
532*8975f5c5SAndroid Build Coastguard Worker 
533*8975f5c5SAndroid Build Coastguard Worker     // this can be quite undeterministic so to improve odds of seeing uninitialized data write bits
534*8975f5c5SAndroid Build Coastguard Worker     // into tex then delete texture then re-create one with same characteristics (driver will likely
535*8975f5c5SAndroid Build Coastguard Worker     // reuse mem) with this trick on r59046 WebKit/OSX I get FAIL 100% of the time instead of ~15%
536*8975f5c5SAndroid Build Coastguard Worker     // of the time.
537*8975f5c5SAndroid Build Coastguard Worker 
538*8975f5c5SAndroid Build Coastguard Worker     std::array<uint8_t, kWidth * kHeight * 4> badData;
539*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < badData.size(); ++i)
540*8975f5c5SAndroid Build Coastguard Worker     {
541*8975f5c5SAndroid Build Coastguard Worker         badData[i] = static_cast<uint8_t>(i % 255);
542*8975f5c5SAndroid Build Coastguard Worker     }
543*8975f5c5SAndroid Build Coastguard Worker 
544*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
545*8975f5c5SAndroid Build Coastguard Worker                     badData.data());
546*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &tempTexture);
547*8975f5c5SAndroid Build Coastguard Worker 
548*8975f5c5SAndroid Build Coastguard Worker     // This will create the GLTexture.
549*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, *tex);
550*8975f5c5SAndroid Build Coastguard Worker }
551*8975f5c5SAndroid Build Coastguard Worker 
setup3DTexture(GLTexture * tex)552*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::setup3DTexture(GLTexture *tex)
553*8975f5c5SAndroid Build Coastguard Worker {
554*8975f5c5SAndroid Build Coastguard Worker     GLuint tempTexture;
555*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &tempTexture);
556*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, tempTexture);
557*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, kWidth, kHeight, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
558*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker     // this can be quite undeterministic so to improve odds of seeing uninitialized data write bits
561*8975f5c5SAndroid Build Coastguard Worker     // into tex then delete texture then re-create one with same characteristics (driver will likely
562*8975f5c5SAndroid Build Coastguard Worker     // reuse mem) with this trick on r59046 WebKit/OSX I get FAIL 100% of the time instead of ~15%
563*8975f5c5SAndroid Build Coastguard Worker     // of the time.
564*8975f5c5SAndroid Build Coastguard Worker 
565*8975f5c5SAndroid Build Coastguard Worker     std::array<uint8_t, kWidth * kHeight * 2 * 4> badData;
566*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < badData.size(); ++i)
567*8975f5c5SAndroid Build Coastguard Worker     {
568*8975f5c5SAndroid Build Coastguard Worker         badData[i] = static_cast<uint8_t>(i % 255);
569*8975f5c5SAndroid Build Coastguard Worker     }
570*8975f5c5SAndroid Build Coastguard Worker 
571*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kWidth, kHeight, 2, GL_RGBA, GL_UNSIGNED_BYTE,
572*8975f5c5SAndroid Build Coastguard Worker                     badData.data());
573*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &tempTexture);
574*8975f5c5SAndroid Build Coastguard Worker 
575*8975f5c5SAndroid Build Coastguard Worker     // This will create the GLTexture.
576*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, *tex);
577*8975f5c5SAndroid Build Coastguard Worker }
578*8975f5c5SAndroid Build Coastguard Worker 
checkNonZeroPixels(GLTexture * texture,int skipX,int skipY,int skipWidth,int skipHeight,const GLColor & skip)579*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::checkNonZeroPixels(GLTexture *texture,
580*8975f5c5SAndroid Build Coastguard Worker                                                 int skipX,
581*8975f5c5SAndroid Build Coastguard Worker                                                 int skipY,
582*8975f5c5SAndroid Build Coastguard Worker                                                 int skipWidth,
583*8975f5c5SAndroid Build Coastguard Worker                                                 int skipHeight,
584*8975f5c5SAndroid Build Coastguard Worker                                                 const GLColor &skip)
585*8975f5c5SAndroid Build Coastguard Worker {
586*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
587*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
588*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
589*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture->get(), 0);
590*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
591*8975f5c5SAndroid Build Coastguard Worker 
592*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(skipX, skipY, skipWidth, skipHeight, skip);
593*8975f5c5SAndroid Build Coastguard Worker }
594*8975f5c5SAndroid Build Coastguard Worker 
checkNonZeroPixels3D(GLTexture * texture,int skipX,int skipY,int skipWidth,int skipHeight,int textureLayer,const GLColor & skip)595*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::checkNonZeroPixels3D(GLTexture *texture,
596*8975f5c5SAndroid Build Coastguard Worker                                                   int skipX,
597*8975f5c5SAndroid Build Coastguard Worker                                                   int skipY,
598*8975f5c5SAndroid Build Coastguard Worker                                                   int skipWidth,
599*8975f5c5SAndroid Build Coastguard Worker                                                   int skipHeight,
600*8975f5c5SAndroid Build Coastguard Worker                                                   int textureLayer,
601*8975f5c5SAndroid Build Coastguard Worker                                                   const GLColor &skip)
602*8975f5c5SAndroid Build Coastguard Worker {
603*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, 0);
604*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
605*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
606*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture->get(), 0,
607*8975f5c5SAndroid Build Coastguard Worker                               textureLayer);
608*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(skipX, skipY, skipWidth, skipHeight, skip);
611*8975f5c5SAndroid Build Coastguard Worker }
612*8975f5c5SAndroid Build Coastguard Worker 
checkFramebufferNonZeroPixels(int skipX,int skipY,int skipWidth,int skipHeight,const GLColor & skip)613*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::checkFramebufferNonZeroPixels(int skipX,
614*8975f5c5SAndroid Build Coastguard Worker                                                            int skipY,
615*8975f5c5SAndroid Build Coastguard Worker                                                            int skipWidth,
616*8975f5c5SAndroid Build Coastguard Worker                                                            int skipHeight,
617*8975f5c5SAndroid Build Coastguard Worker                                                            const GLColor &skip)
618*8975f5c5SAndroid Build Coastguard Worker {
619*8975f5c5SAndroid Build Coastguard Worker     checkCustomFramebufferNonZeroPixels(kWidth, kHeight, skipX, skipY, skipWidth, skipHeight, skip);
620*8975f5c5SAndroid Build Coastguard Worker }
621*8975f5c5SAndroid Build Coastguard Worker 
checkCustomFramebufferNonZeroPixels(int fboWidth,int fboHeight,int skipX,int skipY,int skipWidth,int skipHeight,const GLColor & skip)622*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::checkCustomFramebufferNonZeroPixels(int fboWidth,
623*8975f5c5SAndroid Build Coastguard Worker                                                                  int fboHeight,
624*8975f5c5SAndroid Build Coastguard Worker                                                                  int skipX,
625*8975f5c5SAndroid Build Coastguard Worker                                                                  int skipY,
626*8975f5c5SAndroid Build Coastguard Worker                                                                  int skipWidth,
627*8975f5c5SAndroid Build Coastguard Worker                                                                  int skipHeight,
628*8975f5c5SAndroid Build Coastguard Worker                                                                  const GLColor &skip)
629*8975f5c5SAndroid Build Coastguard Worker {
630*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> data(fboWidth * fboHeight);
631*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, fboWidth, fboHeight, GL_RGBA, GL_UNSIGNED_BYTE, data.data());
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker     int k = 0;
634*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < fboHeight; ++y)
635*8975f5c5SAndroid Build Coastguard Worker     {
636*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < fboWidth; ++x)
637*8975f5c5SAndroid Build Coastguard Worker         {
638*8975f5c5SAndroid Build Coastguard Worker             int index = (y * fboWidth + x);
639*8975f5c5SAndroid Build Coastguard Worker             if (x >= skipX && x < skipX + skipWidth && y >= skipY && y < skipY + skipHeight)
640*8975f5c5SAndroid Build Coastguard Worker             {
641*8975f5c5SAndroid Build Coastguard Worker                 ASSERT_EQ(skip, data[index]) << " at pixel " << x << ", " << y;
642*8975f5c5SAndroid Build Coastguard Worker             }
643*8975f5c5SAndroid Build Coastguard Worker             else
644*8975f5c5SAndroid Build Coastguard Worker             {
645*8975f5c5SAndroid Build Coastguard Worker                 k += (data[index] != GLColor::transparentBlack) ? 1 : 0;
646*8975f5c5SAndroid Build Coastguard Worker             }
647*8975f5c5SAndroid Build Coastguard Worker         }
648*8975f5c5SAndroid Build Coastguard Worker     }
649*8975f5c5SAndroid Build Coastguard Worker 
650*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(0, k);
651*8975f5c5SAndroid Build Coastguard Worker }
652*8975f5c5SAndroid Build Coastguard Worker 
653*8975f5c5SAndroid Build Coastguard Worker // Reading an uninitialized texture (texImage2D) should succeed with all bytes set to 0.
TEST_P(RobustResourceInitTest,ReadingUninitializedTexture)654*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, ReadingUninitializedTexture)
655*8975f5c5SAndroid Build Coastguard Worker {
656*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
659*8975f5c5SAndroid Build Coastguard Worker     setupTexture(&tex);
660*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
661*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, 0, 0, 0, 0, GLColor::transparentBlack);
662*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
663*8975f5c5SAndroid Build Coastguard Worker }
664*8975f5c5SAndroid Build Coastguard Worker 
665*8975f5c5SAndroid Build Coastguard Worker // Test that calling glTexImage2D multiple times with the same size and no data resets all texture
666*8975f5c5SAndroid Build Coastguard Worker // data
TEST_P(RobustResourceInitTest,ReuploadingClearsTexture)667*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, ReuploadingClearsTexture)
668*8975f5c5SAndroid Build Coastguard Worker {
669*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker     // crbug.com/826576
672*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsNVIDIA() && IsDesktopOpenGL());
673*8975f5c5SAndroid Build Coastguard Worker 
674*8975f5c5SAndroid Build Coastguard Worker     // Put some data into the texture
675*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kWidth * kHeight> data;
676*8975f5c5SAndroid Build Coastguard Worker     data.fill(GLColor::white);
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
679*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
680*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
681*8975f5c5SAndroid Build Coastguard Worker                  data.data());
682*8975f5c5SAndroid Build Coastguard Worker 
683*8975f5c5SAndroid Build Coastguard Worker     // Reset the texture
684*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
685*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, 0, 0, 0, 0, GLColor::transparentBlack);
686*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
687*8975f5c5SAndroid Build Coastguard Worker }
688*8975f5c5SAndroid Build Coastguard Worker 
689*8975f5c5SAndroid Build Coastguard Worker // Cover the case where null pixel data is uploaded to a texture and then sub image is used to
690*8975f5c5SAndroid Build Coastguard Worker // upload partial data
TEST_P(RobustResourceInitTest,TexImageThenSubImage)691*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, TexImageThenSubImage)
692*8975f5c5SAndroid Build Coastguard Worker {
693*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117, but only fails on Nexus devices
696*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
697*8975f5c5SAndroid Build Coastguard Worker 
698*8975f5c5SAndroid Build Coastguard Worker     // Put some data into the texture
699*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
700*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
701*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
702*8975f5c5SAndroid Build Coastguard Worker 
703*8975f5c5SAndroid Build Coastguard Worker     // Force the D3D texture to create a storage
704*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, 0, 0, 0, 0, GLColor::transparentBlack);
705*8975f5c5SAndroid Build Coastguard Worker 
706*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
707*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
708*8975f5c5SAndroid Build Coastguard Worker 
709*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kWidth * kHeight> data;
710*8975f5c5SAndroid Build Coastguard Worker     data.fill(GLColor::white);
711*8975f5c5SAndroid Build Coastguard Worker 
712*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth / 2, kHeight / 2, GL_RGBA, GL_UNSIGNED_BYTE,
713*8975f5c5SAndroid Build Coastguard Worker                     data.data());
714*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, 0, 0, kWidth / 2, kHeight / 2, GLColor::white);
715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
716*8975f5c5SAndroid Build Coastguard Worker }
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker // Reading an uninitialized texture (texImage3D) should succeed with all bytes set to 0.
TEST_P(RobustResourceInitTestES3,ReadingUninitialized3DTexture)719*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, ReadingUninitialized3DTexture)
720*8975f5c5SAndroid Build Coastguard Worker {
721*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
722*8975f5c5SAndroid Build Coastguard Worker 
723*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
724*8975f5c5SAndroid Build Coastguard Worker     setup3DTexture(&tex);
725*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, kWidth, kHeight, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
726*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
727*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels3D(&tex, 0, 0, 0, 0, 0, GLColor::transparentBlack);
728*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
729*8975f5c5SAndroid Build Coastguard Worker }
730*8975f5c5SAndroid Build Coastguard Worker 
731*8975f5c5SAndroid Build Coastguard Worker // Copy of the copytexsubimage3d_texture_wrongly_initialized test that is part of the WebGL2
732*8975f5c5SAndroid Build Coastguard Worker // conformance suite: copy-texture-image-webgl-specific.html
TEST_P(RobustResourceInitTestES3,CopyTexSubImage3DTextureWronglyInitialized)733*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, CopyTexSubImage3DTextureWronglyInitialized)
734*8975f5c5SAndroid Build Coastguard Worker {
735*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
736*8975f5c5SAndroid Build Coastguard Worker 
737*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureLayer     = 0;
738*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureWidth     = 2;
739*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureHeight    = 2;
740*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureDepth     = 2;
741*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kTextureDataSize = kTextureWidth * kTextureHeight * 4;
742*8975f5c5SAndroid Build Coastguard Worker 
743*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2D;
744*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2D);
745*8975f5c5SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, kTextureDataSize> data = {{0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
746*8975f5c5SAndroid Build Coastguard Worker                                                              0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
747*8975f5c5SAndroid Build Coastguard Worker                                                              0x0D, 0x0E, 0x0F, 0x10}};
748*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureWidth, kTextureHeight, 0, GL_RGBA,
749*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, data.data());
750*8975f5c5SAndroid Build Coastguard Worker 
751*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
752*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
753*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2D, 0);
754*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
755*8975f5c5SAndroid Build Coastguard Worker 
756*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture3D;
757*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture3D);
758*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kTextureWidth, kTextureHeight, kTextureDepth);
759*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, kTextureLayer, 0, 0, kTextureWidth, kTextureHeight);
760*8975f5c5SAndroid Build Coastguard Worker 
761*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture3D, 0, kTextureLayer);
762*8975f5c5SAndroid Build Coastguard Worker     std::array<uint8_t, kTextureDataSize> pixels;
763*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kTextureWidth, kTextureHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
764*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
765*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(data, pixels);
766*8975f5c5SAndroid Build Coastguard Worker }
767*8975f5c5SAndroid Build Coastguard Worker 
768*8975f5c5SAndroid Build Coastguard Worker // Test that binding an EGL surface to a texture does not cause it to be cleared.
TEST_P(RobustResourceInitTestES3,BindTexImage)769*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, BindTexImage)
770*8975f5c5SAndroid Build Coastguard Worker {
771*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window  = getEGLWindow();
774*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = window->getSurface();
775*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display = window->getDisplay();
776*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config   = window->getConfig();
777*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = window->getContext();
778*8975f5c5SAndroid Build Coastguard Worker 
779*8975f5c5SAndroid Build Coastguard Worker     EGLint surfaceType = 0;
780*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType);
781*8975f5c5SAndroid Build Coastguard Worker     // Test skipped because EGL config cannot be used to create pbuffers.
782*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF((surfaceType & EGL_PBUFFER_BIT) == 0);
783*8975f5c5SAndroid Build Coastguard Worker 
784*8975f5c5SAndroid Build Coastguard Worker     EGLint bindToSurfaceRGBA = 0;
785*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_BIND_TO_TEXTURE_RGBA, &bindToSurfaceRGBA);
786*8975f5c5SAndroid Build Coastguard Worker     // Test skipped because EGL config cannot be used to create pbuffers.
787*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(bindToSurfaceRGBA == EGL_FALSE);
788*8975f5c5SAndroid Build Coastguard Worker 
789*8975f5c5SAndroid Build Coastguard Worker     EGLint attribs[] = {
790*8975f5c5SAndroid Build Coastguard Worker         EGL_WIDTH,          32,
791*8975f5c5SAndroid Build Coastguard Worker         EGL_HEIGHT,         32,
792*8975f5c5SAndroid Build Coastguard Worker         EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
793*8975f5c5SAndroid Build Coastguard Worker         EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
794*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
795*8975f5c5SAndroid Build Coastguard Worker     };
796*8975f5c5SAndroid Build Coastguard Worker 
797*8975f5c5SAndroid Build Coastguard Worker     EGLSurface pbuffer = eglCreatePbufferSurface(display, config, attribs);
798*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(EGL_NO_SURFACE, pbuffer);
799*8975f5c5SAndroid Build Coastguard Worker 
800*8975f5c5SAndroid Build Coastguard Worker     // Clear the pbuffer
801*8975f5c5SAndroid Build Coastguard Worker     eglMakeCurrent(display, pbuffer, pbuffer, context);
802*8975f5c5SAndroid Build Coastguard Worker     GLColor clearColor = GLColor::magenta;
803*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor.R, clearColor.G, clearColor.B, clearColor.A);
804*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
805*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, clearColor);
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker     // Bind the pbuffer to a texture and read its color
808*8975f5c5SAndroid Build Coastguard Worker     eglMakeCurrent(display, surface, surface, context);
809*8975f5c5SAndroid Build Coastguard Worker 
810*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
811*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
812*8975f5c5SAndroid Build Coastguard Worker     eglBindTexImage(display, pbuffer, EGL_BACK_BUFFER);
813*8975f5c5SAndroid Build Coastguard Worker 
814*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
815*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
816*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
817*8975f5c5SAndroid Build Coastguard Worker     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
818*8975f5c5SAndroid Build Coastguard Worker     {
819*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, clearColor);
820*8975f5c5SAndroid Build Coastguard Worker     }
821*8975f5c5SAndroid Build Coastguard Worker     else
822*8975f5c5SAndroid Build Coastguard Worker     {
823*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Read pixels check skipped because framebuffer was not complete." << std::endl;
824*8975f5c5SAndroid Build Coastguard Worker     }
825*8975f5c5SAndroid Build Coastguard Worker 
826*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(display, pbuffer);
827*8975f5c5SAndroid Build Coastguard Worker }
828*8975f5c5SAndroid Build Coastguard Worker 
829*8975f5c5SAndroid Build Coastguard Worker // Tests that drawing with an uninitialized Texture works as expected.
TEST_P(RobustResourceInitTest,DrawWithTexture)830*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, DrawWithTexture)
831*8975f5c5SAndroid Build Coastguard Worker {
832*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
835*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
836*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
837*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
838*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
839*8975f5c5SAndroid Build Coastguard Worker 
840*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
841*8975f5c5SAndroid Build Coastguard Worker         "attribute vec2 position;\n"
842*8975f5c5SAndroid Build Coastguard Worker         "varying vec2 texCoord;\n"
843*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
844*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
845*8975f5c5SAndroid Build Coastguard Worker         "    texCoord = (position * 0.5) + 0.5;\n"
846*8975f5c5SAndroid Build Coastguard Worker         "}";
847*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
848*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
849*8975f5c5SAndroid Build Coastguard Worker         "varying vec2 texCoord;\n"
850*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex;\n"
851*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
852*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = texture2D(tex, texCoord);\n"
853*8975f5c5SAndroid Build Coastguard Worker         "}";
854*8975f5c5SAndroid Build Coastguard Worker 
855*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
856*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
857*8975f5c5SAndroid Build Coastguard Worker 
858*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(0, 0, 0, 0, GLColor::black);
859*8975f5c5SAndroid Build Coastguard Worker }
860*8975f5c5SAndroid Build Coastguard Worker 
861*8975f5c5SAndroid Build Coastguard Worker // Tests that drawing with an uninitialized mipped texture works as expected.
TEST_P(RobustResourceInitTestES3,DrawWithMippedTexture)862*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, DrawWithMippedTexture)
863*8975f5c5SAndroid Build Coastguard Worker {
864*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
865*8975f5c5SAndroid Build Coastguard Worker 
866*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
867*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
868*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
869*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kWidth / 2, kHeight / 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
870*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
871*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, kWidth / 4, kHeight / 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
872*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
873*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, kWidth / 8, kHeight / 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
874*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
875*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
876*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
877*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
878*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);
879*8975f5c5SAndroid Build Coastguard Worker 
880*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
881*8975f5c5SAndroid Build Coastguard Worker 
882*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
883*8975f5c5SAndroid Build Coastguard Worker         "attribute vec2 position;\n"
884*8975f5c5SAndroid Build Coastguard Worker         "varying vec2 texCoord;\n"
885*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
886*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
887*8975f5c5SAndroid Build Coastguard Worker         "    texCoord = (position * 0.5) + 0.5;\n"
888*8975f5c5SAndroid Build Coastguard Worker         "}";
889*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
890*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
891*8975f5c5SAndroid Build Coastguard Worker         "varying vec2 texCoord;\n"
892*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex;\n"
893*8975f5c5SAndroid Build Coastguard Worker         "void main() {\n"
894*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = texture2D(tex, texCoord);\n"
895*8975f5c5SAndroid Build Coastguard Worker         "}";
896*8975f5c5SAndroid Build Coastguard Worker 
897*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
898*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
899*8975f5c5SAndroid Build Coastguard Worker 
900*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(0, 0, 0, 0, GLColor::black);
901*8975f5c5SAndroid Build Coastguard Worker }
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker // Reading a partially initialized texture (texImage2D) should succeed with all uninitialized bytes
904*8975f5c5SAndroid Build Coastguard Worker // set to 0 and initialized bytes untouched.
TEST_P(RobustResourceInitTest,ReadingPartiallyInitializedTexture)905*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, ReadingPartiallyInitializedTexture)
906*8975f5c5SAndroid Build Coastguard Worker {
907*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
908*8975f5c5SAndroid Build Coastguard Worker 
909*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117, but only fails on Nexus devices
910*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
911*8975f5c5SAndroid Build Coastguard Worker 
912*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
913*8975f5c5SAndroid Build Coastguard Worker     setupTexture(&tex);
914*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
915*8975f5c5SAndroid Build Coastguard Worker     GLColor data(108, 72, 36, 9);
916*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, kWidth / 2, kHeight / 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
917*8975f5c5SAndroid Build Coastguard Worker                     &data.R);
918*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, kWidth / 2, kHeight / 2, 1, 1, data);
919*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
920*8975f5c5SAndroid Build Coastguard Worker }
921*8975f5c5SAndroid Build Coastguard Worker 
922*8975f5c5SAndroid Build Coastguard Worker // Uninitialized parts of textures initialized via copyTexImage2D should have all bytes set to 0.
TEST_P(RobustResourceInitTest,UninitializedPartsOfCopied2DTexturesAreBlack)923*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, UninitializedPartsOfCopied2DTexturesAreBlack)
924*8975f5c5SAndroid Build Coastguard Worker {
925*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
926*8975f5c5SAndroid Build Coastguard Worker 
927*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
928*8975f5c5SAndroid Build Coastguard Worker     setupTexture(&tex);
929*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
930*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
931*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
932*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
933*8975f5c5SAndroid Build Coastguard Worker     constexpr int fboWidth  = 16;
934*8975f5c5SAndroid Build Coastguard Worker     constexpr int fboHeight = 16;
935*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, fboWidth, fboHeight);
936*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
937*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
938*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
939*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
940*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
941*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kWidth, kHeight, 0);
942*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, 0, 0, fboWidth, fboHeight, GLColor::red);
943*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
944*8975f5c5SAndroid Build Coastguard Worker }
945*8975f5c5SAndroid Build Coastguard Worker 
946*8975f5c5SAndroid Build Coastguard Worker // Reading an uninitialized portion of a texture (copyTexImage2D with negative x and y) should
947*8975f5c5SAndroid Build Coastguard Worker // succeed with all bytes set to 0. Regression test for a bug where the zeroing out of the
948*8975f5c5SAndroid Build Coastguard Worker // texture was done via the same code path as glTexImage2D, causing the PIXEL_UNPACK_BUFFER
949*8975f5c5SAndroid Build Coastguard Worker // to be used.
TEST_P(RobustResourceInitTestES3,ReadingOutOfBoundsCopiedTextureWithUnpackBuffer)950*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, ReadingOutOfBoundsCopiedTextureWithUnpackBuffer)
951*8975f5c5SAndroid Build Coastguard Worker {
952*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
953*8975f5c5SAndroid Build Coastguard Worker     // TODO([email protected]): CopyTexImage from GL_RGBA4444 to GL_ALPHA fails when looking
954*8975f5c5SAndroid Build Coastguard Worker     // up which resulting format the texture should have.
955*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL());
956*8975f5c5SAndroid Build Coastguard Worker 
957*8975f5c5SAndroid Build Coastguard Worker     // GL_ALPHA texture can't be read with glReadPixels, for convenience this test uses
958*8975f5c5SAndroid Build Coastguard Worker     // glCopyTextureCHROMIUM to copy GL_ALPHA into GL_RGBA
959*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"));
960*8975f5c5SAndroid Build Coastguard Worker 
961*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
962*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
963*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
964*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
965*8975f5c5SAndroid Build Coastguard Worker     constexpr int fboWidth  = 16;
966*8975f5c5SAndroid Build Coastguard Worker     constexpr int fboHeight = 16;
967*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, fboWidth, fboHeight);
968*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
969*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
970*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
971*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
972*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
973*8975f5c5SAndroid Build Coastguard Worker     constexpr int x = -8;
974*8975f5c5SAndroid Build Coastguard Worker     constexpr int y = -8;
975*8975f5c5SAndroid Build Coastguard Worker 
976*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
977*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
978*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> bunchOfGreen(fboWidth * fboHeight, GLColor::green);
979*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(bunchOfGreen[0]) * bunchOfGreen.size(),
980*8975f5c5SAndroid Build Coastguard Worker                  bunchOfGreen.data(), GL_STATIC_DRAW);
981*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
982*8975f5c5SAndroid Build Coastguard Worker 
983*8975f5c5SAndroid Build Coastguard Worker     // Use non-multiple-of-4 dimensions to make sure unpack alignment is set in the backends
984*8975f5c5SAndroid Build Coastguard Worker     // (http://crbug.com/836131)
985*8975f5c5SAndroid Build Coastguard Worker     constexpr int kTextureWidth  = 127;
986*8975f5c5SAndroid Build Coastguard Worker     constexpr int kTextureHeight = 127;
987*8975f5c5SAndroid Build Coastguard Worker 
988*8975f5c5SAndroid Build Coastguard Worker     // Use GL_ALPHA to force a CPU readback in the D3D11 backend
989*8975f5c5SAndroid Build Coastguard Worker     GLTexture texAlpha;
990*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texAlpha);
991*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, x, y, kTextureWidth, kTextureHeight, 0);
992*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
993*8975f5c5SAndroid Build Coastguard Worker 
994*8975f5c5SAndroid Build Coastguard Worker     // GL_ALPHA cannot be glReadPixels, so copy into a GL_RGBA texture
995*8975f5c5SAndroid Build Coastguard Worker     GLTexture texRGBA;
996*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
997*8975f5c5SAndroid Build Coastguard Worker     setupTexture(&texRGBA);
998*8975f5c5SAndroid Build Coastguard Worker     glCopyTextureCHROMIUM(texAlpha, 0, GL_TEXTURE_2D, texRGBA, 0, GL_RGBA, GL_UNSIGNED_BYTE,
999*8975f5c5SAndroid Build Coastguard Worker                           GL_FALSE, GL_FALSE, GL_FALSE);
1000*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1001*8975f5c5SAndroid Build Coastguard Worker 
1002*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&texRGBA, -x, -y, fboWidth, fboHeight, GLColor(0, 0, 0, 255));
1003*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1004*8975f5c5SAndroid Build Coastguard Worker }
1005*8975f5c5SAndroid Build Coastguard Worker 
1006*8975f5c5SAndroid Build Coastguard Worker // Reading an uninitialized portion of a texture (copyTexImage2D with negative x and y) should
1007*8975f5c5SAndroid Build Coastguard Worker // succeed with all bytes set to 0.
TEST_P(RobustResourceInitTest,ReadingOutOfBoundsCopiedTexture)1008*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, ReadingOutOfBoundsCopiedTexture)
1009*8975f5c5SAndroid Build Coastguard Worker {
1010*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1011*8975f5c5SAndroid Build Coastguard Worker 
1012*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1013*8975f5c5SAndroid Build Coastguard Worker     setupTexture(&tex);
1014*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1015*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1016*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1017*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1018*8975f5c5SAndroid Build Coastguard Worker     constexpr int fboWidth  = 16;
1019*8975f5c5SAndroid Build Coastguard Worker     constexpr int fboHeight = 16;
1020*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, fboWidth, fboHeight);
1021*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1022*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1023*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
1024*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1025*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1026*8975f5c5SAndroid Build Coastguard Worker     constexpr int x = -8;
1027*8975f5c5SAndroid Build Coastguard Worker     constexpr int y = -8;
1028*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, kWidth, kHeight, 0);
1029*8975f5c5SAndroid Build Coastguard Worker     checkNonZeroPixels(&tex, -x, -y, fboWidth, fboHeight, GLColor::red);
1030*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1031*8975f5c5SAndroid Build Coastguard Worker }
1032*8975f5c5SAndroid Build Coastguard Worker 
1033*8975f5c5SAndroid Build Coastguard Worker // Tests resources are initialized properly with multisample resolve.
TEST_P(RobustResourceInitTestES3,MultisampledDepthInitializedCorrectly)1034*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, MultisampledDepthInitializedCorrectly)
1035*8975f5c5SAndroid Build Coastguard Worker {
1036*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1037*8975f5c5SAndroid Build Coastguard Worker 
1038*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117
1039*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1040*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263936
1041*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
1042*8975f5c5SAndroid Build Coastguard Worker 
1043*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
1044*8975f5c5SAndroid Build Coastguard Worker 
1045*8975f5c5SAndroid Build Coastguard Worker     // Make the destination non-multisampled depth FBO.
1046*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
1047*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
1048*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1049*8975f5c5SAndroid Build Coastguard Worker 
1050*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
1051*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
1052*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kWidth, kHeight);
1053*8975f5c5SAndroid Build Coastguard Worker 
1054*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1055*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1056*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
1057*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
1058*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1059*8975f5c5SAndroid Build Coastguard Worker 
1060*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
1061*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0);
1062*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1063*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1064*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1065*8975f5c5SAndroid Build Coastguard Worker 
1066*8975f5c5SAndroid Build Coastguard Worker     // Make the multisampled depth FBO.
1067*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer msDepth;
1068*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, msDepth);
1069*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, kWidth, kHeight);
1070*8975f5c5SAndroid Build Coastguard Worker 
1071*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msFBO;
1072*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msFBO);
1073*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, msDepth);
1074*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
1075*8975f5c5SAndroid Build Coastguard Worker 
1076*8975f5c5SAndroid Build Coastguard Worker     // Multisample resolve.
1077*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
1078*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
1079*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1080*8975f5c5SAndroid Build Coastguard Worker 
1081*8975f5c5SAndroid Build Coastguard Worker     // Test drawing with the resolved depth buffer.
1082*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1083*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_FALSE);
1084*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
1085*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_EQUAL);
1086*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 1.0f);
1087*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1088*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1089*8975f5c5SAndroid Build Coastguard Worker }
1090*8975f5c5SAndroid Build Coastguard Worker 
1091*8975f5c5SAndroid Build Coastguard Worker // Basic test that textures are initialized correctly.
TEST_P(RobustResourceInitTest,Texture)1092*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, Texture)
1093*8975f5c5SAndroid Build Coastguard Worker {
1094*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1095*8975f5c5SAndroid Build Coastguard Worker 
1096*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1097*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1098*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1099*8975f5c5SAndroid Build Coastguard Worker 
1100*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1101*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1102*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1103*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(0, 0, 0, 0, GLColor::black);
1104*8975f5c5SAndroid Build Coastguard Worker 
1105*8975f5c5SAndroid Build Coastguard Worker     GLint initState = 0;
1106*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1107*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
1108*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_TRUE(initState);
1109*8975f5c5SAndroid Build Coastguard Worker }
1110*8975f5c5SAndroid Build Coastguard Worker 
1111*8975f5c5SAndroid Build Coastguard Worker // Test that uploading texture data with an unpack state set correctly initializes the texture and
1112*8975f5c5SAndroid Build Coastguard Worker // the data is uploaded correctly.
TEST_P(RobustResourceInitTest,TextureWithUnpackState)1113*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, TextureWithUnpackState)
1114*8975f5c5SAndroid Build Coastguard Worker {
1115*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1116*8975f5c5SAndroid Build Coastguard Worker 
1117*8975f5c5SAndroid Build Coastguard Worker     // GL_UNPACK_ROW_LENGTH requires ES 3.0 or GL_EXT_unpack_subimage
1118*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
1119*8975f5c5SAndroid Build Coastguard Worker                        !EnsureGLExtensionEnabled("GL_EXT_unpack_subimage"));
1120*8975f5c5SAndroid Build Coastguard Worker 
1121*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1122*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1123*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1124*8975f5c5SAndroid Build Coastguard Worker 
1125*8975f5c5SAndroid Build Coastguard Worker     // Upload a 2x2 rect using GL_UNPACK_ROW_LENGTH=4
1126*8975f5c5SAndroid Build Coastguard Worker     GLColor colorData[8] = {
1127*8975f5c5SAndroid Build Coastguard Worker         GLColor::green, GLColor::green, GLColor::red, GLColor::red,
1128*8975f5c5SAndroid Build Coastguard Worker         GLColor::green, GLColor::green, GLColor::red, GLColor::red,
1129*8975f5c5SAndroid Build Coastguard Worker     };
1130*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ROW_LENGTH, 4);
1131*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colorData);
1132*8975f5c5SAndroid Build Coastguard Worker 
1133*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1134*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1135*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1136*8975f5c5SAndroid Build Coastguard Worker 
1137*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(0, 0, 2, 2, GLColor::green);
1138*8975f5c5SAndroid Build Coastguard Worker }
1139*8975f5c5SAndroid Build Coastguard Worker 
1140*8975f5c5SAndroid Build Coastguard Worker template <typename PixelT>
testIntegerTextureInit(const char * samplerType,GLenum internalFormatRGBA,GLenum internalFormatRGB,GLenum type)1141*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTestES3::testIntegerTextureInit(const char *samplerType,
1142*8975f5c5SAndroid Build Coastguard Worker                                                        GLenum internalFormatRGBA,
1143*8975f5c5SAndroid Build Coastguard Worker                                                        GLenum internalFormatRGB,
1144*8975f5c5SAndroid Build Coastguard Worker                                                        GLenum type)
1145*8975f5c5SAndroid Build Coastguard Worker {
1146*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1147*8975f5c5SAndroid Build Coastguard Worker 
1148*8975f5c5SAndroid Build Coastguard Worker     std::string fs = GetSimpleTextureFragmentShader(samplerType);
1149*8975f5c5SAndroid Build Coastguard Worker 
1150*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kSimpleTextureVertexShader, fs.c_str());
1151*8975f5c5SAndroid Build Coastguard Worker 
1152*8975f5c5SAndroid Build Coastguard Worker     // Make an RGBA framebuffer.
1153*8975f5c5SAndroid Build Coastguard Worker     GLTexture framebufferTexture;
1154*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, framebufferTexture);
1155*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, internalFormatRGBA, kWidth, kHeight, 0, GL_RGBA_INTEGER, type,
1156*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
1157*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1158*8975f5c5SAndroid Build Coastguard Worker 
1159*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1160*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1161*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, framebufferTexture,
1162*8975f5c5SAndroid Build Coastguard Worker                            0);
1163*8975f5c5SAndroid Build Coastguard Worker 
1164*8975f5c5SAndroid Build Coastguard Worker     // Make an RGB texture.
1165*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1166*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1167*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, internalFormatRGB, kWidth, kHeight, 0, GL_RGB_INTEGER, type,
1168*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
1169*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1170*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1171*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1172*8975f5c5SAndroid Build Coastguard Worker 
1173*8975f5c5SAndroid Build Coastguard Worker     // Blit from the texture to the framebuffer.
1174*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
1175*8975f5c5SAndroid Build Coastguard Worker 
1176*8975f5c5SAndroid Build Coastguard Worker     // Verify both textures have been initialized
1177*8975f5c5SAndroid Build Coastguard Worker     {
1178*8975f5c5SAndroid Build Coastguard Worker         GLint initState = 0;
1179*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, framebufferTexture);
1180*8975f5c5SAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
1181*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_TRUE(initState);
1182*8975f5c5SAndroid Build Coastguard Worker     }
1183*8975f5c5SAndroid Build Coastguard Worker     {
1184*8975f5c5SAndroid Build Coastguard Worker         GLint initState = 0;
1185*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
1186*8975f5c5SAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_2D, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
1187*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_TRUE(initState);
1188*8975f5c5SAndroid Build Coastguard Worker     }
1189*8975f5c5SAndroid Build Coastguard Worker 
1190*8975f5c5SAndroid Build Coastguard Worker     std::array<PixelT, kWidth * kHeight * 4> data;
1191*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kWidth, kHeight, GL_RGBA_INTEGER, type, data.data());
1192*8975f5c5SAndroid Build Coastguard Worker 
1193*8975f5c5SAndroid Build Coastguard Worker     // Check the color channels are zero and the alpha channel is 1.
1194*8975f5c5SAndroid Build Coastguard Worker     int incorrectPixels = 0;
1195*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < kHeight; ++y)
1196*8975f5c5SAndroid Build Coastguard Worker     {
1197*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < kWidth; ++x)
1198*8975f5c5SAndroid Build Coastguard Worker         {
1199*8975f5c5SAndroid Build Coastguard Worker             int index    = (y * kWidth + x) * 4;
1200*8975f5c5SAndroid Build Coastguard Worker             bool correct = (data[index] == 0 && data[index + 1] == 0 && data[index + 2] == 0 &&
1201*8975f5c5SAndroid Build Coastguard Worker                             data[index + 3] == 1);
1202*8975f5c5SAndroid Build Coastguard Worker             incorrectPixels += (!correct ? 1 : 0);
1203*8975f5c5SAndroid Build Coastguard Worker         }
1204*8975f5c5SAndroid Build Coastguard Worker     }
1205*8975f5c5SAndroid Build Coastguard Worker 
1206*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1207*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(0, incorrectPixels);
1208*8975f5c5SAndroid Build Coastguard Worker }
1209*8975f5c5SAndroid Build Coastguard Worker 
1210*8975f5c5SAndroid Build Coastguard Worker // Simple tests for integer formats that ANGLE must emulate on D3D11.
TEST_P(RobustResourceInitTestES3,TextureInit_UIntRGB8)1211*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, TextureInit_UIntRGB8)
1212*8975f5c5SAndroid Build Coastguard Worker {
1213*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1214*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263936
1215*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
1216*8975f5c5SAndroid Build Coastguard Worker 
1217*8975f5c5SAndroid Build Coastguard Worker     testIntegerTextureInit<uint8_t>("u", GL_RGBA8UI, GL_RGB8UI, GL_UNSIGNED_BYTE);
1218*8975f5c5SAndroid Build Coastguard Worker }
1219*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(RobustResourceInitTestES3,TextureInit_UIntRGB32)1220*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, TextureInit_UIntRGB32)
1221*8975f5c5SAndroid Build Coastguard Worker {
1222*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1223*8975f5c5SAndroid Build Coastguard Worker     testIntegerTextureInit<uint32_t>("u", GL_RGBA32UI, GL_RGB32UI, GL_UNSIGNED_INT);
1224*8975f5c5SAndroid Build Coastguard Worker }
1225*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(RobustResourceInitTestES3,TextureInit_IntRGB8)1226*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, TextureInit_IntRGB8)
1227*8975f5c5SAndroid Build Coastguard Worker {
1228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1229*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263936
1230*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
1231*8975f5c5SAndroid Build Coastguard Worker 
1232*8975f5c5SAndroid Build Coastguard Worker     testIntegerTextureInit<int8_t>("i", GL_RGBA8I, GL_RGB8I, GL_BYTE);
1233*8975f5c5SAndroid Build Coastguard Worker }
1234*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(RobustResourceInitTestES3,TextureInit_IntRGB32)1235*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, TextureInit_IntRGB32)
1236*8975f5c5SAndroid Build Coastguard Worker {
1237*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1238*8975f5c5SAndroid Build Coastguard Worker     testIntegerTextureInit<int32_t>("i", GL_RGBA32I, GL_RGB32I, GL_INT);
1239*8975f5c5SAndroid Build Coastguard Worker }
1240*8975f5c5SAndroid Build Coastguard Worker 
1241*8975f5c5SAndroid Build Coastguard Worker // Test that uninitialized image texture works well.
TEST_P(RobustResourceInitTestES31,ImageTextureInit_R32UI)1242*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES31, ImageTextureInit_R32UI)
1243*8975f5c5SAndroid Build Coastguard Worker {
1244*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1245*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCS[] =
1246*8975f5c5SAndroid Build Coastguard Worker         R"(#version 310 es
1247*8975f5c5SAndroid Build Coastguard Worker         layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
1248*8975f5c5SAndroid Build Coastguard Worker         layout(r32ui, binding = 1) writeonly uniform highp uimage2D writeImage;
1249*8975f5c5SAndroid Build Coastguard Worker         void main()
1250*8975f5c5SAndroid Build Coastguard Worker         {
1251*8975f5c5SAndroid Build Coastguard Worker             imageStore(writeImage, ivec2(gl_LocalInvocationID.xy), uvec4(200u));
1252*8975f5c5SAndroid Build Coastguard Worker         })";
1253*8975f5c5SAndroid Build Coastguard Worker 
1254*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1255*8975f5c5SAndroid Build Coastguard Worker     // Don't upload data to texture.
1256*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1257*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, 1, 1);
1258*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1259*8975f5c5SAndroid Build Coastguard Worker 
1260*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
1261*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1262*8975f5c5SAndroid Build Coastguard Worker 
1263*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(1, texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32UI);
1264*8975f5c5SAndroid Build Coastguard Worker 
1265*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(1, 1, 1);
1266*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1267*8975f5c5SAndroid Build Coastguard Worker 
1268*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1269*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
1270*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1271*8975f5c5SAndroid Build Coastguard Worker 
1272*8975f5c5SAndroid Build Coastguard Worker     GLuint outputValue;
1273*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_UNSIGNED_INT, &outputValue);
1274*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1275*8975f5c5SAndroid Build Coastguard Worker 
1276*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(200u, outputValue);
1277*8975f5c5SAndroid Build Coastguard Worker 
1278*8975f5c5SAndroid Build Coastguard Worker     outputValue = 0u;
1279*8975f5c5SAndroid Build Coastguard Worker     // Write to another uninitialized texture.
1280*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture2;
1281*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture2);
1282*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, 1, 1);
1283*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1284*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(1, texture2, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32UI);
1285*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(1, 1, 1);
1286*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
1287*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_UNSIGNED_INT, &outputValue);
1288*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(200u, outputValue);
1289*8975f5c5SAndroid Build Coastguard Worker }
1290*8975f5c5SAndroid Build Coastguard Worker 
1291*8975f5c5SAndroid Build Coastguard Worker // Basic test that renderbuffers are initialized correctly.
TEST_P(RobustResourceInitTest,Renderbuffer)1292*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, Renderbuffer)
1293*8975f5c5SAndroid Build Coastguard Worker {
1294*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1295*8975f5c5SAndroid Build Coastguard Worker 
1296*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
1297*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1298*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
1299*8975f5c5SAndroid Build Coastguard Worker 
1300*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1301*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1302*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
1303*8975f5c5SAndroid Build Coastguard Worker 
1304*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(0, 0, 0, 0, GLColor::black);
1305*8975f5c5SAndroid Build Coastguard Worker }
1306*8975f5c5SAndroid Build Coastguard Worker 
1307*8975f5c5SAndroid Build Coastguard Worker // Tests creating mipmaps with robust resource init.
TEST_P(RobustResourceInitTestES3,GenerateMipmap)1308*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, GenerateMipmap)
1309*8975f5c5SAndroid Build Coastguard Worker {
1310*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1311*8975f5c5SAndroid Build Coastguard Worker 
1312*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureSize = 16;
1313*8975f5c5SAndroid Build Coastguard Worker 
1314*8975f5c5SAndroid Build Coastguard Worker     // Initialize a 16x16 RGBA8 texture with no data.
1315*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1316*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
1317*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureSize, kTextureSize, 0, GL_RGBA,
1318*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1319*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1320*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1321*8975f5c5SAndroid Build Coastguard Worker 
1322*8975f5c5SAndroid Build Coastguard Worker     std::string shader = GetSimpleTextureFragmentShader("");
1323*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kSimpleTextureVertexShader, shader.c_str());
1324*8975f5c5SAndroid Build Coastguard Worker 
1325*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps and verify all the mips.
1326*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
1327*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1328*8975f5c5SAndroid Build Coastguard Worker 
1329*8975f5c5SAndroid Build Coastguard Worker     // Validate a small texture.
1330*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
1331*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1332*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1333*8975f5c5SAndroid Build Coastguard Worker 
1334*8975f5c5SAndroid Build Coastguard Worker     // Set viewport to resize the texture and draw.
1335*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 2, 2);
1336*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
1337*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1338*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
1339*8975f5c5SAndroid Build Coastguard Worker }
1340*8975f5c5SAndroid Build Coastguard Worker 
1341*8975f5c5SAndroid Build Coastguard Worker // Tests creating mipmaps with robust resource init multiple times.
TEST_P(RobustResourceInitTestES3,GenerateMipmapAfterRedefine)1342*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, GenerateMipmapAfterRedefine)
1343*8975f5c5SAndroid Build Coastguard Worker {
1344*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1345*8975f5c5SAndroid Build Coastguard Worker 
1346*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureSize = 16;
1347*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kInitData(kTextureSize * kTextureSize, GLColor::blue);
1348*8975f5c5SAndroid Build Coastguard Worker 
1349*8975f5c5SAndroid Build Coastguard Worker     // Initialize a 16x16 RGBA8 texture with blue.
1350*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1351*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
1352*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureSize, kTextureSize, 0, GL_RGBA,
1353*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, kInitData.data());
1354*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1355*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1356*8975f5c5SAndroid Build Coastguard Worker 
1357*8975f5c5SAndroid Build Coastguard Worker     std::string shader = GetSimpleTextureFragmentShader("");
1358*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kSimpleTextureVertexShader, shader.c_str());
1359*8975f5c5SAndroid Build Coastguard Worker 
1360*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps.
1361*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
1362*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1363*8975f5c5SAndroid Build Coastguard Worker 
1364*8975f5c5SAndroid Build Coastguard Worker     // Validate a small mip.
1365*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
1366*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1367*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1368*8975f5c5SAndroid Build Coastguard Worker 
1369*8975f5c5SAndroid Build Coastguard Worker     // Set viewport to resize the texture and draw.
1370*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 2, 2);
1371*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
1372*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1373*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1374*8975f5c5SAndroid Build Coastguard Worker 
1375*8975f5c5SAndroid Build Coastguard Worker     // Redefine mip 0 with no data.
1376*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureSize, kTextureSize, 0, GL_RGBA,
1377*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1378*8975f5c5SAndroid Build Coastguard Worker 
1379*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps again.  Mip 0 must be cleared before the mipmaps are regenerated.
1380*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
1381*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1382*8975f5c5SAndroid Build Coastguard Worker 
1383*8975f5c5SAndroid Build Coastguard Worker     // Validate a small mip.
1384*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
1385*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1386*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1387*8975f5c5SAndroid Build Coastguard Worker 
1388*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 2, 2);
1389*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
1390*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1391*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
1392*8975f5c5SAndroid Build Coastguard Worker }
1393*8975f5c5SAndroid Build Coastguard Worker 
1394*8975f5c5SAndroid Build Coastguard Worker // Tests creating mipmaps for cube maps with robust resource init.
TEST_P(RobustResourceInitTestES3,GenerateMipmapCubeMap)1395*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, GenerateMipmapCubeMap)
1396*8975f5c5SAndroid Build Coastguard Worker {
1397*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1398*8975f5c5SAndroid Build Coastguard Worker 
1399*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureSize   = 16;
1400*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kTextureLevels = 5;
1401*8975f5c5SAndroid Build Coastguard Worker 
1402*8975f5c5SAndroid Build Coastguard Worker     // Initialize a 16x16 RGBA8 texture with no data.
1403*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1404*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
1405*8975f5c5SAndroid Build Coastguard Worker     for (GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1406*8975f5c5SAndroid Build Coastguard Worker          ++target)
1407*8975f5c5SAndroid Build Coastguard Worker     {
1408*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(target, 0, GL_RGBA, kTextureSize, kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1409*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1410*8975f5c5SAndroid Build Coastguard Worker     }
1411*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1412*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1413*8975f5c5SAndroid Build Coastguard Worker 
1414*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps and verify all the mips.
1415*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
1416*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1417*8975f5c5SAndroid Build Coastguard Worker 
1418*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1419*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1420*8975f5c5SAndroid Build Coastguard Worker     for (GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1421*8975f5c5SAndroid Build Coastguard Worker          ++target)
1422*8975f5c5SAndroid Build Coastguard Worker     {
1423*8975f5c5SAndroid Build Coastguard Worker         for (GLint level = 0; level < kTextureLevels; ++level)
1424*8975f5c5SAndroid Build Coastguard Worker         {
1425*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, tex, level);
1426*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
1427*8975f5c5SAndroid Build Coastguard Worker         }
1428*8975f5c5SAndroid Build Coastguard Worker     }
1429*8975f5c5SAndroid Build Coastguard Worker }
1430*8975f5c5SAndroid Build Coastguard Worker 
1431*8975f5c5SAndroid Build Coastguard Worker // Test blitting a framebuffer out-of-bounds. Multiple iterations.
TEST_P(RobustResourceInitTestES3,BlitFramebufferOutOfBounds)1432*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, BlitFramebufferOutOfBounds)
1433*8975f5c5SAndroid Build Coastguard Worker {
1434*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1435*8975f5c5SAndroid Build Coastguard Worker 
1436*8975f5c5SAndroid Build Coastguard Worker     // Initiate data to read framebuffer
1437*8975f5c5SAndroid Build Coastguard Worker     constexpr int size                = 8;
1438*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum readbufferFormat = GL_RGBA8;
1439*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum drawbufferFormat = GL_RGBA8;
1440*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum filter           = GL_NEAREST;
1441*8975f5c5SAndroid Build Coastguard Worker 
1442*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> readColors(size * size, GLColor::yellow);
1443*8975f5c5SAndroid Build Coastguard Worker 
1444*8975f5c5SAndroid Build Coastguard Worker     // Create read framebuffer and feed data to read buffer
1445*8975f5c5SAndroid Build Coastguard Worker     // Read buffer may have srgb image
1446*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex_read;
1447*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex_read);
1448*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, readbufferFormat, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1449*8975f5c5SAndroid Build Coastguard Worker                  readColors.data());
1450*8975f5c5SAndroid Build Coastguard Worker 
1451*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo_read;
1452*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_read);
1453*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_read, 0);
1454*8975f5c5SAndroid Build Coastguard Worker 
1455*8975f5c5SAndroid Build Coastguard Worker     // Create draw framebuffer. Color in draw buffer is initialized to 0.
1456*8975f5c5SAndroid Build Coastguard Worker     // Draw buffer may have srgb image
1457*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex_draw;
1458*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex_draw);
1459*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, drawbufferFormat, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1460*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
1461*8975f5c5SAndroid Build Coastguard Worker 
1462*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo_draw;
1463*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_draw);
1464*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_draw, 0);
1465*8975f5c5SAndroid Build Coastguard Worker 
1466*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1467*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
1468*8975f5c5SAndroid Build Coastguard Worker 
1469*8975f5c5SAndroid Build Coastguard Worker     using Region = std::array<int, 4>;
1470*8975f5c5SAndroid Build Coastguard Worker 
1471*8975f5c5SAndroid Build Coastguard Worker     struct Test
1472*8975f5c5SAndroid Build Coastguard Worker     {
1473*8975f5c5SAndroid Build Coastguard Worker         constexpr Test(const Region &read, const Region &draw, const Region &real)
1474*8975f5c5SAndroid Build Coastguard Worker             : readRegion(read), drawRegion(draw), realRegion(real)
1475*8975f5c5SAndroid Build Coastguard Worker         {}
1476*8975f5c5SAndroid Build Coastguard Worker 
1477*8975f5c5SAndroid Build Coastguard Worker         Region readRegion;
1478*8975f5c5SAndroid Build Coastguard Worker         Region drawRegion;
1479*8975f5c5SAndroid Build Coastguard Worker         Region realRegion;
1480*8975f5c5SAndroid Build Coastguard Worker     };
1481*8975f5c5SAndroid Build Coastguard Worker 
1482*8975f5c5SAndroid Build Coastguard Worker     constexpr std::array<Test, 2> tests = {{
1483*8975f5c5SAndroid Build Coastguard Worker         // only src region is out-of-bounds, dst region has different width/height as src region.
1484*8975f5c5SAndroid Build Coastguard Worker         {{{-2, -2, 4, 4}}, {{1, 1, 4, 4}}, {{2, 2, 4, 4}}},
1485*8975f5c5SAndroid Build Coastguard Worker         // only src region is out-of-bounds, dst region has the same width/height as src region.
1486*8975f5c5SAndroid Build Coastguard Worker         {{{-2, -2, 4, 4}}, {{1, 1, 7, 7}}, {{3, 3, 7, 7}}},
1487*8975f5c5SAndroid Build Coastguard Worker     }};
1488*8975f5c5SAndroid Build Coastguard Worker 
1489*8975f5c5SAndroid Build Coastguard Worker     // Blit read framebuffer to the image in draw framebuffer.
1490*8975f5c5SAndroid Build Coastguard Worker     for (const auto &test : tests)
1491*8975f5c5SAndroid Build Coastguard Worker     {
1492*8975f5c5SAndroid Build Coastguard Worker         // both the read framebuffer and draw framebuffer bounds are [0, 0, 8, 8]
1493*8975f5c5SAndroid Build Coastguard Worker         // blitting from src region to dst region
1494*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex_draw);
1495*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, drawbufferFormat, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1496*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1497*8975f5c5SAndroid Build Coastguard Worker 
1498*8975f5c5SAndroid Build Coastguard Worker         const auto &read = test.readRegion;
1499*8975f5c5SAndroid Build Coastguard Worker         const auto &draw = test.drawRegion;
1500*8975f5c5SAndroid Build Coastguard Worker         const auto &real = test.realRegion;
1501*8975f5c5SAndroid Build Coastguard Worker 
1502*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(read[0], read[1], read[2], read[3], draw[0], draw[1], draw[2], draw[3],
1503*8975f5c5SAndroid Build Coastguard Worker                           GL_COLOR_BUFFER_BIT, filter);
1504*8975f5c5SAndroid Build Coastguard Worker 
1505*8975f5c5SAndroid Build Coastguard Worker         // Read pixels and check the correctness.
1506*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor> pixels(size * size);
1507*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_draw);
1508*8975f5c5SAndroid Build Coastguard Worker         glPixelStorei(GL_PACK_ROW_LENGTH, 0);
1509*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, size, size, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
1510*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_read);
1511*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1512*8975f5c5SAndroid Build Coastguard Worker 
1513*8975f5c5SAndroid Build Coastguard Worker         for (int ii = 0; ii < size; ++ii)
1514*8975f5c5SAndroid Build Coastguard Worker         {
1515*8975f5c5SAndroid Build Coastguard Worker             for (int jj = 0; jj < size; ++jj)
1516*8975f5c5SAndroid Build Coastguard Worker             {
1517*8975f5c5SAndroid Build Coastguard Worker                 GLColor expectedColor = GLColor::transparentBlack;
1518*8975f5c5SAndroid Build Coastguard Worker                 if (ii >= real[0] && ii < real[2] && jj >= real[1] && jj < real[3])
1519*8975f5c5SAndroid Build Coastguard Worker                 {
1520*8975f5c5SAndroid Build Coastguard Worker                     expectedColor = GLColor::yellow;
1521*8975f5c5SAndroid Build Coastguard Worker                 }
1522*8975f5c5SAndroid Build Coastguard Worker 
1523*8975f5c5SAndroid Build Coastguard Worker                 int loc = ii * size + jj;
1524*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(expectedColor, pixels[loc]) << " at [" << jj << ", " << ii << "]";
1525*8975f5c5SAndroid Build Coastguard Worker             }
1526*8975f5c5SAndroid Build Coastguard Worker         }
1527*8975f5c5SAndroid Build Coastguard Worker     }
1528*8975f5c5SAndroid Build Coastguard Worker }
1529*8975f5c5SAndroid Build Coastguard Worker 
1530*8975f5c5SAndroid Build Coastguard Worker template <typename ClearFunc>
maskedDepthClear(ClearFunc clearFunc)1531*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::maskedDepthClear(ClearFunc clearFunc)
1532*8975f5c5SAndroid Build Coastguard Worker {
1533*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1534*8975f5c5SAndroid Build Coastguard Worker 
1535*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
1536*8975f5c5SAndroid Build Coastguard Worker 
1537*8975f5c5SAndroid Build Coastguard Worker     // Initialize a FBO with depth and simple color.
1538*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthbuffer;
1539*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer);
1540*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kSize, kSize);
1541*8975f5c5SAndroid Build Coastguard Worker 
1542*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorbuffer;
1543*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorbuffer);
1544*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1545*8975f5c5SAndroid Build Coastguard Worker 
1546*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1547*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1548*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuffer, 0);
1549*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer);
1550*8975f5c5SAndroid Build Coastguard Worker 
1551*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1552*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1553*8975f5c5SAndroid Build Coastguard Worker 
1554*8975f5c5SAndroid Build Coastguard Worker     // Disable depth writes and trigger a clear.
1555*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_FALSE);
1556*8975f5c5SAndroid Build Coastguard Worker 
1557*8975f5c5SAndroid Build Coastguard Worker     clearFunc(0.5f);
1558*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
1559*8975f5c5SAndroid Build Coastguard Worker 
1560*8975f5c5SAndroid Build Coastguard Worker     // Draw red with a depth function that checks for the clear value.
1561*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
1562*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_EQUAL);
1563*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
1564*8975f5c5SAndroid Build Coastguard Worker 
1565*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
1566*8975f5c5SAndroid Build Coastguard Worker 
1567*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
1568*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1569*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black) << "depth should not be 0.5f";
1570*8975f5c5SAndroid Build Coastguard Worker 
1571*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 1.0f);
1572*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red) << "depth should be initialized to 1.0f";
1573*8975f5c5SAndroid Build Coastguard Worker }
1574*8975f5c5SAndroid Build Coastguard Worker 
1575*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a masked depth buffer doesn't mark it clean.
TEST_P(RobustResourceInitTest,MaskedDepthClear)1576*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, MaskedDepthClear)
1577*8975f5c5SAndroid Build Coastguard Worker {
1578*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1579*8975f5c5SAndroid Build Coastguard Worker 
1580*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117
1581*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1582*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263936
1583*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
1584*8975f5c5SAndroid Build Coastguard Worker 
1585*8975f5c5SAndroid Build Coastguard Worker     auto clearFunc = [](float depth) {
1586*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1587*8975f5c5SAndroid Build Coastguard Worker         glClearDepthf(depth);
1588*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1589*8975f5c5SAndroid Build Coastguard Worker     };
1590*8975f5c5SAndroid Build Coastguard Worker 
1591*8975f5c5SAndroid Build Coastguard Worker     maskedDepthClear(clearFunc);
1592*8975f5c5SAndroid Build Coastguard Worker }
1593*8975f5c5SAndroid Build Coastguard Worker 
1594*8975f5c5SAndroid Build Coastguard Worker // Tests the same as MaskedDepthClear, but using ClearBuffer calls.
TEST_P(RobustResourceInitTestES3,MaskedDepthClearBuffer)1595*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, MaskedDepthClearBuffer)
1596*8975f5c5SAndroid Build Coastguard Worker {
1597*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1598*8975f5c5SAndroid Build Coastguard Worker 
1599*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117
1600*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1601*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263936
1602*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
1603*8975f5c5SAndroid Build Coastguard Worker 
1604*8975f5c5SAndroid Build Coastguard Worker     auto clearFunc = [](float depth) {
1605*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1606*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1607*8975f5c5SAndroid Build Coastguard Worker         glClearBufferfv(GL_DEPTH, 0, &depth);
1608*8975f5c5SAndroid Build Coastguard Worker     };
1609*8975f5c5SAndroid Build Coastguard Worker 
1610*8975f5c5SAndroid Build Coastguard Worker     maskedDepthClear(clearFunc);
1611*8975f5c5SAndroid Build Coastguard Worker }
1612*8975f5c5SAndroid Build Coastguard Worker 
1613*8975f5c5SAndroid Build Coastguard Worker template <typename ClearFunc>
maskedStencilClear(ClearFunc clearFunc)1614*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::maskedStencilClear(ClearFunc clearFunc)
1615*8975f5c5SAndroid Build Coastguard Worker {
1616*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
1617*8975f5c5SAndroid Build Coastguard Worker 
1618*8975f5c5SAndroid Build Coastguard Worker     // Initialize a FBO with stencil and simple color.
1619*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer stencilbuffer;
1620*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencilbuffer);
1621*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
1622*8975f5c5SAndroid Build Coastguard Worker 
1623*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorbuffer;
1624*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorbuffer);
1625*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1626*8975f5c5SAndroid Build Coastguard Worker 
1627*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1628*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1629*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuffer, 0);
1630*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1631*8975f5c5SAndroid Build Coastguard Worker                               stencilbuffer);
1632*8975f5c5SAndroid Build Coastguard Worker 
1633*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1634*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1635*8975f5c5SAndroid Build Coastguard Worker 
1636*8975f5c5SAndroid Build Coastguard Worker     // Disable stencil writes and trigger a clear. Use a tricky mask that does not overlap the
1637*8975f5c5SAndroid Build Coastguard Worker     // clear.
1638*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xF0);
1639*8975f5c5SAndroid Build Coastguard Worker     clearFunc(0x0F);
1640*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
1641*8975f5c5SAndroid Build Coastguard Worker 
1642*8975f5c5SAndroid Build Coastguard Worker     // Draw red with a stencil function that checks for stencil == 0
1643*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
1644*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x00, 0xFF);
1645*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1646*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
1647*8975f5c5SAndroid Build Coastguard Worker 
1648*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
1649*8975f5c5SAndroid Build Coastguard Worker 
1650*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
1651*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1652*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red) << "stencil should be equal to zero";
1653*8975f5c5SAndroid Build Coastguard Worker }
1654*8975f5c5SAndroid Build Coastguard Worker 
1655*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a masked stencil buffer doesn't mark it clean.
TEST_P(RobustResourceInitTest,MaskedStencilClear)1656*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, MaskedStencilClear)
1657*8975f5c5SAndroid Build Coastguard Worker {
1658*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1659*8975f5c5SAndroid Build Coastguard Worker 
1660*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117, but only fails on Nexus devices
1661*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
1662*8975f5c5SAndroid Build Coastguard Worker 
1663*8975f5c5SAndroid Build Coastguard Worker     auto clearFunc = [](GLint clearValue) {
1664*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1665*8975f5c5SAndroid Build Coastguard Worker         glClearStencil(clearValue);
1666*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1667*8975f5c5SAndroid Build Coastguard Worker     };
1668*8975f5c5SAndroid Build Coastguard Worker 
1669*8975f5c5SAndroid Build Coastguard Worker     maskedStencilClear(clearFunc);
1670*8975f5c5SAndroid Build Coastguard Worker }
1671*8975f5c5SAndroid Build Coastguard Worker 
1672*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a masked stencil buffer doesn't mark it clean, with ClearBufferi.
TEST_P(RobustResourceInitTestES3,MaskedStencilClearBuffer)1673*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, MaskedStencilClearBuffer)
1674*8975f5c5SAndroid Build Coastguard Worker {
1675*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1676*8975f5c5SAndroid Build Coastguard Worker 
1677*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261118
1678*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsOpenGL() && (IsIntel() || IsNVIDIA()));
1679*8975f5c5SAndroid Build Coastguard Worker 
1680*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsLinux() && IsOpenGL());
1681*8975f5c5SAndroid Build Coastguard Worker 
1682*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261117, but only fails on Nexus devices
1683*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
1684*8975f5c5SAndroid Build Coastguard Worker 
1685*8975f5c5SAndroid Build Coastguard Worker     auto clearFunc = [](GLint clearValue) {
1686*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1687*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1688*8975f5c5SAndroid Build Coastguard Worker         glClearBufferiv(GL_STENCIL, 0, &clearValue);
1689*8975f5c5SAndroid Build Coastguard Worker     };
1690*8975f5c5SAndroid Build Coastguard Worker 
1691*8975f5c5SAndroid Build Coastguard Worker     maskedStencilClear(clearFunc);
1692*8975f5c5SAndroid Build Coastguard Worker }
1693*8975f5c5SAndroid Build Coastguard Worker 
1694*8975f5c5SAndroid Build Coastguard Worker template <int Size, typename InitializedTest>
VerifyRGBA8PixelRect(InitializedTest inInitialized)1695*8975f5c5SAndroid Build Coastguard Worker void VerifyRGBA8PixelRect(InitializedTest inInitialized)
1696*8975f5c5SAndroid Build Coastguard Worker {
1697*8975f5c5SAndroid Build Coastguard Worker     std::array<std::array<GLColor, Size>, Size> actualPixels;
1698*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, Size, Size, GL_RGBA, GL_UNSIGNED_BYTE, actualPixels.data());
1699*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1700*8975f5c5SAndroid Build Coastguard Worker 
1701*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < Size; ++y)
1702*8975f5c5SAndroid Build Coastguard Worker     {
1703*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < Size; ++x)
1704*8975f5c5SAndroid Build Coastguard Worker         {
1705*8975f5c5SAndroid Build Coastguard Worker             if (inInitialized(x, y))
1706*8975f5c5SAndroid Build Coastguard Worker             {
1707*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(actualPixels[y][x], GLColor::red) << " at " << x << ", " << y;
1708*8975f5c5SAndroid Build Coastguard Worker             }
1709*8975f5c5SAndroid Build Coastguard Worker             else
1710*8975f5c5SAndroid Build Coastguard Worker             {
1711*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(actualPixels[y][x], GLColor::transparentBlack)
1712*8975f5c5SAndroid Build Coastguard Worker                     << " at " << x << ", " << y;
1713*8975f5c5SAndroid Build Coastguard Worker             }
1714*8975f5c5SAndroid Build Coastguard Worker         }
1715*8975f5c5SAndroid Build Coastguard Worker     }
1716*8975f5c5SAndroid Build Coastguard Worker }
1717*8975f5c5SAndroid Build Coastguard Worker 
1718*8975f5c5SAndroid Build Coastguard Worker // Tests that calling CopyTexSubImage2D will initialize the source & destination.
TEST_P(RobustResourceInitTest,CopyTexSubImage2D)1719*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, CopyTexSubImage2D)
1720*8975f5c5SAndroid Build Coastguard Worker {
1721*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1722*8975f5c5SAndroid Build Coastguard Worker 
1723*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kDestSize = 4;
1724*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSrcSize         = kDestSize / 2;
1725*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kOffset   = kSrcSize / 2;
1726*8975f5c5SAndroid Build Coastguard Worker 
1727*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redColors(kDestSize * kDestSize, GLColor::red);
1728*8975f5c5SAndroid Build Coastguard Worker 
1729*8975f5c5SAndroid Build Coastguard Worker     // Initialize source texture with red.
1730*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
1731*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
1732*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSrcSize, kSrcSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1733*8975f5c5SAndroid Build Coastguard Worker                  redColors.data());
1734*8975f5c5SAndroid Build Coastguard Worker 
1735*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1736*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1737*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture, 0);
1738*8975f5c5SAndroid Build Coastguard Worker 
1739*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1740*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1741*8975f5c5SAndroid Build Coastguard Worker 
1742*8975f5c5SAndroid Build Coastguard Worker     // Create uninitialized destination texture.
1743*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
1744*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
1745*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kDestSize, kDestSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1746*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
1747*8975f5c5SAndroid Build Coastguard Worker 
1748*8975f5c5SAndroid Build Coastguard Worker     // Trigger the copy from initialized source into uninitialized dest.
1749*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, kOffset, kOffset, 0, 0, kSrcSize, kSrcSize);
1750*8975f5c5SAndroid Build Coastguard Worker 
1751*8975f5c5SAndroid Build Coastguard Worker     // Verify the pixel rectangle.
1752*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);
1753*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1754*8975f5c5SAndroid Build Coastguard Worker 
1755*8975f5c5SAndroid Build Coastguard Worker     auto srcInitTest = [](int x, int y) {
1756*8975f5c5SAndroid Build Coastguard Worker         return (x >= kOffset) && x < (kDestSize - kOffset) && (y >= kOffset) &&
1757*8975f5c5SAndroid Build Coastguard Worker                y < (kDestSize - kOffset);
1758*8975f5c5SAndroid Build Coastguard Worker     };
1759*8975f5c5SAndroid Build Coastguard Worker 
1760*8975f5c5SAndroid Build Coastguard Worker     VerifyRGBA8PixelRect<kDestSize>(srcInitTest);
1761*8975f5c5SAndroid Build Coastguard Worker 
1762*8975f5c5SAndroid Build Coastguard Worker     // Make source texture uninitialized. Force a release by redefining a new size.
1763*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTexture);
1764*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSrcSize, kSrcSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1765*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
1766*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture, 0);
1767*8975f5c5SAndroid Build Coastguard Worker 
1768*8975f5c5SAndroid Build Coastguard Worker     // Fill destination texture with red.
1769*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
1770*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kDestSize, kDestSize, GL_RGBA, GL_UNSIGNED_BYTE,
1771*8975f5c5SAndroid Build Coastguard Worker                     redColors.data());
1772*8975f5c5SAndroid Build Coastguard Worker 
1773*8975f5c5SAndroid Build Coastguard Worker     // Trigger a copy from uninitialized source into initialized dest.
1774*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, kOffset, kOffset, 0, 0, kSrcSize, kSrcSize);
1775*8975f5c5SAndroid Build Coastguard Worker 
1776*8975f5c5SAndroid Build Coastguard Worker     // Verify the pixel rectangle.
1777*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);
1778*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1779*8975f5c5SAndroid Build Coastguard Worker 
1780*8975f5c5SAndroid Build Coastguard Worker     auto destInitTest = [srcInitTest](int x, int y) { return !srcInitTest(x, y); };
1781*8975f5c5SAndroid Build Coastguard Worker 
1782*8975f5c5SAndroid Build Coastguard Worker     VerifyRGBA8PixelRect<kDestSize>(destInitTest);
1783*8975f5c5SAndroid Build Coastguard Worker }
1784*8975f5c5SAndroid Build Coastguard Worker 
copyTexSubImage2DCustomFBOTest(int offsetX,int offsetY)1785*8975f5c5SAndroid Build Coastguard Worker void RobustResourceInitTest::copyTexSubImage2DCustomFBOTest(int offsetX, int offsetY)
1786*8975f5c5SAndroid Build Coastguard Worker {
1787*8975f5c5SAndroid Build Coastguard Worker     const int texSize = 512;
1788*8975f5c5SAndroid Build Coastguard Worker     const int fboSize = 16;
1789*8975f5c5SAndroid Build Coastguard Worker 
1790*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1791*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1792*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texSize, texSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1793*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
1794*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1795*8975f5c5SAndroid Build Coastguard Worker 
1796*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
1797*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1798*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, fboSize, fboSize);
1799*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1800*8975f5c5SAndroid Build Coastguard Worker 
1801*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1802*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1803*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
1804*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1805*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1806*8975f5c5SAndroid Build Coastguard Worker 
1807*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
1808*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1809*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1810*8975f5c5SAndroid Build Coastguard Worker 
1811*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, offsetX, offsetY, texSize, texSize);
1812*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1813*8975f5c5SAndroid Build Coastguard Worker 
1814*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readbackFBO;
1815*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, readbackFBO);
1816*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1817*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1818*8975f5c5SAndroid Build Coastguard Worker     checkCustomFramebufferNonZeroPixels(texSize, texSize, -offsetX, -offsetY, fboSize, fboSize,
1819*8975f5c5SAndroid Build Coastguard Worker                                         GLColor::red);
1820*8975f5c5SAndroid Build Coastguard Worker }
1821*8975f5c5SAndroid Build Coastguard Worker 
1822*8975f5c5SAndroid Build Coastguard Worker // Test CopyTexSubImage2D clipped to size of custom FBO, zero x/y source offset.
TEST_P(RobustResourceInitTest,CopyTexSubImage2DCustomFBOZeroOffsets)1823*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, CopyTexSubImage2DCustomFBOZeroOffsets)
1824*8975f5c5SAndroid Build Coastguard Worker {
1825*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1826*8975f5c5SAndroid Build Coastguard Worker     copyTexSubImage2DCustomFBOTest(0, 0);
1827*8975f5c5SAndroid Build Coastguard Worker }
1828*8975f5c5SAndroid Build Coastguard Worker 
1829*8975f5c5SAndroid Build Coastguard Worker // Test CopyTexSubImage2D clipped to size of custom FBO, negative x/y source offset.
TEST_P(RobustResourceInitTest,CopyTexSubImage2DCustomFBONegativeOffsets)1830*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, CopyTexSubImage2DCustomFBONegativeOffsets)
1831*8975f5c5SAndroid Build Coastguard Worker {
1832*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1833*8975f5c5SAndroid Build Coastguard Worker     copyTexSubImage2DCustomFBOTest(-8, -8);
1834*8975f5c5SAndroid Build Coastguard Worker }
1835*8975f5c5SAndroid Build Coastguard Worker 
1836*8975f5c5SAndroid Build Coastguard Worker // Tests that calling CopyTexSubImage3D will initialize the source & destination.
TEST_P(RobustResourceInitTestES3,CopyTexSubImage3D)1837*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, CopyTexSubImage3D)
1838*8975f5c5SAndroid Build Coastguard Worker {
1839*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1840*8975f5c5SAndroid Build Coastguard Worker 
1841*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kDestSize = 4;
1842*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSrcSize         = kDestSize / 2;
1843*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kOffset   = kSrcSize / 2;
1844*8975f5c5SAndroid Build Coastguard Worker 
1845*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redColors(kDestSize * kDestSize * kDestSize, GLColor::red);
1846*8975f5c5SAndroid Build Coastguard Worker 
1847*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTexture;
1848*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1849*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
1850*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1851*8975f5c5SAndroid Build Coastguard Worker 
1852*8975f5c5SAndroid Build Coastguard Worker     // Initialize source texture with red.
1853*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, srcTexture);
1854*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kSrcSize, kSrcSize, kSrcSize, 0, GL_RGBA,
1855*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, redColors.data());
1856*8975f5c5SAndroid Build Coastguard Worker 
1857*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, srcTexture, 0, 0);
1858*8975f5c5SAndroid Build Coastguard Worker 
1859*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1860*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1861*8975f5c5SAndroid Build Coastguard Worker 
1862*8975f5c5SAndroid Build Coastguard Worker     // Create uninitialized destination texture.
1863*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, destTexture);
1864*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kDestSize, kDestSize, kDestSize, 0, GL_RGBA,
1865*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1866*8975f5c5SAndroid Build Coastguard Worker 
1867*8975f5c5SAndroid Build Coastguard Worker     // Trigger the copy from initialized source into uninitialized dest.
1868*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3D(GL_TEXTURE_3D, 0, kOffset, kOffset, 0, 0, 0, kSrcSize, kSrcSize);
1869*8975f5c5SAndroid Build Coastguard Worker 
1870*8975f5c5SAndroid Build Coastguard Worker     // Verify the pixel rectangle.
1871*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, destTexture, 0, 0);
1872*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1873*8975f5c5SAndroid Build Coastguard Worker 
1874*8975f5c5SAndroid Build Coastguard Worker     auto srcInitTest = [](int x, int y) {
1875*8975f5c5SAndroid Build Coastguard Worker         return (x >= kOffset) && x < (kDestSize - kOffset) && (y >= kOffset) &&
1876*8975f5c5SAndroid Build Coastguard Worker                y < (kDestSize - kOffset);
1877*8975f5c5SAndroid Build Coastguard Worker     };
1878*8975f5c5SAndroid Build Coastguard Worker 
1879*8975f5c5SAndroid Build Coastguard Worker     VerifyRGBA8PixelRect<kDestSize>(srcInitTest);
1880*8975f5c5SAndroid Build Coastguard Worker 
1881*8975f5c5SAndroid Build Coastguard Worker     // Make source texture uninitialized.
1882*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, srcTexture);
1883*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kSrcSize, kSrcSize, kSrcSize, 0, GL_RGBA,
1884*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1885*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, srcTexture, 0, 0);
1886*8975f5c5SAndroid Build Coastguard Worker 
1887*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1888*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1889*8975f5c5SAndroid Build Coastguard Worker 
1890*8975f5c5SAndroid Build Coastguard Worker     // Fill destination texture with red.
1891*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, destTexture);
1892*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kDestSize, kDestSize, kDestSize, 0, GL_RGBA,
1893*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, redColors.data());
1894*8975f5c5SAndroid Build Coastguard Worker 
1895*8975f5c5SAndroid Build Coastguard Worker     // Trigger a copy from uninitialized source into initialized dest.
1896*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3D(GL_TEXTURE_3D, 0, kOffset, kOffset, 0, 0, 0, kSrcSize, kSrcSize);
1897*8975f5c5SAndroid Build Coastguard Worker 
1898*8975f5c5SAndroid Build Coastguard Worker     // Verify the pixel rectangle.
1899*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, destTexture, 0, 0);
1900*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1901*8975f5c5SAndroid Build Coastguard Worker 
1902*8975f5c5SAndroid Build Coastguard Worker     auto destInitTest = [srcInitTest](int x, int y) { return !srcInitTest(x, y); };
1903*8975f5c5SAndroid Build Coastguard Worker 
1904*8975f5c5SAndroid Build Coastguard Worker     VerifyRGBA8PixelRect<kDestSize>(destInitTest);
1905*8975f5c5SAndroid Build Coastguard Worker }
1906*8975f5c5SAndroid Build Coastguard Worker 
1907*8975f5c5SAndroid Build Coastguard Worker // Test basic robustness with 2D array textures.
TEST_P(RobustResourceInitTestES3,Texture2DArray)1908*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, Texture2DArray)
1909*8975f5c5SAndroid Build Coastguard Worker {
1910*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1911*8975f5c5SAndroid Build Coastguard Worker 
1912*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize   = 1024;
1913*8975f5c5SAndroid Build Coastguard Worker     constexpr int kLayers = 8;
1914*8975f5c5SAndroid Build Coastguard Worker 
1915*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1916*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
1917*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, kSize, kSize, kLayers, 0, GL_RGBA,
1918*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1919*8975f5c5SAndroid Build Coastguard Worker 
1920*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1921*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1922*8975f5c5SAndroid Build Coastguard Worker 
1923*8975f5c5SAndroid Build Coastguard Worker     for (int layer = 0; layer < kLayers; ++layer)
1924*8975f5c5SAndroid Build Coastguard Worker     {
1925*8975f5c5SAndroid Build Coastguard Worker         checkNonZeroPixels3D(&texture, 0, 0, 0, 0, layer, GLColor::transparentBlack);
1926*8975f5c5SAndroid Build Coastguard Worker     }
1927*8975f5c5SAndroid Build Coastguard Worker }
1928*8975f5c5SAndroid Build Coastguard Worker 
1929*8975f5c5SAndroid Build Coastguard Worker // Test that using TexStorage2D followed by CompressedSubImage works with robust init.
1930*8975f5c5SAndroid Build Coastguard Worker // Taken from WebGL test conformance/extensions/webgl-compressed-texture-s3tc.
TEST_P(RobustResourceInitTestES3,CompressedSubImage)1931*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, CompressedSubImage)
1932*8975f5c5SAndroid Build Coastguard Worker {
1933*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
1934*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
1935*8975f5c5SAndroid Build Coastguard Worker 
1936*8975f5c5SAndroid Build Coastguard Worker     constexpr int width     = 8;
1937*8975f5c5SAndroid Build Coastguard Worker     constexpr int height    = 8;
1938*8975f5c5SAndroid Build Coastguard Worker     constexpr int subX0     = 0;
1939*8975f5c5SAndroid Build Coastguard Worker     constexpr int subY0     = 0;
1940*8975f5c5SAndroid Build Coastguard Worker     constexpr int subWidth  = 4;
1941*8975f5c5SAndroid Build Coastguard Worker     constexpr int subHeight = 4;
1942*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum format = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
1943*8975f5c5SAndroid Build Coastguard Worker 
1944*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint8_t img_8x8_rgb_dxt1[] = {
1945*8975f5c5SAndroid Build Coastguard Worker         0xe0, 0x07, 0x00, 0xf8, 0x11, 0x10, 0x15, 0x00, 0x1f, 0x00, 0xe0,
1946*8975f5c5SAndroid Build Coastguard Worker         0xff, 0x11, 0x10, 0x15, 0x00, 0xe0, 0x07, 0x1f, 0xf8, 0x44, 0x45,
1947*8975f5c5SAndroid Build Coastguard Worker         0x40, 0x55, 0x1f, 0x00, 0xff, 0x07, 0x44, 0x45, 0x40, 0x55,
1948*8975f5c5SAndroid Build Coastguard Worker     };
1949*8975f5c5SAndroid Build Coastguard Worker 
1950*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint8_t img_4x4_rgb_dxt1[] = {
1951*8975f5c5SAndroid Build Coastguard Worker         0xe0, 0x07, 0x00, 0xf8, 0x11, 0x10, 0x15, 0x00,
1952*8975f5c5SAndroid Build Coastguard Worker     };
1953*8975f5c5SAndroid Build Coastguard Worker 
1954*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> data(img_8x8_rgb_dxt1, img_8x8_rgb_dxt1 + ArraySize(img_8x8_rgb_dxt1));
1955*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> subData(img_4x4_rgb_dxt1, img_4x4_rgb_dxt1 + ArraySize(img_4x4_rgb_dxt1));
1956*8975f5c5SAndroid Build Coastguard Worker 
1957*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorbuffer;
1958*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorbuffer);
1959*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1960*8975f5c5SAndroid Build Coastguard Worker 
1961*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1962*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1963*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuffer, 0);
1964*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1965*8975f5c5SAndroid Build Coastguard Worker 
1966*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, width, height);
1967*8975f5c5SAndroid Build Coastguard Worker 
1968*8975f5c5SAndroid Build Coastguard Worker     // testing format width-x-height via texStorage2D
1969*8975f5c5SAndroid Build Coastguard Worker     const auto &expectedData = UncompressDXTIntoSubRegion(width, height, subX0, subY0, subWidth,
1970*8975f5c5SAndroid Build Coastguard Worker                                                           subHeight, subData, format);
1971*8975f5c5SAndroid Build Coastguard Worker 
1972*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1973*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
1974*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1975*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1976*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1977*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1978*8975f5c5SAndroid Build Coastguard Worker 
1979*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, format, width, height);
1980*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1981*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, subX0, subY0, subWidth, subHeight, format,
1982*8975f5c5SAndroid Build Coastguard Worker                               static_cast<GLsizei>(subData.size()), subData.data());
1983*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1984*8975f5c5SAndroid Build Coastguard Worker 
1985*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, true);
1986*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1987*8975f5c5SAndroid Build Coastguard Worker 
1988*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> actualData(width * height);
1989*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
1990*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1991*8975f5c5SAndroid Build Coastguard Worker 
1992*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < height; ++y)
1993*8975f5c5SAndroid Build Coastguard Worker     {
1994*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < width; ++x)
1995*8975f5c5SAndroid Build Coastguard Worker         {
1996*8975f5c5SAndroid Build Coastguard Worker             int offset                  = x + y * width;
1997*8975f5c5SAndroid Build Coastguard Worker             const GLColor expectedColor = expectedData[offset];
1998*8975f5c5SAndroid Build Coastguard Worker             const GLColor actualColor   = actualData[offset];
1999*8975f5c5SAndroid Build Coastguard Worker 
2000*8975f5c5SAndroid Build Coastguard Worker             // Allow for some minor variation because the format is compressed.
2001*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.R, actualColor.R, 1) << " at (" << x << ", " << y << ")";
2002*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.G, actualColor.G, 1) << " at (" << x << ", " << y << ")";
2003*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.B, actualColor.B, 1) << " at (" << x << ", " << y << ")";
2004*8975f5c5SAndroid Build Coastguard Worker         }
2005*8975f5c5SAndroid Build Coastguard Worker     }
2006*8975f5c5SAndroid Build Coastguard Worker }
2007*8975f5c5SAndroid Build Coastguard Worker 
2008*8975f5c5SAndroid Build Coastguard Worker // Test drawing to a framebuffer with not all draw buffers enabled
TEST_P(RobustResourceInitTestES3,SparseDrawBuffers)2009*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, SparseDrawBuffers)
2010*8975f5c5SAndroid Build Coastguard Worker {
2011*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
2012*8975f5c5SAndroid Build Coastguard Worker void main() {
2013*8975f5c5SAndroid Build Coastguard Worker   gl_PointSize = 100.0;
2014*8975f5c5SAndroid Build Coastguard Worker   gl_Position = vec4(0, 0, 0, 1);
2015*8975f5c5SAndroid Build Coastguard Worker })";
2016*8975f5c5SAndroid Build Coastguard Worker 
2017*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
2018*8975f5c5SAndroid Build Coastguard Worker precision highp float;
2019*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 output1;
2020*8975f5c5SAndroid Build Coastguard Worker layout(location = 3) out vec4 output2;
2021*8975f5c5SAndroid Build Coastguard Worker void main()
2022*8975f5c5SAndroid Build Coastguard Worker {
2023*8975f5c5SAndroid Build Coastguard Worker     output1 = vec4(0.0, 1.0, 0.0, 1.0);
2024*8975f5c5SAndroid Build Coastguard Worker     output2 = vec4(0.0, 0.0, 1.0, 1.0);
2025*8975f5c5SAndroid Build Coastguard Worker })";
2026*8975f5c5SAndroid Build Coastguard Worker 
2027*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
2028*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2029*8975f5c5SAndroid Build Coastguard Worker 
2030*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2031*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2032*8975f5c5SAndroid Build Coastguard Worker 
2033*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLTexture> textures(4);
2034*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < textures.size(); i++)
2035*8975f5c5SAndroid Build Coastguard Worker     {
2036*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
2037*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2038*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
2039*8975f5c5SAndroid Build Coastguard Worker                                0);
2040*8975f5c5SAndroid Build Coastguard Worker     }
2041*8975f5c5SAndroid Build Coastguard Worker 
2042*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, 1, 1);
2043*8975f5c5SAndroid Build Coastguard Worker 
2044*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum drawBuffers[4] = {
2045*8975f5c5SAndroid Build Coastguard Worker         GL_NONE,
2046*8975f5c5SAndroid Build Coastguard Worker         GL_COLOR_ATTACHMENT1,
2047*8975f5c5SAndroid Build Coastguard Worker         GL_NONE,
2048*8975f5c5SAndroid Build Coastguard Worker         GL_COLOR_ATTACHMENT3,
2049*8975f5c5SAndroid Build Coastguard Worker     };
2050*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(4, drawBuffers);
2051*8975f5c5SAndroid Build Coastguard Worker 
2052*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
2053*8975f5c5SAndroid Build Coastguard Worker 
2054*8975f5c5SAndroid Build Coastguard Worker     const GLColor expectedColors[4] = {
2055*8975f5c5SAndroid Build Coastguard Worker         GLColor::transparentBlack,
2056*8975f5c5SAndroid Build Coastguard Worker         GLColor::green,
2057*8975f5c5SAndroid Build Coastguard Worker         GLColor::transparentBlack,
2058*8975f5c5SAndroid Build Coastguard Worker         GLColor::blue,
2059*8975f5c5SAndroid Build Coastguard Worker     };
2060*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < textures.size(); i++)
2061*8975f5c5SAndroid Build Coastguard Worker     {
2062*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
2063*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, expectedColors[i]) << " at attachment " << i;
2064*8975f5c5SAndroid Build Coastguard Worker     }
2065*8975f5c5SAndroid Build Coastguard Worker }
2066*8975f5c5SAndroid Build Coastguard Worker 
2067*8975f5c5SAndroid Build Coastguard Worker // Tests that a partial scissor still initializes contents as expected.
TEST_P(RobustResourceInitTest,ClearWithScissor)2068*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, ClearWithScissor)
2069*8975f5c5SAndroid Build Coastguard Worker {
2070*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
2071*8975f5c5SAndroid Build Coastguard Worker 
2072*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
2073*8975f5c5SAndroid Build Coastguard Worker 
2074*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer colorbuffer;
2075*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, colorbuffer);
2076*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2077*8975f5c5SAndroid Build Coastguard Worker 
2078*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
2079*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2080*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorbuffer);
2081*8975f5c5SAndroid Build Coastguard Worker 
2082*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2083*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2084*8975f5c5SAndroid Build Coastguard Worker 
2085*8975f5c5SAndroid Build Coastguard Worker     // Scissor to half the width.
2086*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2087*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kSize / 2, kSize);
2088*8975f5c5SAndroid Build Coastguard Worker 
2089*8975f5c5SAndroid Build Coastguard Worker     // Clear. Half the texture should be black, and half red.
2090*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2091*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2092*8975f5c5SAndroid Build Coastguard Worker 
2093*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2094*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2095*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::transparentBlack);
2096*8975f5c5SAndroid Build Coastguard Worker 
2097*8975f5c5SAndroid Build Coastguard Worker     GLint initState = 0;
2098*8975f5c5SAndroid Build Coastguard Worker     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RESOURCE_INITIALIZED_ANGLE, &initState);
2099*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_TRUE(initState);
2100*8975f5c5SAndroid Build Coastguard Worker }
2101*8975f5c5SAndroid Build Coastguard Worker 
2102*8975f5c5SAndroid Build Coastguard Worker // Tests that surfaces are initialized when they are created
TEST_P(RobustResourceInitTest,SurfaceInitialized)2103*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, SurfaceInitialized)
2104*8975f5c5SAndroid Build Coastguard Worker {
2105*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasRobustSurfaceInit());
2106*8975f5c5SAndroid Build Coastguard Worker 
2107*8975f5c5SAndroid Build Coastguard Worker     checkFramebufferNonZeroPixels(0, 0, 0, 0, GLColor::black);
2108*8975f5c5SAndroid Build Coastguard Worker }
2109*8975f5c5SAndroid Build Coastguard Worker 
2110*8975f5c5SAndroid Build Coastguard Worker // Tests that surfaces are initialized after swapping if they are not preserved
TEST_P(RobustResourceInitTest,SurfaceInitializedAfterSwap)2111*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, SurfaceInitializedAfterSwap)
2112*8975f5c5SAndroid Build Coastguard Worker {
2113*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasRobustSurfaceInit());
2114*8975f5c5SAndroid Build Coastguard Worker 
2115*8975f5c5SAndroid Build Coastguard Worker     EGLint swapBehaviour = 0;
2116*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(eglQuerySurface(getEGLWindow()->getDisplay(), getEGLWindow()->getSurface(),
2117*8975f5c5SAndroid Build Coastguard Worker                                 EGL_SWAP_BEHAVIOR, &swapBehaviour));
2118*8975f5c5SAndroid Build Coastguard Worker 
2119*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4> clearColors = {{
2120*8975f5c5SAndroid Build Coastguard Worker         GLColor::blue,
2121*8975f5c5SAndroid Build Coastguard Worker         GLColor::cyan,
2122*8975f5c5SAndroid Build Coastguard Worker         GLColor::red,
2123*8975f5c5SAndroid Build Coastguard Worker         GLColor::yellow,
2124*8975f5c5SAndroid Build Coastguard Worker     }};
2125*8975f5c5SAndroid Build Coastguard Worker 
2126*8975f5c5SAndroid Build Coastguard Worker     if (swapBehaviour != EGL_BUFFER_PRESERVED)
2127*8975f5c5SAndroid Build Coastguard Worker     {
2128*8975f5c5SAndroid Build Coastguard Worker         checkFramebufferNonZeroPixels(0, 0, 0, 0, GLColor::black);
2129*8975f5c5SAndroid Build Coastguard Worker     }
2130*8975f5c5SAndroid Build Coastguard Worker 
2131*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2132*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, 1, 1);
2133*8975f5c5SAndroid Build Coastguard Worker 
2134*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < clearColors.size(); i++)
2135*8975f5c5SAndroid Build Coastguard Worker     {
2136*8975f5c5SAndroid Build Coastguard Worker         if (swapBehaviour == EGL_BUFFER_PRESERVED && i > 0)
2137*8975f5c5SAndroid Build Coastguard Worker         {
2138*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_EQ(0, 0, clearColors[i - 1]);
2139*8975f5c5SAndroid Build Coastguard Worker         }
2140*8975f5c5SAndroid Build Coastguard Worker 
2141*8975f5c5SAndroid Build Coastguard Worker         angle::Vector4 clearColor = clearColors[i].toNormalizedVector();
2142*8975f5c5SAndroid Build Coastguard Worker         glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
2143*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
2144*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
2145*8975f5c5SAndroid Build Coastguard Worker 
2146*8975f5c5SAndroid Build Coastguard Worker         if (swapBehaviour != EGL_BUFFER_PRESERVED)
2147*8975f5c5SAndroid Build Coastguard Worker         {
2148*8975f5c5SAndroid Build Coastguard Worker             // Only scissored area (0, 0, 1, 1) has clear color.
2149*8975f5c5SAndroid Build Coastguard Worker             // The rest should be robust initialized.
2150*8975f5c5SAndroid Build Coastguard Worker             checkFramebufferNonZeroPixels(0, 0, 1, 1, clearColors[i]);
2151*8975f5c5SAndroid Build Coastguard Worker         }
2152*8975f5c5SAndroid Build Coastguard Worker 
2153*8975f5c5SAndroid Build Coastguard Worker         swapBuffers();
2154*8975f5c5SAndroid Build Coastguard Worker     }
2155*8975f5c5SAndroid Build Coastguard Worker }
2156*8975f5c5SAndroid Build Coastguard Worker 
2157*8975f5c5SAndroid Build Coastguard Worker // Test that multisampled 2D textures are initialized.
TEST_P(RobustResourceInitTestES31,Multisample2DTexture)2158*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES31, Multisample2DTexture)
2159*8975f5c5SAndroid Build Coastguard Worker {
2160*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
2161*8975f5c5SAndroid Build Coastguard Worker 
2162*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2163*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
2164*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, GL_RGBA8, kWidth, kHeight, false);
2165*8975f5c5SAndroid Build Coastguard Worker 
2166*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
2167*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
2168*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
2169*8975f5c5SAndroid Build Coastguard Worker                            texture, 0);
2170*8975f5c5SAndroid Build Coastguard Worker 
2171*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
2172*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
2173*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
2174*8975f5c5SAndroid Build Coastguard Worker 
2175*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFramebuffer;
2176*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFramebuffer);
2177*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
2178*8975f5c5SAndroid Build Coastguard Worker                            0);
2179*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2180*8975f5c5SAndroid Build Coastguard Worker 
2181*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
2182*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
2183*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2184*8975f5c5SAndroid Build Coastguard Worker 
2185*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFramebuffer);
2186*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::transparentBlack);
2187*8975f5c5SAndroid Build Coastguard Worker }
2188*8975f5c5SAndroid Build Coastguard Worker 
2189*8975f5c5SAndroid Build Coastguard Worker // Test that multisampled 2D texture arrays from OES_texture_storage_multisample_2d_array are
2190*8975f5c5SAndroid Build Coastguard Worker // initialized.
TEST_P(RobustResourceInitTestES31,Multisample2DTextureArray)2191*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES31, Multisample2DTextureArray)
2192*8975f5c5SAndroid Build Coastguard Worker {
2193*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
2194*8975f5c5SAndroid Build Coastguard Worker 
2195*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionRequestable("GL_OES_texture_storage_multisample_2d_array"))
2196*8975f5c5SAndroid Build Coastguard Worker     {
2197*8975f5c5SAndroid Build Coastguard Worker         glRequestExtensionANGLE("GL_OES_texture_storage_multisample_2d_array");
2198*8975f5c5SAndroid Build Coastguard Worker     }
2199*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
2200*8975f5c5SAndroid Build Coastguard Worker 
2201*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kLayers = 4;
2202*8975f5c5SAndroid Build Coastguard Worker 
2203*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2204*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, texture);
2205*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, kWidth, kHeight,
2206*8975f5c5SAndroid Build Coastguard Worker                                  kLayers, false);
2207*8975f5c5SAndroid Build Coastguard Worker 
2208*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
2209*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
2210*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
2211*8975f5c5SAndroid Build Coastguard Worker 
2212*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFramebuffer;
2213*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFramebuffer);
2214*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
2215*8975f5c5SAndroid Build Coastguard Worker                            0);
2216*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2217*8975f5c5SAndroid Build Coastguard Worker 
2218*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei layerIndex = 0; layerIndex < kLayers; ++layerIndex)
2219*8975f5c5SAndroid Build Coastguard Worker     {
2220*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
2221*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
2222*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0,
2223*8975f5c5SAndroid Build Coastguard Worker                                   layerIndex);
2224*8975f5c5SAndroid Build Coastguard Worker 
2225*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
2226*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
2227*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2228*8975f5c5SAndroid Build Coastguard Worker 
2229*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFramebuffer);
2230*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::transparentBlack);
2231*8975f5c5SAndroid Build Coastguard Worker     }
2232*8975f5c5SAndroid Build Coastguard Worker }
2233*8975f5c5SAndroid Build Coastguard Worker 
2234*8975f5c5SAndroid Build Coastguard Worker // Test to cover a bug that the multisampled depth attachment of a framebuffer are not successfully
2235*8975f5c5SAndroid Build Coastguard Worker // initialized before it is used as the read framebuffer in blitFramebuffer.
2236*8975f5c5SAndroid Build Coastguard Worker // Referenced from the following WebGL CTS:
2237*8975f5c5SAndroid Build Coastguard Worker // conformance2/renderbuffers/multisampled-depth-renderbuffer-initialization.html
TEST_P(RobustResourceInitTestES3,InitializeMultisampledDepthRenderbufferAfterCopyTextureCHROMIUM)2238*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, InitializeMultisampledDepthRenderbufferAfterCopyTextureCHROMIUM)
2239*8975f5c5SAndroid Build Coastguard Worker {
2240*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
2241*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_copy_texture"));
2242*8975f5c5SAndroid Build Coastguard Worker 
2243*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263936
2244*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
2245*8975f5c5SAndroid Build Coastguard Worker 
2246*8975f5c5SAndroid Build Coastguard Worker     // Call glCopyTextureCHROMIUM to set destTexture as the color attachment of the internal
2247*8975f5c5SAndroid Build Coastguard Worker     // framebuffer mScratchFBO.
2248*8975f5c5SAndroid Build Coastguard Worker     GLTexture sourceTexture;
2249*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, sourceTexture);
2250*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2251*8975f5c5SAndroid Build Coastguard Worker     GLTexture destTexture;
2252*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, destTexture);
2253*8975f5c5SAndroid Build Coastguard Worker     glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, GL_RGBA,
2254*8975f5c5SAndroid Build Coastguard Worker                           GL_UNSIGNED_BYTE, GL_FALSE, GL_FALSE, GL_FALSE);
2255*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2256*8975f5c5SAndroid Build Coastguard Worker 
2257*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer drawFbo;
2258*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, drawFbo);
2259*8975f5c5SAndroid Build Coastguard Worker 
2260*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
2261*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
2262*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2263*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
2264*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer drawDepthRbo;
2265*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, drawDepthRbo);
2266*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kWidth, kHeight);
2267*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, drawDepthRbo);
2268*8975f5c5SAndroid Build Coastguard Worker 
2269*8975f5c5SAndroid Build Coastguard Worker     // Clear drawDepthRbo to 0.0f
2270*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2271*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.0f);
2272*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2273*8975f5c5SAndroid Build Coastguard Worker 
2274*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kReadDepthRboSampleCount = 4;
2275*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFbo;
2276*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, readFbo);
2277*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer readDepthRbo;
2278*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, readDepthRbo);
2279*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, kReadDepthRboSampleCount,
2280*8975f5c5SAndroid Build Coastguard Worker                                      GL_DEPTH_COMPONENT16, kWidth, kHeight);
2281*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, readDepthRbo);
2282*8975f5c5SAndroid Build Coastguard Worker 
2283*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2284*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
2285*8975f5c5SAndroid Build Coastguard Worker 
2286*8975f5c5SAndroid Build Coastguard Worker     // Blit from readDepthRbo to drawDepthRbo. When robust resource init is enabled, readDepthRbo
2287*8975f5c5SAndroid Build Coastguard Worker     // should be initialized to 1.0f by default, so the data in drawDepthRbo should also be 1.0f.
2288*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
2289*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
2290*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2291*8975f5c5SAndroid Build Coastguard Worker 
2292*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
2293*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2294*8975f5c5SAndroid Build Coastguard Worker 
2295*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, drawFbo);
2296*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2297*8975f5c5SAndroid Build Coastguard Worker 
2298*8975f5c5SAndroid Build Coastguard Worker     // If drawDepthRbo is correctly set to 1.0f, the depth test can always pass, so the result
2299*8975f5c5SAndroid Build Coastguard Worker     // should be green.
2300*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f, 1.0f, true);
2301*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2302*8975f5c5SAndroid Build Coastguard Worker }
2303*8975f5c5SAndroid Build Coastguard Worker 
2304*8975f5c5SAndroid Build Coastguard Worker // Corner case for robust resource init: CopyTexImage to a cube map.
TEST_P(RobustResourceInitTest,CopyTexImageToOffsetCubeMap)2305*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTest, CopyTexImageToOffsetCubeMap)
2306*8975f5c5SAndroid Build Coastguard Worker {
2307*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasGLExtension());
2308*8975f5c5SAndroid Build Coastguard Worker 
2309*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
2310*8975f5c5SAndroid Build Coastguard Worker 
2311*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redPixels(kSize * kSize, GLColor::red);
2312*8975f5c5SAndroid Build Coastguard Worker 
2313*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTex;
2314*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, srcTex);
2315*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2316*8975f5c5SAndroid Build Coastguard Worker                  redPixels.data());
2317*8975f5c5SAndroid Build Coastguard Worker 
2318*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2319*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2320*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTex, 0);
2321*8975f5c5SAndroid Build Coastguard Worker 
2322*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2323*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2324*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2325*8975f5c5SAndroid Build Coastguard Worker 
2326*8975f5c5SAndroid Build Coastguard Worker     GLTexture dstTex;
2327*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, dstTex);
2328*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 1, 1, kSize, kSize, 0);
2329*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, -1, -1, kSize, kSize, 0);
2330*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 2, 2, kSize, kSize, 0);
2331*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, -2, -2, kSize, kSize, 0);
2332*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2333*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2334*8975f5c5SAndroid Build Coastguard Worker 
2335*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2336*8975f5c5SAndroid Build Coastguard Worker 
2337*8975f5c5SAndroid Build Coastguard Worker     // Verify the offset attachments.
2338*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
2339*8975f5c5SAndroid Build Coastguard Worker                            dstTex, 0);
2340*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2341*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2342*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::transparentBlack);
2343*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::transparentBlack);
2344*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::transparentBlack);
2345*8975f5c5SAndroid Build Coastguard Worker 
2346*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
2347*8975f5c5SAndroid Build Coastguard Worker                            dstTex, 0);
2348*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2349*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
2350*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::transparentBlack);
2351*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::transparentBlack);
2352*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
2353*8975f5c5SAndroid Build Coastguard Worker }
2354*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(RobustResourceInitTestES3,CheckDepthStencilRenderbufferIsCleared)2355*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, CheckDepthStencilRenderbufferIsCleared)
2356*8975f5c5SAndroid Build Coastguard Worker {
2357*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasRobustSurfaceInit());
2358*8975f5c5SAndroid Build Coastguard Worker 
2359*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer colorRb;
2360*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2361*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencilRb;
2362*8975f5c5SAndroid Build Coastguard Worker 
2363*8975f5c5SAndroid Build Coastguard Worker     // Make a framebuffer with RGBA + DEPTH_STENCIL
2364*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, colorRb);
2365*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
2366*8975f5c5SAndroid Build Coastguard Worker 
2367*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencilRb);
2368*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kWidth, kHeight);
2369*8975f5c5SAndroid Build Coastguard Worker 
2370*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2371*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRb);
2372*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2373*8975f5c5SAndroid Build Coastguard Worker                               depthStencilRb);
2374*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2375*8975f5c5SAndroid Build Coastguard Worker 
2376*8975f5c5SAndroid Build Coastguard Worker     // Render a quad at Z = 1.0 with depth test on and depth function set to GL_EQUAL.
2377*8975f5c5SAndroid Build Coastguard Worker     // If the depth buffer is not cleared to 1.0 this will fail
2378*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2379*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_EQUAL);
2380*8975f5c5SAndroid Build Coastguard Worker 
2381*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2382*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
2383*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
2384*8975f5c5SAndroid Build Coastguard Worker 
2385*8975f5c5SAndroid Build Coastguard Worker     // Render with stencil test on and stencil function set to GL_EQUAL
2386*8975f5c5SAndroid Build Coastguard Worker     // If the stencil is not zero this will fail.
2387*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
2388*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2389*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2390*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0, 0xFF);
2391*8975f5c5SAndroid Build Coastguard Worker 
2392*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2393*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
2394*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
2395*8975f5c5SAndroid Build Coastguard Worker 
2396*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2397*8975f5c5SAndroid Build Coastguard Worker }
2398*8975f5c5SAndroid Build Coastguard Worker 
2399*8975f5c5SAndroid Build Coastguard Worker // Test that default framebuffer depth and stencil are cleared to values that
2400*8975f5c5SAndroid Build Coastguard Worker // are consistent with non-default framebuffer clear values. Depth 1.0, stencil 0.0.
TEST_P(RobustResourceInitTestES3,CheckDefaultDepthStencilRenderbufferIsCleared)2401*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, CheckDefaultDepthStencilRenderbufferIsCleared)
2402*8975f5c5SAndroid Build Coastguard Worker {
2403*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasRobustSurfaceInit());
2404*8975f5c5SAndroid Build Coastguard Worker 
2405*8975f5c5SAndroid Build Coastguard Worker     // Render a quad at Z = 1.0 with depth test on and depth function set to GL_EQUAL.
2406*8975f5c5SAndroid Build Coastguard Worker     // If the depth buffer is not cleared to 1.0 this will fail
2407*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2408*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_EQUAL);
2409*8975f5c5SAndroid Build Coastguard Worker 
2410*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2411*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
2412*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
2413*8975f5c5SAndroid Build Coastguard Worker 
2414*8975f5c5SAndroid Build Coastguard Worker     // Render with stencil test on and stencil function set to GL_EQUAL
2415*8975f5c5SAndroid Build Coastguard Worker     // If the stencil is not zero this will fail.
2416*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
2417*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2418*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2419*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0, 0xFF);
2420*8975f5c5SAndroid Build Coastguard Worker 
2421*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2422*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
2423*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
2424*8975f5c5SAndroid Build Coastguard Worker 
2425*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2426*8975f5c5SAndroid Build Coastguard Worker }
2427*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(RobustResourceInitTestES3,CheckMultisampleDepthStencilRenderbufferIsCleared)2428*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, CheckMultisampleDepthStencilRenderbufferIsCleared)
2429*8975f5c5SAndroid Build Coastguard Worker {
2430*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasRobustSurfaceInit());
2431*8975f5c5SAndroid Build Coastguard Worker 
2432*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer colorRb;
2433*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2434*8975f5c5SAndroid Build Coastguard Worker 
2435*8975f5c5SAndroid Build Coastguard Worker     // Make a framebuffer with RGBA
2436*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, colorRb);
2437*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
2438*8975f5c5SAndroid Build Coastguard Worker 
2439*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2440*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRb);
2441*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2442*8975f5c5SAndroid Build Coastguard Worker 
2443*8975f5c5SAndroid Build Coastguard Worker     // Make a corresponding multisample framebuffer with RGBA + DEPTH_STENCIL
2444*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSamples = 4;
2445*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer multisampleColorRb;
2446*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer multisampleFb;
2447*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer multisampleDepthStencilRb;
2448*8975f5c5SAndroid Build Coastguard Worker 
2449*8975f5c5SAndroid Build Coastguard Worker     // Make a framebuffer with RGBA + DEPTH_STENCIL
2450*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, multisampleColorRb);
2451*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, kSamples, GL_RGBA8, kWidth, kHeight);
2452*8975f5c5SAndroid Build Coastguard Worker 
2453*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, multisampleDepthStencilRb);
2454*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, kSamples, GL_DEPTH24_STENCIL8, kWidth,
2455*8975f5c5SAndroid Build Coastguard Worker                                      kHeight);
2456*8975f5c5SAndroid Build Coastguard Worker 
2457*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, multisampleFb);
2458*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
2459*8975f5c5SAndroid Build Coastguard Worker                               multisampleColorRb);
2460*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2461*8975f5c5SAndroid Build Coastguard Worker                               multisampleDepthStencilRb);
2462*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2463*8975f5c5SAndroid Build Coastguard Worker 
2464*8975f5c5SAndroid Build Coastguard Worker     // Render a quad at Z = 1.0 with depth test on and depth function set to GL_EQUAL.
2465*8975f5c5SAndroid Build Coastguard Worker     // If the depth buffer is not cleared to 1.0 this will fail
2466*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2467*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_EQUAL);
2468*8975f5c5SAndroid Build Coastguard Worker 
2469*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2470*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
2471*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
2472*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
2473*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fb);
2474*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
2475*8975f5c5SAndroid Build Coastguard Worker 
2476*8975f5c5SAndroid Build Coastguard Worker     // Render with stencil test on and stencil function set to GL_EQUAL
2477*8975f5c5SAndroid Build Coastguard Worker     // If the stencil is not zero this will fail.
2478*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
2479*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2480*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2481*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0, 0xFF);
2482*8975f5c5SAndroid Build Coastguard Worker 
2483*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2484*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, multisampleFb);
2485*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
2486*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
2487*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
2488*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fb);
2489*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
2490*8975f5c5SAndroid Build Coastguard Worker 
2491*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2492*8975f5c5SAndroid Build Coastguard Worker }
2493*8975f5c5SAndroid Build Coastguard Worker 
2494*8975f5c5SAndroid Build Coastguard Worker // Test that blit between two depth/stencil buffers after glClearBufferfi works.  The blit is done
2495*8975f5c5SAndroid Build Coastguard Worker // once expecting robust resource init value, then clear is called with the same value as the robust
2496*8975f5c5SAndroid Build Coastguard Worker // init, and blit is done again.  This triggers an optimization in the Vulkan backend where the
2497*8975f5c5SAndroid Build Coastguard Worker // second clear is no-oped.
TEST_P(RobustResourceInitTestES3,BlitDepthStencilAfterClearBuffer)2498*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustResourceInitTestES3, BlitDepthStencilAfterClearBuffer)
2499*8975f5c5SAndroid Build Coastguard Worker {
2500*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasRobustSurfaceInit());
2501*8975f5c5SAndroid Build Coastguard Worker 
2502*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263848
2503*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
2504*8975f5c5SAndroid Build Coastguard Worker 
2505*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263847
2506*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D11());
2507*8975f5c5SAndroid Build Coastguard Worker 
2508*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2509*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2510*8975f5c5SAndroid Build Coastguard Worker 
2511*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFbo, drawFbo;
2512*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer readDepthStencil, drawDepthStencil;
2513*8975f5c5SAndroid Build Coastguard Worker 
2514*8975f5c5SAndroid Build Coastguard Worker     // Create destination framebuffer.
2515*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, drawDepthStencil);
2516*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2517*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, drawFbo);
2518*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2519*8975f5c5SAndroid Build Coastguard Worker                               drawDepthStencil);
2520*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2521*8975f5c5SAndroid Build Coastguard Worker 
2522*8975f5c5SAndroid Build Coastguard Worker     // Create source framebuffer
2523*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, readDepthStencil);
2524*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2525*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, readFbo);
2526*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2527*8975f5c5SAndroid Build Coastguard Worker                               readDepthStencil);
2528*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2529*8975f5c5SAndroid Build Coastguard Worker 
2530*8975f5c5SAndroid Build Coastguard Worker     // Blit once with the robust resource init clear.
2531*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
2532*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
2533*8975f5c5SAndroid Build Coastguard Worker                       GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2534*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2535*8975f5c5SAndroid Build Coastguard Worker 
2536*8975f5c5SAndroid Build Coastguard Worker     // Verify that the blit was successful.
2537*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
2538*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
2539*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2540*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color);
2541*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2542*8975f5c5SAndroid Build Coastguard Worker 
2543*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2544*8975f5c5SAndroid Build Coastguard Worker 
2545*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2546*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
2547*8975f5c5SAndroid Build Coastguard Worker 
2548*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2549*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2550*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0, 0xFF);
2551*8975f5c5SAndroid Build Coastguard Worker 
2552*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.95f, 1.0f, true);
2553*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2554*8975f5c5SAndroid Build Coastguard Worker 
2555*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFbo);
2556*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2557*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
2558*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
2559*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
2560*8975f5c5SAndroid Build Coastguard Worker 
2561*8975f5c5SAndroid Build Coastguard Worker     // Clear to the same value as robust init, and blit again.
2562*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, readFbo);
2563*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0f, 0);
2564*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2565*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
2566*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.5f, 0x3C);
2567*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
2568*8975f5c5SAndroid Build Coastguard Worker                       GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2569*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2570*8975f5c5SAndroid Build Coastguard Worker 
2571*8975f5c5SAndroid Build Coastguard Worker     // Verify that the blit was successful.
2572*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2573*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.95f, 1.0f, true);
2574*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2575*8975f5c5SAndroid Build Coastguard Worker 
2576*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFbo);
2577*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2578*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2579*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2580*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2581*8975f5c5SAndroid Build Coastguard Worker }
2582*8975f5c5SAndroid Build Coastguard Worker 
2583*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(
2584*8975f5c5SAndroid Build Coastguard Worker     RobustResourceInitTest,
2585*8975f5c5SAndroid Build Coastguard Worker     ES3_METAL().enable(Feature::EmulateDontCareLoadWithRandomClear),
2586*8975f5c5SAndroid Build Coastguard Worker     ES2_VULKAN().enable(Feature::AllocateNonZeroMemory));
2587*8975f5c5SAndroid Build Coastguard Worker 
2588*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RobustResourceInitTestES3);
2589*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(RobustResourceInitTestES3,
2590*8975f5c5SAndroid Build Coastguard Worker                                ES3_METAL().enable(Feature::EmulateDontCareLoadWithRandomClear),
2591*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::AllocateNonZeroMemory));
2592*8975f5c5SAndroid Build Coastguard Worker 
2593*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RobustResourceInitTestES31);
2594*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31_AND(RobustResourceInitTestES31,
2595*8975f5c5SAndroid Build Coastguard Worker                                 ES31_VULKAN().enable(Feature::AllocateNonZeroMemory));
2596*8975f5c5SAndroid Build Coastguard Worker 
2597*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
2598