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

/* This file is meant to be included "inline" the implementation that is using the function.
 * The platform native GL implementation header file should be included before this file.
 * Following macros should be defined before this file is included:
 * GET_PROC and GET_PROC_SUFFIX
 *   Call the get function and assign to the interface instance
 * GET_PROC_LOCAL
 *   Call the get function and assign to a local variable
 * GET_LINKED and GET_LINKED_SUFFIX
 *   Get the link-time address of the function and assign it to the interface instance. If
 *   using the linked addresses is not intended, can be the same as GET_PROC.
 */

/**
 * Generic function for creating a GrGLInterface for an OpenGL ES (but not Open GL) context. It
 * calls get() to get each function address. ctx is a generic ptr passed to and interpreted by
 * get().
 */
static const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) {
    const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION));
    GrGLVersion version = GrGLGetVersionFromString(verStr);

    if (version < GR_GL_VER(2,0)) {
        return NULL;
    }

    GET_PROC_LOCAL(GetIntegerv);
    GET_PROC_LOCAL(GetStringi);
    GrGLExtensions extensions;
    if (!extensions.init(kGLES_GrGLStandard, glGetString, GetStringi, GetIntegerv)) {
        return NULL;
    }

    GrGLInterface* interface = SkNEW(GrGLInterface);
    GrGLInterface::Functions* functions = &interface->fFunctions;

    GET_LINKED(ActiveTexture);
    GET_LINKED(AttachShader);
    GET_LINKED(BindAttribLocation);
    GET_LINKED(BindBuffer);
    GET_LINKED(BindTexture);
    GET_LINKED_SUFFIX(BindVertexArray, OES);
    GET_LINKED(BlendColor);
    GET_LINKED(BlendFunc);
    GET_LINKED(BufferData);
    GET_LINKED(BufferSubData);
    GET_LINKED(Clear);
    GET_LINKED(ClearColor);
    GET_LINKED(ClearStencil);
    GET_LINKED(ColorMask);
    GET_LINKED(CompileShader);
    GET_LINKED(CompressedTexImage2D);
    GET_LINKED(CompressedTexSubImage2D);
    GET_LINKED(CopyTexSubImage2D);
    GET_LINKED(CreateProgram);
    GET_LINKED(CreateShader);
    GET_LINKED(CullFace);
    GET_LINKED(DeleteBuffers);
    GET_LINKED(DeleteProgram);
    GET_LINKED(DeleteShader);
    GET_LINKED(DeleteTextures);
    GET_LINKED_SUFFIX(DeleteVertexArrays, OES);
    GET_LINKED(DepthMask);
    GET_LINKED(Disable);
    GET_LINKED(DisableVertexAttribArray);
    GET_LINKED(DrawArrays);
    GET_LINKED(DrawElements);
    GET_LINKED(Enable);
    GET_LINKED(EnableVertexAttribArray);
    GET_LINKED(Finish);
    GET_LINKED(Flush);
    GET_LINKED(FrontFace);
    GET_LINKED(GenBuffers);
    GET_LINKED(GenerateMipmap);
    GET_LINKED(GenTextures);
    GET_LINKED_SUFFIX(GenVertexArrays, OES);
    GET_LINKED(GetBufferParameteriv);
    GET_LINKED(GetError);
    GET_LINKED(GetIntegerv);
    GET_LINKED(GetProgramInfoLog);
    GET_LINKED(GetProgramiv);
    GET_LINKED(GetShaderInfoLog);
    GET_LINKED(GetShaderiv);
    GET_LINKED(GetString);
#if GL_ES_VERSION_3_0
    GET_LINKED(GetStringi);
#else
    GET_PROC(GetStringi);
#endif
    GET_LINKED(GetUniformLocation);
    GET_LINKED(LineWidth);
    GET_LINKED(LinkProgram);
    GET_LINKED(PixelStorei);
    GET_LINKED(ReadPixels);
    GET_LINKED(Scissor);
#if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE
    functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource;
#else
    GET_LINKED(ShaderSource);
#endif
    GET_LINKED(StencilFunc);
    GET_LINKED(StencilFuncSeparate);
    GET_LINKED(StencilMask);
    GET_LINKED(StencilMaskSeparate);
    GET_LINKED(StencilOp);
    GET_LINKED(StencilOpSeparate);
    GET_LINKED(TexImage2D);
    GET_LINKED(TexParameteri);
    GET_LINKED(TexParameteriv);
    GET_LINKED(TexSubImage2D);

    if (version >= GR_GL_VER(3,0)) {
#if GL_ES_VERSION_3_0
        GET_LINKED(TexStorage2D);
#else
        GET_PROC(TexStorage2D);
#endif
    } else {
#if GL_EXT_texture_storage
        GET_LINKED_SUFFIX(TexStorage2D, EXT);
#else
        GET_PROC_SUFFIX(TexStorage2D, EXT);
#endif
    }

#if GL_EXT_discard_framebuffer
    GET_LINKED_SUFFIX(DiscardFramebuffer, EXT);
