blob: 19fe44f6d87a1ae32154caac24fca556165bf7e7 [file] [log] [blame]
/*
* Copyright 2012 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"
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES
#endif
#include "GLES2/gl2.h"
#include "GLES2/gl2ext.h"
#include "EGL/egl.h"
#define GR_GET_PROC(procType, baseName) \
interface->f ## baseName = (procType) GetProcAddress(ghANGLELib, "gl" #baseName);
const GrGLInterface* GrGLCreateANGLEInterface() {
static SkAutoTUnref<GrGLInterface> glInterface;
static HMODULE ghANGLELib = NULL;
if (NULL == ghANGLELib) {
// We load the ANGLE library and never let it go
ghANGLELib = LoadLibrary("libGLESv2.dll");
}
if (NULL == ghANGLELib) {
// We can't setup the interface correctly w/o the DLL
return NULL;
}
if (!glInterface.get()) {
GrGLInterface* interface = new GrGLInterface;
glInterface.reset(interface);
interface->fBindingsExported = kES2_GrGLBinding;
GR_GET_PROC(GrGLActiveTextureProc, ActiveTexture);
GR_GET_PROC(GrGLAttachShaderProc, AttachShader);
GR_GET_PROC(GrGLBindAttribLocationProc, BindAttribLocation);
GR_GET_PROC(GrGLBindBufferProc, BindBuffer);
GR_GET_PROC(GrGLBindTextureProc, BindTexture);
GR_GET_PROC(GrGLBlendColorProc, BlendColor);
GR_GET_PROC(GrGLBlendFuncProc, BlendFunc);
GR_GET_PROC(GrGLBufferDataProc, BufferData);
GR_GET_PROC(GrGLBufferSubDataProc, BufferSubData);
GR_GET_PROC(GrGLClearProc, Clear);
GR_GET_PROC(GrGLClearColorProc, ClearColor);
GR_GET_PROC(GrGLClearStencilProc, ClearStencil);
GR_GET_PROC(GrGLColorMaskProc, ColorMask);
GR_GET_PROC(GrGLCompileShaderProc, CompileShader);
GR_GET_PROC(GrGLCompressedTexImage2DProc, CompressedTexImage2D);
GR_GET_PROC(GrGLCreateProgramProc, CreateProgram);
GR_GET_PROC(GrGLCreateShaderProc, CreateShader);
GR_GET_PROC(GrGLCullFaceProc, CullFace);
GR_GET_PROC(GrGLDeleteBuffersProc, DeleteBuffers);
GR_GET_PROC(GrGLDeleteProgramProc, DeleteProgram);
GR_GET_PROC(GrGLDeleteShaderProc, DeleteShader);
GR_GET_PROC(GrGLDeleteTexturesProc, DeleteTextures);
GR_GET_PROC(GrGLDepthMaskProc, DepthMask);
GR_GET_PROC(GrGLDisableProc, Disable);
GR_GET_PROC(GrGLDisableVertexAttribArrayProc, DisableVertexAttribArray);
GR_GET_PROC(GrGLDrawArraysProc, DrawArrays);
GR_GET_PROC(GrGLDrawElementsProc, DrawElements);
GR_GET_PROC(GrGLEnableProc, Enable);
GR_GET_PROC(GrGLEnableVertexAttribArrayProc, EnableVertexAttribArray);
GR_GET_PROC(GrGLFinishProc, Finish);
GR_GET_PROC(GrGLFlushProc, Flush);
GR_GET_PROC(GrGLFrontFaceProc, FrontFace);
GR_GET_PROC(GrGLGenBuffersProc, GenBuffers);
GR_GET_PROC(GrGLGenTexturesProc, GenTextures);
GR_GET_PROC(GrGLGetBufferParameterivProc, GetBufferParameteriv);
GR_GET_PROC(GrGLGetErrorProc, GetError);
GR_GET_PROC(GrGLGetIntegervProc, GetIntegerv);
GR_GET_PROC(GrGLGetProgramInfoLogProc, GetProgramInfoLog);
GR_GET_PROC(GrGLGetProgramivProc, GetProgramiv);
GR_GET_PROC(GrGLGetShaderInfoLogProc, GetShaderInfoLog);
GR_GET_PROC(GrGLGetShaderivProc, GetShaderiv);
GR_GET_PROC(GrGLGetStringProc, GetString);
GR_GET_PROC(GrGLGetUniformLocationProc, GetUniformLocation);
GR_GET_PROC(GrGLLineWidthProc, LineWidth);
GR_GET_PROC(GrGLLinkProgramProc, LinkProgram);
GR_GET_PROC(GrGLPixelStoreiProc, PixelStorei);
GR_GET_PROC(GrGLReadPixelsProc, ReadPixels);
GR_GET_PROC(GrGLScissorProc, Scissor);
GR_GET_PROC(GrGLShaderSourceProc, ShaderSource);
GR_GET_PROC(GrGLStencilFuncProc, StencilFunc);
GR_GET_PROC(GrGLStencilFuncSeparateProc, StencilFuncSeparate);
GR_GET_PROC(GrGLStencilMaskProc, StencilMask);
GR_GET_PROC(GrGLStencilMaskSeparateProc, StencilMaskSeparate);
GR_GET_PROC(GrGLStencilOpProc, StencilOp);
GR_GET_PROC(GrGLStencilOpSeparateProc, StencilOpSeparate);
GR_GET_PROC(GrGLTexImage2DProc, TexImage2D);
GR_GET_PROC(GrGLTexParameteriProc, TexParameteri);
GR_GET_PROC(GrGLTexParameterivProc, TexParameteriv);
GR_GET_PROC(GrGLTexSubImage2DProc, TexSubImage2D);
#if GL_ARB_texture_storage
GR_GET_PROC(GrGLTexStorage2DProc, TexStorage2D);
#elif GL_EXT_texture_storage
interface->fTexStorage2D = (GrGLTexStorage2DProc)
GetProcAddress(ghANGLELib,
"glTexStorage2DEXT");
#endif
GR_GET_PROC(GrGLUniform1fProc, Uniform1f);
GR_GET_PROC(GrGLUniform1iProc, Uniform1i);
GR_GET_PROC(GrGLUniform1fvProc, Uniform1fv);
GR_GET_PROC(GrGLUniform1ivProc, Uniform1iv);
GR_GET_PROC(GrGLUniform2fProc, Uniform2f);
GR_GET_PROC(GrGLUniform2iProc, Uniform2i);
GR_GET_PROC(GrGLUniform2fvProc, Uniform2fv);
GR_GET_PROC(GrGLUniform2ivProc, Uniform2iv);
GR_GET_PROC(GrGLUniform3fProc, Uniform3f);
GR_GET_PROC(GrGLUniform3iProc, Uniform3i);
GR_GET_PROC(GrGLUniform3fvProc, Uniform3fv);
GR_GET_PROC(GrGLUniform3ivProc, Uniform3iv);
GR_GET_PROC(GrGLUniform4fProc, Uniform4f);
GR_GET_PROC(GrGLUniform4iProc, Uniform4i);
GR_GET_PROC(GrGLUniform4fvProc, Uniform4fv);
GR_GET_PROC(GrGLUniform4ivProc, Uniform4iv);
GR_GET_PROC(GrGLUniformMatrix2fvProc, UniformMatrix2fv);
GR_GET_PROC(GrGLUniformMatrix3fvProc, UniformMatrix3fv);
GR_GET_PROC(GrGLUniformMatrix4fvProc, UniformMatrix4fv);
GR_GET_PROC(GrGLUseProgramProc, UseProgram);
GR_GET_PROC(GrGLVertexAttrib4fvProc, VertexAttrib4fv);
GR_GET_PROC(GrGLVertexAttribPointerProc, VertexAttribPointer);
GR_GET_PROC(GrGLViewportProc, Viewport);
GR_GET_PROC(GrGLBindFramebufferProc, BindFramebuffer);
GR_GET_PROC(GrGLBindRenderbufferProc, BindRenderbuffer);
GR_GET_PROC(GrGLCheckFramebufferStatusProc, CheckFramebufferStatus);
GR_GET_PROC(GrGLDeleteFramebuffersProc, DeleteFramebuffers);
GR_GET_PROC(GrGLDeleteRenderbuffersProc, DeleteRenderbuffers);
GR_GET_PROC(GrGLFramebufferRenderbufferProc, FramebufferRenderbuffer);
GR_GET_PROC(GrGLFramebufferTexture2DProc, FramebufferTexture2D);
GR_GET_PROC(GrGLGenFramebuffersProc, GenFramebuffers);
GR_GET_PROC(GrGLGenRenderbuffersProc, GenRenderbuffers);
GR_GET_PROC(GrGLGetFramebufferAttachmentParameterivProc,
GetFramebufferAttachmentParameteriv);
GR_GET_PROC(GrGLGetRenderbufferParameterivProc,
GetRenderbufferParameteriv);
GR_GET_PROC(GrGLRenderbufferStorageProc, RenderbufferStorage);
interface->fMapBuffer = (PFNGLMAPBUFFEROESPROC) eglGetProcAddress("glMapBufferOES");
interface->fUnmapBuffer = (PFNGLUNMAPBUFFEROESPROC) eglGetProcAddress("glUnmapBufferOES");
}
glInterface.get()->ref();
return glInterface.get();
}