gfx/skia/trunk/src/gpu/gl/mesa/GrGLCreateMesaInterface.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/mesa/GrGLCreateMesaInterface.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,232 @@
     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 +#include "gl/GrGLExtensions.h"
    1.13 +#include "gl/GrGLInterface.h"
    1.14 +#include "../GrGLUtil.h"
    1.15 +
    1.16 +#define GL_GLEXT_PROTOTYPES
    1.17 +#include "osmesa_wrapper.h"
    1.18 +
    1.19 +#define GR_GL_GET_PROC(F) interface->fFunctions.f ## F = (GrGL ## F ## Proc) \
    1.20 +        OSMesaGetProcAddress("gl" #F);
    1.21 +#define GR_GL_GET_PROC_SUFFIX(F, S) interface->fFunctions.f ## F = (GrGL ## F ## Proc) \
    1.22 +        OSMesaGetProcAddress("gl" #F #S);
    1.23 +
    1.24 +// We use OSMesaGetProcAddress for every gl function to avoid accidentally using
    1.25 +// non-Mesa gl functions.
    1.26 +
    1.27 +const GrGLInterface* GrGLCreateMesaInterface() {
    1.28 +    if (NULL != OSMesaGetCurrentContext()) {
    1.29 +
    1.30 +        GrGLGetStringProc getString = (GrGLGetStringProc) OSMesaGetProcAddress("glGetString");
    1.31 +        GrGLGetStringiProc getStringi = (GrGLGetStringiProc) OSMesaGetProcAddress("glGetStringi");
    1.32 +        GrGLGetIntegervProc getIntegerv =
    1.33 +            (GrGLGetIntegervProc) OSMesaGetProcAddress("glGetIntegerv");
    1.34 +
    1.35 +        GrGLExtensions extensions;
    1.36 +        if (!extensions.init(kGL_GrGLStandard, getString, getStringi, getIntegerv)) {
    1.37 +            return NULL;
    1.38 +        }
    1.39 +
    1.40 +        const char* versionString = (const char*) getString(GL_VERSION);
    1.41 +        GrGLVersion glVer = GrGLGetVersionFromString(versionString);
    1.42 +
    1.43 +        if (glVer < GR_GL_VER(1,5)) {
    1.44 +            // We must have array and element_array buffer objects.
    1.45 +            return NULL;
    1.46 +        }
    1.47 +        GrGLInterface* interface = SkNEW(GrGLInterface());
    1.48 +
    1.49 +        GR_GL_GET_PROC(ActiveTexture);
    1.50 +        GR_GL_GET_PROC(BeginQuery);
    1.51 +        GR_GL_GET_PROC(AttachShader);
    1.52 +        GR_GL_GET_PROC(BindAttribLocation);
    1.53 +        GR_GL_GET_PROC(BindBuffer);
    1.54 +        GR_GL_GET_PROC(BindFragDataLocation);
    1.55 +        GR_GL_GET_PROC(BindTexture);
    1.56 +        GR_GL_GET_PROC(BlendFunc);
    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 +        GR_GL_GET_PROC(Clear);
    1.67 +        GR_GL_GET_PROC(ClearColor);
    1.68 +        GR_GL_GET_PROC(ClearStencil);
    1.69 +        GR_GL_GET_PROC(ColorMask);
    1.70 +        GR_GL_GET_PROC(CompileShader);
    1.71 +        GR_GL_GET_PROC(CompressedTexImage2D);
    1.72 +        GR_GL_GET_PROC(CopyTexSubImage2D);
    1.73 +        GR_GL_GET_PROC(CreateProgram);
    1.74 +        GR_GL_GET_PROC(CreateShader);
    1.75 +        GR_GL_GET_PROC(CullFace);
    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 +        GR_GL_GET_PROC(DeleteTextures);
    1.81 +        GR_GL_GET_PROC(DepthMask);
    1.82 +        GR_GL_GET_PROC(Disable);
    1.83 +        GR_GL_GET_PROC(DisableVertexAttribArray);
    1.84 +        GR_GL_GET_PROC(DrawArrays);
    1.85 +        GR_GL_GET_PROC(DrawBuffer);
    1.86 +        GR_GL_GET_PROC(DrawBuffers);
    1.87 +        GR_GL_GET_PROC(DrawElements);
    1.88 +        GR_GL_GET_PROC(Enable);
    1.89 +        GR_GL_GET_PROC(EnableVertexAttribArray);
    1.90 +        GR_GL_GET_PROC(EndQuery);
    1.91 +        GR_GL_GET_PROC(Finish);
    1.92 +        GR_GL_GET_PROC(Flush);
    1.93 +        GR_GL_GET_PROC(FrontFace);
    1.94 +        GR_GL_GET_PROC(GenBuffers);
    1.95 +        GR_GL_GET_PROC(GenerateMipmap);
    1.96 +        GR_GL_GET_PROC(GenQueries);
    1.97 +        GR_GL_GET_PROC(GetBufferParameteriv);
    1.98 +        GR_GL_GET_PROC(GetError);
    1.99 +        GR_GL_GET_PROC(GetIntegerv);
   1.100 +        GR_GL_GET_PROC(GetProgramInfoLog);
   1.101 +        GR_GL_GET_PROC(GetProgramiv);
   1.102 +        if (glVer >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) {
   1.103 +            GR_GL_GET_PROC(GetQueryObjecti64v);
   1.104 +            GR_GL_GET_PROC(GetQueryObjectui64v)
   1.105 +            GR_GL_GET_PROC(QueryCounter);
   1.106 +        } else if (extensions.has("GL_EXT_timer_query")) {
   1.107 +            GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
   1.108 +            GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
   1.109 +        }
   1.110 +        GR_GL_GET_PROC(GetQueryObjectiv);
   1.111 +        GR_GL_GET_PROC(GetQueryObjectuiv);
   1.112 +        GR_GL_GET_PROC(GetQueryiv);
   1.113 +        GR_GL_GET_PROC(GetShaderInfoLog);
   1.114 +        GR_GL_GET_PROC(GetShaderiv);
   1.115 +        GR_GL_GET_PROC(GetString);
   1.116 +        GR_GL_GET_PROC(GetStringi);
   1.117 +        GR_GL_GET_PROC(GetTexLevelParameteriv);
   1.118 +        GR_GL_GET_PROC(GenTextures);
   1.119 +        GR_GL_GET_PROC(GetUniformLocation);
   1.120 +        GR_GL_GET_PROC(LineWidth);
   1.121 +        GR_GL_GET_PROC(LinkProgram);
   1.122 +        GR_GL_GET_PROC(LoadIdentity);
   1.123 +        GR_GL_GET_PROC(LoadMatrixf);
   1.124 +        GR_GL_GET_PROC(MatrixMode);
   1.125 +        GR_GL_GET_PROC(MapBuffer);
   1.126 +        GR_GL_GET_PROC(PixelStorei);
   1.127 +        GR_GL_GET_PROC(ReadBuffer);
   1.128 +        GR_GL_GET_PROC(ReadPixels);
   1.129 +        GR_GL_GET_PROC(Scissor);
   1.130 +        GR_GL_GET_PROC(ShaderSource);
   1.131 +        GR_GL_GET_PROC(StencilFunc);
   1.132 +        GR_GL_GET_PROC(StencilFuncSeparate);
   1.133 +        GR_GL_GET_PROC(StencilMask);
   1.134 +        GR_GL_GET_PROC(StencilMaskSeparate);
   1.135 +        GR_GL_GET_PROC(StencilOp);
   1.136 +        GR_GL_GET_PROC(StencilOpSeparate);
   1.137 +        GR_GL_GET_PROC(TexGenfv);
   1.138 +        GR_GL_GET_PROC(TexGeni);
   1.139 +        GR_GL_GET_PROC(TexImage2D)
   1.140 +        GR_GL_GET_PROC(TexParameteri);
   1.141 +        GR_GL_GET_PROC(TexParameteriv);
   1.142 +        GR_GL_GET_PROC(TexStorage2D);
   1.143 +        if (NULL == interface->fFunctions.fTexStorage2D) {
   1.144 +            GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT);
   1.145 +        }
   1.146 +        GR_GL_GET_PROC(TexSubImage2D);
   1.147 +        GR_GL_GET_PROC(Uniform1f);
   1.148 +        GR_GL_GET_PROC(Uniform1i);
   1.149 +        GR_GL_GET_PROC(Uniform1fv);
   1.150 +        GR_GL_GET_PROC(Uniform1iv);
   1.151 +        GR_GL_GET_PROC(Uniform2f);
   1.152 +        GR_GL_GET_PROC(Uniform2i);
   1.153 +        GR_GL_GET_PROC(Uniform2fv);
   1.154 +        GR_GL_GET_PROC(Uniform2iv);
   1.155 +        GR_GL_GET_PROC(Uniform3f);
   1.156 +        GR_GL_GET_PROC(Uniform3i);
   1.157 +        GR_GL_GET_PROC(Uniform3fv);
   1.158 +        GR_GL_GET_PROC(Uniform3iv);
   1.159 +        GR_GL_GET_PROC(Uniform4f);
   1.160 +        GR_GL_GET_PROC(Uniform4i);
   1.161 +        GR_GL_GET_PROC(Uniform4fv);
   1.162 +        GR_GL_GET_PROC(Uniform4iv);
   1.163 +        GR_GL_GET_PROC(UniformMatrix2fv);
   1.164 +        GR_GL_GET_PROC(UniformMatrix3fv);
   1.165 +        GR_GL_GET_PROC(UniformMatrix4fv);
   1.166 +        GR_GL_GET_PROC(UnmapBuffer);
   1.167 +        GR_GL_GET_PROC(UseProgram);
   1.168 +        GR_GL_GET_PROC(VertexAttrib4fv);
   1.169 +        GR_GL_GET_PROC(VertexAttribPointer);
   1.170 +        GR_GL_GET_PROC(Viewport);
   1.171 +
   1.172 +        if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
   1.173 +            // no ARB suffix for GL_ARB_vertex_array_object
   1.174 +            GR_GL_GET_PROC(BindVertexArray);
   1.175 +            GR_GL_GET_PROC(DeleteVertexArrays);
   1.176 +            GR_GL_GET_PROC(GenVertexArrays);
   1.177 +        }
   1.178 +
   1.179 +        // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
   1.180 +        // GL_ARB_framebuffer_object doesn't use ARB suffix.)
   1.181 +        if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
   1.182 +            GR_GL_GET_PROC(GenFramebuffers);
   1.183 +            GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv);
   1.184 +            GR_GL_GET_PROC(GetRenderbufferParameteriv);
   1.185 +            GR_GL_GET_PROC(BindFramebuffer);
   1.186 +            GR_GL_GET_PROC(FramebufferTexture2D);
   1.187 +            GR_GL_GET_PROC(CheckFramebufferStatus);
   1.188 +            GR_GL_GET_PROC(DeleteFramebuffers);
   1.189 +            GR_GL_GET_PROC(RenderbufferStorage);
   1.190 +            GR_GL_GET_PROC(GenRenderbuffers);
   1.191 +            GR_GL_GET_PROC(DeleteRenderbuffers);
   1.192 +            GR_GL_GET_PROC(FramebufferRenderbuffer);
   1.193 +            GR_GL_GET_PROC(BindRenderbuffer);
   1.194 +            GR_GL_GET_PROC(RenderbufferStorageMultisample);
   1.195 +            GR_GL_GET_PROC(BlitFramebuffer);
   1.196 +        } else if (extensions.has("GL_EXT_framebuffer_object")) {
   1.197 +            GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
   1.198 +            GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
   1.199 +            GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
   1.200 +            GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
   1.201 +            GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
   1.202 +            GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
   1.203 +            GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
   1.204 +            GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
   1.205 +            GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
   1.206 +            GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
   1.207 +            GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
   1.208 +            GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
   1.209 +            if (extensions.has("GL_EXT_framebuffer_multisample")) {
   1.210 +                GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
   1.211 +            }
   1.212 +            if (extensions.has("GL_EXT_framebuffer_blit")) {
   1.213 +                GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
   1.214 +            }
   1.215 +        } else {
   1.216 +            // we must have FBOs
   1.217 +            delete interface;
   1.218 +            return NULL;
   1.219 +        }
   1.220 +        GR_GL_GET_PROC(BindFragDataLocationIndexed);
   1.221 +
   1.222 +        if (extensions.has("GL_EXT_debug_marker")) {
   1.223 +            GR_GL_GET_PROC_SUFFIX(InsertEventMarker, EXT);
   1.224 +            GR_GL_GET_PROC_SUFFIX(PopGroupMarker, EXT);
   1.225 +            GR_GL_GET_PROC_SUFFIX(PushGroupMarker, EXT);
   1.226 +        }
   1.227 +
   1.228 +        interface->fStandard = kGL_GrGLStandard;
   1.229 +        interface->fExtensions.swap(&extensions);
   1.230 +
   1.231 +        return interface;
   1.232 +    } else {
   1.233 +        return NULL;
   1.234 +    }
   1.235 +}

mercurial