Home | History | Annotate | Download | only in angle
      1 
      2 /*
      3  * Copyright 2012 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #include "gl/GrGLInterface.h"
     11 
     12 #ifndef GL_GLEXT_PROTOTYPES
     13 #define GL_GLEXT_PROTOTYPES
     14 #endif
     15 
     16 #include "GLES2/gl2.h"
     17 #include "GLES2/gl2ext.h"
     18 #include "EGL/egl.h"
     19 
     20 #define GET_PROC(name)             \
     21     interface->f ## name = (GrGL ## name ## Proc) GetProcAddress(ghANGLELib, "gl" #name);
     22 
     23 const GrGLInterface* GrGLCreateANGLEInterface() {
     24 
     25     static SkAutoTUnref<GrGLInterface> glInterface;
     26     static HMODULE ghANGLELib = NULL;
     27 
     28     if (NULL == ghANGLELib) {
     29         // We load the ANGLE library and never let it go
     30         ghANGLELib = LoadLibrary("libGLESv2.dll");
     31     }
     32     if (NULL == ghANGLELib) {
     33         // We can't setup the interface correctly w/o the DLL
     34         return NULL;
     35     }
     36 
     37     if (!glInterface.get()) {
     38         GrGLInterface* interface = new GrGLInterface;
     39         glInterface.reset(interface);
     40         interface->fBindingsExported = kES2_GrGLBinding;
     41 
     42         GET_PROC(ActiveTexture);
     43         GET_PROC(AttachShader);
     44         GET_PROC(BindAttribLocation);
     45         GET_PROC(BindBuffer);
     46         GET_PROC(BindTexture);
     47         interface->fBindVertexArray =
     48             (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArrayOES");
     49         GET_PROC(BlendColor);
     50         GET_PROC(BlendFunc);
     51         GET_PROC(BufferData);
     52         GET_PROC(BufferSubData);
     53         GET_PROC(Clear);
     54         GET_PROC(ClearColor);
     55         GET_PROC(ClearStencil);
     56         GET_PROC(ColorMask);
     57         GET_PROC(CompileShader);
     58         GET_PROC(CompressedTexImage2D);
     59         GET_PROC(CopyTexSubImage2D);
     60         GET_PROC(CreateProgram);
     61         GET_PROC(CreateShader);
     62         GET_PROC(CullFace);
     63         GET_PROC(DeleteBuffers);
     64         GET_PROC(DeleteProgram);
     65         GET_PROC(DeleteShader);
     66         GET_PROC(DeleteTextures);
     67         interface->fDeleteVertexArrays =
     68             (GrGLDeleteVertexArraysProc) eglGetProcAddress("glDeleteVertexArraysOES");
     69         GET_PROC(DepthMask);
     70         GET_PROC(Disable);
     71         GET_PROC(DisableVertexAttribArray);
     72         GET_PROC(DrawArrays);
     73         GET_PROC(DrawElements);
     74         GET_PROC(Enable);
     75         GET_PROC(EnableVertexAttribArray);
     76         GET_PROC(Finish);
     77         GET_PROC(Flush);
     78         GET_PROC(FrontFace);
     79         GET_PROC(GenBuffers);
     80         GET_PROC(GenerateMipmap);
     81         GET_PROC(GenTextures);
     82         interface->fGenVertexArrays =
     83             (GrGLGenVertexArraysProc) eglGetProcAddress("glGenVertexArraysOES");
     84         GET_PROC(GetBufferParameteriv);
     85         GET_PROC(GetError);
     86         GET_PROC(GetIntegerv);
     87         GET_PROC(GetProgramInfoLog);
     88         GET_PROC(GetProgramiv);
     89         GET_PROC(GetShaderInfoLog);
     90         GET_PROC(GetShaderiv);
     91         GET_PROC(GetString);
     92         GET_PROC(GetUniformLocation);
     93         GET_PROC(LineWidth);
     94         GET_PROC(LinkProgram);
     95         GET_PROC(PixelStorei);
     96         GET_PROC(ReadPixels);
     97         GET_PROC(Scissor);
     98         GET_PROC(ShaderSource);
     99         GET_PROC(StencilFunc);
    100         GET_PROC(StencilFuncSeparate);
    101         GET_PROC(StencilMask);
    102         GET_PROC(StencilMaskSeparate);
    103         GET_PROC(StencilOp);
    104         GET_PROC(StencilOpSeparate);
    105         GET_PROC(TexImage2D);
    106         GET_PROC(TexParameteri);
    107         GET_PROC(TexParameteriv);
    108         GET_PROC(TexSubImage2D);
    109 #if GL_ARB_texture_storage
    110         GET_PROC(TexStorage2D);
    111 #elif GL_EXT_texture_storage
    112         interface->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT");
    113 #endif
    114         GET_PROC(Uniform1f);
    115         GET_PROC(Uniform1i);
    116         GET_PROC(Uniform1fv);
    117         GET_PROC(Uniform1iv);
    118 
    119         GET_PROC(Uniform2f);
    120         GET_PROC(Uniform2i);
    121         GET_PROC(Uniform2fv);
    122         GET_PROC(Uniform2iv);
    123 
    124         GET_PROC(Uniform3f);
    125         GET_PROC(Uniform3i);
    126         GET_PROC(Uniform3fv);
    127         GET_PROC(Uniform3iv);
    128 
    129         GET_PROC(Uniform4f);
    130         GET_PROC(Uniform4i);
    131         GET_PROC(Uniform4fv);
    132         GET_PROC(Uniform4iv);
    133 
    134         GET_PROC(UniformMatrix2fv);
    135         GET_PROC(UniformMatrix3fv);
    136         GET_PROC(UniformMatrix4fv);
    137         GET_PROC(UseProgram);
    138         GET_PROC(VertexAttrib4fv);
    139         GET_PROC(VertexAttribPointer);
    140         GET_PROC(Viewport);
    141         GET_PROC(BindFramebuffer);
    142         GET_PROC(BindRenderbuffer);
    143         GET_PROC(CheckFramebufferStatus);
    144         GET_PROC(DeleteFramebuffers);
    145         GET_PROC(DeleteRenderbuffers);
    146         GET_PROC(FramebufferRenderbuffer);
    147         GET_PROC(FramebufferTexture2D);
    148         GET_PROC(GenFramebuffers);
    149         GET_PROC(GenRenderbuffers);
    150         GET_PROC(GetFramebufferAttachmentParameteriv);
    151         GET_PROC(GetRenderbufferParameteriv);
    152         GET_PROC(RenderbufferStorage);
    153 
    154         interface->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES");
    155         interface->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES");
    156     }
    157     glInterface.get()->ref();
    158     return glInterface.get();
    159 }
    160