blob: c8258da834291cb36724dacfc644cc15ef7aeffc [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;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000062 interface->fColorMask = glColorMask;
63 interface->fColorPointer = glColorPointer;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000064 interface->fCompileShader = glCompileShader;
65 interface->fCompressedTexImage2D = glCompressedTexImage2D;
66 interface->fCreateProgram = glCreateProgram;
67 interface->fCreateShader = glCreateShader;
68 interface->fCullFace = glCullFace;
69 interface->fDeleteBuffers = glDeleteBuffers;
70 interface->fDeleteProgram = glDeleteProgram;
bsalomon@google.com373a6632011-10-19 20:43:20 +000071 interface->fDeleteQueries = glDeleteQueries;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000072 interface->fDeleteShader = glDeleteShader;
73 interface->fDeleteTextures = glDeleteTextures;
74 interface->fDepthMask = glDepthMask;
75 interface->fDisable = glDisable;
bsalomon@google.com373a6632011-10-19 20:43:20 +000076 interface->fDisableVertexAttribArray =
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000077 glDisableVertexAttribArray;
78 interface->fDrawArrays = glDrawArrays;
79 interface->fDrawBuffer = glDrawBuffer;
80 interface->fDrawBuffers = glDrawBuffers;
81 interface->fDrawElements = glDrawElements;
82 interface->fEnable = glEnable;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000083 interface->fEnableVertexAttribArray = glEnableVertexAttribArray;
bsalomon@google.com373a6632011-10-19 20:43:20 +000084 interface->fEndQuery = glEndQuery;
85 interface->fFinish = glFinish;
86 interface->fFlush = glFlush;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000087 interface->fFrontFace = glFrontFace;
88 interface->fGenBuffers = glGenBuffers;
bsalomon@google.com373a6632011-10-19 20:43:20 +000089 interface->fGenQueries = glGenQueries;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000090 interface->fGetBufferParameteriv = glGetBufferParameteriv;
91 interface->fGetError = glGetError;
92 interface->fGetIntegerv = glGetIntegerv;
93 interface->fGetProgramInfoLog = glGetProgramInfoLog;
94 interface->fGetProgramiv = glGetProgramiv;
bsalomon@google.com373a6632011-10-19 20:43:20 +000095 interface->fGetQueryiv = glGetQueryiv;
96 interface->fGetQueryObjectiv = glGetQueryObjectiv;
97 interface->fGetQueryObjectuiv = glGetQueryObjectuiv;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +000098 interface->fGetShaderInfoLog = glGetShaderInfoLog;
99 interface->fGetShaderiv = glGetShaderiv;
100 interface->fGetString = glGetString;
101 interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
102 interface->fGenTextures = glGenTextures;
103 interface->fGetUniformLocation = glGetUniformLocation;
104 interface->fLineWidth = glLineWidth;
105 interface->fLinkProgram = glLinkProgram;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000106 interface->fMapBuffer = glMapBuffer;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000107 interface->fPixelStorei = glPixelStorei;
108 interface->fReadBuffer = glReadBuffer;
109 interface->fReadPixels = glReadPixels;
110 interface->fScissor = glScissor;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000111 interface->fShaderSource = glShaderSource;
112 interface->fStencilFunc = glStencilFunc;
113 interface->fStencilFuncSeparate = glStencilFuncSeparate;
114 interface->fStencilMask = glStencilMask;
115 interface->fStencilMaskSeparate = glStencilMaskSeparate;
116 interface->fStencilOp = glStencilOp;
117 interface->fStencilOpSeparate = glStencilOpSeparate;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000118 // mac uses GLenum for internalFormat param (non-standard)
119 // amounts to int vs. uint.
120 interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
121 interface->fTexParameteri = glTexParameteri;
122 interface->fTexSubImage2D = glTexSubImage2D;
123 interface->fUniform1f = glUniform1f;
124 interface->fUniform1i = glUniform1i;
125 interface->fUniform1fv = glUniform1fv;
126 interface->fUniform1iv = glUniform1iv;
127 interface->fUniform2f = glUniform2f;
128 interface->fUniform2i = glUniform2i;
129 interface->fUniform2fv = glUniform2fv;
130 interface->fUniform2iv = glUniform2iv;
131 interface->fUniform3f = glUniform3f;
132 interface->fUniform3i = glUniform3i;
133 interface->fUniform3fv = glUniform3fv;
134 interface->fUniform3iv = glUniform3iv;
135 interface->fUniform4f = glUniform4f;
136 interface->fUniform4i = glUniform4i;
137 interface->fUniform4fv = glUniform4fv;
138 interface->fUniform4iv = glUniform4iv;
139 interface->fUniform4fv = glUniform4fv;
140 interface->fUniformMatrix2fv = glUniformMatrix2fv;
141 interface->fUniformMatrix3fv = glUniformMatrix3fv;
142 interface->fUniformMatrix4fv = glUniformMatrix4fv;
143 interface->fUnmapBuffer = glUnmapBuffer;
144 interface->fUseProgram = glUseProgram;
145 interface->fVertexAttrib4fv = glVertexAttrib4fv;
146 interface->fVertexAttribPointer = glVertexAttribPointer;
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000147 interface->fViewport = glViewport;
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000148
bsalomon@google.combeccb1e2011-10-25 15:00:44 +0000149 if (ver >= GR_GL_VER(3,3) || GrGLHasExtensionFromString("GL_ARB_timer_query", extStr)) {
150 // ARB extension doesn't use the ARB suffix on the function name
151 #if GL_ARB_timer_query || GL_VERSION_3_3
152 interface->fQueryCounter = glQueryCounter;
153 interface->fGetQueryObjecti64v = glGetQueryObjecti64v;
154 interface->fGetQueryObjectui64v = glGetQueryObjectui64v;
155 #else
156 interface->fQueryCounter = GET_PROC(QueryCounter);
157 interface->fGetQueryObjecti64v = GET_PROC(GetQueryObjecti64v);
158 interface->fGetQueryObjectui64v = GET_PROC(GetQueryObjectui64v);
159 #endif
160 } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extStr)) {
161 #if GL_EXT_timer_query
162 interface->fGetQueryObjecti64v = glGetQueryObjecti64vEXT;
163 interface->fGetQueryObjectui64v = glGetQueryObjectui64vEXT;
164 #else
165 interface->fGetQueryObjecti64v = GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
166 interface->fGetQueryObjectui64v = GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
167 #endif
168 }
169
170 if (ver >= GR_GL_VER(3,0) || GrGLHasExtensionFromString("GL_ARB_framebuffer_object", extStr)) {
171 // ARB extension doesn't use the ARB suffix on the function names
172 #if GL_VERSION_3_0 || GL_ARB_framebuffer_object
173 interface->fGenFramebuffers = glGenFramebuffers;
174 interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
175 interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
176 interface->fBindFramebuffer = glBindFramebuffer;
177 interface->fFramebufferTexture2D = glFramebufferTexture2D;
178 interface->fCheckFramebufferStatus = glCheckFramebufferStatus;
179 interface->fDeleteFramebuffers = glDeleteFramebuffers;
180 interface->fRenderbufferStorage = glRenderbufferStorage;
181 interface->fGenRenderbuffers = glGenRenderbuffers;
182 interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
183 interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
184 interface->fBindRenderbuffer = glBindRenderbuffer;
185 interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample;
186 interface->fBlitFramebuffer = glBlitFramebuffer;
187 #else
188 interface->fGenFramebuffers = GET_PROC(GenFramebuffers);
189 interface->fGetFramebufferAttachmentParameteriv = GET_PROC(GetFramebufferAttachmentParameteriv);
190 interface->fGetRenderbufferParameteriv = GET_PROC(GetRenderbufferParameteriv);
191 interface->fBindFramebuffer = GET_PROC(BindFramebuffer);
192 interface->fFramebufferTexture2D = GET_PROC(FramebufferTexture2D);
193 interface->fCheckFramebufferStatus = GET_PROC(CheckFramebufferStatus);
194 interface->fDeleteFramebuffers = GET_PROC(DeleteFramebuffers);
195 interface->fRenderbufferStorage = GET_PROC(RenderbufferStorage);
196 interface->fGenRenderbuffers = GET_PROC(GenRenderbuffers);
197 interface->fDeleteRenderbuffers = GET_PROC(DeleteRenderbuffers);
198 interface->fFramebufferRenderbuffer = GET_PROC(FramebufferRenderbuffer);
199 interface->fBindRenderbuffer = GET_PROC(BindRenderbuffer);
200 interface->fRenderbufferStorageMultisample = GET_PROC(RenderbufferStorageMultisample);
201 interface->fBlitFramebuffer = GET_PROC(BlitFramebuffer);
202 #endif
203 } else {
204 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object", extStr)) {
205 #if GL_EXT_framebuffer_object
206 interface->fGenFramebuffers = glGenFramebuffersEXT;
207 interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameterivEXT;
208 interface->fGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
209 interface->fBindFramebuffer = glBindFramebufferEXT;
210 interface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
211 interface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
212 interface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
213 interface->fRenderbufferStorage = glRenderbufferStorageEXT;
214 interface->fGenRenderbuffers = glGenRenderbuffersEXT;
215 interface->fDeleteRenderbuffers = glDeleteRenderbuffersEXT;
216 interface->fFramebufferRenderbuffer = glFramebufferRenderbufferEXT;
217 interface->fBindRenderbuffer = glBindRenderbufferEXT;
218 #else
219 interface->fGenFramebuffers = GET_PROC_SUFFIX(GenFramebuffers, EXT);
220 interface->fGetFramebufferAttachmentParameteriv = GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
221 interface->fGetRenderbufferParameteriv = GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
222 interface->fBindFramebuffer = GET_PROC_SUFFIX(BindFramebuffer, EXT);
223 interface->fFramebufferTexture2D = GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
224 interface->fCheckFramebufferStatus = GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
225 interface->fDeleteFramebuffers = GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
226 interface->fRenderbufferStorage = GET_PROC_SUFFIX(RenderbufferStorage, EXT);
227 interface->fGenRenderbuffers = GET_PROC_SUFFIX(GenRenderbuffers, EXT);
228 interface->fDeleteRenderbuffers = GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
229 interface->fFramebufferRenderbuffer = GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
230 interface->fBindRenderbuffer = GET_PROC_SUFFIX(BindRenderbuffer, EXT);
231 #endif
232 }
233 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", extStr)) {
234 #if GL_EXT_framebuffer_multisample
235 interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleEXT;
236 #else
237 interface->fRenderbufferStorageMultisample = GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
238 #endif
239 }
240 if (GrGLHasExtensionFromString("", extStr)) {
241 #if GL_EXT_framebuffer_blit
242 interface->fBlitFramebuffer = glBlitFramebufferEXT;
243 #else
244 interface->fBlitFramebuffer = GET_PROC_SUFFIX(BlitFramebuffer, EXT);
245 #endif
246 }
247 }
248 if (ver >= GR_GL_VER(3,3) || GrGLHasExtensionFromString("GL_ARB_blend_func_extended", extStr)) {
249 // ARB extension doesn't use the ARB suffix on the function name
250 #if GL_VERSION_3_3 || GL_ARB_blend_func_extended
251 interface->fBindFragDataLocationIndexed = glBindFragDataLocationIndexed;
252 #else
253 interface->fBindFragDataLocationIndexed = GET_PROC(BindFragDataLocationIndexed);
254 #endif
255 }
bsalomon@google.com271cffc2011-05-20 14:13:56 +0000256
bsalomon@google.com6fb736f2011-09-16 18:51:57 +0000257 interface->fBindingsExported = kDesktop_GrGLBinding;
258 }
259 glInterface.get()->ref();
260 return glInterface.get();
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000261}