blob: 6d6873d5a2b885944906d373b2697fc35b2bc949 [file] [log] [blame]
Scroggo9df214e2011-04-15 14:48:08 +00001/*
2 Copyright 2011 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17#include "GrGLInterface.h"
18
19#include <GL/glx.h>
20#include <GL/gl.h>
21#include <GL/glext.h>
22#include <GL/glu.h>
23
24#define GR_GL_GET_PROC(F) gDefaultInterface.f ## F = (GrGLInterface::GrGL ## F ## Proc) \
25 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F));
26#define GR_GL_GET_PROC_SUFFIX(F, S) gDefaultInterface.f ## F = (GrGLInterface::GrGL ## F ## Proc) \
27 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S));
28
29void GrGLSetDefaultGLInterface() {
30 static GrGLInterface gDefaultInterface;
31 static bool gDefaultInterfaceInit;
32 if (!gDefaultInterfaceInit && NULL != glXGetCurrentContext()) {
33 int major, minor;
34 const char* versionString = (const char*) glGetString(GL_VERSION);
35 const char* extString = (const char*) glGetString(GL_EXTENSIONS);
36 gl_version_from_string(&major, &minor, versionString);
37
38 if (major == 1 && minor < 5) {
39 // We must have array and element_array buffer objects.
40 return;
41 }
42
43 gDefaultInterface.fActiveTexture = glActiveTexture;
44 GR_GL_GET_PROC(AttachShader);
45 GR_GL_GET_PROC(BindAttribLocation);
46 GR_GL_GET_PROC(BindBuffer);
47 gDefaultInterface.fBindTexture = glBindTexture;
48 gDefaultInterface.fBlendColor = glBlendColor;
49 gDefaultInterface.fBlendFunc = glBlendFunc;
50 GR_GL_GET_PROC(BufferData);
51 GR_GL_GET_PROC(BufferSubData);
52 gDefaultInterface.fClear = glClear;
53 gDefaultInterface.fClearColor = glClearColor;
54 gDefaultInterface.fClearStencil = glClearStencil;
55 gDefaultInterface.fClientActiveTexture = glClientActiveTexture;
56 gDefaultInterface.fColorMask = glColorMask;
57 gDefaultInterface.fColorPointer = glColorPointer;
58 gDefaultInterface.fColor4ub = glColor4ub;
59 GR_GL_GET_PROC(CompileShader);
60 gDefaultInterface.fCompressedTexImage2D = glCompressedTexImage2D;
61 GR_GL_GET_PROC(CreateProgram);
62 GR_GL_GET_PROC(CreateShader);
63 gDefaultInterface.fCullFace = glCullFace;
64 GR_GL_GET_PROC(DeleteBuffers);
65 GR_GL_GET_PROC(DeleteProgram);
66 GR_GL_GET_PROC(DeleteShader);
67 gDefaultInterface.fDeleteTextures = glDeleteTextures;
68 gDefaultInterface.fDepthMask = glDepthMask;
69 gDefaultInterface.fDisable = glDisable;
70 gDefaultInterface.fDisableClientState = glDisableClientState;
71 GR_GL_GET_PROC(DisableVertexAttribArray);
72 gDefaultInterface.fDrawArrays = glDrawArrays;
73 gDefaultInterface.fDrawElements = glDrawElements;
74 gDefaultInterface.fEnable = glEnable;
75 gDefaultInterface.fEnableClientState = glEnableClientState;
76 GR_GL_GET_PROC(EnableVertexAttribArray);
77 gDefaultInterface.fFrontFace = glFrontFace;
78 GR_GL_GET_PROC(GenBuffers);
79 GR_GL_GET_PROC(GetBufferParameteriv);
80 gDefaultInterface.fGetError = glGetError;
81 gDefaultInterface.fGetIntegerv = glGetIntegerv;
82 GR_GL_GET_PROC(GetProgramInfoLog);
83 GR_GL_GET_PROC(GetProgramiv);
84 GR_GL_GET_PROC(GetShaderInfoLog);
85 GR_GL_GET_PROC(GetShaderiv);
86 gDefaultInterface.fGetString = glGetString;
87 gDefaultInterface.fGenTextures = glGenTextures;
88 GR_GL_GET_PROC(GetUniformLocation);
89 gDefaultInterface.fLineWidth = glLineWidth;
90 GR_GL_GET_PROC(LinkProgram);
91 gDefaultInterface.fLoadMatrixf = glLoadMatrixf;
92 GR_GL_GET_PROC(MapBuffer);
93 gDefaultInterface.fMatrixMode = glMatrixMode;
94 gDefaultInterface.fPointSize = glPointSize;
95 gDefaultInterface.fPixelStorei = glPixelStorei;
96 gDefaultInterface.fReadPixels = glReadPixels;
97 gDefaultInterface.fScissor = glScissor;
98 gDefaultInterface.fShadeModel = glShadeModel;
99 GR_GL_GET_PROC(ShaderSource);
100 gDefaultInterface.fStencilFunc = glStencilFunc;
101 GR_GL_GET_PROC(StencilFuncSeparate);
102 gDefaultInterface.fStencilMask = glStencilMask;
103 GR_GL_GET_PROC(StencilMaskSeparate);
104 gDefaultInterface.fStencilOp = glStencilOp;
105 GR_GL_GET_PROC(StencilOpSeparate);
106 gDefaultInterface.fTexCoordPointer = glTexCoordPointer;
107 gDefaultInterface.fTexEnvi = glTexEnvi;
108 // mac uses GLenum for internalFormat param (non-standard)
109 // amounts to int vs. uint.
110 gDefaultInterface.fTexImage2D =
111 (GrGLInterface::GrGLTexImage2DProc)glTexImage2D;
112 gDefaultInterface.fTexParameteri = glTexParameteri;
113 gDefaultInterface.fTexSubImage2D = glTexSubImage2D;
114 GR_GL_GET_PROC(Uniform1fv);
115 GR_GL_GET_PROC(Uniform1i);
116 GR_GL_GET_PROC(Uniform4fv);
117 GR_GL_GET_PROC(UniformMatrix3fv);
118 GR_GL_GET_PROC(UnmapBuffer);
119 GR_GL_GET_PROC(UseProgram);
120 GR_GL_GET_PROC(VertexAttrib4fv);
121 GR_GL_GET_PROC(VertexAttribPointer);
122 gDefaultInterface.fVertexPointer = glVertexPointer;
123 gDefaultInterface.fViewport = glViewport;
124
125 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
126 // GL_ARB_framebuffer_object doesn't use ARB suffix.)
127 if (major >= 3 || has_gl_extension("GL_ARB_framebuffer_object")) {
128 GR_GL_GET_PROC(GenFramebuffers);
129 GR_GL_GET_PROC(BindFramebuffer);
130 GR_GL_GET_PROC(FramebufferTexture2D);
131 GR_GL_GET_PROC(CheckFramebufferStatus);
132 GR_GL_GET_PROC(DeleteFramebuffers);
133 GR_GL_GET_PROC(RenderbufferStorage);
134 GR_GL_GET_PROC(GenRenderbuffers);
135 GR_GL_GET_PROC(DeleteRenderbuffers);
136 GR_GL_GET_PROC(FramebufferRenderbuffer);
137 GR_GL_GET_PROC(BindRenderbuffer);
138 GR_GL_GET_PROC(RenderbufferStorageMultisample);
139 GR_GL_GET_PROC(BlitFramebuffer);
140 } else if (has_gl_extension_from_string("GL_EXT_framebuffer_object",
141 extString)) {
142 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
143 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
144 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
145 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
146 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
147 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
148 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
149 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
150 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
151 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
152 if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample",
153 extString)) {
154 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
155 }
156 if (has_gl_extension_from_string("GL_EXT_framebuffer_blit",
157 extString)) {
158 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
159 }
160 } else {
161 // we must have FBOs
162 return;
163 }
164 gDefaultInterface.fBindingsExported = kDesktop_GrGLBinding;
165
166 gDefaultInterfaceInit = true;
167 }
168 if (gDefaultInterfaceInit)
169 GrGLSetGLInterface(&gDefaultInterface);
170}