#endif
    GET_LINKED(Uniform1f);
    GET_LINKED(Uniform1i);
    GET_LINKED(Uniform1fv);
    GET_LINKED(Uniform1iv);
    GET_LINKED(Uniform2f);
    GET_LINKED(Uniform2i);
    GET_LINKED(Uniform2fv);
    GET_LINKED(Uniform2iv);
    GET_LINKED(Uniform3f);
    GET_LINKED(Uniform3i);
    GET_LINKED(Uniform3fv);
    GET_LINKED(Uniform3iv);
    GET_LINKED(Uniform4f);
    GET_LINKED(Uniform4i);
    GET_LINKED(Uniform4fv);
    GET_LINKED(Uniform4iv);
    GET_LINKED(UniformMatrix2fv);
    GET_LINKED(UniformMatrix3fv);
    GET_LINKED(UniformMatrix4fv);
    GET_LINKED(UseProgram);
    GET_LINKED(VertexAttrib4fv);
    GET_LINKED(VertexAttribPointer);
    GET_LINKED(Viewport);
    GET_LINKED(BindFramebuffer);
    GET_LINKED(BindRenderbuffer);
    GET_LINKED(CheckFramebufferStatus);
    GET_LINKED(DeleteFramebuffers);
    GET_LINKED(DeleteRenderbuffers);
    GET_LINKED(FramebufferRenderbuffer);
    GET_LINKED(FramebufferTexture2D);

    if (version >= GR_GL_VER(3,0)) {
#if GL_ES_VERSION_3_0
        GET_LINKED(RenderbufferStorageMultisample);
        GET_LINKED(BlitFramebuffer);
#else
        GET_PROC(RenderbufferStorageMultisample);
        GET_PROC(BlitFramebuffer);
#endif
    }

    if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
#if GL_EXT_multisampled_render_to_texture
        GET_LINKED_SUFFIX(FramebufferTexture2DMultisample, EXT);
        functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT;
#else
        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, EXT);
        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleEXT");
#endif
    } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
#if GL_IMG_multisampled_render_to_texture
        GET_LINKED_SUFFIX(FramebufferTexture2DMultisample, IMG);
        functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG;
#else
        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, IMG);
        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleIMG");
#endif
    }

    GET_LINKED(GenFramebuffers);
    GET_LINKED(GenRenderbuffers);
    GET_LINKED(GetFramebufferAttachmentParameteriv);
    GET_LINKED(GetRenderbufferParameteriv);
    GET_LINKED(RenderbufferStorage);

#if GL_OES_mapbuffer
    GET_LINKED_SUFFIX(MapBuffer, OES);
    GET_LINKED_SUFFIX(UnmapBuffer, OES);
#else
    GET_PROC_SUFFIX(MapBuffer, OES);
    GET_PROC_SUFFIX(UnmapBuffer, OES);
#endif

    if (version >= GR_GL_VER(3,0)) {
#if GL_ES_VERSION_3_0
        GET_LINKED(MapBufferRange);
        GET_LINKED(FlushMappedBufferRange);
#else
        GET_PROC(MapBufferRange);
        GET_PROC(FlushMappedBufferRange);
#endif
    } else if (extensions.has("GL_EXT_map_buffer_range")) {
#if GL_EXT_map_buffer_range
        GET_LINKED_SUFFIX(MapBufferRange, EXT);
        GET_LINKED_SUFFIX(FlushMappedBufferRange, EXT);
#else
        GET_PROC_SUFFIX(MapBufferRange, EXT);
        GET_PROC_SUFFIX(FlushMappedBufferRange, EXT);
#endif
    }

    if (extensions.has("GL_EXT_debug_marker")) {
        GET_PROC(InsertEventMarker);
        GET_PROC(PushGroupMarker);
        GET_PROC(PopGroupMarker);
        // The below check is here because a device has been found that has the extension string but
        // returns NULL from the eglGetProcAddress for the functions
        if (NULL == functions->fInsertEventMarker ||
            NULL == functions->fPushGroupMarker ||
            NULL == functions->fPopGroupMarker) {
            extensions.remove("GL_EXT_debug_marker");
        }
    }

#if GL_ES_VERSION_3_0
    GET_LINKED(InvalidateFramebuffer);
    GET_LINKED(InvalidateSubFramebuffer);
#else
    GET_PROC(InvalidateFramebuffer);
    GET_PROC(InvalidateSubFramebuffer);
#endif
    GET_PROC(InvalidateBufferData);
    GET_PROC(InvalidateBufferSubData);
    GET_PROC(InvalidateTexImage);
    GET_PROC(InvalidateTexSubImage);

#if GL_ES_VERSION_3_1
    GET_LINKED(GetProgramResourceLocation);
#else
    if (version >= GR_GL_VER(3,1)) {
        GET_PROC(GetProgramResourceLocation);
    }
#endif

    if (extensions.has("GL_NV_path_rendering")) {
        GET_PROC_SUFFIX(MatrixLoadf, EXT);
        GET_PROC_SUFFIX(MatrixLoadIdentity, EXT);
        GET_PROC_SUFFIX(PathCommands, NV);
        GET_PROC_SUFFIX(PathCoords, NV);
        GET_PROC_SUFFIX(PathParameteri, NV);
        GET_PROC_SUFFIX(PathParameterf, NV);
        GET_PROC_SUFFIX(GenPaths, NV);
        GET_PROC_SUFFIX(DeletePaths, NV);
        GET_PROC_SUFFIX(IsPath, NV);
        GET_PROC_SUFFIX(PathStencilFunc, NV);
        GET_PROC_SUFFIX(StencilFillPath, NV);
        GET_PROC_SUFFIX(StencilStrokePath, NV);
        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
        GET_PROC_SUFFIX(CoverFillPath, NV);
        GET_PROC_SUFFIX(CoverStrokePath, NV);
        GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
        GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
        GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
    }

    interface->fStandard = kGLES_GrGLStandard;
    interface->fExtensions.swap(&extensions);

    return interface;
}
