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->fFunctions.f ## name = (GrGL ## name ## Proc) GetProcAddress(ghANGLELib, "gl" #name); 22 23 const GrGLInterface* GrGLCreateANGLEInterface() { 24 25 static HMODULE ghANGLELib = NULL; 26 27 if (NULL == ghANGLELib) { 28 // We load the ANGLE library and never let it go 29 ghANGLELib = LoadLibrary("libGLESv2.dll"); 30 } 31 if (NULL == ghANGLELib) { 32 // We can't setup the interface correctly w/o the DLL 33 return NULL; 34 } 35 36 GrGLInterface* interface = SkNEW(GrGLInterface); 37 interface->fStandard = kGLES_GrGLStandard; 38 39 GrGLInterface::Functions* functions = &interface->fFunctions; 40 41 GET_PROC(ActiveTexture); 42 GET_PROC(AttachShader); 43 GET_PROC(BindAttribLocation); 44 GET_PROC(BindBuffer); 45 GET_PROC(BindTexture); 46 functions->fBindVertexArray = 47 (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArrayOES"); 48 GET_PROC(BlendColor); 49 GET_PROC(BlendFunc); 50 GET_PROC(BufferData); 51 GET_PROC(BufferSubData); 52 GET_PROC(Clear); 53 GET_PROC(ClearColor); 54 GET_PROC(ClearStencil); 55 GET_PROC(ColorMask); 56 GET_PROC(CompileShader); 57 GET_PROC(CompressedTexImage2D); 58 GET_PROC(CompressedTexSubImage2D); 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 functions->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 functions->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(GetStringi); 93 GET_PROC(GetUniformLocation); 94 GET_PROC(LineWidth); 95 GET_PROC(LinkProgram); 96 GET_PROC(PixelStorei); 97 GET_PROC(ReadPixels); 98 GET_PROC(Scissor); 99 GET_PROC(ShaderSource); 100 GET_PROC(StencilFunc); 101 GET_PROC(StencilFuncSeparate); 102 GET_PROC(StencilMask); 103 GET_PROC(StencilMaskSeparate); 104 GET_PROC(StencilOp); 105 GET_PROC(StencilOpSeparate); 106 GET_PROC(TexImage2D); 107 GET_PROC(TexParameteri); 108 GET_PROC(TexParameteriv); 109 GET_PROC(TexSubImage2D); 110 #if GL_ARB_texture_storage 111 GET_PROC(TexStorage2D); 112 #elif GL_EXT_texture_storage 113 functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT"); 114 #endif 115 GET_PROC(Uniform1f); 116 GET_PROC(Uniform1i); 117 GET_PROC(Uniform1fv); 118 GET_PROC(Uniform1iv); 119 120 GET_PROC(Uniform2f); 121 GET_PROC(Uniform2i); 122 GET_PROC(Uniform2fv); 123 GET_PROC(Uniform2iv); 124 125 GET_PROC(Uniform3f); 126 GET_PROC(Uniform3i); 127 GET_PROC(Uniform3fv); 128 GET_PROC(Uniform3iv); 129 130 GET_PROC(Uniform4f); 131 GET_PROC(Uniform4i); 132 GET_PROC(Uniform4fv); 133 GET_PROC(Uniform4iv); 134 135 GET_PROC(UniformMatrix2fv); 136 GET_PROC(UniformMatrix3fv); 137 GET_PROC(UniformMatrix4fv); 138 GET_PROC(UseProgram); 139 GET_PROC(VertexAttrib4fv); 140 GET_PROC(VertexAttribPointer); 141 GET_PROC(Viewport); 142 GET_PROC(BindFramebuffer); 143 GET_PROC(BindRenderbuffer); 144 GET_PROC(CheckFramebufferStatus); 145 GET_PROC(DeleteFramebuffers); 146 GET_PROC(DeleteRenderbuffers); 147 GET_PROC(FramebufferRenderbuffer); 148 GET_PROC(FramebufferTexture2D); 149 GET_PROC(GenFramebuffers); 150 GET_PROC(GenRenderbuffers); 151 GET_PROC(GetFramebufferAttachmentParameteriv); 152 GET_PROC(GetRenderbufferParameteriv); 153 GET_PROC(RenderbufferStorage); 154 155 functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES"); 156 functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES"); 157 158 #if GL_ES_VERSION_3_0 159 functions->fMapBufferRange = GET_PROC(glMapBufferRange); 160 functions->fFlushMappedBufferRange = GET_PROC(glFlushMappedBufferRange); 161 #else 162 functions->fMapBufferRange = (GrGLMapBufferRangeProc) eglGetProcAddress("glMapBufferRange"); 163 functions->fFlushMappedBufferRange = (GrGLFlushMappedBufferRangeProc) eglGetProcAddress("glFlushMappedBufferRange"); 164 #endif 165 166 functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarkerEXT"); 167 functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarkerEXT"); 168 functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGroupMarkerEXT"); 169 170 #if GL_ES_VERSION_3_0 171 GET_PROC(InvalidateFramebuffer); 172 GET_PROC(InvalidateSubFramebuffer); 173 #else 174 functions->fInvalidateFramebuffer = (GrGLInvalidateFramebufferProc) eglGetProcAddress("glInvalidateFramebuffer"); 175 functions->fInvalidateSubFramebuffer = (GrGLInvalidateSubFramebufferProc) eglGetProcAddress("glInvalidateSubFramebuffer"); 176 #endif 177 functions->fInvalidateBufferData = (GrGLInvalidateBufferDataProc) eglGetProcAddress("glInvalidateBufferData"); 178 functions->fInvalidateBufferSubData = (GrGLInvalidateBufferSubDataProc) eglGetProcAddress("glInvalidateBufferSubData"); 179 functions->fInvalidateTexImage = (GrGLInvalidateTexImageProc) eglGetProcAddress("glInvalidateTexImage"); 180 functions->fInvalidateTexSubImage = (GrGLInvalidateTexSubImageProc) eglGetProcAddress("glInvalidateTexSubImage"); 181 182 interface->fExtensions.init(kGLES_GrGLStandard, 183 functions->fGetString, 184 functions->fGetStringi, 185 functions->fGetIntegerv); 186 return interface; 187 } 188