/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "gl/GrGLInterface.h"
#include "gl/GrGLExtensions.h"
#include "gl/GrGLUtil.h"

#include <stdio.h>

const GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface* interface,
                                                     GrGLInsertEventMarkerProc insertEventMarkerFn,
                                                     GrGLPushGroupMarkerProc pushGroupMarkerFn,
                                                     GrGLPopGroupMarkerProc popGroupMarkerFn) {
    GrGLInterface* newInterface = GrGLInterface::NewClone(interface);

    if (!newInterface->fExtensions.has("GL_EXT_debug_marker")) {
        newInterface->fExtensions.add("GL_EXT_debug_marker");
    }

    newInterface->fFunctions.fInsertEventMarker = insertEventMarkerFn;
    newInterface->fFunctions.fPushGroupMarker = pushGroupMarkerFn;
    newInterface->fFunctions.fPopGroupMarker = popGroupMarkerFn;

    return newInterface;
}

GrGLInterface::GrGLInterface() {
    fStandard = kNone_GrGLStandard;
}

GrGLInterface* GrGLInterface::NewClone(const GrGLInterface* interface) {
    SkASSERT(interface);

    GrGLInterface* clone = new GrGLInterface;
    clone->fStandard = interface->fStandard;
    clone->fExtensions = interface->fExtensions;
    clone->fFunctions = interface->fFunctions;
    return clone;
}

#ifdef SK_DEBUG
    static int kIsDebug = 1;
#else
    static int kIsDebug = 0;
#endif

