blob: 61aa3049f08ae0e5519f572ab13510eb4f0d547e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
bsalomon@google.comf987d1b2011-04-04 17:13:52 +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.
bsalomon@google.comf987d1b2011-04-04 17:13:52 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000010#include "GrGLInterface.h"
11
12#include <OpenGL/gl.h>
13#include <OpenGL/glext.h>
14
bsalomon@google.combeccb1e2011-10-25 15:00:44 +000015#include <mach-o/dyld.h>
16
17
18// This uses deprecated functions, should rewrite using dlopen, dlsym, dlclose
19void* GetProcAddress(const char* name) {
20 NSSymbol symbol = NULL;
21 if (NSIsSymbolNameDefined(name)) {
22 symbol = NSLookupAndBindSymbol(name);
23 }
24 return NULL == symbol ? NULL : NSAddressOfSymbol(symbol);
25}
26
27#define GET_PROC(name) ((GrGL ## name ## Proc) GetProcAddress("_gl" #name))
28#define GET_PROC_SUFFIX(name, suffix) ((GrGL ## name ## Proc) GetProcAddress("_gl" #name #suffix))
29
bsalomon@google.com373a6632011-10-19 20:43:20 +000030const GrGLInterface* GrGLCreateNativeInterface() {
31 // The gl functions are not context-specific so we create one global
32 // interface
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000033 static SkAutoTUnref<GrGLInterface> glInterface;
34 if (!glInterface.get()) {
35 GrGLInterface* interface = new GrGLInterface;
36 glInterface.reset(interface);
bsalomon@google.combeccb1e2011-10-25 15:00:44 +000037 const char* verStr = (const char*) glGetString(GL_VERSION);
38 GrGLVersion ver = GrGLGetVersionFromString(verStr);
39 const char* extStr = (const char*) glGetString(GL_EXTENSIONS);
40
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000041 interface->fBindingsExported = kDesktop_GrGLBinding;
42 interface->fActiveTexture = glActiveTexture;
43 interface->fAttachShader = glAttachShader;
bsalomon@google.com373a6632011-10-19 20:43:20 +000044 interface->fBeginQuery = glBeginQuery;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000045 interface->fBindAttribLocation = glBindAttribLocation;
46 interface->fBindBuffer = glBindBuffer;
bsalomon@google.combeccb1e2011-10-25 15:00:44 +000047 if (ver >= GR_GL_VER(3,0)) {
48 #if GL_VERSION_3_0
49 interface->fBindFragDataLocation = glBindFragDataLocation;
50 #else
51 interface->fBindFragDataLocation = GET_PROC(BindFragDataLocation);
52 #endif
53 }
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000054 interface->fBindTexture = glBindTexture;
55 interface->fBlendColor = glBlendColor;
56 interface->fBlendFunc = glBlendFunc;
57 interface->fBufferData = glBufferData;
58 interface->fBufferSubData = glBufferSubData;
59 interface->fClear = glClear;
60 interface->fClearColor = glClearColor;
61 interface->fClearStencil = glClearStencil;
62 interface->fClientActiveTexture = glClientActiveTexture;
63 interface->fColorMask = glColorMask;
64 interface->fColorPointer = glColorPointer;
65 interface->fColor4ub = glColor4ub;
66 interface->fCompileShader = glCompileShader;
67 interface->fCompressedTexImage2D = glCompressedTexImage2D;
68 interface->fCreateProgram = glCreateProgram;
69 interface->fCreateShader = glCreateShader;
70 interface->fCullFace = glCullFace;
71 interface->fDeleteBuffers = glDeleteBuffers;
72 interface->fDeleteProgram = glDeleteProgram;
bsalomon@google.com373a6632011-10-19 20:43:20 +000073 interface->fDeleteQueries = glDeleteQueries;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000074 interface->fDeleteShader = glDeleteShader;
75 interface->fDeleteTextures = glDeleteTextures;
76 interface->fDepthMask = glDepthMask;
77 interface->fDisable = glDisable;
78 interface->fDisableClientState = glDisableClientState;
bsalomon@google.com373a6632011-10-19 20:43:20 +000079 interface->fDisableVertexAttribArray =
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000080 glDisableVertexAttribArray;
81 interface->fDrawArrays = glDrawArrays;
82 interface->fDrawBuffer = glDrawBuffer;
83 interface->fDrawBuffers = glDrawBuffers;
84 interface->fDrawElements = glDrawElements;
85 interface->fEnable = glEnable;
86 interface->fEnableClientState = glEnableClientState;
87 interface->fEnableVertexAttribArray = glEnableVertexAttribArray;
bsalomon@google.com373a6632011-10-19 20:43:20 +000088 interface->fEndQuery = glEndQuery;
89 interface->fFinish = glFinish;
90 interface->fFlush = glFlush;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000091 interface->fFrontFace = glFrontFace;
92 interface->fGenBuffers = glGenBuffers;
bsalomon@google.com373a6632011-10-19 20:43:20 +000093 interface->fGenQueries = glGenQueries;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000094 interface->fGetBufferParameteriv = glGetBufferParameteriv;
95 interface->fGetError = glGetError;
96 interface->fGetIntegerv = glGetIntegerv;
97 interface->fGetProgramInfoLog = glGetProgramInfoLog;
98 interface->fGetProgramiv = glGetProgramiv;
bsalomon@google.com373a6632011-10-19 20:43:20 +000099 interface->fGetQueryiv = glGetQueryiv;
100 interface->fGetQueryObjectiv = glGetQueryObjectiv;
101 interface->fGetQueryObjectuiv = glGetQueryObjectuiv;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000102 interface->fGetShaderInfoLog = glGetShaderInfoLog;
103 interface->fGetShaderiv = glGetShaderiv;
104 interface->fGetString = glGetString;
105 interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
106 interface->fGenTextures = glGenTextures;
107 interface->fGetUniformLocation = glGetUniformLocation;
108 interface->fLineWidth = glLineWidth;
109 interface->fLinkProgram = glLinkProgram;
110 interface->fLoadMatrixf = glLoadMatrixf;
111 interface->fMapBuffer = glMapBuffer;
112 interface->fMatrixMode = glMatrixMode;
113 interface->fPointSize = glPointSize;
114 interface->fPixelStorei = glPixelStorei;
115 interface->fReadBuffer = glReadBuffer;
116 interface->fReadPixels = glReadPixels;
117 interface->fScissor = glScissor;
118 interface->fShadeModel = glShadeModel;
119 interface->fShaderSource = glShaderSource;
120 interface->fStencilFunc = glStencilFunc;
121 interface->fStencilFuncSeparate = glStencilFuncSeparate;
122 interface->fStencilMask = glStencilMask;
123 interface->fStencilMaskSeparate = glStencilMaskSeparate;
124 interface->fStencilOp = glStencilOp;
125 interface->fStencilOpSeparate = glStencilOpSeparate;
126 interface->fTexCoordPointer = glTexCoordPointer;
127 interface->fTexEnvi = glTexEnvi;
128 // mac uses GLenum for internalFormat param (non-standard)
129 // amounts to int vs. uint.
130 interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
131 interface->fTexParameteri = glTexParameteri;
132 interface->fTexSubImage2D = glTexSubImage2D;
133 interface->fUniform1f = glUniform1f;
134 interface->fUniform1i = glUniform1i;
135 interface->fUniform1fv = glUniform1fv;
136 interface->fUniform1iv = glUniform1iv;
137 interface->fUniform2f = glUniform2f;
138 interface->fUniform2i = glUniform2i;
139 interface->fUniform2fv = glUniform2fv;
140 interface->fUniform2iv = glUniform2iv;
141 interface->fUniform3f = glUniform3f;
142 interface->fUniform3i = glUniform3i;
143 interface->fUniform3fv = glUniform3fv;
144 interface->fUniform3iv = glUniform3iv;
145 interface->fUniform4f = glUniform4f;
146 interface->fUniform4i = glUniform4i;
147 interface->fUniform4fv = glUniform4fv;
148 interface->fUniform4iv = glUniform4iv;
149 interface->fUniform4fv = glUniform4fv;
150 interface->fUniformMatrix2fv = glUniformMatrix2fv;
151 interface->fUniformMatrix3fv = glUniformMatrix3fv;
152 interface->fUniformMatrix4fv = glUniformMatrix4fv;
153 interface->fUnmapBuffer = glUnmapBuffer;
154 interface->fUseProgram = glUseProgram;
155 interface->fVertexAttrib4fv = glVertexAttrib4fv;
156 interface->fVertexAttribPointer = glVertexAttribPointer;
157 interface->fVertexPointer = glVertexPointer;
158 interface->fViewport = glViewport;
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000159
bsalomon@google.combeccb1e2011-10-25 15:00:44 +0000160 if (ver >= GR_GL_VER(3,3) || GrGLHasExtensionFromString("GL_ARB_timer_query", extStr)) {
161 // ARB extension doesn't use the ARB suffix on the function name
162 #if GL_ARB_timer_query || GL_VERSION_3_3
163 interface->fQueryCounter = glQueryCounter;
164 interface->fGetQueryObjecti64v = glGetQueryObjecti64v;
165 interface->fGetQueryObjectui64v = glGetQueryObjectui64v;
166 #else
167 interface->fQueryCounter = GET_PROC(QueryCounter);
168 interface->fGetQueryObjecti64v = GET_PROC(GetQueryObjecti64v);
169 interface->fGetQueryObjectui64v = GET_PROC(GetQueryObjectui64v);
170 #endif
171 } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extStr)) {
172 #if GL_EXT_timer_query
173 interface->fGetQueryObjecti64v = glGetQueryObjecti64vEXT;
174 interface->fGetQueryObjectui64v = glGetQueryObjectui64vEXT;
175 #else
176 interface->fGetQueryObjecti64v = GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
177 interface->fGetQueryObjectui64v = GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
178 #endif
179 }
180
181 if (ver >= GR_GL_VER(3,0) || GrGLHasExtensionFromString("GL_ARB_framebuffer_object", extStr)) {
182 // ARB extension doesn't use the ARB suffix on the function names
183 #if GL_VERSION_3_0 || GL_ARB_framebuffer_object
184 interface->fGenFramebuffers = glGenFramebuffers;
185 interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
186 interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
187 interface->fBindFramebuffer = glBindFramebuffer;
188 interface->fFramebufferTexture2D = glFramebufferTexture2D;
189 interface->fCheckFramebufferStatus = glCheckFramebufferStatus;
190 interface->fDeleteFramebuffers = glDeleteFramebuffers;
191 interface->fRenderbufferStorage = glRenderbufferStorage;
192 interface->fGenRenderbuffers = glGenRenderbuffers;
193 interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
194 interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
195 interface->fBindRenderbuffer = glBindRenderbuffer;
196 interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample;
197 interface->fBlitFramebuffer = glBlitFramebuffer;
198 #else
199 interface->fGenFramebuffers = GET_PROC(GenFramebuffers);
200 interface->fGetFramebufferAttachmentParameteriv = GET_PROC(GetFramebufferAttachmentParameteriv);
201 interface->fGetRenderbufferParameteriv = GET_PROC(GetRenderbufferParameteriv);
202 interface->fBindFramebuffer = GET_PROC(BindFramebuffer);
203 interface->fFramebufferTexture2D = GET_PROC(FramebufferTexture2D);
204 interface->fCheckFramebufferStatus = GET_PROC(CheckFramebufferStatus);
205 interface->fDeleteFramebuffers = GET_PROC(DeleteFramebuffers);
206 interface->fRenderbufferStorage = GET_PROC(RenderbufferStorage);
207 interface->fGenRenderbuffers = GET_PROC(GenRenderbuffers);
208 interface->fDeleteRenderbuffers = GET_PROC(DeleteRenderbuffers);
209 interface->fFramebufferRenderbuffer = GET_PROC(FramebufferRenderbuffer);
210 interface->fBindRenderbuffer = GET_PROC(BindRenderbuffer);
211 interface->fRenderbufferStorageMultisample = GET_PROC(RenderbufferStorageMultisample);
212 interface->fBlitFramebuffer = GET_PROC(BlitFramebuffer);
213 #endif
214 } else {
215 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object", extStr)) {
216 #if GL_EXT_framebuffer_object
217 interface->fGenFramebuffers = glGenFramebuffersEXT;
218 interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameterivEXT;
219 interface->fGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
220 interface->fBindFramebuffer = glBindFramebufferEXT;
221 interface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
222 interface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
223 interface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
224 interface->fRenderbufferStorage = glRenderbufferStorageEXT;
225 interface->fGenRenderbuffers = glGenRenderbuffersEXT;
226 interface->fDeleteRenderbuffers = glDeleteRenderbuffersEXT;
227 interface->fFramebufferRenderbuffer = glFramebufferRenderbufferEXT;
228 interface->fBindRenderbuffer = glBindRenderbufferEXT;
229 #else
230 interface->fGenFramebuffers = GET_PROC_SUFFIX(GenFramebuffers, EXT);
231 interface->fGetFramebufferAttachmentParameteriv = GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
232 interface->fGetRenderbufferParameteriv = GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
233 interface->fBindFramebuffer = GET_PROC_SUFFIX(BindFramebuffer, EXT);
234 interface->fFramebufferTexture2D = GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
235 interface->fCheckFramebufferStatus = GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
236 interface->fDeleteFramebuffers = GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
237 interface->fRenderbufferStorage = GET_PROC_SUFFIX(RenderbufferStorage, EXT);
238 interface->fGenRenderbuffers = GET_PROC_SUFFIX(GenRenderbuffers, EXT);
239 interface->fDeleteRenderbuffers = GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
240 interface->fFramebufferRenderbuffer = GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
241 interface->fBindRenderbuffer = GET_PROC_SUFFIX(BindRenderbuffer, EXT);
242 #endif
243 }
244 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", extStr)) {
245 #if GL_EXT_framebuffer_multisample
246 interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleEXT;
247 #else
248 interface->fRenderbufferStorageMultisample = GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
249 #endif
250 }
251 if (GrGLHasExtensionFromString("", extStr)) {
252 #if GL_EXT_framebuffer_blit
253 interface->fBlitFramebuffer = glBlitFramebufferEXT;
254 #else
255 interface->fBlitFramebuffer = GET_PROC_SUFFIX(BlitFramebuffer, EXT);
256 #endif
257 }
258 }
259 if (ver >= GR_GL_VER(3,3) || GrGLHasExtensionFromString("GL_ARB_blend_func_extended", extStr)) {
260 // ARB extension doesn't use the ARB suffix on the function name
261 #if GL_VERSION_3_3 || GL_ARB_blend_func_extended
262 interface->fBindFragDataLocationIndexed = glBindFragDataLocationIndexed;
263 #else
264 interface->fBindFragDataLocationIndexed = GET_PROC(BindFragDataLocationIndexed);
265 #endif
266 }
bsalomon@google.com271cffc2011-05-20 14:13:56 +0000267
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000268 interface->fBindingsExported = kDesktop_GrGLBinding;
269 }
270 glInterface.get()->ref();
271 return glInterface.get();
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000272}