blob: 04c6e30cd9d0747df842d76ef88601dbdcdce8a7 [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.com6fb736f2011-09-16 18:51:57 +000017#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) \
Scroggo9df214e2011-04-15 14:48:08 +000018 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F));
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000019#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) \
Scroggo9df214e2011-04-15 14:48:08 +000020 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S));
21
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000022const GrGLInterface* GrGLDefaultInterface() {
bsalomon@google.com0b77d682011-08-19 13:28:54 +000023 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.
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000031 return NULL;
Scroggo9df214e2011-04-15 14:48:08 +000032 }
33
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000034 GrGLInterface* interface = new GrGLInterface();
tomhudson@google.com747bf292011-06-14 18:16:52 +000035
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000036 interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
37 interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
38 interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
bsalomon@google.com0b77d682011-08-19 13:28:54 +000039
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000040 interface->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.combc5cf512011-09-21 16:21:07 +000044 GR_GL_GET_PROC(BindFragDataLocation);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000045 interface->fBindTexture = glBindTexture;
46 interface->fBlendColor = glBlendColor;
47 interface->fBlendFunc = glBlendFunc;
Scroggo9df214e2011-04-15 14:48:08 +000048 GR_GL_GET_PROC(BufferData);
49 GR_GL_GET_PROC(BufferSubData);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000050 interface->fClear = glClear;
51 interface->fClearColor = glClearColor;
52 interface->fClearStencil = glClearStencil;
53 interface->fClientActiveTexture = glClientActiveTexture;
54 interface->fColorMask = glColorMask;
55 interface->fColorPointer = glColorPointer;
56 interface->fColor4ub = glColor4ub;
Scroggo9df214e2011-04-15 14:48:08 +000057 GR_GL_GET_PROC(CompileShader);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000058 interface->fCompressedTexImage2D = glCompressedTexImage2D;
Scroggo9df214e2011-04-15 14:48:08 +000059 GR_GL_GET_PROC(CreateProgram);
60 GR_GL_GET_PROC(CreateShader);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000061 interface->fCullFace = glCullFace;
Scroggo9df214e2011-04-15 14:48:08 +000062 GR_GL_GET_PROC(DeleteBuffers);
63 GR_GL_GET_PROC(DeleteProgram);
64 GR_GL_GET_PROC(DeleteShader);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000065 interface->fDeleteTextures = glDeleteTextures;
66 interface->fDepthMask = glDepthMask;
67 interface->fDisable = glDisable;
68 interface->fDisableClientState = glDisableClientState;
Scroggo9df214e2011-04-15 14:48:08 +000069 GR_GL_GET_PROC(DisableVertexAttribArray);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000070 interface->fDrawArrays = glDrawArrays;
71 interface->fDrawBuffer = glDrawBuffer;
bsalomon@google.comd32c5f52011-08-02 19:29:03 +000072 GR_GL_GET_PROC(DrawBuffers);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000073 interface->fDrawElements = glDrawElements;
74 interface->fEnable = glEnable;
75 interface->fEnableClientState = glEnableClientState;
Scroggo9df214e2011-04-15 14:48:08 +000076 GR_GL_GET_PROC(EnableVertexAttribArray);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000077 interface->fFrontFace = glFrontFace;
Scroggo9df214e2011-04-15 14:48:08 +000078 GR_GL_GET_PROC(GenBuffers);
79 GR_GL_GET_PROC(GetBufferParameteriv);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000080 interface->fGetError = glGetError;
81 interface->fGetIntegerv = glGetIntegerv;
Scroggo9df214e2011-04-15 14:48:08 +000082 GR_GL_GET_PROC(GetProgramInfoLog);
83 GR_GL_GET_PROC(GetProgramiv);
84 GR_GL_GET_PROC(GetShaderInfoLog);
85 GR_GL_GET_PROC(GetShaderiv);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000086 interface->fGetString = glGetString;
87 interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
88 interface->fGenTextures = glGenTextures;
Scroggo9df214e2011-04-15 14:48:08 +000089 GR_GL_GET_PROC(GetUniformLocation);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000090 interface->fLineWidth = glLineWidth;
Scroggo9df214e2011-04-15 14:48:08 +000091 GR_GL_GET_PROC(LinkProgram);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000092 interface->fLoadMatrixf = glLoadMatrixf;
Scroggo9df214e2011-04-15 14:48:08 +000093 GR_GL_GET_PROC(MapBuffer);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000094 interface->fMatrixMode = glMatrixMode;
95 interface->fPointSize = glPointSize;
96 interface->fPixelStorei = glPixelStorei;
97 interface->fReadBuffer = glReadBuffer;
98 interface->fReadPixels = glReadPixels;
99 interface->fScissor = glScissor;
100 interface->fShadeModel = glShadeModel;
Scroggo9df214e2011-04-15 14:48:08 +0000101 GR_GL_GET_PROC(ShaderSource);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000102 interface->fStencilFunc = glStencilFunc;
Scroggo9df214e2011-04-15 14:48:08 +0000103 GR_GL_GET_PROC(StencilFuncSeparate);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000104 interface->fStencilMask = glStencilMask;
Scroggo9df214e2011-04-15 14:48:08 +0000105 GR_GL_GET_PROC(StencilMaskSeparate);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000106 interface->fStencilOp = glStencilOp;
Scroggo9df214e2011-04-15 14:48:08 +0000107 GR_GL_GET_PROC(StencilOpSeparate);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000108 interface->fTexCoordPointer = glTexCoordPointer;
109 interface->fTexEnvi = glTexEnvi;
110 interface->fTexImage2D = glTexImage2D;
111 interface->fTexParameteri = glTexParameteri;
112 interface->fTexSubImage2D = glTexSubImage2D;
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000113 GR_GL_GET_PROC(Uniform1f);
Scroggo9df214e2011-04-15 14:48:08 +0000114 GR_GL_GET_PROC(Uniform1i);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000115 GR_GL_GET_PROC(Uniform1fv);
116 GR_GL_GET_PROC(Uniform1iv);
117 GR_GL_GET_PROC(Uniform2f);
118 GR_GL_GET_PROC(Uniform2i);
119 GR_GL_GET_PROC(Uniform2fv);
120 GR_GL_GET_PROC(Uniform2iv);
121 GR_GL_GET_PROC(Uniform3f);
122 GR_GL_GET_PROC(Uniform3i);
123 GR_GL_GET_PROC(Uniform3fv);
124 GR_GL_GET_PROC(Uniform3iv);
125 GR_GL_GET_PROC(Uniform4f);
126 GR_GL_GET_PROC(Uniform4i);
Scroggo9df214e2011-04-15 14:48:08 +0000127 GR_GL_GET_PROC(Uniform4fv);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000128 GR_GL_GET_PROC(Uniform4iv);
129 GR_GL_GET_PROC(UniformMatrix2fv);
Scroggo9df214e2011-04-15 14:48:08 +0000130 GR_GL_GET_PROC(UniformMatrix3fv);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000131 GR_GL_GET_PROC(UniformMatrix4fv);
Scroggo9df214e2011-04-15 14:48:08 +0000132 GR_GL_GET_PROC(UnmapBuffer);
133 GR_GL_GET_PROC(UseProgram);
134 GR_GL_GET_PROC(VertexAttrib4fv);
135 GR_GL_GET_PROC(VertexAttribPointer);
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000136 interface->fVertexPointer = glVertexPointer;
137 interface->fViewport = glViewport;
bsalomon@google.com271cffc2011-05-20 14:13:56 +0000138 GR_GL_GET_PROC(BindFragDataLocationIndexed);
Scroggo9df214e2011-04-15 14:48:08 +0000139
140 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
141 // GL_ARB_framebuffer_object doesn't use ARB suffix.)
senorblanco@chromium.org2dbd0442011-05-04 15:29:04 +0000142 if (major >= 3 || has_gl_extension_from_string(
143 "GL_ARB_framebuffer_object", extString)) {
Scroggo9df214e2011-04-15 14:48:08 +0000144 GR_GL_GET_PROC(GenFramebuffers);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000145 GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv);
146 GR_GL_GET_PROC(GetRenderbufferParameteriv);
Scroggo9df214e2011-04-15 14:48:08 +0000147 GR_GL_GET_PROC(BindFramebuffer);
148 GR_GL_GET_PROC(FramebufferTexture2D);
149 GR_GL_GET_PROC(CheckFramebufferStatus);
150 GR_GL_GET_PROC(DeleteFramebuffers);
151 GR_GL_GET_PROC(RenderbufferStorage);
152 GR_GL_GET_PROC(GenRenderbuffers);
153 GR_GL_GET_PROC(DeleteRenderbuffers);
154 GR_GL_GET_PROC(FramebufferRenderbuffer);
155 GR_GL_GET_PROC(BindRenderbuffer);
156 GR_GL_GET_PROC(RenderbufferStorageMultisample);
157 GR_GL_GET_PROC(BlitFramebuffer);
158 } else if (has_gl_extension_from_string("GL_EXT_framebuffer_object",
159 extString)) {
160 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000161 GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
162 GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
Scroggo9df214e2011-04-15 14:48:08 +0000163 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
164 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
165 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
166 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
167 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
168 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
169 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
170 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
171 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
172 if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample",
173 extString)) {
174 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
175 }
176 if (has_gl_extension_from_string("GL_EXT_framebuffer_blit",
177 extString)) {
178 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
179 }
180 } else {
181 // we must have FBOs
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000182 delete interface;
183 return NULL;
Scroggo9df214e2011-04-15 14:48:08 +0000184 }
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000185 interface->fBindingsExported = kDesktop_GrGLBinding;
Scroggo9df214e2011-04-15 14:48:08 +0000186
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000187 return interface;
188 } else {
189 return NULL;
Scroggo9df214e2011-04-15 14:48:08 +0000190 }
Scroggo9df214e2011-04-15 14:48:08 +0000191}