GrGLCreateANGLEInterface.cpp revision b82c3993c2f753e5caaff2df9648ebdafc68595f
18926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
28926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com/*
38926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * Copyright 2012 Google Inc.
48926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com *
58926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * Use of this source code is governed by a BSD-style license that can be
68926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * found in the LICENSE file.
78926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com */
88926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
98926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
108926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "gl/GrGLInterface.h"
118926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
128926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#ifndef GL_GLEXT_PROTOTYPES
138926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#define GL_GLEXT_PROTOTYPES
148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#endif
1544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org
16f44fcdca01722959c3be335f44e88b59dbb33a10junov@chromium.org#include "GLES2/gl2.h"
178926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "GLES2/gl2ext.h"
188926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "EGL/egl.h"
198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#define GR_GET_PROC(procType, baseName)             \
217daaaa4425ea083df437eea95ba6b38315ce98adreed    interface->f ## baseName = (procType) GetProcAddress(ghANGLELib, "gl" #baseName);
227daaaa4425ea083df437eea95ba6b38315ce98adreed
237daaaa4425ea083df437eea95ba6b38315ce98adreedconst GrGLInterface* GrGLCreateANGLEInterface() {
247daaaa4425ea083df437eea95ba6b38315ce98adreed
257daaaa4425ea083df437eea95ba6b38315ce98adreed    static SkAutoTUnref<GrGLInterface> glInterface;
267daaaa4425ea083df437eea95ba6b38315ce98adreed    static HMODULE ghANGLELib = NULL;
277daaaa4425ea083df437eea95ba6b38315ce98adreed
287daaaa4425ea083df437eea95ba6b38315ce98adreed    if (NULL == ghANGLELib) {
297daaaa4425ea083df437eea95ba6b38315ce98adreed        // We load the ANGLE library and never let it go
307daaaa4425ea083df437eea95ba6b38315ce98adreed        ghANGLELib = LoadLibrary("libGLESv2.dll");
317daaaa4425ea083df437eea95ba6b38315ce98adreed    }
327daaaa4425ea083df437eea95ba6b38315ce98adreed    if (NULL == ghANGLELib) {
33cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        // We can't setup the interface correctly w/o the DLL
34cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        return NULL;
35cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
36ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
37ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    if (!glInterface.get()) {
389fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GrGLInterface* interface = new GrGLInterface;
398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        glInterface.reset(interface);
407daaaa4425ea083df437eea95ba6b38315ce98adreed        interface->fBindingsExported = kES2_GrGLBinding;
419fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
424cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org        GR_GET_PROC(GrGLActiveTextureProc,      ActiveTexture);
43f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org        GR_GET_PROC(GrGLAttachShaderProc,       AttachShader);
448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLBindAttribLocationProc, BindAttribLocation);
458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLBindBufferProc,         BindBuffer);
46d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        GR_GET_PROC(GrGLBindTextureProc,        BindTexture);
479fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLBlendColorProc,         BlendColor);
489fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLBlendFuncProc,          BlendFunc);
499fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLBufferDataProc,         BufferData);
508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLBufferSubDataProc,      BufferSubData);
518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLClearProc,              Clear);
528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLClearColorProc,         ClearColor);
538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLClearStencilProc,       ClearStencil);
548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLColorMaskProc,          ColorMask);
557daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLCompileShaderProc,      CompileShader);
567daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLCompressedTexImage2DProc, CompressedTexImage2D);
579fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLCreateProgramProc,      CreateProgram);
589fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLCreateShaderProc,       CreateShader);
599fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLCullFaceProc,           CullFace);
609fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLDeleteBuffersProc,      DeleteBuffers);
61ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com        GR_GET_PROC(GrGLDeleteProgramProc,      DeleteProgram);
628926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLDeleteShaderProc,       DeleteShader);
638926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLDeleteTexturesProc,     DeleteTextures);
647daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLDepthMaskProc,          DepthMask);
657daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLDisableProc,            Disable);
667daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLDisableVertexAttribArrayProc, DisableVertexAttribArray);
677daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLDrawArraysProc,         DrawArrays);
687daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLDrawElementsProc,       DrawElements);
697daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLEnableProc,             Enable);
707daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLEnableVertexAttribArrayProc, EnableVertexAttribArray);
717daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLFinishProc,             Finish);
727daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLFlushProc,              Flush);
737daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLFrontFaceProc,          FrontFace);
747daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLGenBuffersProc,         GenBuffers);
757daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLGenTexturesProc,        GenTextures);
769ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco        GR_GET_PROC(GrGLGetBufferParameterivProc, GetBufferParameteriv);
779ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco        GR_GET_PROC(GrGLGetErrorProc,           GetError);
78cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        GR_GET_PROC(GrGLGetIntegervProc,        GetIntegerv);
798926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLGetProgramInfoLogProc,  GetProgramInfoLog);
80ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com        GR_GET_PROC(GrGLGetProgramivProc,       GetProgramiv);
818926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLGetShaderInfoLogProc,   GetShaderInfoLog);
827daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLGetShaderivProc,        GetShaderiv);
839fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLGetStringProc,          GetString);
844cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org        GR_GET_PROC(GrGLGetUniformLocationProc, GetUniformLocation);
85f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org        GR_GET_PROC(GrGLLineWidthProc,          LineWidth);
868926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLLinkProgramProc,        LinkProgram);
87f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org        GR_GET_PROC(GrGLPixelStoreiProc,        PixelStorei);
888926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLReadPixelsProc,         ReadPixels);
898926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLScissorProc,            Scissor);
908926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLShaderSourceProc,       ShaderSource);
919fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLStencilFuncProc,        StencilFunc);
929fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLStencilFuncSeparateProc, StencilFuncSeparate);
939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLStencilMaskProc,        StencilMask);
948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLStencilMaskSeparateProc, StencilMaskSeparate);
958926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLStencilOpProc,          StencilOp);
968926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLStencilOpSeparateProc,  StencilOpSeparate);
978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLTexImage2DProc,         TexImage2D);
988926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLTexParameteriProc,      TexParameteri);
997daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLTexParameterivProc,     TexParameteriv);
1007daaaa4425ea083df437eea95ba6b38315ce98adreed        GR_GET_PROC(GrGLTexSubImage2DProc,      TexSubImage2D);
1019fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#if GL_ARB_texture_storage
1029fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        GR_GET_PROC(GrGLTexStorage2DProc,       TexStorage2D);
1039fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#elif GL_EXT_texture_storage
1049fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        interface->fTexStorage2D = (GrGLTexStorage2DProc)
105ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com                                            GetProcAddress(ghANGLELib,
1068926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                                            "glTexStorage2DEXT");
1078926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#endif
1088926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform1fProc,          Uniform1f);
1098926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform1iProc,          Uniform1i);
1108926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform1fvProc,         Uniform1fv);
1118926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform1ivProc,         Uniform1iv);
1128926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1138926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform2fProc,          Uniform2f);
1148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform2iProc,          Uniform2i);
1158926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform2fvProc,         Uniform2fv);
1168926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform2ivProc,         Uniform2iv);
1178926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1188926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform3fProc,          Uniform3f);
1198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform3iProc,          Uniform3i);
1208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform3fvProc,         Uniform3fv);
1218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform3ivProc,         Uniform3iv);
1228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform4fProc,          Uniform4f);
1248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform4iProc,          Uniform4i);
1258926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform4fvProc,         Uniform4fv);
1268926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniform4ivProc,         Uniform4iv);
1278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniformMatrix2fvProc,   UniformMatrix2fv);
1298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniformMatrix3fvProc,   UniformMatrix3fv);
1308926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUniformMatrix4fvProc,   UniformMatrix4fv);
1318926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLUseProgramProc,         UseProgram);
1328926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLVertexAttrib4fvProc,    VertexAttrib4fv);
1338926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLVertexAttribPointerProc, VertexAttribPointer);
1348926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLViewportProc,           Viewport);
1358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLBindFramebufferProc,    BindFramebuffer);
1368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLBindRenderbufferProc,   BindRenderbuffer);
1378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLCheckFramebufferStatusProc, CheckFramebufferStatus);
1388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLDeleteFramebuffersProc, DeleteFramebuffers);
1398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLDeleteRenderbuffersProc, DeleteRenderbuffers);
1408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLFramebufferRenderbufferProc, FramebufferRenderbuffer);
1418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLFramebufferTexture2DProc, FramebufferTexture2D);
1428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLGenFramebuffersProc,    GenFramebuffers);
1438926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLGenRenderbuffersProc,   GenRenderbuffers);
1448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLGetFramebufferAttachmentParameterivProc,
1458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                                GetFramebufferAttachmentParameteriv);
1468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        GR_GET_PROC(GrGLGetRenderbufferParameterivProc,
1478926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                                GetRenderbufferParameteriv);
148992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        GR_GET_PROC(GrGLRenderbufferStorageProc, RenderbufferStorage);
1498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        interface->fMapBuffer = (PFNGLMAPBUFFEROESPROC) eglGetProcAddress("glMapBufferOES");
1518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        interface->fUnmapBuffer = (PFNGLUNMAPBUFFEROESPROC) eglGetProcAddress("glUnmapBufferOES");
1528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
1538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    glInterface.get()->ref();
1548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    return glInterface.get();
1558926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1568926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com