1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,286 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "gl/GrGLInterface.h" 1.14 +#include "../GrGLUtil.h" 1.15 + 1.16 +#include <GL/glx.h> 1.17 +#include <GL/gl.h> 1.18 +#include <GL/glext.h> 1.19 +#include <GL/glu.h> 1.20 + 1.21 +#define GR_GL_GET_PROC(F) interface->fFunctions.f ## F = (GrGL ## F ## Proc) \ 1.22 + glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F)); 1.23 +#define GR_GL_GET_PROC_SUFFIX(F, S) interface->fFunctions.f ## F = (GrGL ## F ## Proc) \ 1.24 + glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S)); 1.25 + 1.26 +const GrGLInterface* GrGLCreateNativeInterface() { 1.27 + if (NULL != glXGetCurrentContext()) { 1.28 + 1.29 + const char* versionString = (const char*) glGetString(GL_VERSION); 1.30 + GrGLVersion glVer = GrGLGetVersionFromString(versionString); 1.31 + 1.32 + // This may or may not succeed depending on the gl version. 1.33 + GrGLGetStringiProc glGetStringi = 1.34 + (GrGLGetStringiProc) glXGetProcAddress(reinterpret_cast<const GLubyte*>("glGetStringi")); 1.35 + 1.36 + GrGLExtensions extensions; 1.37 + if (!extensions.init(kGL_GrGLStandard, glGetString, glGetStringi, glGetIntegerv)) { 1.38 + return NULL; 1.39 + } 1.40 + 1.41 + if (glVer < GR_GL_VER(1,5)) { 1.42 + // We must have array and element_array buffer objects. 1.43 + return NULL; 1.44 + } 1.45 + 1.46 + GrGLInterface* interface = SkNEW(GrGLInterface()); 1.47 + GrGLInterface::Functions* functions = &interface->fFunctions; 1.48 + 1.49 + functions->fActiveTexture = glActiveTexture; 1.50 + GR_GL_GET_PROC(AttachShader); 1.51 + GR_GL_GET_PROC(BindAttribLocation); 1.52 + GR_GL_GET_PROC(BindBuffer); 1.53 + GR_GL_GET_PROC(BindFragDataLocation); 1.54 + GR_GL_GET_PROC(BeginQuery); 1.55 + functions->fBindTexture = glBindTexture; 1.56 + functions->fBlendFunc = glBlendFunc; 1.57 + 1.58 + if (glVer >= GR_GL_VER(1,4) || 1.59 + extensions.has("GL_ARB_imaging") || 1.60 + extensions.has("GL_EXT_blend_color")) { 1.61 + GR_GL_GET_PROC(BlendColor); 1.62 + } 1.63 + 1.64 + GR_GL_GET_PROC(BufferData); 1.65 + GR_GL_GET_PROC(BufferSubData); 1.66 + functions->fClear = glClear; 1.67 + functions->fClearColor = glClearColor; 1.68 + functions->fClearStencil = glClearStencil; 1.69 + functions->fColorMask = glColorMask; 1.70 + GR_GL_GET_PROC(CompileShader); 1.71 + functions->fCompressedTexImage2D = glCompressedTexImage2D; 1.72 + functions->fCopyTexSubImage2D = glCopyTexSubImage2D; 1.73 + GR_GL_GET_PROC(CreateProgram); 1.74 + GR_GL_GET_PROC(CreateShader); 1.75 + functions->fCullFace = glCullFace; 1.76 + GR_GL_GET_PROC(DeleteBuffers); 1.77 + GR_GL_GET_PROC(DeleteProgram); 1.78 + GR_GL_GET_PROC(DeleteQueries); 1.79 + GR_GL_GET_PROC(DeleteShader); 1.80 + functions->fDeleteTextures = glDeleteTextures; 1.81 + functions->fDepthMask = glDepthMask; 1.82 + functions->fDisable = glDisable; 1.83 + GR_GL_GET_PROC(DisableVertexAttribArray); 1.84 + functions->fDrawArrays = glDrawArrays; 1.85 + functions->fDrawBuffer = glDrawBuffer; 1.86 + GR_GL_GET_PROC(DrawBuffers); 1.87 + functions->fDrawElements = glDrawElements; 1.88 + functions->fEnable = glEnable; 1.89 + GR_GL_GET_PROC(EnableVertexAttribArray); 1.90 + GR_GL_GET_PROC(EndQuery); 1.91 + functions->fFinish = glFinish; 1.92 + functions->fFlush = glFlush; 1.93 + functions->fFrontFace = glFrontFace; 1.94 + GR_GL_GET_PROC(GenBuffers); 1.95 + GR_GL_GET_PROC(GenerateMipmap); 1.96 + GR_GL_GET_PROC(GetBufferParameteriv); 1.97 + functions->fGetError = glGetError; 1.98 + functions->fGetIntegerv = glGetIntegerv; 1.99 + GR_GL_GET_PROC(GetQueryObjectiv); 1.100 + GR_GL_GET_PROC(GetQueryObjectuiv); 1.101 + if (glVer >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) { 1.102 + GR_GL_GET_PROC(GetQueryObjecti64v); 1.103 + GR_GL_GET_PROC(GetQueryObjectui64v); 1.104 + GR_GL_GET_PROC(QueryCounter); 1.105 + } else if (extensions.has("GL_EXT_timer_query")) { 1.106 + GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT); 1.107 + GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT); 1.108 + } 1.109 + GR_GL_GET_PROC(GetQueryiv); 1.110 + GR_GL_GET_PROC(GetProgramInfoLog); 1.111 + GR_GL_GET_PROC(GetProgramiv); 1.112 + GR_GL_GET_PROC(GetShaderInfoLog); 1.113 + GR_GL_GET_PROC(GetShaderiv); 1.114 + functions->fGetString = glGetString; 1.115 + GR_GL_GET_PROC(GetStringi); 1.116 + functions->fGetTexLevelParameteriv = glGetTexLevelParameteriv; 1.117 + GR_GL_GET_PROC(GenQueries); 1.118 + functions->fGenTextures = glGenTextures; 1.119 + GR_GL_GET_PROC(GetUniformLocation); 1.120 + functions->fLineWidth = glLineWidth; 1.121 + GR_GL_GET_PROC(LinkProgram); 1.122 + GR_GL_GET_PROC(MapBuffer); 1.123 + functions->fPixelStorei = glPixelStorei; 1.124 + functions->fReadBuffer = glReadBuffer; 1.125 + functions->fReadPixels = glReadPixels; 1.126 + functions->fScissor = glScissor; 1.127 + GR_GL_GET_PROC(ShaderSource); 1.128 + functions->fStencilFunc = glStencilFunc; 1.129 + GR_GL_GET_PROC(StencilFuncSeparate); 1.130 + functions->fStencilMask = glStencilMask; 1.131 + GR_GL_GET_PROC(StencilMaskSeparate); 1.132 + functions->fStencilOp = glStencilOp; 1.133 + GR_GL_GET_PROC(StencilOpSeparate); 1.134 + functions->fTexImage2D = glTexImage2D; 1.135 + functions->fTexGenfv = glTexGenfv; 1.136 + functions->fTexGeni = glTexGeni; 1.137 + functions->fTexParameteri = glTexParameteri; 1.138 + functions->fTexParameteriv = glTexParameteriv; 1.139 + if (glVer >= GR_GL_VER(4,2) || extensions.has("GL_ARB_texture_storage")) { 1.140 + GR_GL_GET_PROC(TexStorage2D); 1.141 + } else if (extensions.has("GL_EXT_texture_storage")) { 1.142 + GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT); 1.143 + } 1.144 + functions->fTexSubImage2D = glTexSubImage2D; 1.145 + GR_GL_GET_PROC(Uniform1f); 1.146 + GR_GL_GET_PROC(Uniform1i); 1.147 + GR_GL_GET_PROC(Uniform1fv); 1.148 + GR_GL_GET_PROC(Uniform1iv); 1.149 + GR_GL_GET_PROC(Uniform2f); 1.150 + GR_GL_GET_PROC(Uniform2i); 1.151 + GR_GL_GET_PROC(Uniform2fv); 1.152 + GR_GL_GET_PROC(Uniform2iv); 1.153 + GR_GL_GET_PROC(Uniform3f); 1.154 + GR_GL_GET_PROC(Uniform3i); 1.155 + GR_GL_GET_PROC(Uniform3fv); 1.156 + GR_GL_GET_PROC(Uniform3iv); 1.157 + GR_GL_GET_PROC(Uniform4f); 1.158 + GR_GL_GET_PROC(Uniform4i); 1.159 + GR_GL_GET_PROC(Uniform4fv); 1.160 + GR_GL_GET_PROC(Uniform4iv); 1.161 + GR_GL_GET_PROC(UniformMatrix2fv); 1.162 + GR_GL_GET_PROC(UniformMatrix3fv); 1.163 + GR_GL_GET_PROC(UniformMatrix4fv); 1.164 + GR_GL_GET_PROC(UnmapBuffer); 1.165 + GR_GL_GET_PROC(UseProgram); 1.166 + GR_GL_GET_PROC(VertexAttrib4fv); 1.167 + GR_GL_GET_PROC(VertexAttribPointer); 1.168 + functions->fViewport = glViewport; 1.169 + GR_GL_GET_PROC(BindFragDataLocationIndexed); 1.170 + 1.171 + if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) { 1.172 + // no ARB suffix for GL_ARB_vertex_array_object 1.173 + GR_GL_GET_PROC(BindVertexArray); 1.174 + GR_GL_GET_PROC(GenVertexArrays); 1.175 + GR_GL_GET_PROC(DeleteVertexArrays); 1.176 + } 1.177 + 1.178 + // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since 1.179 + // GL_ARB_framebuffer_object doesn't use ARB suffix.) 1.180 + if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) { 1.181 + GR_GL_GET_PROC(GenFramebuffers); 1.182 + GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv); 1.183 + GR_GL_GET_PROC(GetRenderbufferParameteriv); 1.184 + GR_GL_GET_PROC(BindFramebuffer); 1.185 + GR_GL_GET_PROC(FramebufferTexture2D); 1.186 + GR_GL_GET_PROC(CheckFramebufferStatus); 1.187 + GR_GL_GET_PROC(DeleteFramebuffers); 1.188 + GR_GL_GET_PROC(RenderbufferStorage); 1.189 + GR_GL_GET_PROC(GenRenderbuffers); 1.190 + GR_GL_GET_PROC(DeleteRenderbuffers); 1.191 + GR_GL_GET_PROC(FramebufferRenderbuffer); 1.192 + GR_GL_GET_PROC(BindRenderbuffer); 1.193 + GR_GL_GET_PROC(RenderbufferStorageMultisample); 1.194 + GR_GL_GET_PROC(BlitFramebuffer); 1.195 + } else if (extensions.has("GL_EXT_framebuffer_object")) { 1.196 + GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT); 1.197 + GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT); 1.198 + GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT); 1.199 + GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT); 1.200 + GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT); 1.201 + GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT); 1.202 + GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT); 1.203 + GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT); 1.204 + GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT); 1.205 + GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT); 1.206 + GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT); 1.207 + GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT); 1.208 + if (extensions.has("GL_EXT_framebuffer_multisample")) { 1.209 + GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT); 1.210 + } 1.211 + if (extensions.has("GL_EXT_framebuffer_blit")) { 1.212 + GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT); 1.213 + } 1.214 + } else { 1.215 + // we must have FBOs 1.216 + delete interface; 1.217 + return NULL; 1.218 + } 1.219 + 1.220 + GR_GL_GET_PROC(LoadIdentity); 1.221 + GR_GL_GET_PROC(LoadMatrixf); 1.222 + GR_GL_GET_PROC(MatrixMode); 1.223 + 1.224 + if (extensions.has("GL_NV_path_rendering")) { 1.225 + GR_GL_GET_PROC_SUFFIX(PathCommands, NV); 1.226 + GR_GL_GET_PROC_SUFFIX(PathCoords, NV); 1.227 + GR_GL_GET_PROC_SUFFIX(PathSubCommands, NV); 1.228 + GR_GL_GET_PROC_SUFFIX(PathSubCoords, NV); 1.229 + GR_GL_GET_PROC_SUFFIX(PathString, NV); 1.230 + GR_GL_GET_PROC_SUFFIX(PathGlyphs, NV); 1.231 + GR_GL_GET_PROC_SUFFIX(PathGlyphRange, NV); 1.232 + GR_GL_GET_PROC_SUFFIX(WeightPaths, NV); 1.233 + GR_GL_GET_PROC_SUFFIX(CopyPath, NV); 1.234 + GR_GL_GET_PROC_SUFFIX(InterpolatePaths, NV); 1.235 + GR_GL_GET_PROC_SUFFIX(TransformPath, NV); 1.236 + GR_GL_GET_PROC_SUFFIX(PathParameteriv, NV); 1.237 + GR_GL_GET_PROC_SUFFIX(PathParameteri, NV); 1.238 + GR_GL_GET_PROC_SUFFIX(PathParameterfv, NV); 1.239 + GR_GL_GET_PROC_SUFFIX(PathParameterf, NV); 1.240 + GR_GL_GET_PROC_SUFFIX(PathDashArray, NV); 1.241 + GR_GL_GET_PROC_SUFFIX(GenPaths, NV); 1.242 + GR_GL_GET_PROC_SUFFIX(DeletePaths, NV); 1.243 + GR_GL_GET_PROC_SUFFIX(IsPath, NV); 1.244 + GR_GL_GET_PROC_SUFFIX(PathStencilFunc, NV); 1.245 + GR_GL_GET_PROC_SUFFIX(PathStencilDepthOffset, NV); 1.246 + GR_GL_GET_PROC_SUFFIX(StencilFillPath, NV); 1.247 + GR_GL_GET_PROC_SUFFIX(StencilStrokePath, NV); 1.248 + GR_GL_GET_PROC_SUFFIX(StencilFillPathInstanced, NV); 1.249 + GR_GL_GET_PROC_SUFFIX(StencilStrokePathInstanced, NV); 1.250 + GR_GL_GET_PROC_SUFFIX(PathCoverDepthFunc, NV); 1.251 + GR_GL_GET_PROC_SUFFIX(PathColorGen, NV); 1.252 + GR_GL_GET_PROC_SUFFIX(PathTexGen, NV); 1.253 + GR_GL_GET_PROC_SUFFIX(PathFogGen, NV); 1.254 + GR_GL_GET_PROC_SUFFIX(CoverFillPath, NV); 1.255 + GR_GL_GET_PROC_SUFFIX(CoverStrokePath, NV); 1.256 + GR_GL_GET_PROC_SUFFIX(CoverFillPathInstanced, NV); 1.257 + GR_GL_GET_PROC_SUFFIX(CoverStrokePathInstanced, NV); 1.258 + GR_GL_GET_PROC_SUFFIX(GetPathParameteriv, NV); 1.259 + GR_GL_GET_PROC_SUFFIX(GetPathParameterfv, NV); 1.260 + GR_GL_GET_PROC_SUFFIX(GetPathCommands, NV); 1.261 + GR_GL_GET_PROC_SUFFIX(GetPathCoords, NV); 1.262 + GR_GL_GET_PROC_SUFFIX(GetPathDashArray, NV); 1.263 + GR_GL_GET_PROC_SUFFIX(GetPathMetrics, NV); 1.264 + GR_GL_GET_PROC_SUFFIX(GetPathMetricRange, NV); 1.265 + GR_GL_GET_PROC_SUFFIX(GetPathSpacing, NV); 1.266 + GR_GL_GET_PROC_SUFFIX(GetPathColorGeniv, NV); 1.267 + GR_GL_GET_PROC_SUFFIX(GetPathColorGenfv, NV); 1.268 + GR_GL_GET_PROC_SUFFIX(GetPathTexGeniv, NV); 1.269 + GR_GL_GET_PROC_SUFFIX(GetPathTexGenfv, NV); 1.270 + GR_GL_GET_PROC_SUFFIX(IsPointInFillPath, NV); 1.271 + GR_GL_GET_PROC_SUFFIX(IsPointInStrokePath, NV); 1.272 + GR_GL_GET_PROC_SUFFIX(GetPathLength, NV); 1.273 + GR_GL_GET_PROC_SUFFIX(PointAlongPath, NV); 1.274 + } 1.275 + 1.276 + if (extensions.has("GL_EXT_debug_marker")) { 1.277 + GR_GL_GET_PROC_SUFFIX(InsertEventMarker, EXT); 1.278 + GR_GL_GET_PROC_SUFFIX(PushGroupMarker, EXT); 1.279 + GR_GL_GET_PROC_SUFFIX(PopGroupMarker, EXT); 1.280 + } 1.281 + 1.282 + interface->fStandard = kGL_GrGLStandard; 1.283 + interface->fExtensions.swap(&extensions); 1.284 + 1.285 + return interface; 1.286 + } else { 1.287 + return NULL; 1.288 + } 1.289 +}