// 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 "starboard/configuration.h"
#if SB_API_VERSION >= SB_ALL_RENDERERS_REQUIRED_VERSION || SB_HAS(GLES2)

#include "cobalt/renderer/egl_and_gles.h"
#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"

#define REGISTER_GL_FUNCTION(F)                                 \
                                                                \
  if (0 == strcmp("gl" #F, name)) {                             \
    return reinterpret_cast<GrGLFuncPtr>(GL_CALL_PREFIX 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);
#if SB_API_VERSION < SB_GLES3_DEPRECATED_VERSION && defined(GLES3_SUPPORTED)
  REGISTER_GL_FUNCTION(GetStringi);
#endif
  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(TexParameterf);
  REGISTER_GL_FUNCTION(TexParameterfv);
  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 EGL_CALL_SIMPLE(eglGetProcAddress(name));
}

sk_sp<const GrGLInterface> GrGLMakeNativeInterface() {
  return GrGLMakeAssembledInterface(NULL, &GetGLProc);
}

const GrGLInterface* GrGLCreateNativeInterface() {
  return GrGLAssembleInterface(NULL, &GetGLProc);
}
#else  // SB_API_VERSION >= SB_ALL_RENDERERS_REQUIRED_VERSION || SB_HAS(GLES2)

#include "third_party/skia/include/gpu/gl/GrGLInterface.h"

sk_sp<const GrGLInterface> GrGLMakeNativeInterface() { return nullptr; }

const GrGLInterface* GrGLCreateNativeInterface() { return nullptr; }

#endif  // SB_API_VERSION >= SB_ALL_RENDERERS_REQUIRED_VERSION || SB_HAS(GLES2)
