gfx/skia/trunk/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/trunk/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,247 @@
     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 <dlfcn.h>
    1.17 +
    1.18 +// We get the proc addresss of all GL functions dynamically because we sometimes link against
    1.19 +// alternative GL implementations (e.g. MESA) in addition to the native GL implementation.
    1.20 +class GLLoader {
    1.21 +public:
    1.22 +    GLLoader() {
    1.23 +        fLibrary = dlopen(
    1.24 +                    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib",
    1.25 +                    RTLD_LAZY);
    1.26 +    }
    1.27 +    ~GLLoader() {
    1.28 +        if (NULL != fLibrary) {
    1.29 +            dlclose(fLibrary);
    1.30 +        }
    1.31 +    }
    1.32 +    void* handle() {
    1.33 +        return NULL == fLibrary ? RTLD_DEFAULT : fLibrary;
    1.34 +    }
    1.35 +private:
    1.36 +    void* fLibrary;
    1.37 +};
    1.38 +
    1.39 +static void* GetProcAddress(const char* name) {
    1.40 +    static GLLoader gLoader;
    1.41 +    return dlsym(gLoader.handle(), name);
    1.42 +}
    1.43 +
    1.44 +#define GET_PROC(name) (interface->fFunctions.f ## name = ((GrGL ## name ## Proc) GetProcAddress("gl" #name)))
    1.45 +#define GET_PROC_SUFFIX(name, suffix) (interface->fFunctions.f ## name = ((GrGL ## name ## Proc) GetProcAddress("gl" #name #suffix)))
    1.46 +
    1.47 +const GrGLInterface* GrGLCreateNativeInterface() {
    1.48 +
    1.49 +    GrGLGetStringProc glGetString = (GrGLGetStringProc) GetProcAddress("glGetString");
    1.50 +    GrGLGetStringiProc glGetStringi = (GrGLGetStringiProc) GetProcAddress("glGetStringi");
    1.51 +    GrGLGetIntegervProc glGetIntegerv = (GrGLGetIntegervProc) GetProcAddress("glGetIntegerv");
    1.52 +
    1.53 +    const char* verStr = (const char*) glGetString(GR_GL_VERSION);
    1.54 +    GrGLVersion ver = GrGLGetVersionFromString(verStr);
    1.55 +    GrGLExtensions extensions;
    1.56 +    if (!extensions.init(kGL_GrGLStandard, glGetString, glGetStringi, glGetIntegerv)) {
    1.57 +        return NULL;
    1.58 +    }
    1.59 +
    1.60 +    GrGLInterface* interface = SkNEW(GrGLInterface);
    1.61 +    interface->fStandard = kGL_GrGLStandard;
    1.62 +
    1.63 +    GET_PROC(ActiveTexture);
    1.64 +    GET_PROC(AttachShader);
    1.65 +    GET_PROC(BeginQuery);
    1.66 +    GET_PROC(BindAttribLocation);
    1.67 +    GET_PROC(BindBuffer);
    1.68 +    if (ver >= GR_GL_VER(3,0)) {
    1.69 +        GET_PROC(BindFragDataLocation);
    1.70 +    }
    1.71 +    GET_PROC(BindTexture);
    1.72 +    GET_PROC(BlendFunc);
    1.73 +
    1.74 +    if (ver >= GR_GL_VER(1,4) ||
    1.75 +        extensions.has("GL_ARB_imaging") ||
    1.76 +        extensions.has("GL_EXT_blend_color")) {
    1.77 +        GET_PROC(BlendColor);
    1.78 +    }
    1.79 +
    1.80 +    GET_PROC(BufferData);
    1.81 +    GET_PROC(BufferSubData);
    1.82 +    GET_PROC(Clear);
    1.83 +    GET_PROC(ClearColor);
    1.84 +    GET_PROC(ClearStencil);
    1.85 +    GET_PROC(ColorMask);
    1.86 +    GET_PROC(CompileShader);
    1.87 +    GET_PROC(CompressedTexImage2D);
    1.88 +    GET_PROC(CopyTexSubImage2D);
    1.89 +    GET_PROC(CreateProgram);
    1.90 +    GET_PROC(CreateShader);
    1.91 +    GET_PROC(CullFace);
    1.92 +    GET_PROC(DeleteBuffers);
    1.93 +    GET_PROC(DeleteProgram);
    1.94 +    GET_PROC(DeleteQueries);
    1.95 +    GET_PROC(DeleteShader);
    1.96 +    GET_PROC(DeleteTextures);
    1.97 +    GET_PROC(DepthMask);
    1.98 +    GET_PROC(Disable);
    1.99 +    GET_PROC(DisableVertexAttribArray);
   1.100 +    GET_PROC(DrawArrays);
   1.101 +    GET_PROC(DrawBuffer);
   1.102 +    GET_PROC(DrawBuffers);
   1.103 +    GET_PROC(DrawElements);
   1.104 +    GET_PROC(Enable);
   1.105 +    GET_PROC(EnableVertexAttribArray);
   1.106 +    GET_PROC(EndQuery);
   1.107 +    GET_PROC(Finish);
   1.108 +    GET_PROC(Flush);
   1.109 +    GET_PROC(FrontFace);
   1.110 +    GET_PROC(GenBuffers);
   1.111 +    GET_PROC(GenerateMipmap);
   1.112 +    GET_PROC(GenQueries);
   1.113 +    GET_PROC(GetBufferParameteriv);
   1.114 +    GET_PROC(GetError);
   1.115 +    GET_PROC(GetIntegerv);
   1.116 +    GET_PROC(GetProgramInfoLog);
   1.117 +    GET_PROC(GetProgramiv);
   1.118 +    GET_PROC(GetQueryiv);
   1.119 +    GET_PROC(GetQueryObjectiv);
   1.120 +    GET_PROC(GetQueryObjectuiv);
   1.121 +    GET_PROC(GetShaderInfoLog);
   1.122 +    GET_PROC(GetShaderiv);
   1.123 +    GET_PROC(GetString);
   1.124 +    GET_PROC(GetStringi);
   1.125 +    GET_PROC(GetTexLevelParameteriv);
   1.126 +    GET_PROC(GenTextures);
   1.127 +    GET_PROC(GetUniformLocation);
   1.128 +    GET_PROC(LineWidth);
   1.129 +    GET_PROC(LinkProgram);
   1.130 +    GET_PROC(LoadIdentity);
   1.131 +    GET_PROC(LoadMatrixf);
   1.132 +    GET_PROC(MapBuffer);
   1.133 +    GET_PROC(MatrixMode);
   1.134 +    GET_PROC(PixelStorei);
   1.135 +    GET_PROC(ReadBuffer);
   1.136 +    GET_PROC(ReadPixels);
   1.137 +    GET_PROC(Scissor);
   1.138 +    GET_PROC(ShaderSource);
   1.139 +    GET_PROC(StencilFunc);
   1.140 +    GET_PROC(StencilFuncSeparate);
   1.141 +    GET_PROC(StencilMask);
   1.142 +    GET_PROC(StencilMaskSeparate);
   1.143 +    GET_PROC(StencilOp);
   1.144 +    GET_PROC(StencilOpSeparate);
   1.145 +    GET_PROC(TexGenfv);
   1.146 +    GET_PROC(TexGeni);
   1.147 +    GET_PROC(TexImage2D);
   1.148 +    GET_PROC(TexParameteri);
   1.149 +    GET_PROC(TexParameteriv);
   1.150 +    if (ver >= GR_GL_VER(4,2) || extensions.has("GL_ARB_texture_storage")) {
   1.151 +        GET_PROC(TexStorage2D);
   1.152 +    } else if (extensions.has("GL_EXT_texture_storage")) {
   1.153 +        GET_PROC_SUFFIX(TexStorage2D, EXT);
   1.154 +    }
   1.155 +    GET_PROC(TexSubImage2D);
   1.156 +    GET_PROC(Uniform1f);
   1.157 +    GET_PROC(Uniform1i);
   1.158 +    GET_PROC(Uniform1fv);
   1.159 +    GET_PROC(Uniform1iv);
   1.160 +    GET_PROC(Uniform2f);
   1.161 +    GET_PROC(Uniform2i);
   1.162 +    GET_PROC(Uniform2fv);
   1.163 +    GET_PROC(Uniform2iv);
   1.164 +    GET_PROC(Uniform3f);
   1.165 +    GET_PROC(Uniform3i);
   1.166 +    GET_PROC(Uniform3fv);
   1.167 +    GET_PROC(Uniform3iv);
   1.168 +    GET_PROC(Uniform4f);
   1.169 +    GET_PROC(Uniform4i);
   1.170 +    GET_PROC(Uniform4fv);
   1.171 +    GET_PROC(Uniform4iv);
   1.172 +    GET_PROC(Uniform4fv);
   1.173 +    GET_PROC(UniformMatrix2fv);
   1.174 +    GET_PROC(UniformMatrix3fv);
   1.175 +    GET_PROC(UniformMatrix4fv);
   1.176 +    GET_PROC(UnmapBuffer);
   1.177 +    GET_PROC(UseProgram);
   1.178 +    GET_PROC(VertexAttrib4fv);
   1.179 +    GET_PROC(VertexAttribPointer);
   1.180 +    GET_PROC(Viewport);
   1.181 +
   1.182 +    if (ver >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
   1.183 +        // no ARB suffix for GL_ARB_vertex_array_object
   1.184 +        GET_PROC(BindVertexArray);
   1.185 +        GET_PROC(DeleteVertexArrays);
   1.186 +        GET_PROC(GenVertexArrays);
   1.187 +    }
   1.188 +
   1.189 +    if (ver >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) {
   1.190 +        // ARB extension doesn't use the ARB suffix on the function name
   1.191 +        GET_PROC(QueryCounter);
   1.192 +        GET_PROC(GetQueryObjecti64v);
   1.193 +        GET_PROC(GetQueryObjectui64v);
   1.194 +    } else if (extensions.has("GL_EXT_timer_query")) {
   1.195 +        GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
   1.196 +        GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
   1.197 +    }
   1.198 +
   1.199 +    if (ver >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
   1.200 +        // ARB extension doesn't use the ARB suffix on the function names
   1.201 +            GET_PROC(GenFramebuffers);
   1.202 +            GET_PROC(GetFramebufferAttachmentParameteriv);
   1.203 +            GET_PROC(GetRenderbufferParameteriv);
   1.204 +            GET_PROC(BindFramebuffer);
   1.205 +            GET_PROC(FramebufferTexture2D);
   1.206 +            GET_PROC(CheckFramebufferStatus);
   1.207 +            GET_PROC(DeleteFramebuffers);
   1.208 +            GET_PROC(RenderbufferStorage);
   1.209 +            GET_PROC(GenRenderbuffers);
   1.210 +            GET_PROC(DeleteRenderbuffers);
   1.211 +            GET_PROC(FramebufferRenderbuffer);
   1.212 +            GET_PROC(BindRenderbuffer);
   1.213 +            GET_PROC(RenderbufferStorageMultisample);
   1.214 +            GET_PROC(BlitFramebuffer);
   1.215 +    } else {
   1.216 +        if (extensions.has("GL_EXT_framebuffer_object")) {
   1.217 +            GET_PROC_SUFFIX(GenFramebuffers, EXT);
   1.218 +            GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
   1.219 +            GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
   1.220 +            GET_PROC_SUFFIX(BindFramebuffer, EXT);
   1.221 +            GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
   1.222 +            GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
   1.223 +            GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
   1.224 +            GET_PROC_SUFFIX(RenderbufferStorage, EXT);
   1.225 +            GET_PROC_SUFFIX(GenRenderbuffers, EXT);
   1.226 +            GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
   1.227 +            GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
   1.228 +            GET_PROC_SUFFIX(BindRenderbuffer, EXT);
   1.229 +        }
   1.230 +        if (extensions.has("GL_EXT_framebuffer_multisample")) {
   1.231 +            GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
   1.232 +        }
   1.233 +        if (extensions.has("GL_EXT_framebuffer_blit")) {
   1.234 +            GET_PROC_SUFFIX(BlitFramebuffer, EXT);
   1.235 +        }
   1.236 +    }
   1.237 +    if (ver >= GR_GL_VER(3,3) || extensions.has("GL_ARB_blend_func_extended")) {
   1.238 +        // ARB extension doesn't use the ARB suffix on the function name
   1.239 +        GET_PROC(BindFragDataLocationIndexed);
   1.240 +    }
   1.241 +
   1.242 +    if (extensions.has("GL_EXT_debug_marker")) {
   1.243 +        GET_PROC_SUFFIX(InsertEventMarker, EXT);
   1.244 +        GET_PROC_SUFFIX(PushGroupMarker, EXT);
   1.245 +        GET_PROC_SUFFIX(PopGroupMarker, EXT);
   1.246 +    }
   1.247 +
   1.248 +    interface->fExtensions.swap(&extensions);
   1.249 +    return interface;
   1.250 +}

mercurial