1 //
2 // Copyright 2019 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 // capture_gles31_params.cpp:
7 // Pointer parameter capture functions for the OpenGL ES 3.1 entry points.
8
9 #include "libANGLE/capture/capture_gles_3_1_autogen.h"
10
11 using namespace angle;
12
13 namespace gl
14 {
15
CaptureCreateShaderProgramv_strings(const State & glState,bool isCallValid,ShaderType typePacked,GLsizei count,const GLchar * const * strings,ParamCapture * paramCapture)16 void CaptureCreateShaderProgramv_strings(const State &glState,
17 bool isCallValid,
18 ShaderType typePacked,
19 GLsizei count,
20 const GLchar *const *strings,
21 ParamCapture *paramCapture)
22 {
23 CaptureShaderStrings(count, strings, nullptr, paramCapture);
24 }
25
CaptureDeleteProgramPipelines_pipelinesPacked(const State & glState,bool isCallValid,GLsizei n,const ProgramPipelineID * pipelines,ParamCapture * paramCapture)26 void CaptureDeleteProgramPipelines_pipelinesPacked(const State &glState,
27 bool isCallValid,
28 GLsizei n,
29 const ProgramPipelineID *pipelines,
30 ParamCapture *paramCapture)
31 {
32 CaptureArray(pipelines, n, paramCapture);
33 }
34
CaptureDrawArraysIndirect_indirect(const State & glState,bool isCallValid,PrimitiveMode modePacked,const void * indirect,ParamCapture * paramCapture)35 void CaptureDrawArraysIndirect_indirect(const State &glState,
36 bool isCallValid,
37 PrimitiveMode modePacked,
38 const void *indirect,
39 ParamCapture *paramCapture)
40 {
41 // DrawArraysIndirect requires that all data sourced for the command,
42 // including the DrawArraysIndirectCommand structure, be in buffer objects,
43 // and may not be called when the default vertex array object is bound.
44 // Indirect pointer is automatically captured in capture_gles_3_1_autogen.cpp
45 assert(!isCallValid || glState.getTargetBuffer(gl::BufferBinding::DrawIndirect));
46 }
47
CaptureDrawElementsIndirect_indirect(const State & glState,bool isCallValid,PrimitiveMode modePacked,DrawElementsType typePacked,const void * indirect,ParamCapture * paramCapture)48 void CaptureDrawElementsIndirect_indirect(const State &glState,
49 bool isCallValid,
50 PrimitiveMode modePacked,
51 DrawElementsType typePacked,
52 const void *indirect,
53 ParamCapture *paramCapture)
54 {
55 // DrawElementsIndirect requires that all data sourced for the command,
56 // including the DrawElementsIndirectCommand structure, be in buffer objects,
57 // and may not be called when the default vertex array object is bound
58 // Indirect pointer is automatically captured in capture_gles_3_1_autogen.cpp
59 assert(!isCallValid || glState.getTargetBuffer(gl::BufferBinding::DrawIndirect));
60 }
61
CaptureGenProgramPipelines_pipelinesPacked(const State & glState,bool isCallValid,GLsizei n,ProgramPipelineID * pipelines,ParamCapture * paramCapture)62 void CaptureGenProgramPipelines_pipelinesPacked(const State &glState,
63 bool isCallValid,
64 GLsizei n,
65 ProgramPipelineID *pipelines,
66 ParamCapture *paramCapture)
67 {
68 CaptureGenHandles(n, pipelines, paramCapture);
69 }
70
CaptureGetBooleani_v_data(const State & glState,bool isCallValid,GLenum target,GLuint index,GLboolean * data,ParamCapture * paramCapture)71 void CaptureGetBooleani_v_data(const State &glState,
72 bool isCallValid,
73 GLenum target,
74 GLuint index,
75 GLboolean *data,
76 ParamCapture *paramCapture)
77 {
78 CaptureMemory(data, sizeof(GLboolean), paramCapture);
79 }
80
CaptureGetFramebufferParameteriv_params(const State & glState,bool isCallValid,GLenum target,GLenum pname,GLint * params,ParamCapture * paramCapture)81 void CaptureGetFramebufferParameteriv_params(const State &glState,
82 bool isCallValid,
83 GLenum target,
84 GLenum pname,
85 GLint *params,
86 ParamCapture *paramCapture)
87 {
88 // All glGetFramebufferParameteriv queries write back one single value.
89 paramCapture->readBufferSizeBytes = sizeof(GLint);
90 }
91
CaptureGetMultisamplefv_val(const State & glState,bool isCallValid,GLenum pname,GLuint index,GLfloat * val,ParamCapture * paramCapture)92 void CaptureGetMultisamplefv_val(const State &glState,
93 bool isCallValid,
94 GLenum pname,
95 GLuint index,
96 GLfloat *val,
97 ParamCapture *paramCapture)
98 {
99 // GL_SAMPLE_POSITION: 2 floats
100 paramCapture->readBufferSizeBytes = sizeof(GLfloat) * 2;
101 }
102
CaptureGetProgramInterfaceiv_params(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,GLenum pname,GLint * params,ParamCapture * paramCapture)103 void CaptureGetProgramInterfaceiv_params(const State &glState,
104 bool isCallValid,
105 ShaderProgramID program,
106 GLenum programInterface,
107 GLenum pname,
108 GLint *params,
109 ParamCapture *paramCapture)
110 {
111 paramCapture->readBufferSizeBytes = sizeof(GLint);
112 }
113
CaptureGetProgramPipelineInfoLog_length(const State & glState,bool isCallValid,ProgramPipelineID pipeline,GLsizei bufSize,GLsizei * length,GLchar * infoLog,ParamCapture * paramCapture)114 void CaptureGetProgramPipelineInfoLog_length(const State &glState,
115 bool isCallValid,
116 ProgramPipelineID pipeline,
117 GLsizei bufSize,
118 GLsizei *length,
119 GLchar *infoLog,
120 ParamCapture *paramCapture)
121 {
122 if (length)
123 {
124 CaptureMemory(length, sizeof(GLsizei), paramCapture);
125 }
126 }
127
CaptureGetProgramPipelineInfoLog_infoLog(const State & glState,bool isCallValid,ProgramPipelineID pipeline,GLsizei bufSize,GLsizei * length,GLchar * infoLog,ParamCapture * paramCapture)128 void CaptureGetProgramPipelineInfoLog_infoLog(const State &glState,
129 bool isCallValid,
130 ProgramPipelineID pipeline,
131 GLsizei bufSize,
132 GLsizei *length,
133 GLchar *infoLog,
134 ParamCapture *paramCapture)
135 {
136 if (bufSize > 0)
137 {
138 ASSERT(infoLog);
139 if (length)
140 {
141 CaptureArray(infoLog, *length, paramCapture);
142 }
143 else
144 {
145 CaptureString(infoLog, paramCapture);
146 }
147 }
148 }
149
CaptureGetProgramPipelineiv_params(const State & glState,bool isCallValid,ProgramPipelineID pipeline,GLenum pname,GLint * params,ParamCapture * paramCapture)150 void CaptureGetProgramPipelineiv_params(const State &glState,
151 bool isCallValid,
152 ProgramPipelineID pipeline,
153 GLenum pname,
154 GLint *params,
155 ParamCapture *paramCapture)
156 {
157 CaptureMemory(params, sizeof(GLint), paramCapture);
158 }
159
CaptureGetProgramResourceIndex_name(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,const GLchar * name,ParamCapture * paramCapture)160 void CaptureGetProgramResourceIndex_name(const State &glState,
161 bool isCallValid,
162 ShaderProgramID program,
163 GLenum programInterface,
164 const GLchar *name,
165 ParamCapture *paramCapture)
166 {
167 CaptureString(name, paramCapture);
168 }
169
CaptureGetProgramResourceLocation_name(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,const GLchar * name,ParamCapture * paramCapture)170 void CaptureGetProgramResourceLocation_name(const State &glState,
171 bool isCallValid,
172 ShaderProgramID program,
173 GLenum programInterface,
174 const GLchar *name,
175 ParamCapture *paramCapture)
176 {
177 CaptureString(name, paramCapture);
178 }
179
CaptureGetProgramResourceName_length(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,GLuint index,GLsizei bufSize,GLsizei * length,GLchar * name,ParamCapture * paramCapture)180 void CaptureGetProgramResourceName_length(const State &glState,
181 bool isCallValid,
182 ShaderProgramID program,
183 GLenum programInterface,
184 GLuint index,
185 GLsizei bufSize,
186 GLsizei *length,
187 GLchar *name,
188 ParamCapture *paramCapture)
189 {
190 paramCapture->readBufferSizeBytes = sizeof(GLsizei);
191 }
192
CaptureGetProgramResourceName_name(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,GLuint index,GLsizei bufSize,GLsizei * length,GLchar * name,ParamCapture * paramCapture)193 void CaptureGetProgramResourceName_name(const State &glState,
194 bool isCallValid,
195 ShaderProgramID program,
196 GLenum programInterface,
197 GLuint index,
198 GLsizei bufSize,
199 GLsizei *length,
200 GLchar *name,
201 ParamCapture *paramCapture)
202 {
203 CaptureString(name, paramCapture);
204 }
205
CaptureGetProgramResourceiv_props(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,GLuint index,GLsizei propCount,const GLenum * props,GLsizei bufSize,GLsizei * length,GLint * params,ParamCapture * paramCapture)206 void CaptureGetProgramResourceiv_props(const State &glState,
207 bool isCallValid,
208 ShaderProgramID program,
209 GLenum programInterface,
210 GLuint index,
211 GLsizei propCount,
212 const GLenum *props,
213 GLsizei bufSize,
214 GLsizei *length,
215 GLint *params,
216 ParamCapture *paramCapture)
217 {
218 CaptureMemory(props, sizeof(GLenum) * propCount, paramCapture);
219 }
220
CaptureGetProgramResourceiv_length(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,GLuint index,GLsizei propCount,const GLenum * props,GLsizei bufSize,GLsizei * length,GLint * params,ParamCapture * paramCapture)221 void CaptureGetProgramResourceiv_length(const State &glState,
222 bool isCallValid,
223 ShaderProgramID program,
224 GLenum programInterface,
225 GLuint index,
226 GLsizei propCount,
227 const GLenum *props,
228 GLsizei bufSize,
229 GLsizei *length,
230 GLint *params,
231 ParamCapture *paramCapture)
232 {
233 paramCapture->readBufferSizeBytes = sizeof(GLsizei);
234 }
235
CaptureGetProgramResourceiv_params(const State & glState,bool isCallValid,ShaderProgramID program,GLenum programInterface,GLuint index,GLsizei propCount,const GLenum * props,GLsizei bufSize,GLsizei * length,GLint * params,ParamCapture * paramCapture)236 void CaptureGetProgramResourceiv_params(const State &glState,
237 bool isCallValid,
238 ShaderProgramID program,
239 GLenum programInterface,
240 GLuint index,
241 GLsizei propCount,
242 const GLenum *props,
243 GLsizei bufSize,
244 GLsizei *length,
245 GLint *params,
246 ParamCapture *paramCapture)
247 {
248 // Prefer to only capture as many parameters as are returned,
249 // but if this is not known, then capture the whole buffer
250 int paramLength = length != nullptr ? *length : bufSize;
251 CaptureMemory(params, sizeof(GLint) * paramLength, paramCapture);
252 }
253
CaptureGetTexLevelParameterfv_params(const State & glState,bool isCallValid,TextureTarget targetPacked,GLint level,GLenum pname,GLfloat * params,ParamCapture * paramCapture)254 void CaptureGetTexLevelParameterfv_params(const State &glState,
255 bool isCallValid,
256 TextureTarget targetPacked,
257 GLint level,
258 GLenum pname,
259 GLfloat *params,
260 ParamCapture *paramCapture)
261 {
262 CaptureMemory(params, sizeof(GLfloat), paramCapture);
263 }
264
CaptureGetTexLevelParameteriv_params(const State & glState,bool isCallValid,TextureTarget targetPacked,GLint level,GLenum pname,GLint * params,ParamCapture * paramCapture)265 void CaptureGetTexLevelParameteriv_params(const State &glState,
266 bool isCallValid,
267 TextureTarget targetPacked,
268 GLint level,
269 GLenum pname,
270 GLint *params,
271 ParamCapture *paramCapture)
272 {
273 CaptureMemory(params, sizeof(GLint), paramCapture);
274 }
275
CaptureProgramUniform1fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLfloat * value,ParamCapture * paramCapture)276 void CaptureProgramUniform1fv_value(const State &glState,
277 bool isCallValid,
278 ShaderProgramID program,
279 UniformLocation location,
280 GLsizei count,
281 const GLfloat *value,
282 ParamCapture *paramCapture)
283 {
284 CaptureMemory(value, sizeof(GLfloat) * count, paramCapture);
285 }
286
CaptureProgramUniform1iv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLint * value,ParamCapture * paramCapture)287 void CaptureProgramUniform1iv_value(const State &glState,
288 bool isCallValid,
289 ShaderProgramID program,
290 UniformLocation location,
291 GLsizei count,
292 const GLint *value,
293 ParamCapture *paramCapture)
294 {
295 CaptureMemory(value, sizeof(GLint) * count, paramCapture);
296 }
297
CaptureProgramUniform1uiv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLuint * value,ParamCapture * paramCapture)298 void CaptureProgramUniform1uiv_value(const State &glState,
299 bool isCallValid,
300 ShaderProgramID program,
301 UniformLocation location,
302 GLsizei count,
303 const GLuint *value,
304 ParamCapture *paramCapture)
305 {
306 CaptureMemory(value, sizeof(GLuint) * count, paramCapture);
307 }
308
CaptureProgramUniform2fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLfloat * value,ParamCapture * paramCapture)309 void CaptureProgramUniform2fv_value(const State &glState,
310 bool isCallValid,
311 ShaderProgramID program,
312 UniformLocation location,
313 GLsizei count,
314 const GLfloat *value,
315 ParamCapture *paramCapture)
316 {
317 CaptureMemory(value, sizeof(GLfloat) * 2 * count, paramCapture);
318 }
319
CaptureProgramUniform2iv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLint * value,ParamCapture * paramCapture)320 void CaptureProgramUniform2iv_value(const State &glState,
321 bool isCallValid,
322 ShaderProgramID program,
323 UniformLocation location,
324 GLsizei count,
325 const GLint *value,
326 ParamCapture *paramCapture)
327 {
328 CaptureMemory(value, sizeof(GLint) * 2 * count, paramCapture);
329 }
330
CaptureProgramUniform2uiv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLuint * value,ParamCapture * paramCapture)331 void CaptureProgramUniform2uiv_value(const State &glState,
332 bool isCallValid,
333 ShaderProgramID program,
334 UniformLocation location,
335 GLsizei count,
336 const GLuint *value,
337 ParamCapture *paramCapture)
338 {
339 CaptureMemory(value, sizeof(GLuint) * 2 * count, paramCapture);
340 }
341
CaptureProgramUniform3fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLfloat * value,ParamCapture * paramCapture)342 void CaptureProgramUniform3fv_value(const State &glState,
343 bool isCallValid,
344 ShaderProgramID program,
345 UniformLocation location,
346 GLsizei count,
347 const GLfloat *value,
348 ParamCapture *paramCapture)
349 {
350 CaptureMemory(value, sizeof(GLfloat) * 3 * count, paramCapture);
351 }
352
CaptureProgramUniform3iv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLint * value,ParamCapture * paramCapture)353 void CaptureProgramUniform3iv_value(const State &glState,
354 bool isCallValid,
355 ShaderProgramID program,
356 UniformLocation location,
357 GLsizei count,
358 const GLint *value,
359 ParamCapture *paramCapture)
360 {
361 CaptureMemory(value, sizeof(GLint) * 3 * count, paramCapture);
362 }
363
CaptureProgramUniform3uiv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLuint * value,ParamCapture * paramCapture)364 void CaptureProgramUniform3uiv_value(const State &glState,
365 bool isCallValid,
366 ShaderProgramID program,
367 UniformLocation location,
368 GLsizei count,
369 const GLuint *value,
370 ParamCapture *paramCapture)
371 {
372 CaptureMemory(value, sizeof(GLuint) * 3 * count, paramCapture);
373 }
374
CaptureProgramUniform4fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLfloat * value,ParamCapture * paramCapture)375 void CaptureProgramUniform4fv_value(const State &glState,
376 bool isCallValid,
377 ShaderProgramID program,
378 UniformLocation location,
379 GLsizei count,
380 const GLfloat *value,
381 ParamCapture *paramCapture)
382 {
383 CaptureMemory(value, sizeof(GLfloat) * 4 * count, paramCapture);
384 }
385
CaptureProgramUniform4iv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLint * value,ParamCapture * paramCapture)386 void CaptureProgramUniform4iv_value(const State &glState,
387 bool isCallValid,
388 ShaderProgramID program,
389 UniformLocation location,
390 GLsizei count,
391 const GLint *value,
392 ParamCapture *paramCapture)
393 {
394 CaptureMemory(value, sizeof(GLint) * 4 * count, paramCapture);
395 }
396
CaptureProgramUniform4uiv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,const GLuint * value,ParamCapture * paramCapture)397 void CaptureProgramUniform4uiv_value(const State &glState,
398 bool isCallValid,
399 ShaderProgramID program,
400 UniformLocation location,
401 GLsizei count,
402 const GLuint *value,
403 ParamCapture *paramCapture)
404 {
405 CaptureMemory(value, sizeof(GLuint) * 4 * count, paramCapture);
406 }
407
CaptureProgramUniformMatrix2fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)408 void CaptureProgramUniformMatrix2fv_value(const State &glState,
409 bool isCallValid,
410 ShaderProgramID program,
411 UniformLocation location,
412 GLsizei count,
413 GLboolean transpose,
414 const GLfloat *value,
415 ParamCapture *paramCapture)
416 {
417 CaptureMemory(value, sizeof(GLfloat) * 2 * 2 * count, paramCapture);
418 }
419
CaptureProgramUniformMatrix2x3fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)420 void CaptureProgramUniformMatrix2x3fv_value(const State &glState,
421 bool isCallValid,
422 ShaderProgramID program,
423 UniformLocation location,
424 GLsizei count,
425 GLboolean transpose,
426 const GLfloat *value,
427 ParamCapture *paramCapture)
428 {
429 CaptureMemory(value, sizeof(GLfloat) * 2 * 3 * count, paramCapture);
430 }
431
CaptureProgramUniformMatrix2x4fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)432 void CaptureProgramUniformMatrix2x4fv_value(const State &glState,
433 bool isCallValid,
434 ShaderProgramID program,
435 UniformLocation location,
436 GLsizei count,
437 GLboolean transpose,
438 const GLfloat *value,
439 ParamCapture *paramCapture)
440 {
441 CaptureMemory(value, sizeof(GLfloat) * 2 * 4 * count, paramCapture);
442 }
443
CaptureProgramUniformMatrix3fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)444 void CaptureProgramUniformMatrix3fv_value(const State &glState,
445 bool isCallValid,
446 ShaderProgramID program,
447 UniformLocation location,
448 GLsizei count,
449 GLboolean transpose,
450 const GLfloat *value,
451 ParamCapture *paramCapture)
452 {
453 CaptureMemory(value, sizeof(GLfloat) * 3 * 3 * count, paramCapture);
454 }
455
CaptureProgramUniformMatrix3x2fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)456 void CaptureProgramUniformMatrix3x2fv_value(const State &glState,
457 bool isCallValid,
458 ShaderProgramID program,
459 UniformLocation location,
460 GLsizei count,
461 GLboolean transpose,
462 const GLfloat *value,
463 ParamCapture *paramCapture)
464 {
465 CaptureMemory(value, sizeof(GLfloat) * 3 * 2 * count, paramCapture);
466 }
467
CaptureProgramUniformMatrix3x4fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)468 void CaptureProgramUniformMatrix3x4fv_value(const State &glState,
469 bool isCallValid,
470 ShaderProgramID program,
471 UniformLocation location,
472 GLsizei count,
473 GLboolean transpose,
474 const GLfloat *value,
475 ParamCapture *paramCapture)
476 {
477 CaptureMemory(value, sizeof(GLfloat) * 3 * 4 * count, paramCapture);
478 }
479
CaptureProgramUniformMatrix4fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)480 void CaptureProgramUniformMatrix4fv_value(const State &glState,
481 bool isCallValid,
482 ShaderProgramID program,
483 UniformLocation location,
484 GLsizei count,
485 GLboolean transpose,
486 const GLfloat *value,
487 ParamCapture *paramCapture)
488 {
489 CaptureMemory(value, sizeof(GLfloat) * 4 * 4 * count, paramCapture);
490 }
491
CaptureProgramUniformMatrix4x2fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)492 void CaptureProgramUniformMatrix4x2fv_value(const State &glState,
493 bool isCallValid,
494 ShaderProgramID program,
495 UniformLocation location,
496 GLsizei count,
497 GLboolean transpose,
498 const GLfloat *value,
499 ParamCapture *paramCapture)
500 {
501 CaptureMemory(value, sizeof(GLfloat) * 4 * 2 * count, paramCapture);
502 }
503
CaptureProgramUniformMatrix4x3fv_value(const State & glState,bool isCallValid,ShaderProgramID program,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value,ParamCapture * paramCapture)504 void CaptureProgramUniformMatrix4x3fv_value(const State &glState,
505 bool isCallValid,
506 ShaderProgramID program,
507 UniformLocation location,
508 GLsizei count,
509 GLboolean transpose,
510 const GLfloat *value,
511 ParamCapture *paramCapture)
512 {
513 CaptureMemory(value, sizeof(GLfloat) * 4 * 3 * count, paramCapture);
514 }
515
516 } // namespace gl
517