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