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