1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // RobustClientMemoryTest.cpp : Tests of the GL_ANGLE_robust_client_memory extension.
8 
9 #include "test_utils/ANGLETest.h"
10 
11 #include "test_utils/gl_raii.h"
12 
13 namespace angle
14 {
15 class RobustClientMemoryTest : public ANGLETest
16 {
17   protected:
RobustClientMemoryTest()18     RobustClientMemoryTest()
19     {
20         setWindowWidth(128);
21         setWindowHeight(128);
22         setConfigRedBits(8);
23         setConfigGreenBits(8);
24         setConfigBlueBits(8);
25         setConfigAlphaBits(8);
26     }
27 
SetUp()28     void SetUp() override
29     {
30         ANGLETest::SetUp();
31 
32         glGetBooleanvRobustANGLE = reinterpret_cast<PFNGLGETBOOLEANVROBUSTANGLE>(
33             eglGetProcAddress("glGetBooleanvRobustANGLE"));
34         glGetBufferParameterivRobustANGLE = reinterpret_cast<PFNGLGETBUFFERPARAMETERIVROBUSTANGLE>(
35             eglGetProcAddress("glGetBufferParameterivRobustANGLE"));
36         glGetFloatvRobustANGLE = reinterpret_cast<PFNGLGETFLOATVROBUSTANGLE>(
37             eglGetProcAddress("glGetFloatvRobustANGLE"));
38         glGetFramebufferAttachmentParameterivRobustANGLE =
39             reinterpret_cast<PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE>(
40                 eglGetProcAddress("glGetFramebufferAttachmentParameterivRobustANGLE"));
41         glGetIntegervRobustANGLE = reinterpret_cast<PFNGLGETINTEGERVROBUSTANGLE>(
42             eglGetProcAddress("glGetIntegervRobustANGLE"));
43         glGetProgramivRobustANGLE = reinterpret_cast<PFNGLGETPROGRAMIVROBUSTANGLE>(
44             eglGetProcAddress("glGetProgramivRobustANGLE"));
45         glGetRenderbufferParameterivRobustANGLE =
46             reinterpret_cast<PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE>(
47                 eglGetProcAddress("glGetRenderbufferParameterivRobustANGLE"));
48         glGetShaderivRobustANGLE = reinterpret_cast<PFNGLGETSHADERIVROBUSTANGLE>(
49             eglGetProcAddress("glGetShaderivRobustANGLE"));
50         glGetTexParameterfvRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERFVROBUSTANGLE>(
51             eglGetProcAddress("glGetTexParameterfvRobustANGLE"));
52         glGetTexParameterivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIVROBUSTANGLE>(
53             eglGetProcAddress("glGetTexParameterivRobustANGLE"));
54         glGetUniformfvRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMFVROBUSTANGLE>(
55             eglGetProcAddress("glGetUniformfvRobustANGLE"));
56         glGetUniformivRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMIVROBUSTANGLE>(
57             eglGetProcAddress("glGetUniformivRobustANGLE"));
58         glGetVertexAttribfvRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBFVROBUSTANGLE>(
59             eglGetProcAddress("glGetVertexAttribfvRobustANGLE"));
60         glGetVertexAttribivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIVROBUSTANGLE>(
61             eglGetProcAddress("glGetVertexAttribivRobustANGLE"));
62         glGetVertexAttribPointervRobustANGLE =
63             reinterpret_cast<PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE>(
64                 eglGetProcAddress("glGetVertexAttribPointervRobustANGLE"));
65         glReadPixelsRobustANGLE = reinterpret_cast<PFNGLREADPIXELSROBUSTANGLE>(
66             eglGetProcAddress("glReadPixelsRobustANGLE"));
67         glTexImage2DRobustANGLE = reinterpret_cast<PFNGLTEXIMAGE2DROBUSTANGLE>(
68             eglGetProcAddress("glTexImage2DRobustANGLE"));
69         glTexParameterfvRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERFVROBUSTANGLE>(
70             eglGetProcAddress("glTexParameterfvRobustANGLE"));
71         glTexParameterivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIVROBUSTANGLE>(
72             eglGetProcAddress("glTexParameterivRobustANGLE"));
73         glTexSubImage2DRobustANGLE = reinterpret_cast<PFNGLTEXSUBIMAGE2DROBUSTANGLE>(
74             eglGetProcAddress("glTexSubImage2DRobustANGLE"));
75         glTexImage3DRobustANGLE = reinterpret_cast<PFNGLTEXIMAGE3DROBUSTANGLE>(
76             eglGetProcAddress("glTexImage3DRobustANGLE"));
77         glTexSubImage3DRobustANGLE = reinterpret_cast<PFNGLTEXSUBIMAGE3DROBUSTANGLE>(
78             eglGetProcAddress("glTexSubImage3DRobustANGLE"));
79         glGetQueryivRobustANGLE = reinterpret_cast<PFNGLGETQUERYIVROBUSTANGLE>(
80             eglGetProcAddress("glGetQueryivRobustANGLE"));
81         glGetQueryObjectuivRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTUIVROBUSTANGLE>(
82             eglGetProcAddress("glGetQueryObjectuivRobustANGLE"));
83         glGetBufferPointervRobustANGLE = reinterpret_cast<PFNGLGETBUFFERPOINTERVROBUSTANGLE>(
84             eglGetProcAddress("glGetBufferPointervRobustANGLE"));
85         glGetIntegeri_vRobustANGLE = reinterpret_cast<PFNGLGETINTEGERI_VROBUSTANGLE>(
86             eglGetProcAddress("glGetIntegeri_vRobustANGLE"));
87         glGetInternalformativRobustANGLE = reinterpret_cast<PFNGETINTERNALFORMATIVROBUSTANGLE>(
88             eglGetProcAddress("glGetInternalformativRobustANGLE"));
89         glGetVertexAttribIivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIIVROBUSTANGLE>(
90             eglGetProcAddress("glGetVertexAttribIivRobustANGLE"));
91         glGetVertexAttribIuivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE>(
92             eglGetProcAddress("glGetVertexAttribIuivRobustANGLE"));
93         glGetUniformuivRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMUIVROBUSTANGLE>(
94             eglGetProcAddress("glGetUniformuivRobustANGLE"));
95         glGetActiveUniformBlockivRobustANGLE =
96             reinterpret_cast<PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE>(
97                 eglGetProcAddress("glGetActiveUniformBlockivRobustANGLE"));
98         glGetInteger64vRobustANGLE = reinterpret_cast<PFNGLGETINTEGER64VROBUSTANGLE>(
99             eglGetProcAddress("glGetInteger64vRobustANGLE"));
100         glGetInteger64i_vRobustANGLE = reinterpret_cast<PFNGLGETINTEGER64I_VROBUSTANGLE>(
101             eglGetProcAddress("glGetInteger64i_vRobustANGLE"));
102         glGetBufferParameteri64vRobustANGLE =
103             reinterpret_cast<PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE>(
104                 eglGetProcAddress("glGetBufferParameteri64vRobustANGLE"));
105         glSamplerParameterivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIVROBUSTANGLE>(
106             eglGetProcAddress("glSamplerParameterivRobustANGLE"));
107         glSamplerParameterfvRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERFVROBUSTANGLE>(
108             eglGetProcAddress("glSamplerParameterfvRobustANGLE"));
109         glGetSamplerParameterivRobustANGLE =
110             reinterpret_cast<PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE>(
111                 eglGetProcAddress("glGetSamplerParameterivRobustANGLE"));
112         glGetSamplerParameterfvRobustANGLE =
113             reinterpret_cast<PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE>(
114                 eglGetProcAddress("glGetSamplerParameterfvRobustANGLE"));
115         glGetFramebufferParameterivRobustANGLE =
116             reinterpret_cast<PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE>(
117                 eglGetProcAddress("glGetFramebufferParameterivRobustANGLE"));
118         glGetProgramInterfaceivRobustANGLE =
119             reinterpret_cast<PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE>(
120                 eglGetProcAddress("glGetProgramInterfaceivRobustANGLE"));
121         glGetBooleani_vRobustANGLE = reinterpret_cast<PFNGLGETBOOLEANI_VROBUSTANGLE>(
122             eglGetProcAddress("glGetBooleani_vRobustANGLE"));
123         glGetMultisamplefvRobustANGLE = reinterpret_cast<PFNGLGETMULTISAMPLEFVROBUSTANGLE>(
124             eglGetProcAddress("glGetMultisamplefvRobustANGLE"));
125         glGetTexLevelParameterivRobustANGLE =
126             reinterpret_cast<PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE>(
127                 eglGetProcAddress("glGetTexLevelParameterivRobustANGLE"));
128         glGetTexLevelParameterfvRobustANGLE =
129             reinterpret_cast<PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE>(
130                 eglGetProcAddress("glGetTexLevelParameterfvRobustANGLE"));
131         glGetPointervRobustANGLERobustANGLE =
132             reinterpret_cast<PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE>(
133                 eglGetProcAddress("glGetPointervRobustANGLERobustANGLE"));
134         glReadnPixelsRobustANGLE = reinterpret_cast<PFNGLREADNPIXELSROBUSTANGLE>(
135             eglGetProcAddress("glReadnPixelsRobustANGLE"));
136         glGetnUniformfvRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMFVROBUSTANGLE>(
137             eglGetProcAddress("glGetnUniformfvRobustANGLE"));
138         glGetnUniformivRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMIVROBUSTANGLE>(
139             eglGetProcAddress("glGetnUniformivRobustANGLE"));
140         glGetnUniformuivRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMUIVROBUSTANGLE>(
141             eglGetProcAddress("glGetnUniformuivRobustANGLE"));
142         glTexParameterIivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIIVROBUSTANGLE>(
143             eglGetProcAddress("glTexParameterIivRobustANGLE"));
144         glTexParameterIuivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIUIVROBUSTANGLE>(
145             eglGetProcAddress("glTexParameterIuivRobustANGLE"));
146         glGetTexParameterIivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIIVROBUSTANGLE>(
147             eglGetProcAddress("glGetTexParameterIivRobustANGLE"));
148         glGetTexParameterIuivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIUIVROBUSTANGLE>(
149             eglGetProcAddress("glGetTexParameterIuivRobustANGLE"));
150         glSamplerParameterIivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIIVROBUSTANGLE>(
151             eglGetProcAddress("glSamplerParameterIivRobustANGLE"));
152         glSamplerParameterIuivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE>(
153             eglGetProcAddress("glSamplerParameterIuivRobustANGLE"));
154         glGetSamplerParameterIivRobustANGLE =
155             reinterpret_cast<PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE>(
156                 eglGetProcAddress("glGetSamplerParameterIivRobustANGLE"));
157         glGetSamplerParameterIuivRobustANGLE =
158             reinterpret_cast<PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE>(
159                 eglGetProcAddress("glGetSamplerParameterIuivRobustANGLE"));
160         glGetQueryObjectivRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTIVROBUSTANGLE>(
161             eglGetProcAddress("glGetQueryObjectivRobustANGLE"));
162         glGetQueryObjecti64vRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTI64VROBUSTANGLE>(
163             eglGetProcAddress("glGetQueryObjecti64vRobustANGLE"));
164         glGetQueryObjectui64vRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTUI64VROBUSTANGLE>(
165             eglGetProcAddress("glGetQueryObjectui64vRobustANGLE"));
166     }
167 
TearDown()168     void TearDown() override { ANGLETest::TearDown(); }
169 
extensionsPresent() const170     bool extensionsPresent() const
171     {
172         if (!extensionEnabled("GL_ANGLE_robust_client_memory"))
173         {
174             std::cout << "Test skipped because GL_ANGLE_robust_client_memory is not available.";
175             return false;
176         }
177 
178         return true;
179     }
180 
181     PFNGLGETBOOLEANVROBUSTANGLE glGetBooleanvRobustANGLE                   = nullptr;
182     PFNGLGETBUFFERPARAMETERIVROBUSTANGLE glGetBufferParameterivRobustANGLE = nullptr;
183     PFNGLGETFLOATVROBUSTANGLE glGetFloatvRobustANGLE                       = nullptr;
184     PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE
185     glGetFramebufferAttachmentParameterivRobustANGLE                                   = nullptr;
186     PFNGLGETINTEGERVROBUSTANGLE glGetIntegervRobustANGLE                               = nullptr;
187     PFNGLGETPROGRAMIVROBUSTANGLE glGetProgramivRobustANGLE                             = nullptr;
188     PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE glGetRenderbufferParameterivRobustANGLE = nullptr;
189     PFNGLGETSHADERIVROBUSTANGLE glGetShaderivRobustANGLE                               = nullptr;
190     PFNGLGETTEXPARAMETERFVROBUSTANGLE glGetTexParameterfvRobustANGLE                   = nullptr;
191     PFNGLGETTEXPARAMETERIVROBUSTANGLE glGetTexParameterivRobustANGLE                   = nullptr;
192     PFNGLGETUNIFORMFVROBUSTANGLE glGetUniformfvRobustANGLE                             = nullptr;
193     PFNGLGETUNIFORMIVROBUSTANGLE glGetUniformivRobustANGLE                             = nullptr;
194     PFNGLGETVERTEXATTRIBFVROBUSTANGLE glGetVertexAttribfvRobustANGLE                   = nullptr;
195     PFNGLGETVERTEXATTRIBIVROBUSTANGLE glGetVertexAttribivRobustANGLE                   = nullptr;
196     PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE glGetVertexAttribPointervRobustANGLE       = nullptr;
197     PFNGLREADPIXELSROBUSTANGLE glReadPixelsRobustANGLE                                 = nullptr;
198     PFNGLTEXIMAGE2DROBUSTANGLE glTexImage2DRobustANGLE                                 = nullptr;
199     PFNGLTEXPARAMETERFVROBUSTANGLE glTexParameterfvRobustANGLE                         = nullptr;
200     PFNGLTEXPARAMETERIVROBUSTANGLE glTexParameterivRobustANGLE                         = nullptr;
201     PFNGLTEXSUBIMAGE2DROBUSTANGLE glTexSubImage2DRobustANGLE                           = nullptr;
202     PFNGLTEXIMAGE3DROBUSTANGLE glTexImage3DRobustANGLE                                 = nullptr;
203     PFNGLTEXSUBIMAGE3DROBUSTANGLE glTexSubImage3DRobustANGLE                           = nullptr;
204     PFNGLGETQUERYIVROBUSTANGLE glGetQueryivRobustANGLE                                 = nullptr;
205     PFNGLGETQUERYOBJECTUIVROBUSTANGLE glGetQueryObjectuivRobustANGLE                   = nullptr;
206     PFNGLGETBUFFERPOINTERVROBUSTANGLE glGetBufferPointervRobustANGLE                   = nullptr;
207     PFNGLGETINTEGERI_VROBUSTANGLE glGetIntegeri_vRobustANGLE                           = nullptr;
208     PFNGETINTERNALFORMATIVROBUSTANGLE glGetInternalformativRobustANGLE                 = nullptr;
209     PFNGLGETVERTEXATTRIBIIVROBUSTANGLE glGetVertexAttribIivRobustANGLE                 = nullptr;
210     PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE glGetVertexAttribIuivRobustANGLE               = nullptr;
211     PFNGLGETUNIFORMUIVROBUSTANGLE glGetUniformuivRobustANGLE                           = nullptr;
212     PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE glGetActiveUniformBlockivRobustANGLE       = nullptr;
213     PFNGLGETINTEGER64VROBUSTANGLE glGetInteger64vRobustANGLE                           = nullptr;
214     PFNGLGETINTEGER64I_VROBUSTANGLE glGetInteger64i_vRobustANGLE                       = nullptr;
215     PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE glGetBufferParameteri64vRobustANGLE         = nullptr;
216     PFNGLSAMPLERPARAMETERIVROBUSTANGLE glSamplerParameterivRobustANGLE                 = nullptr;
217     PFNGLSAMPLERPARAMETERFVROBUSTANGLE glSamplerParameterfvRobustANGLE                 = nullptr;
218     PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE glGetSamplerParameterivRobustANGLE           = nullptr;
219     PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE glGetSamplerParameterfvRobustANGLE           = nullptr;
220     PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE glGetFramebufferParameterivRobustANGLE   = nullptr;
221     PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE glGetProgramInterfaceivRobustANGLE           = nullptr;
222     PFNGLGETBOOLEANI_VROBUSTANGLE glGetBooleani_vRobustANGLE                           = nullptr;
223     PFNGLGETMULTISAMPLEFVROBUSTANGLE glGetMultisamplefvRobustANGLE                     = nullptr;
224     PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE glGetTexLevelParameterivRobustANGLE         = nullptr;
225     PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE glGetTexLevelParameterfvRobustANGLE         = nullptr;
226     PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE glGetPointervRobustANGLERobustANGLE         = nullptr;
227     PFNGLREADNPIXELSROBUSTANGLE glReadnPixelsRobustANGLE                               = nullptr;
228     PFNGLGETNUNIFORMFVROBUSTANGLE glGetnUniformfvRobustANGLE                           = nullptr;
229     PFNGLGETNUNIFORMIVROBUSTANGLE glGetnUniformivRobustANGLE                           = nullptr;
230     PFNGLGETNUNIFORMUIVROBUSTANGLE glGetnUniformuivRobustANGLE                         = nullptr;
231     PFNGLTEXPARAMETERIIVROBUSTANGLE glTexParameterIivRobustANGLE                       = nullptr;
232     PFNGLTEXPARAMETERIUIVROBUSTANGLE glTexParameterIuivRobustANGLE                     = nullptr;
233     PFNGLGETTEXPARAMETERIIVROBUSTANGLE glGetTexParameterIivRobustANGLE                 = nullptr;
234     PFNGLGETTEXPARAMETERIUIVROBUSTANGLE glGetTexParameterIuivRobustANGLE               = nullptr;
235     PFNGLSAMPLERPARAMETERIIVROBUSTANGLE glSamplerParameterIivRobustANGLE               = nullptr;
236     PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE glSamplerParameterIuivRobustANGLE             = nullptr;
237     PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE glGetSamplerParameterIivRobustANGLE         = nullptr;
238     PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE glGetSamplerParameterIuivRobustANGLE       = nullptr;
239     PFNGLGETQUERYOBJECTIVROBUSTANGLE glGetQueryObjectivRobustANGLE                     = nullptr;
240     PFNGLGETQUERYOBJECTI64VROBUSTANGLE glGetQueryObjecti64vRobustANGLE                 = nullptr;
241     PFNGLGETQUERYOBJECTUI64VROBUSTANGLE glGetQueryObjectui64vRobustANGLE               = nullptr;
242 };
243 
244 // Test basic usage and validation of glGetIntegervRobustANGLE
TEST_P(RobustClientMemoryTest,GetInteger)245 TEST_P(RobustClientMemoryTest, GetInteger)
246 {
247     if (!extensionsPresent())
248     {
249         return;
250     }
251 
252     // Verify that the robust and regular entry points return the same values
253     GLint resultRobust;
254     GLsizei length;
255     glGetIntegervRobustANGLE(GL_MAX_VERTEX_ATTRIBS, 1, &length, &resultRobust);
256     EXPECT_GL_NO_ERROR();
257     EXPECT_EQ(1, length);
258 
259     GLint resultRegular;
260     glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &resultRegular);
261     EXPECT_GL_NO_ERROR();
262     EXPECT_EQ(resultRegular, resultRobust);
263 
264     // Query a dynamic value
265     GLint numCompressedFormats;
266     glGetIntegervRobustANGLE(GL_NUM_COMPRESSED_TEXTURE_FORMATS, 1, &length, &numCompressedFormats);
267     ASSERT_GL_NO_ERROR();
268     EXPECT_EQ(1, length);
269 
270     if (numCompressedFormats > 0)
271     {
272         std::vector<GLint> resultBuf(numCompressedFormats * 2, 0);
273 
274         // Test when the bufSize is too low
275         glGetIntegervRobustANGLE(GL_COMPRESSED_TEXTURE_FORMATS, numCompressedFormats - 1, &length,
276                                  resultBuf.data());
277         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
278         EXPECT_TRUE(std::all_of(resultBuf.begin(), resultBuf.end(),
279                                 [](GLint value) { return value == 0; }));
280 
281         // Make sure the GL doesn't touch the end of the buffer
282         glGetIntegervRobustANGLE(GL_COMPRESSED_TEXTURE_FORMATS,
283                                  static_cast<GLsizei>(resultBuf.size()), &length, resultBuf.data());
284         EXPECT_GL_NO_ERROR();
285         EXPECT_EQ(numCompressedFormats, length);
286         EXPECT_TRUE(std::none_of(resultBuf.begin(), resultBuf.begin() + length,
287                                  [](GLint value) { return value == 0; }));
288         EXPECT_TRUE(std::all_of(resultBuf.begin() + length, resultBuf.end(),
289                                 [](GLint value) { return value == 0; }));
290     }
291 
292     // Test with null length
293     glGetIntegervRobustANGLE(GL_MAX_VARYING_VECTORS, 1, nullptr, &resultRobust);
294     EXPECT_GL_NO_ERROR();
295 
296     glGetIntegervRobustANGLE(GL_MAX_VIEWPORT_DIMS, 1, nullptr, &resultRobust);
297     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
298 
299     GLint maxViewportDims[2];
300     glGetIntegervRobustANGLE(GL_MAX_VIEWPORT_DIMS, 2, nullptr, maxViewportDims);
301     EXPECT_GL_NO_ERROR();
302 }
303 
304 // Test basic usage and validation of glTexImage2DRobustANGLE
TEST_P(RobustClientMemoryTest,TexImage2D)305 TEST_P(RobustClientMemoryTest, TexImage2D)
306 {
307     if (!extensionsPresent())
308     {
309         return;
310     }
311     GLTexture tex;
312     glBindTexture(GL_TEXTURE_2D, tex.get());
313 
314     GLsizei dataDimension = 1024;
315     std::vector<GLubyte> rgbaData(dataDimension * dataDimension * 4);
316 
317     // Test the regular case
318     glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA,
319                             GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()),
320                             rgbaData.data());
321     EXPECT_GL_NO_ERROR();
322 
323     // Test with a data size that is too small
324     glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA,
325                             GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()) / 2,
326                             rgbaData.data());
327     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
328 
329     if (getClientMajorVersion() >= 3)
330     {
331         // Set an unpack parameter that would cause the driver to read past the end of the buffer
332         glPixelStorei(GL_UNPACK_ROW_LENGTH, dataDimension + 1);
333         glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA,
334                                 GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()),
335                                 rgbaData.data());
336         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
337     }
338 }
339 
340 // Test basic usage and validation of glReadPixelsRobustANGLE
TEST_P(RobustClientMemoryTest,ReadPixels)341 TEST_P(RobustClientMemoryTest, ReadPixels)
342 {
343     if (!extensionsPresent())
344     {
345         return;
346     }
347 
348     GLsizei dataDimension = 16;
349     std::vector<GLubyte> rgbaData(dataDimension * dataDimension * 4);
350 
351     // Test the regular case
352     GLsizei length = 0;
353     glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
354                             static_cast<GLsizei>(rgbaData.size()), &length, rgbaData.data());
355     EXPECT_GL_NO_ERROR();
356     EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length);
357 
358     // Test with a data size that is too small
359     glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
360                             static_cast<GLsizei>(rgbaData.size()) - 1, &length, rgbaData.data());
361     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
362 
363     if (getClientMajorVersion() >= 3)
364     {
365         // Set a pack parameter that would cause the driver to write past the end of the buffer
366         glPixelStorei(GL_PACK_ROW_LENGTH, dataDimension + 1);
367         glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
368                                 static_cast<GLsizei>(rgbaData.size()), &length, rgbaData.data());
369         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
370     }
371 }
372 
373 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
374 // tests should be run against.
375 ANGLE_INSTANTIATE_TEST(RobustClientMemoryTest,
376                        ES2_D3D9(),
377                        ES2_D3D11(),
378                        ES3_D3D11(),
379                        ES2_D3D11_FL9_3(),
380                        ES2_OPENGL(),
381                        ES3_OPENGL(),
382                        ES2_OPENGLES(),
383                        ES3_OPENGLES());
384 
385 }  // namespace
386