1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 *
7 * THIS FILE IS AUTOGENERATED
8 * Make edits to tools/gpu/gl/interface/templates.go or they will
9 * be overwritten.
10 */
11
12#include "include/gpu/gl/GrGLExtensions.h"
13#include "include/gpu/gl/GrGLInterface.h"
14#include "src/gpu/gl/GrGLUtil.h"
15
16#include <stdio.h>
17
18GrGLInterface::GrGLInterface() {
19 fStandard = kNone_GrGLStandard;
20}
21
22#define RETURN_FALSE_INTERFACE \
23 SkDEBUGF("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); \
24 return false
25
26bool GrGLInterface::validate() const {
27
28 if (kNone_GrGLStandard == fStandard) {
29 RETURN_FALSE_INTERFACE;
30 }
31
32 if (!fExtensions.isInitialized()) {
33 RETURN_FALSE_INTERFACE;
34 }
35
36 GrGLVersion glVer = GrGLGetVersion(this);
37 if (GR_GL_INVALID_VER == glVer) {
38 RETURN_FALSE_INTERFACE;
39 }
40 // Autogenerated content follows
41 if (!fFunctions.fActiveTexture ||
42 !fFunctions.fAttachShader ||
43 !fFunctions.fBindAttribLocation ||
44 !fFunctions.fBindBuffer ||
45 !fFunctions.fBindTexture ||
46 !fFunctions.fBlendColor ||
47 !fFunctions.fBlendEquation ||
48 !fFunctions.fBlendFunc ||
49 !fFunctions.fBufferData ||
50 !fFunctions.fBufferSubData ||
51 !fFunctions.fClear ||
52 !fFunctions.fClearColor ||
53 !fFunctions.fClearStencil ||
54 !fFunctions.fColorMask ||
55 !fFunctions.fCompileShader ||
56 !fFunctions.fCompressedTexImage2D ||
57 !fFunctions.fCompressedTexSubImage2D ||
58 !fFunctions.fCopyTexSubImage2D ||
59 !fFunctions.fCreateProgram ||
60 !fFunctions.fCreateShader ||
61 !fFunctions.fCullFace ||
62 !fFunctions.fDeleteBuffers ||
63 !fFunctions.fDeleteProgram ||
64 !fFunctions.fDeleteShader ||
65 !fFunctions.fDeleteTextures ||
66 !fFunctions.fDepthMask ||
67 !fFunctions.fDisable ||
68 !fFunctions.fDisableVertexAttribArray ||
69 !fFunctions.fDrawArrays ||
70 !fFunctions.fDrawElements ||
71 !fFunctions.fEnable ||
72 !fFunctions.fEnableVertexAttribArray ||
73 !fFunctions.fFinish ||
74 !fFunctions.fFlush ||
75 !fFunctions.fFrontFace ||
76 !fFunctions.fGenBuffers ||
77 !fFunctions.fGenTextures ||
78 !fFunctions.fGetBufferParameteriv ||
79 !fFunctions.fGetError ||
80 !fFunctions.fGetIntegerv ||
81 !fFunctions.fGetProgramInfoLog ||
82 !fFunctions.fGetProgramiv ||
83 !fFunctions.fGetShaderInfoLog ||
84 !fFunctions.fGetShaderiv ||
85 !fFunctions.fGetString ||
86 !fFunctions.fGetUniformLocation ||
87 !fFunctions.fIsTexture ||
88 !fFunctions.fLineWidth ||
89 !fFunctions.fLinkProgram ||
90 !fFunctions.fPixelStorei ||
91 !fFunctions.fReadPixels ||
92 !fFunctions.fScissor ||
93 !fFunctions.fShaderSource ||
94 !fFunctions.fStencilFunc ||
95 !fFunctions.fStencilFuncSeparate ||
96 !fFunctions.fStencilMask ||
97 !fFunctions.fStencilMaskSeparate ||
98 !fFunctions.fStencilOp ||
99 !fFunctions.fStencilOpSeparate ||
100 !fFunctions.fTexImage2D ||
101 !fFunctions.fTexParameterf ||
102 !fFunctions.fTexParameterfv ||
103 !fFunctions.fTexParameteri ||
104 !fFunctions.fTexParameteriv ||
105 !fFunctions.fTexSubImage2D ||
106 !fFunctions.fUniform1f ||
107 !fFunctions.fUniform1fv ||
108 !fFunctions.fUniform1i ||
109 !fFunctions.fUniform1iv ||
110 !fFunctions.fUniform2f ||
111 !fFunctions.fUniform2fv ||
112 !fFunctions.fUniform2i ||
113 !fFunctions.fUniform2iv ||
114 !fFunctions.fUniform3f ||
115 !fFunctions.fUniform3fv ||
116 !fFunctions.fUniform3i ||
117 !fFunctions.fUniform3iv ||
118 !fFunctions.fUniform4f ||
119 !fFunctions.fUniform4fv ||
120 !fFunctions.fUniform4i ||
121 !fFunctions.fUniform4iv ||
122 !fFunctions.fUniformMatrix2fv ||
123 !fFunctions.fUniformMatrix3fv ||
124 !fFunctions.fUniformMatrix4fv ||
125 !fFunctions.fUseProgram ||
126 !fFunctions.fVertexAttrib1f ||
127 !fFunctions.fVertexAttrib2fv ||
128 !fFunctions.fVertexAttrib3fv ||
129 !fFunctions.fVertexAttrib4fv ||
130 !fFunctions.fVertexAttribPointer ||
131 !fFunctions.fViewport) {
132 RETURN_FALSE_INTERFACE;
133 }
134
135 if (GR_IS_GR_GL(fStandard)) {
136 if (!fFunctions.fDrawBuffer ||
137 !fFunctions.fPolygonMode) {
138 RETURN_FALSE_INTERFACE;
139 }
140 }
141
142 if ((GR_IS_GR_GL(fStandard) && (
143 (glVer >= GR_GL_VER(3,0)))) ||
144 (GR_IS_GR_GL_ES(fStandard) && (
145 (glVer >= GR_GL_VER(3,0)))) ||
146 (GR_IS_GR_WEBGL(fStandard) && (
147 (glVer >= GR_GL_VER(2,0))))) {
148 if (!fFunctions.fGetStringi) {
149 RETURN_FALSE_INTERFACE;
150 }
151 }
152
153 if ((GR_IS_GR_GL(fStandard) && (
154 (glVer >= GR_GL_VER(4,2)))) ||
155 (GR_IS_GR_GL_ES(fStandard) && (
156 (glVer >= GR_GL_VER(3,1))))) {
157 // all functions were marked optional or test_only
158 }
159
160 if (GR_IS_GR_GL(fStandard) ||
161 (GR_IS_GR_GL_ES(fStandard) && (
162 (glVer >= GR_GL_VER(3,0)) ||
163 fExtensions.has("GL_OES_vertex_array_object"))) ||
164 (GR_IS_GR_WEBGL(fStandard) && (
165 (glVer >= GR_GL_VER(2,0)) ||
166 fExtensions.has("GL_OES_vertex_array_object") ||
167 fExtensions.has("OES_vertex_array_object")))) {
168 if (!fFunctions.fBindVertexArray ||
169 !fFunctions.fDeleteVertexArrays ||
170 !fFunctions.fGenVertexArrays) {
171 RETURN_FALSE_INTERFACE;
172 }
173 }
174
175 if ((GR_IS_GR_GL(fStandard) && (
176 (glVer >= GR_GL_VER(4,0)) ||
177 fExtensions.has("GL_ARB_tessellation_shader"))) ||
178 (GR_IS_GR_GL_ES(fStandard) && (
179 (glVer >= GR_GL_VER(3,2)) ||
180 fExtensions.has("GL_OES_tessellation_shader")))) {
181 // all functions were marked optional or test_only
182 }
183
184 if ((GR_IS_GR_GL(fStandard) && (
185 (glVer >= GR_GL_VER(3,0)))) ||
186 (GR_IS_GR_GL_ES(fStandard) && (
187 (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended"))))) {
188 if (!fFunctions.fBindFragDataLocation) {
189 RETURN_FALSE_INTERFACE;
190 }
191 }
192
193 if ((GR_IS_GR_GL(fStandard) && (
194 (glVer >= GR_GL_VER(3,3)) ||
195 fExtensions.has("GL_ARB_blend_func_extended"))) ||
196 (GR_IS_GR_GL_ES(fStandard) && (
197 (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended"))))) {
198 if (!fFunctions.fBindFragDataLocationIndexed) {
199 RETURN_FALSE_INTERFACE;
200 }
201 }
202
203 if ((GR_IS_GR_GL(fStandard) && (
204 fExtensions.has("GL_KHR_blend_equation_advanced") ||
205 fExtensions.has("GL_NV_blend_equation_advanced"))) ||
206 (GR_IS_GR_GL_ES(fStandard) && (
207 fExtensions.has("GL_KHR_blend_equation_advanced") ||
208 fExtensions.has("GL_NV_blend_equation_advanced")))) {
209 if (!fFunctions.fBlendBarrier) {
210 RETURN_FALSE_INTERFACE;
211 }
212 }
213
214 if ((GR_IS_GR_GL(fStandard) && (
215 (glVer >= GR_GL_VER(4,4)) ||
216 fExtensions.has("GL_ARB_clear_texture"))) ||
217 (GR_IS_GR_GL_ES(fStandard) && (
218 fExtensions.has("GL_EXT_clear_texture")))) {
219 // all functions were marked optional or test_only
220 }
221
222 if ((GR_IS_GR_GL(fStandard) && (
223 (glVer >= GR_GL_VER(3,1)) ||
224 fExtensions.has("GL_ARB_draw_instanced") ||
225 fExtensions.has("GL_EXT_draw_instanced"))) ||
226 (GR_IS_GR_GL_ES(fStandard) && (
227 (glVer >= GR_GL_VER(3,0)) ||
228 fExtensions.has("GL_EXT_draw_instanced"))) ||
229 (GR_IS_GR_WEBGL(fStandard) && (
230 (glVer >= GR_GL_VER(2,0))))) {
231 if (!fFunctions.fDrawArraysInstanced ||
232 !fFunctions.fDrawElementsInstanced) {
233 RETURN_FALSE_INTERFACE;
234 }
235 }
236
237 if ((GR_IS_GR_GL(fStandard) && (
238 (glVer >= GR_GL_VER(4,2)) ||
239 fExtensions.has("GL_ARB_base_instance"))) ||
240 (GR_IS_GR_GL_ES(fStandard) && (
241 fExtensions.has("GL_EXT_base_instance") ||
242 fExtensions.has("GL_ANGLE_base_vertex_base_instance")))) {
243 if (!fFunctions.fDrawArraysInstancedBaseInstance ||
244 !fFunctions.fDrawElementsInstancedBaseVertexBaseInstance) {
245 RETURN_FALSE_INTERFACE;
246 }
247 }
248
249 if (GR_IS_GR_GL(fStandard) ||
250 (GR_IS_GR_GL_ES(fStandard) && (
251 (glVer >= GR_GL_VER(3,0)))) ||
252 (GR_IS_GR_WEBGL(fStandard) && (
253 (glVer >= GR_GL_VER(2,0))))) {
254 if (!fFunctions.fDrawBuffers ||
255 !fFunctions.fReadBuffer) {
256 RETURN_FALSE_INTERFACE;
257 }
258 }
259
260 if ((GR_IS_GR_GL(fStandard) && (
261 (glVer >= GR_GL_VER(4,0)) ||
262 fExtensions.has("GL_ARB_draw_indirect"))) ||
263 (GR_IS_GR_GL_ES(fStandard) && (
264 (glVer >= GR_GL_VER(3,1))))) {
265 if (!fFunctions.fDrawArraysIndirect ||
266 !fFunctions.fDrawElementsIndirect) {
267 RETURN_FALSE_INTERFACE;
268 }
269 }
270
271 if (GR_IS_GR_GL(fStandard) ||
272 (GR_IS_GR_GL_ES(fStandard) && (
273 (glVer >= GR_GL_VER(3,0)))) ||
274 (GR_IS_GR_WEBGL(fStandard) && (
275 (glVer >= GR_GL_VER(2,0))))) {
276 if (!fFunctions.fDrawRangeElements) {
277 RETURN_FALSE_INTERFACE;
278 }
279 }
280
281 if ((GR_IS_GR_GL(fStandard) && (
282 (glVer >= GR_GL_VER(3,2)) ||
283 fExtensions.has("GL_ARB_texture_multisample"))) ||
284 (GR_IS_GR_GL_ES(fStandard) && (
285 (glVer >= GR_GL_VER(3,1))))) {
286 if (!fFunctions.fGetMultisamplefv) {
287 RETURN_FALSE_INTERFACE;
288 }
289 }
290
291 if (GR_IS_GR_GL(fStandard) ||
292 (GR_IS_GR_GL_ES(fStandard) && (
293 (glVer >= GR_GL_VER(3,1))))) {
294 if (!fFunctions.fGetTexLevelParameteriv) {
295 RETURN_FALSE_INTERFACE;
296 }
297 }
298
299 if ((GR_IS_GR_GL(fStandard) && (
300 (glVer >= GR_GL_VER(4,3)) ||
301 fExtensions.has("GL_ARB_multi_draw_indirect"))) ||
302 (GR_IS_GR_GL_ES(fStandard) && (
303 fExtensions.has("GL_EXT_multi_draw_indirect")))) {
304 if (!fFunctions.fMultiDrawArraysIndirect ||
305 !fFunctions.fMultiDrawElementsIndirect) {
306 RETURN_FALSE_INTERFACE;
307 }
308 }
309
310 if ((GR_IS_GR_GL(fStandard) && (
311 (glVer >= GR_GL_VER(3,1)))) ||
312 (GR_IS_GR_GL_ES(fStandard) && (
313 (glVer >= GR_GL_VER(3,2)) ||
314 fExtensions.has("GL_OES_texture_buffer") ||
315 fExtensions.has("GL_EXT_texture_buffer")))) {
316 if (!fFunctions.fTexBuffer) {
317 RETURN_FALSE_INTERFACE;
318 }
319 }
320
321 if ((GR_IS_GR_GL(fStandard) && (
322 (glVer >= GR_GL_VER(4,3)))) ||
323 (GR_IS_GR_GL_ES(fStandard) && (
324 (glVer >= GR_GL_VER(3,2)) ||
325 fExtensions.has("GL_OES_texture_buffer") ||
326 fExtensions.has("GL_EXT_texture_buffer")))) {
327 if (!fFunctions.fTexBufferRange) {
328 RETURN_FALSE_INTERFACE;
329 }
330 }
331
332 if ((GR_IS_GR_GL(fStandard) && (
333 (glVer >= GR_GL_VER(4,2)) ||
334 fExtensions.has("GL_ARB_texture_storage") ||
335 fExtensions.has("GL_EXT_texture_storage"))) ||
336 (GR_IS_GR_GL_ES(fStandard) && (
337 (glVer >= GR_GL_VER(3,0)) ||
338 fExtensions.has("GL_EXT_texture_storage"))) ||
339 (GR_IS_GR_WEBGL(fStandard) && (
340 (glVer >= GR_GL_VER(2,0))))) {
341 if (!fFunctions.fTexStorage2D) {
342 RETURN_FALSE_INTERFACE;
343 }
344 }
345
346 if ((GR_IS_GR_GL(fStandard) && (
347 (glVer >= GR_GL_VER(4,5)) ||
348 fExtensions.has("GL_ARB_texture_barrier") ||
349 fExtensions.has("GL_NV_texture_barrier"))) ||
350 (GR_IS_GR_GL_ES(fStandard) && (
351 fExtensions.has("GL_NV_texture_barrier")))) {
352 if (!fFunctions.fTextureBarrier) {
353 RETURN_FALSE_INTERFACE;
354 }
355 }
356
357 if ((GR_IS_GR_GL_ES(fStandard) && (
358 fExtensions.has("GL_EXT_discard_framebuffer")))) {
359 if (!fFunctions.fDiscardFramebuffer) {
360 RETURN_FALSE_INTERFACE;
361 }
362 }
363
364 if ((GR_IS_GR_GL_ES(fStandard) && (
365 fExtensions.has("GL_QCOM_tiled_rendering")))) {
366 // all functions were marked optional or test_only
367 }
368
369 if ((GR_IS_GR_GL(fStandard) && (
370 (glVer >= GR_GL_VER(3,2)) ||
371 fExtensions.has("GL_ARB_instanced_arrays"))) ||
372 (GR_IS_GR_GL_ES(fStandard) && (
373 (glVer >= GR_GL_VER(3,0)) ||
374 fExtensions.has("GL_EXT_instanced_arrays"))) ||
375 (GR_IS_GR_WEBGL(fStandard) && (
376 (glVer >= GR_GL_VER(2,0))))) {
377 if (!fFunctions.fVertexAttribDivisor) {
378 RETURN_FALSE_INTERFACE;
379 }
380 }
381
382 if ((GR_IS_GR_GL(fStandard) && (
383 (glVer >= GR_GL_VER(3,0)))) ||
384 (GR_IS_GR_GL_ES(fStandard) && (
385 (glVer >= GR_GL_VER(3,0)))) ||
386 (GR_IS_GR_WEBGL(fStandard) && (
387 (glVer >= GR_GL_VER(2,0))))) {
388 if (!fFunctions.fVertexAttribIPointer) {
389 RETURN_FALSE_INTERFACE;
390 }
391 }
392
393 if ((GR_IS_GR_GL(fStandard) && (
394 (glVer >= GR_GL_VER(3,0)) ||
395 fExtensions.has("GL_ARB_framebuffer_object") ||
396 fExtensions.has("GL_EXT_framebuffer_object"))) ||
397 GR_IS_GR_GL_ES(fStandard) ||
398 GR_IS_GR_WEBGL(fStandard)) {
399 if (!fFunctions.fBindFramebuffer ||
400 !fFunctions.fBindRenderbuffer ||
401 !fFunctions.fCheckFramebufferStatus ||
402 !fFunctions.fDeleteFramebuffers ||
403 !fFunctions.fDeleteRenderbuffers ||
404 !fFunctions.fFramebufferRenderbuffer ||
405 !fFunctions.fFramebufferTexture2D ||
406 !fFunctions.fGenFramebuffers ||
407 !fFunctions.fGenRenderbuffers ||
408 !fFunctions.fGenerateMipmap ||
409 !fFunctions.fGetFramebufferAttachmentParameteriv ||
410 !fFunctions.fGetRenderbufferParameteriv ||
411 !fFunctions.fRenderbufferStorage) {
412 RETURN_FALSE_INTERFACE;
413 }
414 }
415
416 if ((GR_IS_GR_GL(fStandard) && (
417 (glVer >= GR_GL_VER(3,0)) ||
418 fExtensions.has("GL_ARB_framebuffer_object") ||
419 fExtensions.has("GL_EXT_framebuffer_blit"))) ||
420 (GR_IS_GR_GL_ES(fStandard) && (
421 (glVer >= GR_GL_VER(3,0)) ||
422 fExtensions.has("GL_CHROMIUM_framebuffer_multisample") ||
423 fExtensions.has("GL_ANGLE_framebuffer_blit"))) ||
424 (GR_IS_GR_WEBGL(fStandard) && (
425 (glVer >= GR_GL_VER(2,0))))) {
426 if (!fFunctions.fBlitFramebuffer) {
427 RETURN_FALSE_INTERFACE;
428 }
429 }
430
431 if ((GR_IS_GR_GL(fStandard) && (
432 (glVer >= GR_GL_VER(3,0)) ||
433 fExtensions.has("GL_ARB_framebuffer_object") ||
434 fExtensions.has("GL_EXT_framebuffer_multisample"))) ||
435 (GR_IS_GR_GL_ES(fStandard) && (
436 (glVer >= GR_GL_VER(3,0)) ||
437 fExtensions.has("GL_CHROMIUM_framebuffer_multisample") ||
438 fExtensions.has("GL_ANGLE_framebuffer_multisample"))) ||
439 (GR_IS_GR_WEBGL(fStandard) && (
440 (glVer >= GR_GL_VER(2,0))))) {
441 if (!fFunctions.fRenderbufferStorageMultisample) {
442 RETURN_FALSE_INTERFACE;
443 }
444 }
445
446 if ((GR_IS_GR_GL_ES(fStandard) && (
447 fExtensions.has("GL_CHROMIUM_map_sub")))) {
448 if (!fFunctions.fMapBufferSubData ||
449 !fFunctions.fMapTexSubImage2D ||
450 !fFunctions.fUnmapBufferSubData ||
451 !fFunctions.fUnmapTexSubImage2D) {
452 RETURN_FALSE_INTERFACE;
453 }
454 }
455
456 if ((GR_IS_GR_GL_ES(fStandard) && (
457 fExtensions.has("GL_EXT_multisampled_render_to_texture") ||
458 fExtensions.has("GL_IMG_multisampled_render_to_texture")))) {
459 if (!fFunctions.fFramebufferTexture2DMultisample) {
460 RETURN_FALSE_INTERFACE;
461 }
462 }
463
464 if ((GR_IS_GR_GL_ES(fStandard) && (
465 fExtensions.has("GL_EXT_multisampled_render_to_texture")))) {
466 if (!fFunctions.fRenderbufferStorageMultisampleES2EXT) {
467 RETURN_FALSE_INTERFACE;
468 }
469 }
470
471 if ((GR_IS_GR_GL_ES(fStandard) && (
472 fExtensions.has("GL_IMG_multisampled_render_to_texture")))) {
473 if (!fFunctions.fRenderbufferStorageMultisampleES2EXT) {
474 RETURN_FALSE_INTERFACE;
475 }
476 }
477
478 if ((GR_IS_GR_GL_ES(fStandard) && (
479 fExtensions.has("GL_APPLE_framebuffer_multisample")))) {
480 if (!fFunctions.fResolveMultisampleFramebuffer ||
481 !fFunctions.fRenderbufferStorageMultisampleES2APPLE) {
482 RETURN_FALSE_INTERFACE;
483 }
484 }
485
486 if (GR_IS_GR_GL(fStandard) ||
487 (GR_IS_GR_GL_ES(fStandard) && (
488 fExtensions.has("GL_OES_mapbuffer")))) {
489 if (!fFunctions.fMapBuffer) {
490 RETURN_FALSE_INTERFACE;
491 }
492 }
493
494 if (GR_IS_GR_GL(fStandard) ||
495 (GR_IS_GR_GL_ES(fStandard) && (
496 (glVer >= GR_GL_VER(3,0)) ||
497 fExtensions.has("GL_OES_mapbuffer")))) {
498 if (!fFunctions.fUnmapBuffer) {
499 RETURN_FALSE_INTERFACE;
500 }
501 }
502
503 if ((GR_IS_GR_GL(fStandard) && (
504 (glVer >= GR_GL_VER(3,0)) ||
505 fExtensions.has("GL_ARB_map_buffer_range"))) ||
506 (GR_IS_GR_GL_ES(fStandard) && (
507 (glVer >= GR_GL_VER(3,0)) ||
508 fExtensions.has("GL_EXT_map_buffer_range")))) {
509 if (!fFunctions.fFlushMappedBufferRange ||
510 !fFunctions.fMapBufferRange) {
511 RETURN_FALSE_INTERFACE;
512 }
513 }
514
515 if ((GR_IS_GR_GL(fStandard) && (
516 fExtensions.has("GL_EXT_debug_marker"))) ||
517 (GR_IS_GR_GL_ES(fStandard) && (
518 fExtensions.has("GL_EXT_debug_marker")))) {
519 if (!fFunctions.fInsertEventMarker ||
520 !fFunctions.fPopGroupMarker ||
521 !fFunctions.fPushGroupMarker) {
522 RETURN_FALSE_INTERFACE;
523 }
524 }
525
526 if ((GR_IS_GR_GL(fStandard) && (
527 (glVer >= GR_GL_VER(4,3)) ||
528 fExtensions.has("GL_ARB_program_interface_query"))) ||
529 (GR_IS_GR_GL_ES(fStandard) && (
530 (glVer >= GR_GL_VER(3,1))))) {
531 if (!fFunctions.fGetProgramResourceLocation) {
532 RETURN_FALSE_INTERFACE;
533 }
534 }
535
536 if ((GR_IS_GR_GL(fStandard) && (
537 fExtensions.has("GL_NV_path_rendering"))) ||
538 (GR_IS_GR_GL_ES(fStandard) && (
539 fExtensions.has("GL_CHROMIUM_path_rendering") ||
540 fExtensions.has("GL_NV_path_rendering")))) {
541 if (!fFunctions.fMatrixLoadIdentity ||
542 !fFunctions.fMatrixLoadf) {
543 RETURN_FALSE_INTERFACE;
544 }
545 }
546
547 if ((GR_IS_GR_GL(fStandard) && (
548 fExtensions.has("GL_NV_path_rendering"))) ||
549 (GR_IS_GR_GL_ES(fStandard) && (
550 fExtensions.has("GL_CHROMIUM_path_rendering") ||
551 fExtensions.has("GL_NV_path_rendering")))) {
552 if (!fFunctions.fCoverFillPath ||
553 !fFunctions.fCoverFillPathInstanced ||
554 !fFunctions.fCoverStrokePath ||
555 !fFunctions.fCoverStrokePathInstanced ||
556 !fFunctions.fDeletePaths ||
557 !fFunctions.fGenPaths ||
558 !fFunctions.fIsPath ||
559 !fFunctions.fPathCommands ||
560 !fFunctions.fPathParameterf ||
561 !fFunctions.fPathParameteri ||
562 !fFunctions.fPathStencilFunc ||
563 !fFunctions.fStencilFillPath ||
564 !fFunctions.fStencilFillPathInstanced ||
565 !fFunctions.fStencilStrokePath ||
566 !fFunctions.fStencilStrokePathInstanced) {
567 RETURN_FALSE_INTERFACE;
568 }
569 }
570
571 if ((GR_IS_GR_GL_ES(fStandard) && (
572 fExtensions.has("GL_CHROMIUM_path_rendering")))) {
573 if (!fFunctions.fBindFragmentInputLocation) {
574 RETURN_FALSE_INTERFACE;
575 }
576 }
577
578 if ((GR_IS_GR_GL(fStandard) && (
579 fExtensions.has("GL_NV_framebuffer_mixed_samples"))) ||
580 (GR_IS_GR_GL_ES(fStandard) && (
581 fExtensions.has("GL_CHROMIUM_framebuffer_mixed_samples") ||
582 fExtensions.has("GL_NV_framebuffer_mixed_samples")))) {
583 if (!fFunctions.fCoverageModulation) {
584 RETURN_FALSE_INTERFACE;
585 }
586 }
587
588 if ((GR_IS_GR_GL(fStandard) && (
589 (glVer >= GR_GL_VER(4,3)) ||
590 fExtensions.has("GL_KHR_debug"))) ||
591 (GR_IS_GR_GL_ES(fStandard) && (
592 fExtensions.has("GL_KHR_debug")))) {
593 if (!fFunctions.fDebugMessageCallback ||
594 !fFunctions.fDebugMessageControl ||
595 !fFunctions.fDebugMessageInsert ||
596 !fFunctions.fGetDebugMessageLog ||
597 !fFunctions.fObjectLabel ||
598 !fFunctions.fPopDebugGroup ||
599 !fFunctions.fPushDebugGroup) {
600 RETURN_FALSE_INTERFACE;
601 }
602 }
603
604 if ((GR_IS_GR_GL_ES(fStandard) && (
605 fExtensions.has("GL_CHROMIUM_bind_uniform_location")))) {
606 if (!fFunctions.fBindUniformLocation) {
607 RETURN_FALSE_INTERFACE;
608 }
609 }
610
611 if ((GR_IS_GR_GL(fStandard) && (
612 fExtensions.has("GL_EXT_window_rectangles"))) ||
613 (GR_IS_GR_GL_ES(fStandard) && (
614 fExtensions.has("GL_EXT_window_rectangles")))) {
615 if (!fFunctions.fWindowRectangles) {
616 RETURN_FALSE_INTERFACE;
617 }
618 }
619
620 if ((GR_IS_GR_GL(fStandard) && (
621 (glVer >= GR_GL_VER(3,2)) ||
622 fExtensions.has("GL_ARB_sync"))) ||
623 (GR_IS_GR_GL_ES(fStandard) && (
624 (glVer >= GR_GL_VER(3,0)) ||
625 fExtensions.has("GL_APPLE_sync"))) ||
626 (GR_IS_GR_WEBGL(fStandard) && (
627 (glVer >= GR_GL_VER(2,0))))) {
628 if (!fFunctions.fClientWaitSync ||
629 !fFunctions.fDeleteSync ||
630 !fFunctions.fFenceSync ||
631 !fFunctions.fIsSync ||
632 !fFunctions.fWaitSync) {
633 RETURN_FALSE_INTERFACE;
634 }
635 }
636
637 if ((GR_IS_GR_GL(fStandard) && (
638 (glVer >= GR_GL_VER(4,2)) ||
639 fExtensions.has("GL_ARB_internalformat_query"))) ||
640 (GR_IS_GR_GL_ES(fStandard) && (
641 (glVer >= GR_GL_VER(3,0))))) {
642 if (!fFunctions.fGetInternalformativ) {
643 RETURN_FALSE_INTERFACE;
644 }
645 }
646
647 if ((GR_IS_GR_GL(fStandard) && (
648 (glVer >= GR_GL_VER(4,1)))) ||
649 (GR_IS_GR_GL_ES(fStandard) && (
650 (glVer >= GR_GL_VER(3,0)) ||
651 fExtensions.has("GL_OES_get_program_binary")))) {
652 if (!fFunctions.fGetProgramBinary ||
653 !fFunctions.fProgramBinary) {
654 RETURN_FALSE_INTERFACE;
655 }
656 }
657
658 if ((GR_IS_GR_GL(fStandard) && (
659 (glVer >= GR_GL_VER(4,1)))) ||
660 (GR_IS_GR_GL_ES(fStandard) && (
661 (glVer >= GR_GL_VER(3,0))))) {
662 if (!fFunctions.fProgramParameteri) {
663 RETURN_FALSE_INTERFACE;
664 }
665 }
666
667 if ((GR_IS_GR_GL(fStandard) && (
668 (glVer >= GR_GL_VER(3,2)) ||
669 fExtensions.has("GL_ARB_sampler_objects"))) ||
670 (GR_IS_GR_GL_ES(fStandard) && (
671 (glVer >= GR_GL_VER(3,0)))) ||
672 (GR_IS_GR_WEBGL(fStandard) && (
673 (glVer >= GR_GL_VER(2,0))))) {
674 if (!fFunctions.fBindSampler ||
675 !fFunctions.fDeleteSamplers ||
676 !fFunctions.fGenSamplers ||
677 !fFunctions.fSamplerParameteri ||
678 !fFunctions.fSamplerParameteriv) {
679 RETURN_FALSE_INTERFACE;
680 }
681 }
682
683 if (GR_IS_GR_GL(fStandard)) {
684 if (!fFunctions.fGetQueryObjectiv) {
685 RETURN_FALSE_INTERFACE;
686 }
687 }
688
689 if (GR_IS_GR_GL(fStandard) ||
690 (GR_IS_GR_GL_ES(fStandard) && (
691 (glVer >= GR_GL_VER(3,0)) ||
692 fExtensions.has("GL_EXT_occlusion_query_boolean")))) {
693#if GR_TEST_UTILS
694 if (!fFunctions.fBeginQuery ||
695 !fFunctions.fDeleteQueries ||
696 !fFunctions.fEndQuery ||
697 !fFunctions.fGenQueries ||
698 !fFunctions.fGetQueryObjectuiv ||
699 !fFunctions.fGetQueryiv) {
700 RETURN_FALSE_INTERFACE;
701 }
702#endif
703 // all functions were marked optional or test_only
704 }
705
706 if ((GR_IS_GR_GL(fStandard) && (
707 (glVer >= GR_GL_VER(3,3)) ||
708 fExtensions.has("GL_ARB_timer_query") ||
709 fExtensions.has("GL_EXT_timer_query")))) {
710 if (!fFunctions.fGetQueryObjecti64v ||
711 !fFunctions.fGetQueryObjectui64v) {
712 RETURN_FALSE_INTERFACE;
713 }
714 }
715
716 if ((GR_IS_GR_GL(fStandard) && (
717 (glVer >= GR_GL_VER(3,3)) ||
718 fExtensions.has("GL_ARB_timer_query")))) {
719 if (!fFunctions.fQueryCounter) {
720 RETURN_FALSE_INTERFACE;
721 }
722 }
723
724 if ((GR_IS_GR_GL(fStandard) && (
725 (glVer >= GR_GL_VER(4,3)) ||
726 fExtensions.has("GL_ARB_invalidate_subdata")))) {
727 if (!fFunctions.fInvalidateBufferData ||
728 !fFunctions.fInvalidateBufferSubData ||
729 !fFunctions.fInvalidateTexImage ||
730 !fFunctions.fInvalidateTexSubImage) {
731 RETURN_FALSE_INTERFACE;
732 }
733 }
734
735 if ((GR_IS_GR_GL(fStandard) && (
736 (glVer >= GR_GL_VER(4,3)) ||
737 fExtensions.has("GL_ARB_invalidate_subdata"))) ||
738 (GR_IS_GR_GL_ES(fStandard) && (
739 (glVer >= GR_GL_VER(3,0)))) ||
740 (GR_IS_GR_WEBGL(fStandard) && (
741 (glVer >= GR_GL_VER(2,0))))) {
742 if (!fFunctions.fInvalidateFramebuffer ||
743 !fFunctions.fInvalidateSubFramebuffer) {
744 RETURN_FALSE_INTERFACE;
745 }
746 }
747
748 if ((GR_IS_GR_GL(fStandard) && (
749 (glVer >= GR_GL_VER(4,3)) ||
750 fExtensions.has("GL_ARB_ES2_compatibility"))) ||
751 GR_IS_GR_GL_ES(fStandard) ||
752 GR_IS_GR_WEBGL(fStandard)) {
753 if (!fFunctions.fGetShaderPrecisionFormat) {
754 RETURN_FALSE_INTERFACE;
755 }
756 }
757
758 if ((GR_IS_GR_GL(fStandard) && (
759 fExtensions.has("GL_NV_fence"))) ||
760 (GR_IS_GR_GL_ES(fStandard) && (
761 fExtensions.has("GL_NV_fence")))) {
762 if (!fFunctions.fDeleteFences ||
763 !fFunctions.fFinishFence ||
764 !fFunctions.fGenFences ||
765 !fFunctions.fSetFence ||
766 !fFunctions.fTestFence) {
767 RETURN_FALSE_INTERFACE;
768 }
769 }
770
771
772 // End autogenerated content
773 return true;
774}
775
776#if GR_TEST_UTILS
777
778void GrGLInterface::abandon() const {
779 const_cast<GrGLInterface*>(this)->fFunctions = GrGLInterface::Functions();
780}
781
782#endif // GR_TEST_UTILS
783