michael@0: // Modified from chromium/src/webkit/glue/gl_bindings_skia_cmd_buffer.cc michael@0: michael@0: // Copyright (c) 2011 The Chromium Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: michael@0: #include "gl/GrGLExtensions.h" michael@0: #include "gl/GrGLInterface.h" michael@0: #include "gl/GrGLUtil.h" michael@0: michael@0: #ifndef GL_GLEXT_PROTOTYPES michael@0: #define GL_GLEXT_PROTOTYPES michael@0: #endif michael@0: michael@0: #include michael@0: #include michael@0: michael@0: #include michael@0: michael@0: static GrGLInterface* create_es_interface(GrGLVersion version, michael@0: const GrGLExtensions& extensions) { michael@0: if (version < GR_GL_VER(2,0)) { michael@0: return NULL; michael@0: } michael@0: michael@0: GrGLInterface* interface = SkNEW(GrGLInterface); michael@0: interface->fStandard = kGLES_GrGLStandard; michael@0: GrGLInterface::Functions* functions = &interface->fFunctions; michael@0: michael@0: functions->fActiveTexture = glActiveTexture; michael@0: functions->fAttachShader = glAttachShader; michael@0: functions->fBindAttribLocation = glBindAttribLocation; michael@0: functions->fBindBuffer = glBindBuffer; michael@0: functions->fBindTexture = glBindTexture; michael@0: functions->fBindVertexArray = glBindVertexArrayOES; michael@0: functions->fBlendColor = glBlendColor; michael@0: functions->fBlendFunc = glBlendFunc; michael@0: functions->fBufferData = glBufferData; michael@0: functions->fBufferSubData = glBufferSubData; michael@0: functions->fClear = glClear; michael@0: functions->fClearColor = glClearColor; michael@0: functions->fClearStencil = glClearStencil; michael@0: functions->fColorMask = glColorMask; michael@0: functions->fCompileShader = glCompileShader; michael@0: functions->fCompressedTexImage2D = glCompressedTexImage2D; michael@0: functions->fCopyTexSubImage2D = glCopyTexSubImage2D; michael@0: functions->fCreateProgram = glCreateProgram; michael@0: functions->fCreateShader = glCreateShader; michael@0: functions->fCullFace = glCullFace; michael@0: functions->fDeleteBuffers = glDeleteBuffers; michael@0: functions->fDeleteProgram = glDeleteProgram; michael@0: functions->fDeleteShader = glDeleteShader; michael@0: functions->fDeleteTextures = glDeleteTextures; michael@0: functions->fDeleteVertexArrays = glDeleteVertexArraysOES; michael@0: functions->fDepthMask = glDepthMask; michael@0: functions->fDisable = glDisable; michael@0: functions->fDisableVertexAttribArray = glDisableVertexAttribArray; michael@0: functions->fDrawArrays = glDrawArrays; michael@0: functions->fDrawElements = glDrawElements; michael@0: functions->fEnable = glEnable; michael@0: functions->fEnableVertexAttribArray = glEnableVertexAttribArray; michael@0: functions->fFinish = glFinish; michael@0: functions->fFlush = glFlush; michael@0: functions->fFrontFace = glFrontFace; michael@0: functions->fGenBuffers = glGenBuffers; michael@0: functions->fGenerateMipmap = glGenerateMipmap; michael@0: functions->fGenTextures = glGenTextures; michael@0: functions->fGenVertexArrays = glGenVertexArraysOES; michael@0: functions->fGetBufferParameteriv = glGetBufferParameteriv; michael@0: functions->fGetError = glGetError; michael@0: functions->fGetIntegerv = glGetIntegerv; michael@0: functions->fGetProgramInfoLog = glGetProgramInfoLog; michael@0: functions->fGetProgramiv = glGetProgramiv; michael@0: functions->fGetShaderInfoLog = glGetShaderInfoLog; michael@0: functions->fGetShaderiv = glGetShaderiv; michael@0: functions->fGetString = glGetString; michael@0: #if GL_ES_VERSION_30 michael@0: functions->fGetStringi = glGetStringi; michael@0: #else michael@0: functions->fGetStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi"); michael@0: #endif michael@0: functions->fGetUniformLocation = glGetUniformLocation; michael@0: functions->fLineWidth = glLineWidth; michael@0: functions->fLinkProgram = glLinkProgram; michael@0: functions->fPixelStorei = glPixelStorei; michael@0: functions->fReadPixels = glReadPixels; michael@0: functions->fScissor = glScissor; michael@0: #if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE michael@0: functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource; michael@0: #else michael@0: functions->fShaderSource = glShaderSource; michael@0: #endif michael@0: functions->fStencilFunc = glStencilFunc; michael@0: functions->fStencilFuncSeparate = glStencilFuncSeparate; michael@0: functions->fStencilMask = glStencilMask; michael@0: functions->fStencilMaskSeparate = glStencilMaskSeparate; michael@0: functions->fStencilOp = glStencilOp; michael@0: functions->fStencilOpSeparate = glStencilOpSeparate; michael@0: functions->fTexImage2D = glTexImage2D; michael@0: functions->fTexParameteri = glTexParameteri; michael@0: functions->fTexParameteriv = glTexParameteriv; michael@0: functions->fTexSubImage2D = glTexSubImage2D; michael@0: michael@0: if (version >= GR_GL_VER(3,0)) { michael@0: #if GL_ES_VERSION_3_0 michael@0: functions->fTexStorage2D = glTexStorage2D; michael@0: #else michael@0: functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2D"); michael@0: #endif michael@0: } else { michael@0: #if GL_EXT_texture_storage michael@0: functions->fTexStorage2D = glTexStorage2DEXT; michael@0: #else michael@0: functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT"); michael@0: #endif michael@0: } michael@0: michael@0: #if GL_EXT_discard_framebuffer michael@0: functions->fDiscardFramebuffer = glDiscardFramebufferEXT; michael@0: #endif michael@0: functions->fUniform1f = glUniform1f; michael@0: functions->fUniform1i = glUniform1i; michael@0: functions->fUniform1fv = glUniform1fv; michael@0: functions->fUniform1iv = glUniform1iv; michael@0: functions->fUniform2f = glUniform2f; michael@0: functions->fUniform2i = glUniform2i; michael@0: functions->fUniform2fv = glUniform2fv; michael@0: functions->fUniform2iv = glUniform2iv; michael@0: functions->fUniform3f = glUniform3f; michael@0: functions->fUniform3i = glUniform3i; michael@0: functions->fUniform3fv = glUniform3fv; michael@0: functions->fUniform3iv = glUniform3iv; michael@0: functions->fUniform4f = glUniform4f; michael@0: functions->fUniform4i = glUniform4i; michael@0: functions->fUniform4fv = glUniform4fv; michael@0: functions->fUniform4iv = glUniform4iv; michael@0: functions->fUniformMatrix2fv = glUniformMatrix2fv; michael@0: functions->fUniformMatrix3fv = glUniformMatrix3fv; michael@0: functions->fUniformMatrix4fv = glUniformMatrix4fv; michael@0: functions->fUseProgram = glUseProgram; michael@0: functions->fVertexAttrib4fv = glVertexAttrib4fv; michael@0: functions->fVertexAttribPointer = glVertexAttribPointer; michael@0: functions->fViewport = glViewport; michael@0: functions->fBindFramebuffer = glBindFramebuffer; michael@0: functions->fBindRenderbuffer = glBindRenderbuffer; michael@0: functions->fCheckFramebufferStatus = glCheckFramebufferStatus; michael@0: functions->fDeleteFramebuffers = glDeleteFramebuffers; michael@0: functions->fDeleteRenderbuffers = glDeleteRenderbuffers; michael@0: functions->fFramebufferRenderbuffer = glFramebufferRenderbuffer; michael@0: functions->fFramebufferTexture2D = glFramebufferTexture2D; michael@0: michael@0: if (version >= GR_GL_VER(3,0)) { michael@0: #if GL_ES_VERSION_3_0 michael@0: functions->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample; michael@0: functions->fBlitFramebuffer = glBlitFramebuffer; michael@0: #else michael@0: functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample"); michael@0: functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("glBlitFramebuffer"); michael@0: #endif michael@0: } michael@0: michael@0: if (extensions.has("GL_EXT_multisampled_render_to_texture")) { michael@0: #if GL_EXT_multisampled_render_to_texture michael@0: functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleEXT; michael@0: functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT; michael@0: #else michael@0: functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleEXT"); michael@0: functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleEXT"); michael@0: #endif michael@0: } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) { michael@0: #if GL_IMG_multisampled_render_to_texture michael@0: functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleIMG; michael@0: functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG; michael@0: #else michael@0: functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleIMG"); michael@0: functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG"); michael@0: #endif michael@0: } michael@0: michael@0: functions->fGenFramebuffers = glGenFramebuffers; michael@0: functions->fGenRenderbuffers = glGenRenderbuffers; michael@0: functions->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv; michael@0: functions->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv; michael@0: functions->fRenderbufferStorage = glRenderbufferStorage; michael@0: #if GL_OES_mapbuffer michael@0: functions->fMapBuffer = glMapBufferOES; michael@0: functions->fUnmapBuffer = glUnmapBufferOES; michael@0: #else michael@0: functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES"); michael@0: functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES"); michael@0: #endif michael@0: michael@0: if (extensions.has("GL_EXT_debug_marker")) { michael@0: functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarkerEXT"); michael@0: functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarkerEXT"); michael@0: functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGropuMarkerEXT"); michael@0: } michael@0: michael@0: return interface; michael@0: } michael@0: michael@0: static GrGLInterface* create_desktop_interface(GrGLVersion version, michael@0: const GrGLExtensions& extensions) { michael@0: // Currently this assumes a 4.4 context or later. Supporting lower GL versions would require michael@0: // getting suffixed versions of pointers for supported extensions. michael@0: if (version < GR_GL_VER(4,4)) { michael@0: return NULL; michael@0: } michael@0: michael@0: GrGLInterface* interface = SkNEW(GrGLInterface); michael@0: interface->fStandard = kGL_GrGLStandard; michael@0: GrGLInterface::Functions* functions = &interface->fFunctions; michael@0: michael@0: functions->fActiveTexture = (GrGLActiveTextureProc) eglGetProcAddress("glActiveTexture"); michael@0: functions->fAttachShader = (GrGLAttachShaderProc) eglGetProcAddress("glAttachShader"); michael@0: functions->fBeginQuery = (GrGLBeginQueryProc) eglGetProcAddress("glBeginQuery"); michael@0: functions->fBindAttribLocation = (GrGLBindAttribLocationProc) eglGetProcAddress("glBindAttribLocation"); michael@0: functions->fBindBuffer = (GrGLBindBufferProc) eglGetProcAddress("glBindBuffer"); michael@0: functions->fBindFragDataLocation = (GrGLBindFragDataLocationProc) eglGetProcAddress("glBindFragDataLocation"); michael@0: functions->fBindFragDataLocationIndexed = (GrGLBindFragDataLocationIndexedProc) eglGetProcAddress("glBindFragDataLocationIndexed"); michael@0: functions->fBindFramebuffer = (GrGLBindFramebufferProc) eglGetProcAddress("glBindFramebuffer"); michael@0: functions->fBindRenderbuffer = (GrGLBindRenderbufferProc) eglGetProcAddress("glBindRenderbuffer"); michael@0: functions->fBindTexture = (GrGLBindTextureProc) eglGetProcAddress("glBindTexture"); michael@0: functions->fBindVertexArray = (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArray"); michael@0: functions->fBlendColor = (GrGLBlendColorProc) eglGetProcAddress("glBlendColor"); michael@0: functions->fBlendFunc = (GrGLBlendFuncProc) eglGetProcAddress("glBlendFunc"); michael@0: functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("glBlitFramebuffer"); michael@0: functions->fBufferData = (GrGLBufferDataProc) eglGetProcAddress("glBufferData"); michael@0: functions->fBufferSubData = (GrGLBufferSubDataProc) eglGetProcAddress("glBufferSubData"); michael@0: functions->fCheckFramebufferStatus = (GrGLCheckFramebufferStatusProc) eglGetProcAddress("glCheckFramebufferStatus"); michael@0: functions->fClear = (GrGLClearProc) eglGetProcAddress("glClear"); michael@0: functions->fClearColor = (GrGLClearColorProc) eglGetProcAddress("glClearColor"); michael@0: functions->fClearStencil = (GrGLClearStencilProc) eglGetProcAddress("glClearStencil"); michael@0: functions->fColorMask = (GrGLColorMaskProc) eglGetProcAddress("glColorMask"); michael@0: functions->fCompileShader = (GrGLCompileShaderProc) eglGetProcAddress("glCompileShader"); michael@0: functions->fCompressedTexImage2D = (GrGLCompressedTexImage2DProc) eglGetProcAddress("glCompressedTexImage2D"); michael@0: functions->fCopyTexSubImage2D = (GrGLCopyTexSubImage2DProc) eglGetProcAddress("glCopyTexSubImage2D"); michael@0: functions->fCreateProgram = (GrGLCreateProgramProc) eglGetProcAddress("glCreateProgram"); michael@0: functions->fCreateShader = (GrGLCreateShaderProc) eglGetProcAddress("glCreateShader"); michael@0: functions->fCullFace = (GrGLCullFaceProc) eglGetProcAddress("glCullFace"); michael@0: functions->fDeleteBuffers = (GrGLDeleteBuffersProc) eglGetProcAddress("glDeleteBuffers"); michael@0: functions->fDeleteFramebuffers = (GrGLDeleteFramebuffersProc) eglGetProcAddress("glDeleteFramebuffers"); michael@0: functions->fDeleteProgram = (GrGLDeleteProgramProc) eglGetProcAddress("glDeleteProgram"); michael@0: functions->fDeleteQueries = (GrGLDeleteQueriesProc) eglGetProcAddress("glDeleteQueries"); michael@0: functions->fDeleteRenderbuffers = (GrGLDeleteRenderbuffersProc) eglGetProcAddress("glDeleteRenderbuffers"); michael@0: functions->fDeleteShader = (GrGLDeleteShaderProc) eglGetProcAddress("glDeleteShader"); michael@0: functions->fDeleteTextures = (GrGLDeleteTexturesProc) eglGetProcAddress("glDeleteTextures"); michael@0: functions->fDeleteVertexArrays = (GrGLDeleteVertexArraysProc) eglGetProcAddress("glDeleteVertexArrays"); michael@0: functions->fDepthMask = (GrGLDepthMaskProc) eglGetProcAddress("glDepthMask"); michael@0: functions->fDisable = (GrGLDisableProc) eglGetProcAddress("glDisable"); michael@0: functions->fDisableVertexAttribArray = (GrGLDisableVertexAttribArrayProc) eglGetProcAddress("glDisableVertexAttribArray"); michael@0: functions->fDrawArrays = (GrGLDrawArraysProc) eglGetProcAddress("glDrawArrays"); michael@0: functions->fDrawBuffer = (GrGLDrawBufferProc) eglGetProcAddress("glDrawBuffer"); michael@0: functions->fDrawBuffers = (GrGLDrawBuffersProc) eglGetProcAddress("glDrawBuffers"); michael@0: functions->fDrawElements = (GrGLDrawElementsProc) eglGetProcAddress("glDrawElements"); michael@0: functions->fEnable = (GrGLEnableProc) eglGetProcAddress("glEnable"); michael@0: functions->fEnableVertexAttribArray = (GrGLEnableVertexAttribArrayProc) eglGetProcAddress("glEnableVertexAttribArray"); michael@0: functions->fEndQuery = (GrGLEndQueryProc) eglGetProcAddress("glEndQuery"); michael@0: functions->fFinish = (GrGLFinishProc) eglGetProcAddress("glFinish"); michael@0: functions->fFlush = (GrGLFlushProc) eglGetProcAddress("glFlush"); michael@0: functions->fFramebufferRenderbuffer = (GrGLFramebufferRenderbufferProc) eglGetProcAddress("glFramebufferRenderbuffer"); michael@0: functions->fFramebufferTexture2D = (GrGLFramebufferTexture2DProc) eglGetProcAddress("glFramebufferTexture2D"); michael@0: functions->fFrontFace = (GrGLFrontFaceProc) eglGetProcAddress("glFrontFace"); michael@0: functions->fGenBuffers = (GrGLGenBuffersProc) eglGetProcAddress("glGenBuffers"); michael@0: functions->fGenFramebuffers = (GrGLGenFramebuffersProc) eglGetProcAddress("glGenFramebuffers"); michael@0: functions->fGenerateMipmap = (GrGLGenerateMipmapProc) eglGetProcAddress("glGenerateMipmap"); michael@0: functions->fGenQueries = (GrGLGenQueriesProc) eglGetProcAddress("glGenQueries"); michael@0: functions->fGenRenderbuffers = (GrGLGenRenderbuffersProc) eglGetProcAddress("glGenRenderbuffers"); michael@0: functions->fGenTextures = (GrGLGenTexturesProc) eglGetProcAddress("glGenTextures"); michael@0: functions->fGenVertexArrays = (GrGLGenVertexArraysProc) eglGetProcAddress("glGenVertexArrays"); michael@0: functions->fGetBufferParameteriv = (GrGLGetBufferParameterivProc) eglGetProcAddress("glGetBufferParameteriv"); michael@0: functions->fGetError = (GrGLGetErrorProc) eglGetProcAddress("glGetError"); michael@0: functions->fGetFramebufferAttachmentParameteriv = (GrGLGetFramebufferAttachmentParameterivProc) eglGetProcAddress("glGetFramebufferAttachmentParameteriv"); michael@0: functions->fGetIntegerv = (GrGLGetIntegervProc) eglGetProcAddress("glGetIntegerv"); michael@0: functions->fGetQueryObjecti64v = (GrGLGetQueryObjecti64vProc) eglGetProcAddress("glGetQueryObjecti64v"); michael@0: functions->fGetQueryObjectiv = (GrGLGetQueryObjectivProc) eglGetProcAddress("glGetQueryObjectiv"); michael@0: functions->fGetQueryObjectui64v = (GrGLGetQueryObjectui64vProc) eglGetProcAddress("glGetQueryObjectui64v"); michael@0: functions->fGetQueryObjectuiv = (GrGLGetQueryObjectuivProc) eglGetProcAddress("glGetQueryObjectuiv"); michael@0: functions->fGetQueryiv = (GrGLGetQueryivProc) eglGetProcAddress("glGetQueryiv"); michael@0: functions->fGetProgramInfoLog = (GrGLGetProgramInfoLogProc) eglGetProcAddress("glGetProgramInfoLog"); michael@0: functions->fGetProgramiv = (GrGLGetProgramivProc) eglGetProcAddress("glGetProgramiv"); michael@0: functions->fGetRenderbufferParameteriv = (GrGLGetRenderbufferParameterivProc) eglGetProcAddress("glGetRenderbufferParameteriv"); michael@0: functions->fGetShaderInfoLog = (GrGLGetShaderInfoLogProc) eglGetProcAddress("glGetShaderInfoLog"); michael@0: functions->fGetShaderiv = (GrGLGetShaderivProc) eglGetProcAddress("glGetShaderiv"); michael@0: functions->fGetString = (GrGLGetStringProc) eglGetProcAddress("glGetString"); michael@0: functions->fGetStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi"); michael@0: functions->fGetTexLevelParameteriv = (GrGLGetTexLevelParameterivProc) eglGetProcAddress("glGetTexLevelParameteriv"); michael@0: functions->fGetUniformLocation = (GrGLGetUniformLocationProc) eglGetProcAddress("glGetUniformLocation"); michael@0: functions->fLineWidth = (GrGLLineWidthProc) eglGetProcAddress("glLineWidth"); michael@0: functions->fLinkProgram = (GrGLLinkProgramProc) eglGetProcAddress("glLinkProgram"); michael@0: functions->fLoadIdentity = (GrGLLoadIdentityProc) eglGetProcAddress("glLoadIdentity"); michael@0: functions->fLoadMatrixf = (GrGLLoadMatrixfProc) eglGetProcAddress("glLoadMatrixf"); michael@0: functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBuffer"); michael@0: functions->fMatrixMode = (GrGLMatrixModeProc) eglGetProcAddress("glMatrixMode"); michael@0: functions->fPixelStorei = (GrGLPixelStoreiProc) eglGetProcAddress("glPixelStorei"); michael@0: functions->fQueryCounter = (GrGLQueryCounterProc) eglGetProcAddress("glQueryCounter"); michael@0: functions->fReadBuffer = (GrGLReadBufferProc) eglGetProcAddress("glReadBuffer"); michael@0: functions->fReadPixels = (GrGLReadPixelsProc) eglGetProcAddress("glReadPixels"); michael@0: functions->fRenderbufferStorage = (GrGLRenderbufferStorageProc) eglGetProcAddress("glRenderbufferStorage"); michael@0: functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample"); michael@0: functions->fScissor = (GrGLScissorProc) eglGetProcAddress("glScissor"); michael@0: functions->fShaderSource = (GrGLShaderSourceProc) eglGetProcAddress("glShaderSource"); michael@0: functions->fStencilFunc = (GrGLStencilFuncProc) eglGetProcAddress("glStencilFunc"); michael@0: functions->fStencilFuncSeparate = (GrGLStencilFuncSeparateProc) eglGetProcAddress("glStencilFuncSeparate"); michael@0: functions->fStencilMask = (GrGLStencilMaskProc) eglGetProcAddress("glStencilMask"); michael@0: functions->fStencilMaskSeparate = (GrGLStencilMaskSeparateProc) eglGetProcAddress("glStencilMaskSeparate"); michael@0: functions->fStencilOp = (GrGLStencilOpProc) eglGetProcAddress("glStencilOp"); michael@0: functions->fStencilOpSeparate = (GrGLStencilOpSeparateProc) eglGetProcAddress("glStencilOpSeparate"); michael@0: functions->fTexGenfv = (GrGLTexGenfvProc) eglGetProcAddress("glTexGenfv"); michael@0: functions->fTexGeni = (GrGLTexGeniProc) eglGetProcAddress("glTexGeni"); michael@0: functions->fTexImage2D = (GrGLTexImage2DProc) eglGetProcAddress("glTexImage2D"); michael@0: functions->fTexParameteri = (GrGLTexParameteriProc) eglGetProcAddress("glTexParameteri"); michael@0: functions->fTexParameteriv = (GrGLTexParameterivProc) eglGetProcAddress("glTexParameteriv"); michael@0: functions->fTexSubImage2D = (GrGLTexSubImage2DProc) eglGetProcAddress("glTexSubImage2D"); michael@0: functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2D"); michael@0: functions->fUniform1f = (GrGLUniform1fProc) eglGetProcAddress("glUniform1f"); michael@0: functions->fUniform1i = (GrGLUniform1iProc) eglGetProcAddress("glUniform1i"); michael@0: functions->fUniform1fv = (GrGLUniform1fvProc) eglGetProcAddress("glUniform1fv"); michael@0: functions->fUniform1iv = (GrGLUniform1ivProc) eglGetProcAddress("glUniform1iv"); michael@0: functions->fUniform2f = (GrGLUniform2fProc) eglGetProcAddress("glUniform2f"); michael@0: functions->fUniform2i = (GrGLUniform2iProc) eglGetProcAddress("glUniform2i"); michael@0: functions->fUniform2fv = (GrGLUniform2fvProc) eglGetProcAddress("glUniform2fv"); michael@0: functions->fUniform2iv = (GrGLUniform2ivProc) eglGetProcAddress("glUniform2iv"); michael@0: functions->fUniform3f = (GrGLUniform3fProc) eglGetProcAddress("glUniform3f"); michael@0: functions->fUniform3i = (GrGLUniform3iProc) eglGetProcAddress("glUniform3i"); michael@0: functions->fUniform3fv = (GrGLUniform3fvProc) eglGetProcAddress("glUniform3fv"); michael@0: functions->fUniform3iv = (GrGLUniform3ivProc) eglGetProcAddress("glUniform3iv"); michael@0: functions->fUniform4f = (GrGLUniform4fProc) eglGetProcAddress("glUniform4f"); michael@0: functions->fUniform4i = (GrGLUniform4iProc) eglGetProcAddress("glUniform4i"); michael@0: functions->fUniform4fv = (GrGLUniform4fvProc) eglGetProcAddress("glUniform4fv"); michael@0: functions->fUniform4iv = (GrGLUniform4ivProc) eglGetProcAddress("glUniform4iv"); michael@0: functions->fUniformMatrix2fv = (GrGLUniformMatrix2fvProc) eglGetProcAddress("glUniformMatrix2fv"); michael@0: functions->fUniformMatrix3fv = (GrGLUniformMatrix3fvProc) eglGetProcAddress("glUniformMatrix3fv"); michael@0: functions->fUniformMatrix4fv = (GrGLUniformMatrix4fvProc) eglGetProcAddress("glUniformMatrix4fv"); michael@0: functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBuffer"); michael@0: functions->fUseProgram = (GrGLUseProgramProc) eglGetProcAddress("glUseProgram"); michael@0: functions->fVertexAttrib4fv = (GrGLVertexAttrib4fvProc) eglGetProcAddress("glVertexAttrib4fv"); michael@0: functions->fVertexAttribPointer = (GrGLVertexAttribPointerProc) eglGetProcAddress("glVertexAttribPointer"); michael@0: functions->fViewport = (GrGLViewportProc) eglGetProcAddress("glViewport"); michael@0: michael@0: if (extensions.has("GL_NV_path_rendering")) { michael@0: functions->fPathCommands = (GrGLPathCommandsProc) eglGetProcAddress("glPathCommandsNV"); michael@0: functions->fPathCoords = (GrGLPathCoordsProc) eglGetProcAddress("glPathCoordsNV"); michael@0: functions->fPathSubCommands = (GrGLPathSubCommandsProc) eglGetProcAddress("glPathSubCommandsNV"); michael@0: functions->fPathSubCoords = (GrGLPathSubCoordsProc) eglGetProcAddress("glPathSubCoordsNV"); michael@0: functions->fPathString = (GrGLPathStringProc) eglGetProcAddress("glPathStringNV"); michael@0: functions->fPathGlyphs = (GrGLPathGlyphsProc) eglGetProcAddress("glPathGlyphsNV"); michael@0: functions->fPathGlyphRange = (GrGLPathGlyphRangeProc) eglGetProcAddress("glPathGlyphRangeNV"); michael@0: functions->fWeightPaths = (GrGLWeightPathsProc) eglGetProcAddress("glWeightPathsNV"); michael@0: functions->fCopyPath = (GrGLCopyPathProc) eglGetProcAddress("glCopyPathNV"); michael@0: functions->fInterpolatePaths = (GrGLInterpolatePathsProc) eglGetProcAddress("glInterpolatePathsNV"); michael@0: functions->fTransformPath = (GrGLTransformPathProc) eglGetProcAddress("glTransformPathNV"); michael@0: functions->fPathParameteriv = (GrGLPathParameterivProc) eglGetProcAddress("glPathParameterivNV"); michael@0: functions->fPathParameteri = (GrGLPathParameteriProc) eglGetProcAddress("glPathParameteriNV"); michael@0: functions->fPathParameterfv = (GrGLPathParameterfvProc) eglGetProcAddress("glPathParameterfvNV"); michael@0: functions->fPathParameterf = (GrGLPathParameterfProc) eglGetProcAddress("glPathParameterfNV"); michael@0: functions->fPathDashArray = (GrGLPathDashArrayProc) eglGetProcAddress("glPathDashArrayNV"); michael@0: functions->fGenPaths = (GrGLGenPathsProc) eglGetProcAddress("glGenPathsNV"); michael@0: functions->fDeletePaths = (GrGLDeletePathsProc) eglGetProcAddress("glDeletePathsNV"); michael@0: functions->fIsPath = (GrGLIsPathProc) eglGetProcAddress("glIsPathNV"); michael@0: functions->fPathStencilFunc = (GrGLPathStencilFuncProc) eglGetProcAddress("glPathStencilFuncNV"); michael@0: functions->fPathStencilDepthOffset = (GrGLPathStencilDepthOffsetProc) eglGetProcAddress("glPathStencilDepthOffsetNV"); michael@0: functions->fStencilFillPath = (GrGLStencilFillPathProc) eglGetProcAddress("glStencilFillPathNV"); michael@0: functions->fStencilStrokePath = (GrGLStencilStrokePathProc) eglGetProcAddress("glStencilStrokePathNV"); michael@0: functions->fStencilFillPathInstanced = (GrGLStencilFillPathInstancedProc) eglGetProcAddress("glStencilFillPathInstancedNV"); michael@0: functions->fStencilStrokePathInstanced = (GrGLStencilStrokePathInstancedProc) eglGetProcAddress("glStencilStrokePathInstancedNV"); michael@0: functions->fPathCoverDepthFunc = (GrGLPathCoverDepthFuncProc) eglGetProcAddress("glPathCoverDepthFuncNV"); michael@0: functions->fPathColorGen = (GrGLPathColorGenProc) eglGetProcAddress("glPathColorGenNV"); michael@0: functions->fPathTexGen = (GrGLPathTexGenProc) eglGetProcAddress("glPathTexGenNV"); michael@0: functions->fPathFogGen = (GrGLPathFogGenProc) eglGetProcAddress("glPathFogGenNV"); michael@0: functions->fCoverFillPath = (GrGLCoverFillPathProc) eglGetProcAddress("glCoverFillPathNV"); michael@0: functions->fCoverStrokePath = (GrGLCoverStrokePathProc) eglGetProcAddress("glCoverStrokePathNV"); michael@0: functions->fCoverFillPathInstanced = (GrGLCoverFillPathInstancedProc) eglGetProcAddress("glCoverFillPathInstancedNV"); michael@0: functions->fCoverStrokePathInstanced = (GrGLCoverStrokePathInstancedProc) eglGetProcAddress("glCoverStrokePathInstancedNV"); michael@0: functions->fGetPathParameteriv = (GrGLGetPathParameterivProc) eglGetProcAddress("glGetPathParameterivNV"); michael@0: functions->fGetPathParameterfv = (GrGLGetPathParameterfvProc) eglGetProcAddress("glGetPathParameterfvNV"); michael@0: functions->fGetPathCommands = (GrGLGetPathCommandsProc) eglGetProcAddress("glGetPathCommandsNV"); michael@0: functions->fGetPathCoords = (GrGLGetPathCoordsProc) eglGetProcAddress("glGetPathCoordsNV"); michael@0: functions->fGetPathDashArray = (GrGLGetPathDashArrayProc) eglGetProcAddress("glGetPathDashArrayNV"); michael@0: functions->fGetPathMetrics = (GrGLGetPathMetricsProc) eglGetProcAddress("glGetPathMetricsNV"); michael@0: functions->fGetPathMetricRange = (GrGLGetPathMetricRangeProc) eglGetProcAddress("glGetPathMetricRangeNV"); michael@0: functions->fGetPathSpacing = (GrGLGetPathSpacingProc) eglGetProcAddress("glGetPathSpacingNV"); michael@0: functions->fGetPathColorGeniv = (GrGLGetPathColorGenivProc) eglGetProcAddress("glGetPathColorGenivNV"); michael@0: functions->fGetPathColorGenfv = (GrGLGetPathColorGenfvProc) eglGetProcAddress("glGetPathColorGenfvNV"); michael@0: functions->fGetPathTexGeniv = (GrGLGetPathTexGenivProc) eglGetProcAddress("glGetPathTexGenivNV"); michael@0: functions->fGetPathTexGenfv = (GrGLGetPathTexGenfvProc) eglGetProcAddress("glGetPathTexGenfvNV"); michael@0: functions->fIsPointInFillPath = (GrGLIsPointInFillPathProc) eglGetProcAddress("glIsPointInFillPathNV"); michael@0: functions->fIsPointInStrokePath = (GrGLIsPointInStrokePathProc) eglGetProcAddress("glIsPointInStrokePathNV"); michael@0: functions->fGetPathLength = (GrGLGetPathLengthProc) eglGetProcAddress("glGetPathLengthNV"); michael@0: functions->fPointAlongPath = (GrGLPointAlongPathProc) eglGetProcAddress("glPointAlongPathNV"); michael@0: } michael@0: michael@0: if (extensions.has("GL_EXT_debug_marker")) { michael@0: functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarkerEXT"); michael@0: functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarkerEXT"); michael@0: functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGropuMarkerEXT"); michael@0: } michael@0: michael@0: return interface; michael@0: } michael@0: michael@0: const GrGLInterface* GrGLCreateNativeInterface() { michael@0: michael@0: GrGLGetStringiProc getStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi"); michael@0: michael@0: const char* verStr = reinterpret_cast(glGetString(GR_GL_VERSION)); michael@0: GrGLVersion version = GrGLGetVersionFromString(verStr); michael@0: GrGLStandard standard = GrGLGetStandardInUseFromString(verStr); michael@0: michael@0: GrGLExtensions extensions; michael@0: if (!extensions.init(standard, glGetString, getStringi, glGetIntegerv)) { michael@0: return NULL; michael@0: } michael@0: michael@0: GrGLInterface* interface = NULL; michael@0: if (kGLES_GrGLStandard == standard) { michael@0: interface = create_es_interface(version, extensions); michael@0: } else if (kGL_GrGLStandard == standard) { michael@0: interface = create_desktop_interface(version, extensions); michael@0: } michael@0: michael@0: if (NULL != interface) { michael@0: interface->fExtensions.swap(&extensions); michael@0: } michael@0: michael@0: return interface; michael@0: }