aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
blob: 059713d8e4ed5a11a3bdfbfbc328f83ede665ecf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

/*
 * 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);
        interface->fBindVertexArray =
            (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArrayOES");
        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);
        interface->fDeleteVertexArrays =
            (GrGLDeleteVertexArraysProc) eglGetProcAddress("glDeleteVertexArraysOES");
        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);
        interface->fGenVertexArrays =
            (GrGLGenVertexArraysProc) eglGetProcAddress("glGenVertexArraysOES");
        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) eglGetProcAddress("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 = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES");
        interface->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES");
    }
    glInterface.get()->ref();
    return glInterface.get();
}