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