13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/*
33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc.
43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com *
53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file.
73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */
83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
986c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com#include "gl/GrGLExtensions.h"
1039ef825ac6dff4eb2a165b15dbdccdbfb5887984tomhudson@google.com#include "gl/GrGLInterface.h"
11589a15fbf124f1d8ff26782802f7f4559f46fc6cbsalomon@google.com#include "../GrGLUtil.h"
123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
13d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com#define GL_GLEXT_PROTOTYPES
14c2aab80eed661042473f2946b231fdc2041f0ab4bsalomon@google.com#include "osmesa_wrapper.h"
153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) \
173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        OSMesaGetProcAddress("gl" #F);
183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) \
193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        OSMesaGetProcAddress("gl" #F #S);
203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
21d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com// We use OSMesaGetProcAddress for every gl function to avoid accidentally using
22d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com// non-Mesa gl functions.
23d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com
24d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.comconst GrGLInterface* GrGLCreateMesaInterface() {
253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    if (NULL != OSMesaGetCurrentContext()) {
2686c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com
27bd6c2016209bbc5bf9db9ff1fc05544d7e812592bsalomon@google.com        GrGLGetStringProc getString = (GrGLGetStringProc) OSMesaGetProcAddress("glGetString");
28bd6c2016209bbc5bf9db9ff1fc05544d7e812592bsalomon@google.com        GrGLGetStringiProc getStringi = (GrGLGetStringiProc) OSMesaGetProcAddress("glGetStringi");
29bd6c2016209bbc5bf9db9ff1fc05544d7e812592bsalomon@google.com        GrGLGetIntegervProc getIntegerv =
30bd6c2016209bbc5bf9db9ff1fc05544d7e812592bsalomon@google.com            (GrGLGetIntegervProc) OSMesaGetProcAddress("glGetIntegerv");
3186c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com
3286c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        GrGLExtensions extensions;
33bd6c2016209bbc5bf9db9ff1fc05544d7e812592bsalomon@google.com        if (!extensions.init(kDesktop_GrGLBinding, getString, getStringi, getIntegerv)) {
3486c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com            return NULL;
3586c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        }
3686c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com
37d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        const char* versionString = (const char*) getString(GL_VERSION);
383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GrGLVersion glVer = GrGLGetVersionFromString(versionString);
393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
403f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        if (glVer < GR_GL_VER(1,5)) {
413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            // We must have array and element_array buffer objects.
423f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            return NULL;
433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
443f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GrGLInterface* interface = new GrGLInterface();
453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
46d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(ActiveTexture);
47d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(BeginQuery);
483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(AttachShader);
493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(BindAttribLocation);
503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(BindBuffer);
513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(BindFragDataLocation);
52d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(BindTexture);
53d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(BlendFunc);
54d26439670a7010ba518af5bb81f4d94d94ce8108robertphillips@google.com
55d26439670a7010ba518af5bb81f4d94d94ce8108robertphillips@google.com        if (glVer >= GR_GL_VER(1,4) ||
5686c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com            extensions.has("GL_ARB_imaging") ||
5786c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com            extensions.has("GL_EXT_blend_color")) {
58d26439670a7010ba518af5bb81f4d94d94ce8108robertphillips@google.com            GR_GL_GET_PROC(BlendColor);
59aaefb11b6a32b499c47002326a8cae33f9468241bsalomon@google.com        }
60d26439670a7010ba518af5bb81f4d94d94ce8108robertphillips@google.com
613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(BufferData);
623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(BufferSubData);
63d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Clear);
64d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(ClearColor);
65d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(ClearStencil);
66a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(ClientActiveTexture);
67d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(ColorMask);
683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(CompileShader);
69d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(CompressedTexImage2D);
7088672fbe426b68b6981a96204de8aff8201dd29ccommit-bot@chromium.org        GR_GL_GET_PROC(CopyTexSubImage2D);
713f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(CreateProgram);
723f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(CreateShader);
73d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(CullFace);
743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(DeleteBuffers);
753f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(DeleteProgram);
76d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(DeleteQueries);
773f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(DeleteShader);
78d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(DeleteTextures);
79d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(DepthMask);
80d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Disable);
81a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(DisableClientState);
823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(DisableVertexAttribArray);
83d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(DrawArrays);
84d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(DrawBuffer);
853f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(DrawBuffers);
86d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(DrawElements);
87d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Enable);
88a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(EnableClientState);
893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(EnableVertexAttribArray);
90d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(EndQuery);
91d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Finish);
92d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Flush);
93d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(FrontFace);
943f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GenBuffers);
95a67b348f7f66678e392b0f9e70cc738cc0c69007commit-bot@chromium.org        GR_GL_GET_PROC(GenerateMipmap);
96d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GenQueries);
973f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GetBufferParameteriv);
98d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetError);
99d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetIntegerv);
1003f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GetProgramInfoLog);
1013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GetProgramiv);
10286c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        if (glVer >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) {
103d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com            GR_GL_GET_PROC(GetQueryObjecti64v);
104d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com            GR_GL_GET_PROC(GetQueryObjectui64v)
105d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com            GR_GL_GET_PROC(QueryCounter);
10686c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        } else if (extensions.has("GL_EXT_timer_query")) {
107e8db0d07b73867274b63ce25efbb1bdd0b8096b7bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
108e8db0d07b73867274b63ce25efbb1bdd0b8096b7bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
109d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        }
110d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetQueryObjectiv);
111d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetQueryObjectuiv);
112d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetQueryiv);
1133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GetShaderInfoLog);
1143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GetShaderiv);
115d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetString);
11686c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        GR_GL_GET_PROC(GetStringi);
117d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GetTexLevelParameteriv);
118d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(GenTextures);
1193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(GetUniformLocation);
120d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(LineWidth);
1213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(LinkProgram);
122a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(LoadIdentity);
123a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(LoadMatrixf);
124a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(MatrixMode);
1253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(MapBuffer);
126d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(PixelStorei);
127d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(ReadBuffer);
128d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(ReadPixels);
129d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Scissor);
1303f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(ShaderSource);
131d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(StencilFunc);
1323f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(StencilFuncSeparate);
133d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(StencilMask);
1343f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(StencilMaskSeparate);
135d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(StencilOp);
1363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(StencilOpSeparate);
137a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(TexGenf);
138a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(TexGenfv);
139a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(TexGeni);
140d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(TexImage2D)
141d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(TexParameteri);
1422db25450f909354fbec8d83b6ca4b02521f9e02fbsalomon@google.com        GR_GL_GET_PROC(TexParameteriv);
143919a1375ba60823b849c648646af9326fbba87f7bsalomon@google.com        GR_GL_GET_PROC(TexStorage2D);
144919a1375ba60823b849c648646af9326fbba87f7bsalomon@google.com        if (NULL == interface->fTexStorage2D) {
145919a1375ba60823b849c648646af9326fbba87f7bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT);
146919a1375ba60823b849c648646af9326fbba87f7bsalomon@google.com        }
147d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(TexSubImage2D);
1483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform1f);
1493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform1i);
1503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform1fv);
1513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform1iv);
1523f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform2f);
1533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform2i);
1543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform2fv);
1553f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform2iv);
1563f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform3f);
1573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform3i);
1583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform3fv);
1593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform3iv);
1603f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform4f);
1613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform4i);
1623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform4fv);
1633f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(Uniform4iv);
1643f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(UniformMatrix2fv);
1653f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(UniformMatrix3fv);
1663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(UniformMatrix4fv);
1673f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(UnmapBuffer);
1683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(UseProgram);
1693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(VertexAttrib4fv);
1703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(VertexAttribPointer);
171a4da2893bba74445b29b326a90106b3908dcf8e0commit-bot@chromium.org        GR_GL_GET_PROC(VertexPointer);
172d9f609a66ab7192670bf0ccbbc878ab2b398dab8bsalomon@google.com        GR_GL_GET_PROC(Viewport);
1733f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
1746ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com        if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
1756ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com            // no ARB suffix for GL_ARB_vertex_array_object
1766ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com            GR_GL_GET_PROC(BindVertexArray);
1776ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com            GR_GL_GET_PROC(DeleteVertexArrays);
1786ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com            GR_GL_GET_PROC(GenVertexArrays);
1796ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com        }
1806ccccc065b1122fec12480699d10e7e7482a8b76bsalomon@google.com
1813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
1823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        // GL_ARB_framebuffer_object doesn't use ARB suffix.)
18386c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
1843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(GenFramebuffers);
1853f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv);
1863f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(GetRenderbufferParameteriv);
1873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(BindFramebuffer);
1883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(FramebufferTexture2D);
1893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(CheckFramebufferStatus);
1903f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(DeleteFramebuffers);
1913f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(RenderbufferStorage);
1923f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(GenRenderbuffers);
1933f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(DeleteRenderbuffers);
1943f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(FramebufferRenderbuffer);
1953f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(BindRenderbuffer);
1963f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(RenderbufferStorageMultisample);
1973f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC(BlitFramebuffer);
19886c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com        } else if (extensions.has("GL_EXT_framebuffer_object")) {
1993f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
2003f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
2013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
2023f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
2033f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
2043f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
2053f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
2063f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
2073f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
2083f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
2093f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
2103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
21186c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com            if (extensions.has("GL_EXT_framebuffer_multisample")) {
2123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
2133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            }
21486c972c88eedf604db60ec44e32cefe9baf70243bsalomon@google.com            if (extensions.has("GL_EXT_framebuffer_blit")) {
2153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
2163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            }
2173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        } else {
2183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            // we must have FBOs
2193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            delete interface;
2203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            return NULL;
2213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
2223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GR_GL_GET_PROC(BindFragDataLocationIndexed);
2233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        interface->fBindingsExported = kDesktop_GrGLBinding;
2243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        return interface;
2253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    } else {
2263f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        return NULL;
2273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
2283f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
229