// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <EGL/egl.h>
#include <GLES2/gl2.h>

#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
#include "third_party/skia/src/gpu/gl/GrGLUtil.h"

#define REGISTER_GL_FUNCTION(F)                   \
                                                  \
  if (0 == strcmp("gl" #F, name)) {               \
    return reinterpret_cast<GrGLFuncPtr>(&gl##F); \
  }

GrGLFuncPtr GetGLProc(void* ctx, const char name[]) {
  SkASSERT(NULL == ctx);

  // Make non-extension GL function addresses available without having
  // to go through eglGetProcAddress() if possible.
  REGISTER_GL_FUNCTION(ActiveTexture);
  REGISTER_GL_FUNCTION(AttachShader);
  REGISTER_GL_FUNCTION(BindAttribLocation);
  REGISTER_GL_FUNCTION(BindBuffer);
  REGISTER_GL_FUNCTION(BindTexture);
  REGISTER_GL_FUNCTION(BlendColor);
  REGISTER_GL_FUNCTION(BlendEquation);
  REGISTER_GL_FUNCTION(BlendFunc);
  REGISTER_GL_FUNCTION(BufferData);
  REGISTER_GL_FUNCTION(BufferSubData);
  REGISTER_GL_FUNCTION(Clear);
  REGISTER_GL_FUNCTION(ClearColor);
  REGISTER_GL_FUNCTION(ClearStencil);
  REGISTER_GL_FUNCTION(ColorMask);
  REGISTER_GL_FUNCTION(CompileShader);
  REGISTER_GL_FUNCTION(CompressedTexImage2D);
  REGISTER_GL_FUNCTION(CompressedTexSubImage2D);
  REGISTER_GL_FUNCTION(CopyTexSubImage2D);
  REGISTER_GL_FUNCTION(CreateProgram);
  REGISTER_GL_FUNCTION(CreateShader);
  REGISTER_GL_FUNCTION(CullFace);
  REGISTER_GL_FUNCTION(DeleteBuffers);
  REGISTER_GL_FUNCTION(DeleteProgram);
  REGISTER_GL_FUNCTION(DeleteShader);
  REGISTER_GL_FUNCTION(DeleteTextures);
  REGISTER_GL_FUNCTION(DepthMask);
  REGISTER_GL_FUNCTION(Disable);
  REGISTER_GL_FUNCTION(DisableVertexAttribArray);
  REGISTER_GL_FUNCTION(DrawArrays);
  REGISTER_GL_FUNCTION(DrawElements);
  REGISTER_GL_FUNCTION(Enable);
  REGISTER_GL_FUNCTION(EnableVertexAttribArray);
  REGISTER_GL_FUNCTION(FrontFace);
  REGISTER_GL_FUNCTION(GenBuffers);
  REGISTER_GL_FUNCTION(GenTextures);
  REGISTER_GL_FUNCTION(GetBufferParameteriv);
  REGISTER_GL_FUNCTION(GenerateMipmap);
  REGISTER_GL_FUNCTION(GetError);
  REGISTER_GL_FUNCTION(GetIntegerv);
  REGISTER_GL_FUNCTION(GetProgramInfoLog);
  REGISTER_GL_FUNCTION(GetProgramiv);
  REGISTER_GL_FUNCTION(GetShaderInfoLog);
  REGISTER_GL_FUNCTION(GetShaderiv);
  REGISTER_GL_FUNCTION(GetString);
  REGISTER_GL_FUNCTION(GetUniformLocation);
  REGISTER_GL_FUNCTION(IsTexture);
  REGISTER_GL_FUNCTION(LinkProgram);
  REGISTER_GL_FUNCTION(LineWidth);
  REGISTER_GL_FUNCTION(PixelStorei);
  REGISTER_GL_FUNCTION(ReadPixels);
  REGISTER_GL_FUNCTION(Scissor);
  REGISTER_GL_FUNCTION(ShaderSource);
  REGISTER_GL_FUNCTION(StencilFunc);
  REGISTER_GL_FUNCTION(StencilFuncSeparate);
  REGISTER_GL_FUNCTION(StencilMask);
  REGISTER_GL_FUNCTION(StencilMaskSeparate);
  REGISTER_GL_FUNCTION(StencilOp);
  REGISTER_GL_FUNCTION(StencilOpSeparate);
  REGISTER_GL_FUNCTION(TexImage2D);
  REGISTER_GL_FUNCTION(TexParameteri);
  REGISTER_GL_FUNCTION(TexParameteriv);
  REGISTER_GL_FUNCTION(TexSubImage2D);
  REGISTER_GL_FUNCTION(Uniform1f);
  REGISTER_GL_FUNCTION(Uniform1i);
  REGISTER_GL_FUNCTION(Uniform1fv);
  REGISTER_GL_FUNCTION(Uniform1iv);
  REGISTER_GL_FUNCTION(Uniform2f);
  REGISTER_GL_FUNCTION(Uniform2i);
  REGISTER_GL_FUNCTION(Uniform2fv);
  REGISTER_GL_FUNCTION(Uniform2iv);
  REGISTER_GL_FUNCTION(Uniform3f);
  REGISTER_GL_FUNCTION(Uniform3i);
  REGISTER_GL_FUNCTION(Uniform3fv);
  REGISTER_GL_FUNCTION(Uniform3iv);
  REGISTER_GL_FUNCTION(Uniform4f);
  REGISTER_GL_FUNCTION(Uniform4i);
  REGISTER_GL_FUNCTION(Uniform4fv);
  REGISTER_GL_FUNCTION(Uniform4iv);
  REGISTER_GL_FUNCTION(UniformMatrix2fv);
  REGISTER_GL_FUNCTION(UniformMatrix3fv);
  REGISTER_GL_FUNCTION(UniformMatrix4fv);
  REGISTER_GL_FUNCTION(UseProgram);
  REGISTER_GL_FUNCTION(VertexAttrib1f);
  REGISTER_GL_FUNCTION(VertexAttrib2fv);
  REGISTER_GL_FUNCTION(VertexAttrib3fv);
  REGISTER_GL_FUNCTION(VertexAttrib4fv);
  REGISTER_GL_FUNCTION(VertexAttribPointer);
  REGISTER_GL_FUNCTION(Viewport);
  REGISTER_GL_FUNCTION(BindFramebuffer);
  REGISTER_GL_FUNCTION(BindRenderbuffer);
  REGISTER_GL_FUNCTION(CheckFramebufferStatus);
  REGISTER_GL_FUNCTION(DeleteFramebuffers);
  REGISTER_GL_FUNCTION(DeleteRenderbuffers);
  REGISTER_GL_FUNCTION(Finish);
  REGISTER_GL_FUNCTION(Flush);
  REGISTER_GL_FUNCTION(FramebufferRenderbuffer);
  REGISTER_GL_FUNCTION(FramebufferTexture2D);
  REGISTER_GL_FUNCTION(GetFramebufferAttachmentParameteriv);
  REGISTER_GL_FUNCTION(GetRenderbufferParameteriv);
  REGISTER_GL_FUNCTION(GenFramebuffers);
  REGISTER_GL_FUNCTION(GenRenderbuffers);
  REGISTER_GL_FUNCTION(RenderbufferStorage);
  REGISTER_GL_FUNCTION(GetShaderPrecisionFormat);

  return eglGetProcAddress(name);
}

const GrGLInterface* GrGLCreateNativeInterface() {
  return GrGLAssembleInterface(NULL, &GetGLProc);
}