#define RETURN_FALSE_INTERFACE                                                                   \
    if (kIsDebug) { SkDebugf("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); } \
    return false;

bool GrGLInterface::validate() const {

    if (kNone_GrGLStandard == fStandard) {
        RETURN_FALSE_INTERFACE
    }

    if (!fExtensions.isInitialized()) {
        RETURN_FALSE_INTERFACE
    }

    // functions that are always required
    if (nullptr == fFunctions.fActiveTexture ||
        nullptr == fFunctions.fAttachShader ||
        nullptr == fFunctions.fBindAttribLocation ||
        nullptr == fFunctions.fBindBuffer ||
        nullptr == fFunctions.fBindTexture ||
        nullptr == fFunctions.fBlendColor ||      // -> GL >= 1.4 or extension, ES >= 2.0
        nullptr == fFunctions.fBlendEquation ||   // -> GL >= 1.4 or extension, ES >= 2.0
        nullptr == fFunctions.fBlendFunc ||
        nullptr == fFunctions.fBufferData ||
        nullptr == fFunctions.fBufferSubData ||
        nullptr == fFunctions.fClear ||
        nullptr == fFunctions.fClearColor ||
        nullptr == fFunctions.fClearStencil ||
        nullptr == fFunctions.fColorMask ||
        nullptr == fFunctions.fCompileShader ||
        nullptr == fFunctions.fCopyTexSubImage2D ||
        nullptr == fFunctions.fCreateProgram ||
        nullptr == fFunctions.fCreateShader ||
        nullptr == fFunctions.fCullFace ||
        nullptr == fFunctions.fDeleteBuffers ||
        nullptr == fFunctions.fDeleteProgram ||
        nullptr == fFunctions.fDeleteShader ||
        nullptr == fFunctions.fDeleteTextures ||
        nullptr == fFunctions.fDepthMask ||
        nullptr == fFunctions.fDisable ||
        nullptr == fFunctions.fDisableVertexAttribArray ||
        nullptr == fFunctions.fDrawArrays ||
        nullptr == fFunctions.fDrawElements ||
        nullptr == fFunctions.fEnable ||
        nullptr == fFunctions.fEnableVertexAttribArray ||
        nullptr == fFunctions.fFrontFace ||
        nullptr == fFunctions.fGenBuffers ||
        nullptr == fFunctions.fGenTextures ||
        nullptr == fFunctions.fGetBufferParameteriv ||
        nullptr == fFunctions.fGenerateMipmap ||
        nullptr == fFunctions.fGetError ||
        nullptr == fFunctions.fGetIntegerv ||
        nullptr == fFunctions.fGetProgramInfoLog ||
        nullptr == fFunctions.fGetProgramiv ||
        nullptr == fFunctions.fGetShaderInfoLog ||
        nullptr == fFunctions.fGetShaderiv ||
        nullptr == fFunctions.fGetString ||
        nullptr == fFunctions.fGetUniformLocation ||
#if 0 //  Not included in Chrome yet
        nullptr == fFunctions.fIsTexture ||
#endif
        nullptr == fFunctions.fLinkProgram ||
        nullptr == fFunctions.fLineWidth ||
        nullptr == fFunctions.fPixelStorei ||
        nullptr == fFunctions.fReadPixels ||
        nullptr == fFunctions.fScissor ||
        nullptr == fFunctions.fShaderSource ||
        nullptr == fFunctions.fStencilFunc ||
        nullptr == fFunctions.fStencilMask ||
        nullptr == fFunctions.fStencilOp ||
        nullptr == fFunctions.fTexImage2D ||
        nullptr == fFunctions.fTexParameteri ||
        nullptr == fFunctions.fTexParameteriv ||
        nullptr == fFunctions.fTexSubImage2D ||
        nullptr == fFunctions.fUniform1f ||
        nullptr == fFunctions.fUniform1i ||
        nullptr == fFunctions.fUniform1fv ||
        nullptr == fFunctions.fUniform1iv ||
        nullptr == fFunctions.fUniform2f ||
        nullptr == fFunctions.fUniform2i ||
        nullptr == fFunctions.fUniform2fv ||
        nullptr == fFunctions.fUniform2iv ||
        nullptr == fFunctions.fUniform3f ||
        nullptr == fFunctions.fUniform3i ||
        nullptr == fFunctions.fUniform3fv ||
        nullptr == fFunctions.fUniform3iv ||
        nullptr == fFunctions.fUniform4f ||
        nullptr == fFunctions.fUniform4i ||
        nullptr == fFunctions.fUniform4fv ||
        nullptr == fFunctions.fUniform4iv ||
        nullptr == fFunctions.fUniformMatrix2fv ||
        nullptr == fFunctions.fUniformMatrix3fv ||
        nullptr == fFunctions.fUniformMatrix4fv ||
        nullptr == fFunctions.fUseProgram ||
        nullptr == fFunctions.fVertexAttrib1f ||
        nullptr == fFunctions.fVertexAttrib2fv ||
        nullptr == fFunctions.fVertexAttrib3fv ||
        nullptr == fFunctions.fVertexAttrib4fv ||
        nullptr == fFunctions.fVertexAttribPointer ||
        nullptr == fFunctions.fViewport ||
        nullptr == fFunctions.fBindFramebuffer ||
        nullptr == fFunctions.fBindRenderbuffer ||
        nullptr == fFunctions.fCheckFramebufferStatus ||
        nullptr == fFunctions.fDeleteFramebuffers ||
        nullptr == fFunctions.fDeleteRenderbuffers ||
        nullptr == fFunctions.fFinish ||
        nullptr == fFunctions.fFlush ||
        nullptr == fFunctions.fFramebufferRenderbuffer ||
        nullptr == fFunctions.fFramebufferTexture2D ||
        nullptr == fFunctions.fGetFramebufferAttachmentParameteriv ||
        nullptr == fFunctions.fGetRenderbufferParameteriv ||
        nullptr == fFunctions.fGenFramebuffers ||
        nullptr == fFunctions.fGenRenderbuffers ||
        nullptr == fFunctions.fRenderbufferStorage) {
        RETURN_FALSE_INTERFACE
    }

    GrGLVersion glVer = GrGLGetVersion(this);
    if (GR_GL_INVALID_VER == glVer) {
        RETURN_FALSE_INTERFACE
    }

    // Now check that baseline ES/Desktop fns not covered above are present
    // and that we have fn pointers for any advertised fExtensions that we will
    // try to use.

    // these functions are part of ES2, we assume they are available
    // On the desktop we assume they are available if the extension
    // is present or GL version is high enough.
    if (kGLES_GrGLStandard == fStandard) {
        if (nullptr == fFunctions.fStencilFuncSeparate ||
            nullptr == fFunctions.fStencilMaskSeparate ||
            nullptr == fFunctions.fStencilOpSeparate) {
            RETURN_FALSE_INTERFACE
        }
    } else if (kGL_GrGLStandard == fStandard) {

        if (glVer >= GR_GL_VER(2,0)) {
            if (nullptr == fFunctions.fStencilFuncSeparate ||
                nullptr == fFunctions.fStencilMaskSeparate ||
                nullptr == fFunctions.fStencilOpSeparate ||
                nullptr == fFunctions.fPolygonMode) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(3,0) && nullptr == fFunctions.fBindFragDataLocation) {
            RETURN_FALSE_INTERFACE
        }
        if (glVer >= GR_GL_VER(2,0) || fExtensions.has("GL_ARB_draw_buffers")) {
            if (nullptr == fFunctions.fDrawBuffers) {
                RETURN_FALSE_INTERFACE
            }
        }

        if (glVer >= GR_GL_VER(1,5) || fExtensions.has("GL_ARB_occlusion_query")) {
            if (nullptr == fFunctions.fGenQueries ||
                nullptr == fFunctions.fDeleteQueries ||
                nullptr == fFunctions.fBeginQuery ||
                nullptr == fFunctions.fEndQuery ||
                nullptr == fFunctions.fGetQueryiv ||
                nullptr == fFunctions.fGetQueryObjectiv ||
                nullptr == fFunctions.fGetQueryObjectuiv) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(3,3) ||
            fExtensions.has("GL_ARB_timer_query") ||
            fExtensions.has("GL_EXT_timer_query")) {
            if (nullptr == fFunctions.fGetQueryObjecti64v ||
                nullptr == fFunctions.fGetQueryObjectui64v) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_timer_query")) {
            if (nullptr == fFunctions.fQueryCounter) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    // optional function on desktop before 1.3
    if (kGL_GrGLStandard != fStandard ||
        (glVer >= GR_GL_VER(1,3)) ||
        fExtensions.has("GL_ARB_texture_compression")) {
        if (nullptr == fFunctions.fCompressedTexImage2D
#if 0
            || nullptr == fFunctions.fCompressedTexSubImage2D
#endif
            ) {
            RETURN_FALSE_INTERFACE
        }
    }

    // part of desktop GL, but not ES
    if (kGL_GrGLStandard == fStandard &&
        (nullptr == fFunctions.fGetTexLevelParameteriv ||
         nullptr == fFunctions.fDrawBuffer ||
         nullptr == fFunctions.fReadBuffer)) {
        RETURN_FALSE_INTERFACE
    }

    // GL_EXT_texture_storage is part of desktop 4.2
    // There is a desktop ARB extension and an ES+desktop EXT extension
    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(4,2) ||
            fExtensions.has("GL_ARB_texture_storage") ||
            fExtensions.has("GL_EXT_texture_storage")) {
            if (nullptr == fFunctions.fTexStorage2D) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_texture_storage")) {
        if (nullptr == fFunctions.fTexStorage2D) {
            RETURN_FALSE_INTERFACE
        }
    }

    // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extensions.
    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(4,5) ||
            fExtensions.has("GL_ARB_texture_barrier") ||
            fExtensions.has("GL_NV_texture_barrier")) {
            if (nullptr == fFunctions.fTextureBarrier) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else if (fExtensions.has("GL_NV_texture_barrier")) {
        if (nullptr == fFunctions.fTextureBarrier) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (fExtensions.has("GL_KHR_blend_equation_advanced") ||
        fExtensions.has("GL_NV_blend_equation_advanced")) {
        if (nullptr == fFunctions.fBlendBarrier) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (fExtensions.has("GL_EXT_discard_framebuffer")) {
        if (nullptr == fFunctions.fDiscardFramebuffer) {
            RETURN_FALSE_INTERFACE
        }
    }

    // FBO MSAA
    if (kGL_GrGLStandard == fStandard) {
        // GL 3.0 and the ARB extension have multisample + blit
        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_ARB_framebuffer_object")) {
            if (nullptr == fFunctions.fRenderbufferStorageMultisample ||
                nullptr == fFunctions.fBlitFramebuffer) {
                RETURN_FALSE_INTERFACE
            }
        } else {
            if (fExtensions.has("GL_EXT_framebuffer_blit") &&
                nullptr == fFunctions.fBlitFramebuffer) {
                RETURN_FALSE_INTERFACE
            }
            if (fExtensions.has("GL_EXT_framebuffer_multisample") &&
                nullptr == fFunctions.fRenderbufferStorageMultisample) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else {
        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_CHROMIUM_framebuffer_multisample")) {
            if (nullptr == fFunctions.fRenderbufferStorageMultisample ||
                nullptr == fFunctions.fBlitFramebuffer) {
                RETURN_FALSE_INTERFACE
            }
        } else {
            if (fExtensions.has("GL_ANGLE_framebuffer_multisample") &&
                nullptr == fFunctions.fRenderbufferStorageMultisample) {
                RETURN_FALSE_INTERFACE
            }
            if (fExtensions.has("GL_ANGLE_framebuffer_blit") &&
                nullptr == fFunctions.fBlitFramebuffer) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (fExtensions.has("GL_APPLE_framebuffer_multisample")) {
            if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2APPLE ||
                nullptr == fFunctions.fResolveMultisampleFramebuffer) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (fExtensions.has("GL_IMG_multisampled_render_to_texture") ||
            fExtensions.has("GL_EXT_multisampled_render_to_texture")) {
            if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2EXT ||
                nullptr == fFunctions.fFramebufferTexture2DMultisample) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    // On ES buffer mapping is an extension. On Desktop
    // buffer mapping was part of original VBO extension
    // which we require.
    if (kGL_GrGLStandard == fStandard || fExtensions.has("GL_OES_mapbuffer")) {
        if (nullptr == fFunctions.fMapBuffer ||
            nullptr == fFunctions.fUnmapBuffer) {
            RETURN_FALSE_INTERFACE
        }
    }

    // Dual source blending
    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_blend_func_extended")) {
            if (nullptr == fFunctions.fBindFragDataLocationIndexed) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else {
        if (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended")) {
            if (nullptr == fFunctions.fBindFragDataLocation ||
                nullptr == fFunctions.fBindFragDataLocationIndexed) {
                RETURN_FALSE_INTERFACE
            }
        }
    }


    // glGetStringi was added in version 3.0 of both desktop and ES.
    if (glVer >= GR_GL_VER(3, 0)) {
        if (nullptr == fFunctions.fGetStringi) {
            RETURN_FALSE_INTERFACE
        }
    }

    // glVertexAttribIPointer was added in version 3.0 of both desktop and ES.
    if (glVer >= GR_GL_VER(3, 0)) {
        if (NULL == fFunctions.fVertexAttribIPointer) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3,1)) {
            if (nullptr == fFunctions.fTexBuffer) {
                RETURN_FALSE_INTERFACE;
            }
        }
        if (glVer >= GR_GL_VER(4,3)) {
            if (nullptr == fFunctions.fTexBufferRange) {
                RETURN_FALSE_INTERFACE;
            }
        }
    } else {
        if (glVer >= GR_GL_VER(3,2) || fExtensions.has("GL_OES_texture_buffer") ||
            fExtensions.has("GL_EXT_texture_buffer")) {
            if (nullptr == fFunctions.fTexBuffer ||
                nullptr == fFunctions.fTexBufferRange) {
                RETURN_FALSE_INTERFACE;
            }
        }
    }

    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3, 0) || fExtensions.has("GL_ARB_vertex_array_object")) {
            if (nullptr == fFunctions.fBindVertexArray ||
                nullptr == fFunctions.fDeleteVertexArrays ||
                nullptr == fFunctions.fGenVertexArrays) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else {
        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_OES_vertex_array_object")) {
            if (nullptr == fFunctions.fBindVertexArray ||
                nullptr == fFunctions.fDeleteVertexArrays ||
                nullptr == fFunctions.fGenVertexArrays) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    if (fExtensions.has("GL_EXT_debug_marker")) {
        if (nullptr == fFunctions.fInsertEventMarker ||
            nullptr == fFunctions.fPushGroupMarker ||
            nullptr == fFunctions.fPopGroupMarker) {
            RETURN_FALSE_INTERFACE
        }
    }

    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
        fExtensions.has("GL_ARB_invalidate_subdata")) {
        if (nullptr == fFunctions.fInvalidateBufferData ||
            nullptr == fFunctions.fInvalidateBufferSubData ||
            nullptr == fFunctions.fInvalidateFramebuffer ||
            nullptr == fFunctions.fInvalidateSubFramebuffer ||
            nullptr == fFunctions.fInvalidateTexImage ||
            nullptr == fFunctions.fInvalidateTexSubImage) {
            RETURN_FALSE_INTERFACE;
        }
    } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) {
        // ES 3.0 adds the framebuffer functions but not the others.
        if (nullptr == fFunctions.fInvalidateFramebuffer ||
            nullptr == fFunctions.fInvalidateSubFramebuffer) {
            RETURN_FALSE_INTERFACE;
        }
    }

    if (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_CHROMIUM_map_sub")) {
        if (nullptr == fFunctions.fMapBufferSubData ||
            nullptr == fFunctions.fMapTexSubImage2D ||
            nullptr == fFunctions.fUnmapBufferSubData ||
            nullptr == fFunctions.fUnmapTexSubImage2D) {
            RETURN_FALSE_INTERFACE;
        }
    }

    // These functions are added to the 3.0 version of both GLES and GL.
    if (glVer >= GR_GL_VER(3,0) ||
        (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_map_buffer_range")) ||
        (kGL_GrGLStandard == fStandard && fExtensions.has("GL_ARB_map_buffer_range"))) {
        if (nullptr == fFunctions.fMapBufferRange ||
            nullptr == fFunctions.fFlushMappedBufferRange) {
            RETURN_FALSE_INTERFACE;
        }
    }

    if ((kGL_GrGLStandard == fStandard &&
         (glVer >= GR_GL_VER(3,2) || fExtensions.has("GL_ARB_texture_multisample"))) ||
        (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) {
        if (NULL == fFunctions.fGetMultisamplefv) {
            RETURN_FALSE_INTERFACE
        }
    }

    if ((kGL_GrGLStandard == fStandard &&
         (glVer >= GR_GL_VER(4,3) || fExtensions.has("GL_ARB_program_interface_query"))) ||
        (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) {
        if (nullptr == fFunctions.fGetProgramResourceLocation) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (kGLES_GrGLStandard == fStandard || glVer >= GR_GL_VER(4,1) ||
        fExtensions.has("GL_ARB_ES2_compatibility")) {
        if (nullptr == fFunctions.fGetShaderPrecisionFormat) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (fExtensions.has("GL_NV_path_rendering") || fExtensions.has("GL_CHROMIUM_path_rendering")) {
        if (nullptr == fFunctions.fMatrixLoadf ||
            nullptr == fFunctions.fMatrixLoadIdentity ||
            nullptr == fFunctions.fPathCommands ||
            nullptr == fFunctions.fPathParameteri ||
            nullptr == fFunctions.fPathParameterf ||
            nullptr == fFunctions.fGenPaths ||
            nullptr == fFunctions.fDeletePaths ||
            nullptr == fFunctions.fIsPath ||
            nullptr == fFunctions.fPathStencilFunc ||
            nullptr == fFunctions.fStencilFillPath ||
            nullptr == fFunctions.fStencilStrokePath ||
            nullptr == fFunctions.fStencilFillPathInstanced ||
            nullptr == fFunctions.fStencilStrokePathInstanced ||
            nullptr == fFunctions.fCoverFillPath ||
            nullptr == fFunctions.fCoverStrokePath ||
            nullptr == fFunctions.fCoverFillPathInstanced ||
            nullptr == fFunctions.fCoverStrokePathInstanced
#if 0
            // List of functions that Skia uses, but which have been added since the initial release
            // of NV_path_rendering driver. We do not want to fail interface validation due to
            // missing features, we will just not use the extension.
            // Update this list -> update GrGLCaps::hasPathRenderingSupport too.
            || nullptr == fFunctions.fStencilThenCoverFillPath ||
            nullptr == fFunctions.fStencilThenCoverStrokePath ||
            nullptr == fFunctions.fStencilThenCoverFillPathInstanced ||
            nullptr == fFunctions.fStencilThenCoverStrokePathInstanced ||
            nullptr == fFunctions.fProgramPathFragmentInputGen
#endif
            ) {
            RETURN_FALSE_INTERFACE
        }
        if (fExtensions.has("GL_CHROMIUM_path_rendering")) {
            if (nullptr == fFunctions.fBindFragmentInputLocation) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    if (fExtensions.has("GL_EXT_raster_multisample")) {
        if (nullptr == fFunctions.fRasterSamples) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (fExtensions.has("GL_NV_framebuffer_mixed_samples") ||
        fExtensions.has("GL_CHROMIUM_framebuffer_mixed_samples")) {
        if (nullptr == fFunctions.fCoverageModulation) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3,1) ||
            fExtensions.has("GL_EXT_draw_instanced") || fExtensions.has("GL_ARB_draw_instanced")) {
            if (nullptr == fFunctions.fDrawArraysInstanced ||
                nullptr == fFunctions.fDrawElementsInstanced) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else if (kGLES_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_draw_instanced")) {
            if (nullptr == fFunctions.fDrawArraysInstanced ||
                nullptr == fFunctions.fDrawElementsInstanced) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3,2) || fExtensions.has("GL_ARB_instanced_arrays")) {
            if (nullptr == fFunctions.fVertexAttribDivisor) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else if (kGLES_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_instanced_arrays")) {
            if (nullptr == fFunctions.fVertexAttribDivisor) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    if ((kGL_GrGLStandard == fStandard &&
         (glVer >= GR_GL_VER(4,0) || fExtensions.has("GL_ARB_draw_indirect"))) ||
        (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) {
        if (NULL == fFunctions.fDrawArraysIndirect ||
            NULL == fFunctions.fDrawElementsIndirect) {
            RETURN_FALSE_INTERFACE
        }
    }

    if ((kGL_GrGLStandard == fStandard &&
         (glVer >= GR_GL_VER(4,3) || fExtensions.has("GL_ARB_multi_draw_indirect"))) ||
        (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_multi_draw_indirect"))) {
        if (NULL == fFunctions.fMultiDrawArraysIndirect ||
            NULL == fFunctions.fMultiDrawElementsIndirect) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (fExtensions.has("GL_NV_bindless_texture")) {
        if (nullptr == fFunctions.fGetTextureHandle ||
            nullptr == fFunctions.fGetTextureSamplerHandle ||
            nullptr == fFunctions.fMakeTextureHandleResident ||
            nullptr == fFunctions.fMakeTextureHandleNonResident ||
            nullptr == fFunctions.fGetImageHandle ||
            nullptr == fFunctions.fMakeImageHandleResident ||
            nullptr == fFunctions.fMakeImageHandleNonResident ||
            nullptr == fFunctions.fIsTextureHandleResident ||
            nullptr == fFunctions.fIsImageHandleResident ||
            nullptr == fFunctions.fUniformHandleui64 ||
            nullptr == fFunctions.fUniformHandleui64v ||
            nullptr == fFunctions.fProgramUniformHandleui64 ||
            nullptr == fFunctions.fProgramUniformHandleui64v) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (kGL_GrGLStandard == fStandard && fExtensions.has("GL_EXT_direct_state_access")) {
        if (nullptr == fFunctions.fTextureParameteri ||
            nullptr == fFunctions.fTextureParameteriv ||
            nullptr == fFunctions.fTextureParameterf ||
            nullptr == fFunctions.fTextureParameterfv ||
            nullptr == fFunctions.fTextureImage1D ||
            nullptr == fFunctions.fTextureImage2D ||
            nullptr == fFunctions.fTextureSubImage1D ||
            nullptr == fFunctions.fTextureSubImage2D ||
            nullptr == fFunctions.fCopyTextureImage1D ||
            nullptr == fFunctions.fCopyTextureImage2D ||
            nullptr == fFunctions.fCopyTextureSubImage1D ||
            nullptr == fFunctions.fCopyTextureSubImage2D ||
            nullptr == fFunctions.fGetTextureImage ||
            nullptr == fFunctions.fGetTextureParameterfv ||
            nullptr == fFunctions.fGetTextureParameteriv ||
            nullptr == fFunctions.fGetTextureLevelParameterfv ||
            nullptr == fFunctions.fGetTextureLevelParameteriv) {
            RETURN_FALSE_INTERFACE
        }
        if (glVer >= GR_GL_VER(1,2)) {
            if (nullptr == fFunctions.fTextureImage3D ||
                nullptr == fFunctions.fTextureSubImage3D ||
                nullptr == fFunctions.fCopyTextureSubImage3D ||
                nullptr == fFunctions.fCompressedTextureImage3D ||
                nullptr == fFunctions.fCompressedTextureImage2D ||
                nullptr == fFunctions.fCompressedTextureImage1D ||
                nullptr == fFunctions.fCompressedTextureSubImage3D ||
                nullptr == fFunctions.fCompressedTextureSubImage2D ||
                nullptr == fFunctions.fCompressedTextureSubImage1D ||
                nullptr == fFunctions.fGetCompressedTextureImage) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(1,5)) {
            if (nullptr == fFunctions.fNamedBufferData ||
                nullptr == fFunctions.fNamedBufferSubData ||
                nullptr == fFunctions.fMapNamedBuffer ||
                nullptr == fFunctions.fUnmapNamedBuffer ||
                nullptr == fFunctions.fGetNamedBufferParameteriv ||
                nullptr == fFunctions.fGetNamedBufferPointerv ||
                nullptr == fFunctions.fGetNamedBufferSubData) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(2,0)) {
            if (nullptr == fFunctions.fProgramUniform1f ||
                nullptr == fFunctions.fProgramUniform2f ||
                nullptr == fFunctions.fProgramUniform3f ||
                nullptr == fFunctions.fProgramUniform4f ||
                nullptr == fFunctions.fProgramUniform1i ||
                nullptr == fFunctions.fProgramUniform2i ||
                nullptr == fFunctions.fProgramUniform3i ||
                nullptr == fFunctions.fProgramUniform4i ||
                nullptr == fFunctions.fProgramUniform1fv ||
                nullptr == fFunctions.fProgramUniform2fv ||
                nullptr == fFunctions.fProgramUniform3fv ||
                nullptr == fFunctions.fProgramUniform4fv ||
                nullptr == fFunctions.fProgramUniform1iv ||
                nullptr == fFunctions.fProgramUniform2iv ||
                nullptr == fFunctions.fProgramUniform3iv ||
                nullptr == fFunctions.fProgramUniform4iv ||
                nullptr == fFunctions.fProgramUniformMatrix2fv ||
                nullptr == fFunctions.fProgramUniformMatrix3fv ||
                nullptr == fFunctions.fProgramUniformMatrix4fv) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(2,1)) {
            if (nullptr == fFunctions.fProgramUniformMatrix2x3fv ||
                nullptr == fFunctions.fProgramUniformMatrix3x2fv ||
                nullptr == fFunctions.fProgramUniformMatrix2x4fv ||
                nullptr == fFunctions.fProgramUniformMatrix4x2fv ||
                nullptr == fFunctions.fProgramUniformMatrix3x4fv ||
                nullptr == fFunctions.fProgramUniformMatrix4x3fv) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(3,0)) {
            if (nullptr == fFunctions.fNamedRenderbufferStorage ||
                nullptr == fFunctions.fGetNamedRenderbufferParameteriv ||
                nullptr == fFunctions.fNamedRenderbufferStorageMultisample ||
                nullptr == fFunctions.fCheckNamedFramebufferStatus ||
                nullptr == fFunctions.fNamedFramebufferTexture1D ||
                nullptr == fFunctions.fNamedFramebufferTexture2D ||
                nullptr == fFunctions.fNamedFramebufferTexture3D ||
                nullptr == fFunctions.fNamedFramebufferRenderbuffer ||
                nullptr == fFunctions.fGetNamedFramebufferAttachmentParameteriv ||
                nullptr == fFunctions.fGenerateTextureMipmap ||
                nullptr == fFunctions.fFramebufferDrawBuffer ||
                nullptr == fFunctions.fFramebufferDrawBuffers ||
                nullptr == fFunctions.fFramebufferReadBuffer ||
                nullptr == fFunctions.fGetFramebufferParameteriv ||
                nullptr == fFunctions.fNamedCopyBufferSubData ||
                nullptr == fFunctions.fVertexArrayVertexOffset ||
                nullptr == fFunctions.fVertexArrayColorOffset ||
                nullptr == fFunctions.fVertexArrayEdgeFlagOffset ||
                nullptr == fFunctions.fVertexArrayIndexOffset ||
                nullptr == fFunctions.fVertexArrayNormalOffset ||
                nullptr == fFunctions.fVertexArrayTexCoordOffset ||
                nullptr == fFunctions.fVertexArrayMultiTexCoordOffset ||
                nullptr == fFunctions.fVertexArrayFogCoordOffset ||
                nullptr == fFunctions.fVertexArraySecondaryColorOffset ||
                nullptr == fFunctions.fVertexArrayVertexAttribOffset ||
                nullptr == fFunctions.fVertexArrayVertexAttribIOffset ||
                nullptr == fFunctions.fEnableVertexArray ||
                nullptr == fFunctions.fDisableVertexArray ||
                nullptr == fFunctions.fEnableVertexArrayAttrib ||
                nullptr == fFunctions.fDisableVertexArrayAttrib ||
                nullptr == fFunctions.fGetVertexArrayIntegerv ||
                nullptr == fFunctions.fGetVertexArrayPointerv ||
                nullptr == fFunctions.fGetVertexArrayIntegeri_v ||
                nullptr == fFunctions.fGetVertexArrayPointeri_v ||
                nullptr == fFunctions.fMapNamedBufferRange ||
                nullptr == fFunctions.fFlushMappedNamedBufferRange) {
                RETURN_FALSE_INTERFACE
            }
        }
        if (glVer >= GR_GL_VER(3,1)) {
            if (nullptr == fFunctions.fTextureBuffer) {
                RETURN_FALSE_INTERFACE;
            }
        }
    }

    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
        fExtensions.has("GL_KHR_debug")) {
        if (nullptr == fFunctions.fDebugMessageControl ||
            nullptr == fFunctions.fDebugMessageInsert ||
            nullptr == fFunctions.fDebugMessageCallback ||
            nullptr == fFunctions.fGetDebugMessageLog ||
            nullptr == fFunctions.fPushDebugGroup ||
            nullptr == fFunctions.fPopDebugGroup ||
            nullptr == fFunctions.fObjectLabel) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (fExtensions.has("GL_EXT_window_rectangles")) {
        if (nullptr == fFunctions.fWindowRectangles) {
            RETURN_FALSE_INTERFACE
        }
    }

    if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,0)) ||
        fExtensions.has("GL_ARB_sample_shading")) {
        if (nullptr == fFunctions.fMinSampleShading) {
            RETURN_FALSE_INTERFACE
        }
    } else if (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_OES_sample_shading")) {
        if (nullptr == fFunctions.fMinSampleShading) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3, 2) || fExtensions.has("GL_ARB_sync")) {
            if (nullptr == fFunctions.fFenceSync ||
                nullptr == fFunctions.fClientWaitSync ||
                nullptr == fFunctions.fWaitSync ||
                nullptr == fFunctions.fDeleteSync) {
                RETURN_FALSE_INTERFACE
            }
        }
    } else if (kGLES_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(3, 0)) {
            if (nullptr == fFunctions.fFenceSync ||
                nullptr == fFunctions.fClientWaitSync ||
                nullptr == fFunctions.fWaitSync ||
                nullptr == fFunctions.fDeleteSync) {
                RETURN_FALSE_INTERFACE
            }
        }
    }

    if (fExtensions.has("EGL_KHR_image") || fExtensions.has("EGL_KHR_image_base")) {
        if (nullptr == fFunctions.fEGLCreateImage ||
            nullptr == fFunctions.fEGLDestroyImage) {
            RETURN_FALSE_INTERFACE
        }
    }

    if (kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(2,0)) {
        if (nullptr == fFunctions.fDrawRangeElements) {
            RETURN_FALSE_INTERFACE;
        }
    } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) {
        if (nullptr == fFunctions.fDrawRangeElements) {
            RETURN_FALSE_INTERFACE;
        }
    }

    if (kGL_GrGLStandard == fStandard) {
        if (glVer >= GR_GL_VER(4,2) || fExtensions.has("GL_ARB_shader_image_load_store")) {
            if (nullptr == fFunctions.fBindImageTexture ||
                nullptr == fFunctions.fMemoryBarrier) {
                RETURN_FALSE_INTERFACE;
            }
        }
        if (glVer >= GR_GL_VER(4,5) || fExtensions.has("GL_ARB_ES3_1_compatibility")) {
            if (nullptr == fFunctions.fMemoryBarrierByRegion) {
                RETURN_FALSE_INTERFACE;
            }
        }
    } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1)) {
        if (nullptr == fFunctions.fBindImageTexture ||
            nullptr == fFunctions.fMemoryBarrier ||
            nullptr == fFunctions.fMemoryBarrierByRegion) {
            RETURN_FALSE_INTERFACE;
        }
    }

    return true;
}
