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