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