1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
659a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com */
759a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com
859a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com
96bf38b59c9de1cd35cd091cf8766117f4e1f66a0tomhudson@google.com#include "gl/GrGLInterface.h"
101744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com#include "gl/GrGLExtensions.h"
111744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com#include "gl/GrGLUtil.h"
1259a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com
1359a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com#include <stdio.h>
1459a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com
1556bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#if GR_GL_PER_GL_FUNC_CALLBACK
1656bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.comnamespace {
1756bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.comvoid GrGLDefaultInterfaceCallback(const GrGLInterface*) {}
1856bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com}
1956bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#endif
2056bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com
21a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.orgconst GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface* interface,
22a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org                                                     GrGLInsertEventMarkerProc insertEventMarkerFn,
23a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org                                                     GrGLPushGroupMarkerProc pushGroupMarkerFn,
24a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org                                                     GrGLPopGroupMarkerProc popGroupMarkerFn) {
25a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    GrGLInterface* newInterface = GrGLInterface::NewClone(interface);
26a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org
27a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    if (!newInterface->fExtensions.has("GL_EXT_debug_marker")) {
28a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org        newInterface->fExtensions.add("GL_EXT_debug_marker");
29a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    }
30a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org
31f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    newInterface->fFunctions.fInsertEventMarker = insertEventMarkerFn;
32f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    newInterface->fFunctions.fPushGroupMarker = pushGroupMarkerFn;
33f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    newInterface->fFunctions.fPopGroupMarker = popGroupMarkerFn;
34a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org
35a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    return newInterface;
36a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org}
37a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org
38d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.orgconst GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface* interface) {
39d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    GrGLInterface* newInterface = GrGLInterface::NewClone(interface);
40d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org
41d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    newInterface->fExtensions.remove("GL_NV_path_rendering");
422ca29c0b919765f01ee07625250c0b58f30b05b5kkinnunen    newInterface->fExtensions.remove("GL_CHROMIUM_path_rendering");
432ca29c0b919765f01ee07625250c0b58f30b05b5kkinnunen    newInterface->fFunctions.fMatrixLoadf = nullptr;
442ca29c0b919765f01ee07625250c0b58f30b05b5kkinnunen    newInterface->fFunctions.fMatrixLoadIdentity = nullptr;
4596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fPathCommands = nullptr;
4696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fPathParameteri = nullptr;
4796fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fPathParameterf = nullptr;
4896fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fGenPaths = nullptr;
4996fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fDeletePaths = nullptr;
5096fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fIsPath = nullptr;
5196fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fPathStencilFunc = nullptr;
5296fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilFillPath = nullptr;
5396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilStrokePath = nullptr;
5496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilFillPathInstanced = nullptr;
5596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilStrokePathInstanced = nullptr;
5696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fCoverFillPath = nullptr;
5796fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fCoverStrokePath = nullptr;
5896fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fCoverFillPathInstanced = nullptr;
5996fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fCoverStrokePathInstanced = nullptr;
6096fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilThenCoverFillPath = nullptr;
6196fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilThenCoverStrokePath = nullptr;
6296fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilThenCoverFillPathInstanced = nullptr;
6396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fStencilThenCoverStrokePathInstanced = nullptr;
6496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fProgramPathFragmentInputGen = nullptr;
6596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    newInterface->fFunctions.fBindFragmentInputLocation = nullptr;
66d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    return newInterface;
67d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org}
68d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org
69f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.orgGrGLInterface::GrGLInterface() {
709e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    fStandard = kNone_GrGLStandard;
710b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com
7256bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#if GR_GL_PER_GL_FUNC_CALLBACK
7356bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com    fCallback = GrGLDefaultInterfaceCallback;
7456bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com    fCallbackData = 0;
7556bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#endif
760b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com}
770b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com
78d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.orgGrGLInterface* GrGLInterface::NewClone(const GrGLInterface* interface) {
7949f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(interface);
80d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org
81385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary    GrGLInterface* clone = new GrGLInterface;
82d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    clone->fStandard = interface->fStandard;
83d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    clone->fExtensions = interface->fExtensions;
84d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    clone->fFunctions = interface->fFunctions;
85d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org#if GR_GL_PER_GL_FUNC_CALLBACK
86d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    clone->fCallback = interface->fCallback;
87d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    clone->fCallbackData = interface->fCallbackData;
88d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org#endif
89d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org    return clone;
90d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org}
91d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org
92e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#ifdef SK_DEBUG
93e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org    static int kIsDebug = 1;
94e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#else
95e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org    static int kIsDebug = 0;
96e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#endif
97e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org
98e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#define RETURN_FALSE_INTERFACE                                                                   \
99e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org    if (kIsDebug) { SkDebugf("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); } \
100e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org    return false;
101adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org
1029e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.orgbool GrGLInterface::validate() const {
103bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
1049e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kNone_GrGLStandard == fStandard) {
105adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org        RETURN_FALSE_INTERFACE
106bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
10712eea2b10d6caaafe0a207d10b1e9322510983a2skia.committer@gmail.com
10890313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org    if (!fExtensions.isInitialized()) {
109adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org        RETURN_FALSE_INTERFACE
1101744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com    }
111bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
112bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // functions that are always required
11396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    if (nullptr == fFunctions.fActiveTexture ||
11496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fAttachShader ||
11596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBindAttribLocation ||
11696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBindBuffer ||
11796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBindTexture ||
11896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBlendColor ||      // -> GL >= 1.4 or extension, ES >= 2.0
11996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBlendEquation ||   // -> GL >= 1.4 or extension, ES >= 2.0
12096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBlendFunc ||
12196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBufferData ||
12296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBufferSubData ||
12396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fClear ||
12496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fClearColor ||
12596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fClearStencil ||
12696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fColorMask ||
12796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fCompileShader ||
12896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fCopyTexSubImage2D ||
12996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fCreateProgram ||
13096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fCreateShader ||
13196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fCullFace ||
13296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDeleteBuffers ||
13396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDeleteProgram ||
13496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDeleteShader ||
13596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDeleteTextures ||
13696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDepthMask ||
13796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDisable ||
13896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDisableVertexAttribArray ||
13996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDrawArrays ||
14096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDrawElements ||
14196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fEnable ||
14296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fEnableVertexAttribArray ||
14396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fFrontFace ||
14496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGenBuffers ||
14596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGenTextures ||
14696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetBufferParameteriv ||
14796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGenerateMipmap ||
14896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetError ||
14996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetIntegerv ||
15096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetProgramInfoLog ||
15196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetProgramiv ||
15296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetShaderInfoLog ||
15396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetShaderiv ||
15496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetString ||
15596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetUniformLocation ||
1566dc6f5f4a153d33ed91565cb3cd397a310a937d0bsalomon#if 0 //  Not included in Chrome yet
15796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fIsTexture ||
1586dc6f5f4a153d33ed91565cb3cd397a310a937d0bsalomon#endif
15996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fLinkProgram ||
16096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fLineWidth ||
16196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fPixelStorei ||
16296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fReadPixels ||
16396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fScissor ||
16496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fShaderSource ||
16596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fStencilFunc ||
16696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fStencilMask ||
16796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fStencilOp ||
16896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fTexImage2D ||
16996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fTexParameteri ||
17096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fTexParameteriv ||
17196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fTexSubImage2D ||
17296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform1f ||
17396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform1i ||
17496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform1fv ||
17596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform1iv ||
17696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform2f ||
17796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform2i ||
17896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform2fv ||
17996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform2iv ||
18096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform3f ||
18196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform3i ||
18296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform3fv ||
18396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform3iv ||
18496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform4f ||
18596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform4i ||
18696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform4fv ||
18796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniform4iv ||
18896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniformMatrix2fv ||
18996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniformMatrix3fv ||
19096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUniformMatrix4fv ||
19196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fUseProgram ||
19296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fVertexAttrib1f ||
19396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fVertexAttrib2fv ||
19496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fVertexAttrib3fv ||
19596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fVertexAttrib4fv ||
19696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fVertexAttribPointer ||
19796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fViewport ||
19896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBindFramebuffer ||
19996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fBindRenderbuffer ||
20096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fCheckFramebufferStatus ||
20196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDeleteFramebuffers ||
20296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fDeleteRenderbuffers ||
20396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fFinish ||
20496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fFlush ||
20596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fFramebufferRenderbuffer ||
20696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fFramebufferTexture2D ||
20796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetFramebufferAttachmentParameteriv ||
20896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGetRenderbufferParameteriv ||
20996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGenFramebuffers ||
21096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fGenRenderbuffers ||
21196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        nullptr == fFunctions.fRenderbufferStorage) {
212adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org        RETURN_FALSE_INTERFACE
213bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
214bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
215c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com    GrGLVersion glVer = GrGLGetVersion(this);
216f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org    if (GR_GL_INVALID_VER == glVer) {
217f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org        RETURN_FALSE_INTERFACE
218f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org    }
21945c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen    // TODO: Remove this once command buffer implements full ES3.
22045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen    bool ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3 = false;
22145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen    if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) {
22245c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        const GrGLubyte* rendererUByte;
22345c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        GR_GL_CALL_RET(this, rendererUByte, GetString(GR_GL_RENDERER));
22445c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        const char* renderer = reinterpret_cast<const char*>(rendererUByte);
22545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3 =
22645c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                0 == strcmp(renderer, "Chromium");
22745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen    }
228bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
229bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // Now check that baseline ES/Desktop fns not covered above are present
23090313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org    // and that we have fn pointers for any advertised fExtensions that we will
231bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // try to use.
232bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
233bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // these functions are part of ES2, we assume they are available
234bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // On the desktop we assume they are available if the extension
235bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // is present or GL version is high enough.
2369e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kGLES_GrGLStandard == fStandard) {
23796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fStencilFuncSeparate ||
23896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilMaskSeparate ||
23996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilOpSeparate) {
240adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
241bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        }
2429e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    } else if (kGL_GrGLStandard == fStandard) {
243e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com
244c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com        if (glVer >= GR_GL_VER(2,0)) {
24596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fStencilFuncSeparate ||
24696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fStencilMaskSeparate ||
24796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fStencilOpSeparate) {
248adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
249bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com            }
250bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        }
25196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (glVer >= GR_GL_VER(3,0) && nullptr == fFunctions.fBindFragDataLocation) {
252adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
253bc5cf51627505f763586100675aa60b66d743c7ebsalomon@google.com        }
25490313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(2,0) || fExtensions.has("GL_ARB_draw_buffers")) {
25596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fDrawBuffers) {
256adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
257d32c5f564e4aa9ada2650e07d3856d5b21cd2138bsalomon@google.com            }
258d32c5f564e4aa9ada2650e07d3856d5b21cd2138bsalomon@google.com        }
259e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com
26090313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(1,5) || fExtensions.has("GL_ARB_occlusion_query")) {
26196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fGenQueries ||
26296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fDeleteQueries ||
26396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fBeginQuery ||
26496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fEndQuery ||
26596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetQueryiv ||
26696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetQueryObjectiv ||
26796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetQueryObjectuiv) {
268adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
269373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com            }
270373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        }
271373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        if (glVer >= GR_GL_VER(3,3) ||
27290313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            fExtensions.has("GL_ARB_timer_query") ||
27390313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            fExtensions.has("GL_EXT_timer_query")) {
27496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fGetQueryObjecti64v ||
27596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetQueryObjectui64v) {
276adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
277373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com            }
278373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        }
27990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_timer_query")) {
28096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fQueryCounter) {
281adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
282373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com            }
283373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        }
284bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
285bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
286bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // optional function on desktop before 1.3
2879e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kGL_GrGLStandard != fStandard ||
2881744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com        (glVer >= GR_GL_VER(1,3)) ||
28990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        fExtensions.has("GL_ARB_texture_compression")) {
29096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fCompressedTexImage2D
291c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#if 0
29296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            || nullptr == fFunctions.fCompressedTexSubImage2D
293c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#endif
294e1f5a23812cab849174a47fae02397e7291f850ekrajcevski            ) {
295adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
296bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        }
297bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
298bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
299d32c5f564e4aa9ada2650e07d3856d5b21cd2138bsalomon@google.com    // part of desktop GL, but not ES
3009e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kGL_GrGLStandard == fStandard &&
30196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        (nullptr == fFunctions.fGetTexLevelParameteriv ||
30296fcdcc219d2a0d3579719b84b28bede76efba64halcanary         nullptr == fFunctions.fDrawBuffer ||
30396fcdcc219d2a0d3579719b84b28bede76efba64halcanary         nullptr == fFunctions.fReadBuffer)) {
304adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org        RETURN_FALSE_INTERFACE
305bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
306cee661af926cc977addc6e039b7022975a448acebsalomon@google.com
307280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com    // GL_EXT_texture_storage is part of desktop 4.2
308280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com    // There is a desktop ARB extension and an ES+desktop EXT extension
3099e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kGL_GrGLStandard == fStandard) {
310baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com        if (glVer >= GR_GL_VER(4,2) ||
31190313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            fExtensions.has("GL_ARB_texture_storage") ||
31290313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            fExtensions.has("GL_EXT_texture_storage")) {
31396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fTexStorage2D) {
314adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
315baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com            }
316baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com        }
31790313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org    } else if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_texture_storage")) {
31845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) {
31945c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen            if (nullptr == fFunctions.fTexStorage2D) {
32045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                RETURN_FALSE_INTERFACE
32145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen            }
322baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com        }
323280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com    }
324280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com
325fd4167ddf12ea723b828462ec1507acebdef5776cdalton    // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extensions.
326fd4167ddf12ea723b828462ec1507acebdef5776cdalton    if (kGL_GrGLStandard == fStandard) {
327fd4167ddf12ea723b828462ec1507acebdef5776cdalton        if (glVer >= GR_GL_VER(4,5) ||
328fd4167ddf12ea723b828462ec1507acebdef5776cdalton            fExtensions.has("GL_ARB_texture_barrier") ||
329fd4167ddf12ea723b828462ec1507acebdef5776cdalton            fExtensions.has("GL_NV_texture_barrier")) {
33096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fTextureBarrier) {
331fd4167ddf12ea723b828462ec1507acebdef5776cdalton                RETURN_FALSE_INTERFACE
332fd4167ddf12ea723b828462ec1507acebdef5776cdalton            }
333fd4167ddf12ea723b828462ec1507acebdef5776cdalton        }
334fd4167ddf12ea723b828462ec1507acebdef5776cdalton    } else if (fExtensions.has("GL_NV_texture_barrier")) {
33596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fTextureBarrier) {
336fd4167ddf12ea723b828462ec1507acebdef5776cdalton            RETURN_FALSE_INTERFACE
337fd4167ddf12ea723b828462ec1507acebdef5776cdalton        }
338fd4167ddf12ea723b828462ec1507acebdef5776cdalton    }
339fd4167ddf12ea723b828462ec1507acebdef5776cdalton
340bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton    if (fExtensions.has("GL_KHR_blend_equation_advanced") ||
341bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton        fExtensions.has("GL_NV_blend_equation_advanced")) {
34296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fBlendBarrier) {
343bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton            RETURN_FALSE_INTERFACE
344bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton        }
345bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton    }
346bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton
34790313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org    if (fExtensions.has("GL_EXT_discard_framebuffer")) {
348c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon// FIXME: Remove this once Chromium is updated to provide this function
349c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#if 0
35096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fDiscardFramebuffer) {
351adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
352a6ffb58b109f71512bde4e14d06a655914578c8drobertphillips@google.com        }
353c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#endif
354a6ffb58b109f71512bde4e14d06a655914578c8drobertphillips@google.com    }
355a6ffb58b109f71512bde4e14d06a655914578c8drobertphillips@google.com
356bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // FBO MSAA
3579e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kGL_GrGLStandard == fStandard) {
358bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        // GL 3.0 and the ARB extension have multisample + blit
35990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_ARB_framebuffer_object")) {
36096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fRenderbufferStorageMultisample ||
36196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fBlitFramebuffer) {
362adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
363bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com            }
364bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        } else {
36590313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            if (fExtensions.has("GL_EXT_framebuffer_blit") &&
36696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fBlitFramebuffer) {
367adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
368bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com            }
36990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            if (fExtensions.has("GL_EXT_framebuffer_multisample") &&
37096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fRenderbufferStorageMultisample) {
371adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
372bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com            }
373bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        }
374bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    } else {
37590313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_CHROMIUM_framebuffer_multisample")) {
37696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fRenderbufferStorageMultisample ||
37796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fBlitFramebuffer) {
378adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
379a8e5a06f69b7e0cb17a4b3203f0a7a1d52aa73eccommit-bot@chromium.org            }
380a8e5a06f69b7e0cb17a4b3203f0a7a1d52aa73eccommit-bot@chromium.org        }
38190313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (fExtensions.has("GL_APPLE_framebuffer_multisample")) {
38296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2APPLE ||
38396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fResolveMultisampleFramebuffer) {
384adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
385bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com            }
386bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        }
38790313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (fExtensions.has("GL_IMG_multisampled_render_to_texture") ||
38890313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org            fExtensions.has("GL_EXT_multisampled_render_to_texture")) {
38996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2EXT ||
39096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fFramebufferTexture2DMultisample) {
391adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
392f3a60c09b975f50bbd14215df10effffd2fd46e8bsalomon@google.com            }
393f3a60c09b975f50bbd14215df10effffd2fd46e8bsalomon@google.com        }
394bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
395bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
396bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // On ES buffer mapping is an extension. On Desktop
397bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // buffer mapping was part of original VBO extension
398bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    // which we require.
39990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org    if (kGL_GrGLStandard == fStandard || fExtensions.has("GL_OES_mapbuffer")) {
40096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fMapBuffer ||
40196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fUnmapBuffer) {
402adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
403bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com        }
404bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    }
405bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com
406271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    // Dual source blending
407d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen    if (kGL_GrGLStandard == fStandard) {
408d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen        if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_blend_func_extended")) {
40996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fBindFragDataLocationIndexed) {
410d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen                RETURN_FALSE_INTERFACE
411d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen            }
412d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen        }
413d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen    } else {
414d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen        if (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended")) {
41596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fBindFragDataLocation ||
41696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fBindFragDataLocationIndexed) {
417d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen                RETURN_FALSE_INTERFACE
418d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen            }
419271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
420271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
42112eea2b10d6caaafe0a207d10b1e9322510983a2skia.committer@gmail.com
422d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen
423726e621000582e4de7c9ce0f7e9950c3af4e5d9bcommit-bot@chromium.org    // glGetStringi was added in version 3.0 of both desktop and ES.
424726e621000582e4de7c9ce0f7e9950c3af4e5d9bcommit-bot@chromium.org    if (glVer >= GR_GL_VER(3, 0)) {
42596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fGetStringi) {
426adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
4271744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com        }
4281744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com    }
429271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
430793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton    // glVertexAttribIPointer was added in version 3.0 of both desktop and ES.
431793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton    if (glVer >= GR_GL_VER(3, 0)) {
432793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton        if (NULL == fFunctions.fVertexAttribIPointer) {
433793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton            RETURN_FALSE_INTERFACE
434793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton        }
435793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton    }
436793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton
4379e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    if (kGL_GrGLStandard == fStandard) {
43890313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(3, 0) || fExtensions.has("GL_ARB_vertex_array_object")) {
43996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fBindVertexArray ||
44096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fDeleteVertexArrays ||
44196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGenVertexArrays) {
442adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
443ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com            }
444ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com        }
445ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com    } else {
44690313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_OES_vertex_array_object")) {
44796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fBindVertexArray ||
44896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fDeleteVertexArrays ||
44996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGenVertexArrays) {
450adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org                RETURN_FALSE_INTERFACE
451ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com            }
452ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com        }
453ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com    }
454a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org
455a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    if (fExtensions.has("GL_EXT_debug_marker")) {
45696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fInsertEventMarker ||
45796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPushGroupMarker ||
45896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPopGroupMarker) {
459adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org            RETURN_FALSE_INTERFACE
460a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org        }
461a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    }
462a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com
463160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
464160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        fExtensions.has("GL_ARB_invalidate_subdata")) {
46596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fInvalidateBufferData ||
46696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fInvalidateBufferSubData ||
46796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fInvalidateFramebuffer ||
46896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fInvalidateSubFramebuffer ||
46996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fInvalidateTexImage ||
47096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fInvalidateTexSubImage) {
471a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com            RETURN_FALSE_INTERFACE;
472a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com        }
473160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) {
474a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com        // ES 3.0 adds the framebuffer functions but not the others.
47596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fInvalidateFramebuffer ||
47696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fInvalidateSubFramebuffer) {
477a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com            RETURN_FALSE_INTERFACE;
478a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com        }
479a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com    }
480beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org
481beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org    if (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_CHROMIUM_map_sub")) {
48296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fMapBufferSubData ||
48396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fMapTexSubImage2D ||
48496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fUnmapBufferSubData ||
48596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fUnmapTexSubImage2D) {
486beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org            RETURN_FALSE_INTERFACE;
487beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org        }
488beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org    }
489a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com
490160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    // These functions are added to the 3.0 version of both GLES and GL.
491160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    if (glVer >= GR_GL_VER(3,0) ||
492160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_map_buffer_range")) ||
493160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        (kGL_GrGLStandard == fStandard && fExtensions.has("GL_ARB_map_buffer_range"))) {
49445c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) {
49545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen            if (nullptr == fFunctions.fMapBufferRange ||
49645c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                nullptr == fFunctions.fFlushMappedBufferRange) {
49745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                RETURN_FALSE_INTERFACE;
49845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen            }
499160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        }
500160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    }
50132b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen
50232b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen    if ((kGL_GrGLStandard == fStandard &&
50332b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen         (glVer >= GR_GL_VER(4,3) || fExtensions.has("GL_ARB_program_interface_query"))) ||
50432b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen        (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) {
50596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fGetProgramResourceLocation) {
50632b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen            RETURN_FALSE_INTERFACE
50732b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen        }
50832b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen    }
50932b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen
510ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon    if (kGLES_GrGLStandard == fStandard || glVer >= GR_GL_VER(4,1) ||
511ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon        fExtensions.has("GL_ARB_ES2_compatibility")) {
512c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#if 0 // Enable this once Chrome gives us the function ptr
51396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fGetShaderPrecisionFormat) {
514ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon            RETURN_FALSE_INTERFACE
515ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon        }
516c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#endif
517ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon    }
518ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon
5196bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    if (fExtensions.has("GL_NV_path_rendering") || fExtensions.has("GL_CHROMIUM_path_rendering")) {
52096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fMatrixLoadf ||
52196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fMatrixLoadIdentity ||
52296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPathCommands ||
52396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPathParameteri ||
52496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPathParameterf ||
52596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGenPaths ||
52696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fDeletePaths ||
52796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fIsPath ||
52896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPathStencilFunc ||
52996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilFillPath ||
53096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilStrokePath ||
53196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilFillPathInstanced ||
53296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilStrokePathInstanced ||
53396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCoverFillPath ||
53496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCoverStrokePath ||
53596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCoverFillPathInstanced ||
53696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCoverStrokePathInstanced
537cfe62e30848eadead4358b0385e57723779b762bkkinnunen#if 0
538cfe62e30848eadead4358b0385e57723779b762bkkinnunen            // List of functions that Skia uses, but which have been added since the initial release
539cfe62e30848eadead4358b0385e57723779b762bkkinnunen            // of NV_path_rendering driver. We do not want to fail interface validation due to
540cfe62e30848eadead4358b0385e57723779b762bkkinnunen            // missing features, we will just not use the extension.
541cfe62e30848eadead4358b0385e57723779b762bkkinnunen            // Update this list -> update GrGLCaps::hasPathRenderingSupport too.
54296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            || nullptr == fFunctions.fStencilThenCoverFillPath ||
54396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilThenCoverStrokePath ||
54496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilThenCoverFillPathInstanced ||
54596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fStencilThenCoverStrokePathInstanced ||
54696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fProgramPathFragmentInputGen
547cfe62e30848eadead4358b0385e57723779b762bkkinnunen#endif
548cfe62e30848eadead4358b0385e57723779b762bkkinnunen            ) {
54932b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen            RETURN_FALSE_INTERFACE
55032b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen        }
5516bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen        if (fExtensions.has("GL_CHROMIUM_path_rendering")) {
55296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fBindFragmentInputLocation) {
5536bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen                RETURN_FALSE_INTERFACE
5546bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen            }
5556bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen        }
55632b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen    }
55732b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen
5580edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton    if (fExtensions.has("GL_EXT_raster_multisample")) {
55996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fRasterSamples) {
5600edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton            RETURN_FALSE_INTERFACE
5610edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton        }
5620edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton    }
5630edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton
564ea40943f8e71dd515d5d64471a6d0f67abc6dc12kkinnunen    if (fExtensions.has("GL_NV_framebuffer_mixed_samples") ||
565ea40943f8e71dd515d5d64471a6d0f67abc6dc12kkinnunen        fExtensions.has("GL_CHROMIUM_framebuffer_mixed_samples")) {
56696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fCoverageModulation) {
56708b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov            RETURN_FALSE_INTERFACE
56808b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov        }
56908b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov    }
57008b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov
571b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw    if (kGL_GrGLStandard == fStandard) {
572b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw        if (glVer >= GR_GL_VER(3,1) ||
573b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            fExtensions.has("GL_EXT_draw_instanced") || fExtensions.has("GL_ARB_draw_instanced")) {
574b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            if (nullptr == fFunctions.fDrawArraysInstanced ||
575b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw                nullptr == fFunctions.fDrawElementsInstanced) {
576b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw                RETURN_FALSE_INTERFACE
577b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            }
57845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        }
579b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw    } else if (kGLES_GrGLStandard == fStandard) {
58045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) {
58145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen            if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_draw_instanced")) {
58245c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                if (nullptr == fFunctions.fDrawArraysInstanced ||
58345c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                    nullptr == fFunctions.fDrawElementsInstanced) {
58445c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                    RETURN_FALSE_INTERFACE
58545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                }
586b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            }
58745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        }
588626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
589626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
590b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw    if (kGL_GrGLStandard == fStandard) {
591b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw        if (glVer >= GR_GL_VER(3,2) || fExtensions.has("GL_ARB_instanced_arrays")) {
592b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            if (nullptr == fFunctions.fVertexAttribDivisor) {
593b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw                RETURN_FALSE_INTERFACE
594b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            }
59545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        }
596b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw    } else if (kGLES_GrGLStandard == fStandard) {
59745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) {
59845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen            if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_instanced_arrays")) {
59945c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                if (nullptr == fFunctions.fVertexAttribDivisor) {
60045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                    RETURN_FALSE_INTERFACE
60145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen                }
602b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw            }
60345c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen        }
604626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
605626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
60606604b95622359640a1c2028b885646deda28d52cdalton    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
60706604b95622359640a1c2028b885646deda28d52cdalton        (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) {
60806604b95622359640a1c2028b885646deda28d52cdalton        if (NULL == fFunctions.fDrawArraysIndirect ||
60906604b95622359640a1c2028b885646deda28d52cdalton            NULL == fFunctions.fDrawElementsIndirect) {
61006604b95622359640a1c2028b885646deda28d52cdalton            RETURN_FALSE_INTERFACE
61106604b95622359640a1c2028b885646deda28d52cdalton        }
61206604b95622359640a1c2028b885646deda28d52cdalton    }
61306604b95622359640a1c2028b885646deda28d52cdalton
61406604b95622359640a1c2028b885646deda28d52cdalton    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
61506604b95622359640a1c2028b885646deda28d52cdalton        (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_multi_draw_indirect"))) {
61606604b95622359640a1c2028b885646deda28d52cdalton        if (NULL == fFunctions.fMultiDrawArraysIndirect ||
61706604b95622359640a1c2028b885646deda28d52cdalton            NULL == fFunctions.fMultiDrawElementsIndirect) {
61806604b95622359640a1c2028b885646deda28d52cdalton            RETURN_FALSE_INTERFACE
61906604b95622359640a1c2028b885646deda28d52cdalton        }
62006604b95622359640a1c2028b885646deda28d52cdalton    }
62106604b95622359640a1c2028b885646deda28d52cdalton
622626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    if (fExtensions.has("GL_NV_bindless_texture")) {
62396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fGetTextureHandle ||
62496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetTextureSamplerHandle ||
62596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fMakeTextureHandleResident ||
62696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fMakeTextureHandleNonResident ||
62796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetImageHandle ||
62896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fMakeImageHandleResident ||
62996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fMakeImageHandleNonResident ||
63096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fIsTextureHandleResident ||
63196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fIsImageHandleResident ||
63296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fUniformHandleui64 ||
63396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fUniformHandleui64v ||
63496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fProgramUniformHandleui64 ||
63596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fProgramUniformHandleui64v) {
636626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            RETURN_FALSE_INTERFACE
637626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
638626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
639626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
640626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    if (kGL_GrGLStandard == fStandard && fExtensions.has("GL_EXT_direct_state_access")) {
64196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fTextureParameteri ||
64296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureParameteriv ||
64396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureParameterf ||
64496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureParameterfv ||
64596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureImage1D ||
64696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureImage2D ||
64796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureSubImage1D ||
64896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fTextureSubImage2D ||
64996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCopyTextureImage1D ||
65096fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCopyTextureImage2D ||
65196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCopyTextureSubImage1D ||
65296fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fCopyTextureSubImage2D ||
65396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetTextureImage ||
65496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetTextureParameterfv ||
65596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetTextureParameteriv ||
65696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetTextureLevelParameterfv ||
65796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetTextureLevelParameteriv) {
658626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            RETURN_FALSE_INTERFACE
659626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
660626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        if (glVer >= GR_GL_VER(1,2)) {
66196fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fTextureImage3D ||
66296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fTextureSubImage3D ||
66396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCopyTextureSubImage3D ||
66496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCompressedTextureImage3D ||
66596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCompressedTextureImage2D ||
66696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCompressedTextureImage1D ||
66796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCompressedTextureSubImage3D ||
66896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCompressedTextureSubImage2D ||
66996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCompressedTextureSubImage1D ||
67096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetCompressedTextureImage) {
671626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                RETURN_FALSE_INTERFACE
672626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            }
673626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
674626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        if (glVer >= GR_GL_VER(1,5)) {
67596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fNamedBufferData ||
67696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedBufferSubData ||
67796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fMapNamedBuffer ||
67896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fUnmapNamedBuffer ||
67996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetNamedBufferParameteriv ||
68096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetNamedBufferPointerv ||
68196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetNamedBufferSubData) {
682626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                RETURN_FALSE_INTERFACE
683626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            }
684626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
685626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        if (glVer >= GR_GL_VER(2,0)) {
68696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fProgramUniform1f ||
68796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform2f ||
68896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform3f ||
68996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform4f ||
69096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform1i ||
69196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform2i ||
69296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform3i ||
69396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform4i ||
69496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform1fv ||
69596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform2fv ||
69696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform3fv ||
69796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform4fv ||
69896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform1iv ||
69996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform2iv ||
70096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform3iv ||
70196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniform4iv ||
70296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix2fv ||
70396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix3fv ||
70496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix4fv) {
705626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                RETURN_FALSE_INTERFACE
706626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            }
707626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
708626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        if (glVer >= GR_GL_VER(2,1)) {
70996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fProgramUniformMatrix2x3fv ||
71096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix3x2fv ||
71196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix2x4fv ||
71296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix4x2fv ||
71396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix3x4fv ||
71496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fProgramUniformMatrix4x3fv) {
715626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                RETURN_FALSE_INTERFACE
716626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            }
717626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
718626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        if (glVer >= GR_GL_VER(3,0)) {
71996fcdcc219d2a0d3579719b84b28bede76efba64halcanary            if (nullptr == fFunctions.fNamedRenderbufferStorage ||
72096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetNamedRenderbufferParameteriv ||
72196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedRenderbufferStorageMultisample ||
72296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fCheckNamedFramebufferStatus ||
72396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedFramebufferTexture1D ||
72496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedFramebufferTexture2D ||
72596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedFramebufferTexture3D ||
72696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedFramebufferRenderbuffer ||
72796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetNamedFramebufferAttachmentParameteriv ||
72896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGenerateTextureMipmap ||
72996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fFramebufferDrawBuffer ||
73096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fFramebufferDrawBuffers ||
73196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fFramebufferReadBuffer ||
73296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetFramebufferParameteriv ||
73396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fNamedCopyBufferSubData ||
73496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayVertexOffset ||
73596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayColorOffset ||
73696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayEdgeFlagOffset ||
73796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayIndexOffset ||
73896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayNormalOffset ||
73996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayTexCoordOffset ||
74096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayMultiTexCoordOffset ||
74196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayFogCoordOffset ||
74296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArraySecondaryColorOffset ||
74396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayVertexAttribOffset ||
74496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fVertexArrayVertexAttribIOffset ||
74596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fEnableVertexArray ||
74696fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fDisableVertexArray ||
74796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fEnableVertexArrayAttrib ||
74896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fDisableVertexArrayAttrib ||
74996fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetVertexArrayIntegerv ||
75096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetVertexArrayPointerv ||
75196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetVertexArrayIntegeri_v ||
75296fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fGetVertexArrayPointeri_v ||
75396fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fMapNamedBufferRange ||
75496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                nullptr == fFunctions.fFlushMappedNamedBufferRange) {
755626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton                RETURN_FALSE_INTERFACE
756626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            }
757626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
758626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
759626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
760626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
761626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        fExtensions.has("GL_KHR_debug")) {
76296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == fFunctions.fDebugMessageControl ||
76396fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fDebugMessageInsert ||
76496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fDebugMessageCallback ||
76596fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fGetDebugMessageLog ||
76696fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPushDebugGroup ||
76796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fPopDebugGroup ||
76896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr == fFunctions.fObjectLabel) {
769626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton            RETURN_FALSE_INTERFACE
770626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton        }
771626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton    }
772626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton
773b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon    if (fExtensions.has("EGL_KHR_image") || fExtensions.has("EGL_KHR_image_base")) {
7747ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon        if (nullptr == fFunctions.fEGLCreateImage ||
7757ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon            nullptr == fFunctions.fEGLDestroyImage) {
776b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon            RETURN_FALSE_INTERFACE
777b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon        }
778b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon    }
779b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon
780bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com    return true;
781bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com}
782