blob: 3e12ca1b544a18b738424e1ede84759df85ad4fa [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
Scroggo9df214e2011-04-15 14:48:08 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
Scroggo9df214e2011-04-15 14:48:08 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
Scroggo9df214e2011-04-15 14:48:08 +000010#include "GrGLInterface.h"
11
12#include <GL/glx.h>
13#include <GL/gl.h>
14#include <GL/glext.h>
15#include <GL/glu.h>
16
bsalomon@google.com0b77d682011-08-19 13:28:54 +000017#define GR_GL_GET_PROC(F) defaultInterface->f ## F = (GrGL ## F ## Proc) \
Scroggo9df214e2011-04-15 14:48:08 +000018 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F));
bsalomon@google.com0b77d682011-08-19 13:28:54 +000019#define GR_GL_GET_PROC_SUFFIX(F, S) defaultInterface->f ## F = (GrGL ## F ## Proc) \
Scroggo9df214e2011-04-15 14:48:08 +000020 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S));
21
bsalomon@google.com0b77d682011-08-19 13:28:54 +000022void GrGLInitializeDefaultGLInterface() {
23 if (NULL != glXGetCurrentContext()) {
Scroggo9df214e2011-04-15 14:48:08 +000024 int major, minor;
25 const char* versionString = (const char*) glGetString(GL_VERSION);
26 const char* extString = (const char*) glGetString(GL_EXTENSIONS);
27 gl_version_from_string(&major, &minor, versionString);
28
29 if (major == 1 && minor < 5) {
30 // We must have array and element_array buffer objects.
31 return;
32 }
33
bsalomon@google.com0b77d682011-08-19 13:28:54 +000034 GrGLInterface* defaultInterface = new GrGLInterface();
tomhudson@google.com747bf292011-06-14 18:16:52 +000035
bsalomon@google.com0b77d682011-08-19 13:28:54 +000036 defaultInterface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
37 defaultInterface->fMinRenderTargetHeight = kProbe_GrGLCapability;
38 defaultInterface->fMinRenderTargetWidth = kProbe_GrGLCapability;
39
40 defaultInterface->fActiveTexture = glActiveTexture;
Scroggo9df214e2011-04-15 14:48:08 +000041 GR_GL_GET_PROC(AttachShader);
42 GR_GL_GET_PROC(BindAttribLocation);
43 GR_GL_GET_PROC(BindBuffer);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000044 defaultInterface->fBindTexture = glBindTexture;
45 defaultInterface->fBlendColor = glBlendColor;
46 defaultInterface->fBlendFunc = glBlendFunc;
Scroggo9df214e2011-04-15 14:48:08 +000047 GR_GL_GET_PROC(BufferData);
48 GR_GL_GET_PROC(BufferSubData);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000049 defaultInterface->fClear = glClear;
50 defaultInterface->fClearColor = glClearColor;
51 defaultInterface->fClearStencil = glClearStencil;
52 defaultInterface->fClientActiveTexture = glClientActiveTexture;
53 defaultInterface->fColorMask = glColorMask;
54 defaultInterface->fColorPointer = glColorPointer;
55 defaultInterface->fColor4ub = glColor4ub;
Scroggo9df214e2011-04-15 14:48:08 +000056 GR_GL_GET_PROC(CompileShader);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000057 defaultInterface->fCompressedTexImage2D = glCompressedTexImage2D;
Scroggo9df214e2011-04-15 14:48:08 +000058 GR_GL_GET_PROC(CreateProgram);
59 GR_GL_GET_PROC(CreateShader);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000060 defaultInterface->fCullFace = glCullFace;
Scroggo9df214e2011-04-15 14:48:08 +000061 GR_GL_GET_PROC(DeleteBuffers);
62 GR_GL_GET_PROC(DeleteProgram);
63 GR_GL_GET_PROC(DeleteShader);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000064 defaultInterface->fDeleteTextures = glDeleteTextures;
65 defaultInterface->fDepthMask = glDepthMask;
66 defaultInterface->fDisable = glDisable;
67 defaultInterface->fDisableClientState = glDisableClientState;
Scroggo9df214e2011-04-15 14:48:08 +000068 GR_GL_GET_PROC(DisableVertexAttribArray);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000069 defaultInterface->fDrawArrays = glDrawArrays;
70 defaultInterface->fDrawBuffer = glDrawBuffer;
bsalomon@google.comd32c5f52011-08-02 19:29:03 +000071 GR_GL_GET_PROC(DrawBuffers);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000072 defaultInterface->fDrawElements = glDrawElements;
73 defaultInterface->fEnable = glEnable;
74 defaultInterface->fEnableClientState = glEnableClientState;
Scroggo9df214e2011-04-15 14:48:08 +000075 GR_GL_GET_PROC(EnableVertexAttribArray);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000076 defaultInterface->fFrontFace = glFrontFace;
Scroggo9df214e2011-04-15 14:48:08 +000077 GR_GL_GET_PROC(GenBuffers);
78 GR_GL_GET_PROC(GetBufferParameteriv);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000079 defaultInterface->fGetError = glGetError;
80 defaultInterface->fGetIntegerv = glGetIntegerv;
Scroggo9df214e2011-04-15 14:48:08 +000081 GR_GL_GET_PROC(GetProgramInfoLog);
82 GR_GL_GET_PROC(GetProgramiv);
83 GR_GL_GET_PROC(GetShaderInfoLog);
84 GR_GL_GET_PROC(GetShaderiv);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000085 defaultInterface->fGetString = glGetString;
86 defaultInterface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
87 defaultInterface->fGenTextures = glGenTextures;
Scroggo9df214e2011-04-15 14:48:08 +000088 GR_GL_GET_PROC(GetUniformLocation);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000089 defaultInterface->fLineWidth = glLineWidth;
Scroggo9df214e2011-04-15 14:48:08 +000090 GR_GL_GET_PROC(LinkProgram);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000091 defaultInterface->fLoadMatrixf = glLoadMatrixf;
Scroggo9df214e2011-04-15 14:48:08 +000092 GR_GL_GET_PROC(MapBuffer);
bsalomon@google.com0b77d682011-08-19 13:28:54 +000093 defaultInterface->fMatrixMode = glMatrixMode;
94 defaultInterface->fPointSize = glPointSize;
95 defaultInterface->fPixelStorei = glPixelStorei;
96 defaultInterface->fReadBuffer = glReadBuffer;
97 defaultInterface->fReadPixels = glReadPixels;
98 defaultInterface->fScissor = glScissor;
99 defaultInterface->fShadeModel = glShadeModel;
Scroggo9df214e2011-04-15 14:48:08 +0000100 GR_GL_GET_PROC(ShaderSource);
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000101 defaultInterface->fStencilFunc = glStencilFunc;
Scroggo9df214e2011-04-15 14:48:08 +0000102 GR_GL_GET_PROC(StencilFuncSeparate);
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000103 defaultInterface->fStencilMask = glStencilMask;
Scroggo9df214e2011-04-15 14:48:08 +0000104 GR_GL_GET_PROC(StencilMaskSeparate);
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000105 defaultInterface->fStencilOp = glStencilOp;
Scroggo9df214e2011-04-15 14:48:08 +0000106 GR_GL_GET_PROC(StencilOpSeparate);
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000107 defaultInterface->fTexCoordPointer = glTexCoordPointer;
108 defaultInterface->fTexEnvi = glTexEnvi;
109 defaultInterface->fTexImage2D = glTexImage2D;
110 defaultInterface->fTexParameteri = glTexParameteri;
111 defaultInterface->fTexSubImage2D = glTexSubImage2D;
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000112 GR_GL_GET_PROC(Uniform1f);
Scroggo9df214e2011-04-15 14:48:08 +0000113 GR_GL_GET_PROC(Uniform1i);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000114 GR_GL_GET_PROC(Uniform1fv);
115 GR_GL_GET_PROC(Uniform1iv);
116 GR_GL_GET_PROC(Uniform2f);
117 GR_GL_GET_PROC(Uniform2i);
118 GR_GL_GET_PROC(Uniform2fv);
119 GR_GL_GET_PROC(Uniform2iv);
120 GR_GL_GET_PROC(Uniform3f);
121 GR_GL_GET_PROC(Uniform3i);
122 GR_GL_GET_PROC(Uniform3fv);
123 GR_GL_GET_PROC(Uniform3iv);
124 GR_GL_GET_PROC(Uniform4f);
125 GR_GL_GET_PROC(Uniform4i);
Scroggo9df214e2011-04-15 14:48:08 +0000126 GR_GL_GET_PROC(Uniform4fv);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000127 GR_GL_GET_PROC(Uniform4iv);
128 GR_GL_GET_PROC(UniformMatrix2fv);
Scroggo9df214e2011-04-15 14:48:08 +0000129 GR_GL_GET_PROC(UniformMatrix3fv);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000130 GR_GL_GET_PROC(UniformMatrix4fv);
Scroggo9df214e2011-04-15 14:48:08 +0000131 GR_GL_GET_PROC(UnmapBuffer);
132 GR_GL_GET_PROC(UseProgram);
133 GR_GL_GET_PROC(VertexAttrib4fv);
134 GR_GL_GET_PROC(VertexAttribPointer);
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000135 defaultInterface->fVertexPointer = glVertexPointer;
136 defaultInterface->fViewport = glViewport;
bsalomon@google.com271cffc2011-05-20 14:13:56 +0000137 GR_GL_GET_PROC(BindFragDataLocationIndexed);
Scroggo9df214e2011-04-15 14:48:08 +0000138
139 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
140 // GL_ARB_framebuffer_object doesn't use ARB suffix.)
senorblanco@chromium.org2dbd0442011-05-04 15:29:04 +0000141 if (major >= 3 || has_gl_extension_from_string(
142 "GL_ARB_framebuffer_object", extString)) {
Scroggo9df214e2011-04-15 14:48:08 +0000143 GR_GL_GET_PROC(GenFramebuffers);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000144 GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv);
145 GR_GL_GET_PROC(GetRenderbufferParameteriv);
Scroggo9df214e2011-04-15 14:48:08 +0000146 GR_GL_GET_PROC(BindFramebuffer);
147 GR_GL_GET_PROC(FramebufferTexture2D);
148 GR_GL_GET_PROC(CheckFramebufferStatus);
149 GR_GL_GET_PROC(DeleteFramebuffers);
150 GR_GL_GET_PROC(RenderbufferStorage);
151 GR_GL_GET_PROC(GenRenderbuffers);
152 GR_GL_GET_PROC(DeleteRenderbuffers);
153 GR_GL_GET_PROC(FramebufferRenderbuffer);
154 GR_GL_GET_PROC(BindRenderbuffer);
155 GR_GL_GET_PROC(RenderbufferStorageMultisample);
156 GR_GL_GET_PROC(BlitFramebuffer);
157 } else if (has_gl_extension_from_string("GL_EXT_framebuffer_object",
158 extString)) {
159 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000160 GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
161 GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
Scroggo9df214e2011-04-15 14:48:08 +0000162 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
163 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
164 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
165 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
166 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
167 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
168 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
169 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
170 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
171 if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample",
172 extString)) {
173 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
174 }
175 if (has_gl_extension_from_string("GL_EXT_framebuffer_blit",
176 extString)) {
177 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
178 }
179 } else {
180 // we must have FBOs
181 return;
182 }
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000183 defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
Scroggo9df214e2011-04-15 14:48:08 +0000184
bsalomon@google.com0b77d682011-08-19 13:28:54 +0000185 GrGLSetDefaultGLInterface(defaultInterface)->unref();
Scroggo9df214e2011-04-15 14:48:08 +0000186 }
Scroggo9df214e2011-04-15 14:48:08 +0000187}