OLD | NEW |
1 // Modified from chromium/src/webkit/glue/gl_bindings_skia_cmd_buffer.cc | 1 // Modified from chromium/src/webkit/glue/gl_bindings_skia_cmd_buffer.cc |
2 | 2 |
3 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 3 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
4 // Use of this source code is governed by a BSD-style license that can be | 4 // Use of this source code is governed by a BSD-style license that can be |
5 // found in the LICENSE file. | 5 // found in the LICENSE file. |
6 | 6 |
7 #include "gl/GrGLInterface.h" | 7 #include "gl/GrGLInterface.h" |
8 #include "gl/GrGLAssembleInterface.h" | 8 #include "gl/GrGLAssembleInterface.h" |
9 #include "gl/GrGLExtensions.h" | 9 #include "gl/GrGLExtensions.h" |
10 #include "gl/GrGLUtil.h" | 10 #include "gl/GrGLUtil.h" |
11 | 11 |
12 #ifndef GL_GLEXT_PROTOTYPES | 12 #ifndef GL_GLEXT_PROTOTYPES |
13 #define GL_GLEXT_PROTOTYPES | 13 #define GL_GLEXT_PROTOTYPES |
14 #endif | 14 #endif |
15 | 15 |
16 #include <GLES2/gl2.h> | 16 #include <GLES2/gl2.h> |
17 #include <GLES2/gl2ext.h> | 17 #include <GLES2/gl2ext.h> |
18 | 18 |
19 #include <EGL/egl.h> | 19 #include <EGL/egl.h> |
20 | 20 |
21 static GrGLInterface* create_es_interface(GrGLVersion version, | 21 #define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F) |
22 GrGLExtensions* extensions) { | 22 #define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "
gl" #F #S) |
23 if (version < GR_GL_VER(2,0)) { | 23 #define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl
" #F) |
24 return NULL; | |
25 } | |
26 | 24 |
27 GrGLInterface* interface = SkNEW(GrGLInterface); | 25 #define GET_LINKED(F) functions->f ## F = gl ## F |
28 interface->fStandard = kGLES_GrGLStandard; | 26 #define GET_LINKED_SUFFIX(F, S) functions->f ## F = gl ## F ##S |
29 GrGLInterface::Functions* functions = &interface->fFunctions; | |
30 | 27 |
31 functions->fActiveTexture = glActiveTexture; | 28 #include "gl/GrGLAssembleGLESInterface.h" |
32 functions->fAttachShader = glAttachShader; | |
33 functions->fBindAttribLocation = glBindAttribLocation; | |
34 functions->fBindBuffer = glBindBuffer; | |
35 functions->fBindTexture = glBindTexture; | |
36 functions->fBindVertexArray = glBindVertexArrayOES; | |
37 functions->fBlendColor = glBlendColor; | |
38 functions->fBlendFunc = glBlendFunc; | |
39 functions->fBufferData = glBufferData; | |
40 functions->fBufferSubData = glBufferSubData; | |
41 functions->fClear = glClear; | |
42 functions->fClearColor = glClearColor; | |
43 functions->fClearStencil = glClearStencil; | |
44 functions->fColorMask = glColorMask; | |
45 functions->fCompileShader = glCompileShader; | |
46 functions->fCompressedTexImage2D = glCompressedTexImage2D; | |
47 functions->fCompressedTexSubImage2D = glCompressedTexSubImage2D; | |
48 functions->fCopyTexSubImage2D = glCopyTexSubImage2D; | |
49 functions->fCreateProgram = glCreateProgram; | |
50 functions->fCreateShader = glCreateShader; | |
51 functions->fCullFace = glCullFace; | |
52 functions->fDeleteBuffers = glDeleteBuffers; | |
53 functions->fDeleteProgram = glDeleteProgram; | |
54 functions->fDeleteShader = glDeleteShader; | |
55 functions->fDeleteTextures = glDeleteTextures; | |
56 functions->fDeleteVertexArrays = glDeleteVertexArraysOES; | |
57 functions->fDepthMask = glDepthMask; | |
58 functions->fDisable = glDisable; | |
59 functions->fDisableVertexAttribArray = glDisableVertexAttribArray; | |
60 functions->fDrawArrays = glDrawArrays; | |
61 functions->fDrawElements = glDrawElements; | |
62 functions->fEnable = glEnable; | |
63 functions->fEnableVertexAttribArray = glEnableVertexAttribArray; | |
64 functions->fFinish = glFinish; | |
65 functions->fFlush = glFlush; | |
66 functions->fFrontFace = glFrontFace; | |
67 functions->fGenBuffers = glGenBuffers; | |
68 functions->fGenerateMipmap = glGenerateMipmap; | |
69 functions->fGenTextures = glGenTextures; | |
70 functions->fGenVertexArrays = glGenVertexArraysOES; | |
71 functions->fGetBufferParameteriv = glGetBufferParameteriv; | |
72 functions->fGetError = glGetError; | |
73 functions->fGetIntegerv = glGetIntegerv; | |
74 functions->fGetProgramInfoLog = glGetProgramInfoLog; | |
75 functions->fGetProgramiv = glGetProgramiv; | |
76 functions->fGetShaderInfoLog = glGetShaderInfoLog; | |
77 functions->fGetShaderiv = glGetShaderiv; | |
78 functions->fGetString = glGetString; | |
79 #if GL_ES_VERSION_3_0 | |
80 functions->fGetStringi = glGetStringi; | |
81 #else | |
82 functions->fGetStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetString
i"); | |
83 #endif | |
84 functions->fGetUniformLocation = glGetUniformLocation; | |
85 functions->fLineWidth = glLineWidth; | |
86 functions->fLinkProgram = glLinkProgram; | |
87 functions->fPixelStorei = glPixelStorei; | |
88 functions->fReadPixels = glReadPixels; | |
89 functions->fScissor = glScissor; | |
90 #if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE | |
91 functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource; | |
92 #else | |
93 functions->fShaderSource = glShaderSource; | |
94 #endif | |
95 functions->fStencilFunc = glStencilFunc; | |
96 functions->fStencilFuncSeparate = glStencilFuncSeparate; | |
97 functions->fStencilMask = glStencilMask; | |
98 functions->fStencilMaskSeparate = glStencilMaskSeparate; | |
99 functions->fStencilOp = glStencilOp; | |
100 functions->fStencilOpSeparate = glStencilOpSeparate; | |
101 functions->fTexImage2D = glTexImage2D; | |
102 functions->fTexParameteri = glTexParameteri; | |
103 functions->fTexParameteriv = glTexParameteriv; | |
104 functions->fTexSubImage2D = glTexSubImage2D; | |
105 | |
106 if (version >= GR_GL_VER(3,0)) { | |
107 #if GL_ES_VERSION_3_0 | |
108 functions->fTexStorage2D = glTexStorage2D; | |
109 #else | |
110 functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glT
exStorage2D"); | |
111 #endif | |
112 } else { | |
113 #if GL_EXT_texture_storage | |
114 functions->fTexStorage2D = glTexStorage2DEXT; | |
115 #else | |
116 functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glT
exStorage2DEXT"); | |
117 #endif | |
118 } | |
119 | |
120 #if GL_EXT_discard_framebuffer | |
121 functions->fDiscardFramebuffer = glDiscardFramebufferEXT; | |
122 #endif | |
123 functions->fUniform1f = glUniform1f; | |
124 functions->fUniform1i = glUniform1i; | |
125 functions->fUniform1fv = glUniform1fv; | |
126 functions->fUniform1iv = glUniform1iv; | |
127 functions->fUniform2f = glUniform2f; | |
128 functions->fUniform2i = glUniform2i; | |
129 functions->fUniform2fv = glUniform2fv; | |
130 functions->fUniform2iv = glUniform2iv; | |
131 functions->fUniform3f = glUniform3f; | |
132 functions->fUniform3i = glUniform3i; | |
133 functions->fUniform3fv = glUniform3fv; | |
134 functions->fUniform3iv = glUniform3iv; | |
135 functions->fUniform4f = glUniform4f; | |
136 functions->fUniform4i = glUniform4i; | |
137 functions->fUniform4fv = glUniform4fv; | |
138 functions->fUniform4iv = glUniform4iv; | |
139 functions->fUniformMatrix2fv = glUniformMatrix2fv; | |
140 functions->fUniformMatrix3fv = glUniformMatrix3fv; | |
141 functions->fUniformMatrix4fv = glUniformMatrix4fv; | |
142 functions->fUseProgram = glUseProgram; | |
143 functions->fVertexAttrib4fv = glVertexAttrib4fv; | |
144 functions->fVertexAttribPointer = glVertexAttribPointer; | |
145 functions->fViewport = glViewport; | |
146 functions->fBindFramebuffer = glBindFramebuffer; | |
147 functions->fBindRenderbuffer = glBindRenderbuffer; | |
148 functions->fCheckFramebufferStatus = glCheckFramebufferStatus; | |
149 functions->fDeleteFramebuffers = glDeleteFramebuffers; | |
150 functions->fDeleteRenderbuffers = glDeleteRenderbuffers; | |
151 functions->fFramebufferRenderbuffer = glFramebufferRenderbuffer; | |
152 functions->fFramebufferTexture2D = glFramebufferTexture2D; | |
153 | |
154 if (version >= GR_GL_VER(3,0)) { | |
155 #if GL_ES_VERSION_3_0 | |
156 functions->fRenderbufferStorageMultisample = glRenderbufferStorageMultis
ample; | |
157 functions->fBlitFramebuffer = glBlitFramebuffer; | |
158 #else | |
159 functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMul
tisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample"); | |
160 functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddres
s("glBlitFramebuffer"); | |
161 #endif | |
162 } | |
163 | |
164 if (extensions->has("GL_EXT_multisampled_render_to_texture")) { | |
165 #if GL_EXT_multisampled_render_to_texture | |
166 functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMult
isampleEXT; | |
167 functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorage
MultisampleEXT; | |
168 #else | |
169 functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DM
ultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleEXT"); | |
170 functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStor
ageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleEXT"); | |
171 #endif | |
172 } else if (extensions->has("GL_IMG_multisampled_render_to_texture")) { | |
173 #if GL_IMG_multisampled_render_to_texture | |
174 functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMult
isampleIMG; | |
175 functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorage
MultisampleIMG; | |
176 #else | |
177 functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DM
ultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleIMG"); | |
178 functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStor
ageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG"); | |
179 #endif | |
180 } | |
181 | |
182 functions->fGenFramebuffers = glGenFramebuffers; | |
183 functions->fGenRenderbuffers = glGenRenderbuffers; | |
184 functions->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachment
Parameteriv; | |
185 functions->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv; | |
186 functions->fRenderbufferStorage = glRenderbufferStorage; | |
187 | |
188 #if GL_OES_mapbuffer | |
189 functions->fMapBuffer = glMapBufferOES; | |
190 functions->fUnmapBuffer = glUnmapBufferOES; | |
191 #else | |
192 functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOE
S"); | |
193 functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBu
fferOES"); | |
194 | |
195 #endif | |
196 | |
197 if (version >= GR_GL_VER(3,0)) { | |
198 #if GL_ES_VERSION_3_0 | |
199 functions->fMapBufferRange = glMapBufferRange; | |
200 functions->fFlushMappedBufferRange = glFlushMappedBufferRange; | |
201 #else | |
202 functions->fMapBufferRange = (GrGLMapBufferRangeProc) eglGetProcAddress(
"glMapBufferRange"); | |
203 functions->fFlushMappedBufferRange = (GrGLFlushMappedBufferRangeProc) eg
lGetProcAddress("glFlushMappedBufferRange"); | |
204 #endif | |
205 } else if (extensions->has("GL_EXT_map_buffer_range")) { | |
206 #if GL_EXT_map_buffer_range | |
207 functions->fMapBufferRange = glMapBufferRangeEXT; | |
208 functions->fFlushMappedBufferRange = glFlushMappedBufferRangeEXT; | |
209 #else | |
210 functions->fMapBufferRange = (GrGLMapBufferRangeProc) eglGetProcAddress(
"glMapBufferRangeEXT"); | |
211 functions->fFlushMappedBufferRange = (GrGLFlushMappedBufferRangeProc) eg
lGetProcAddress("glFlushMappedBufferRangeEXT"); | |
212 #endif | |
213 } | |
214 | |
215 if (extensions->has("GL_EXT_debug_marker")) { | |
216 functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAd
dress("glInsertEventMarker"); | |
217 functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddr
ess("glPushGroupMarker"); | |
218 functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress(
"glPopGroupMarker"); | |
219 // The below check is here because a device has been found that has the
extension string but | |
220 // returns NULL from the eglGetProcAddress for the functions | |
221 if (NULL == functions->fInsertEventMarker || | |
222 NULL == functions->fPushGroupMarker || | |
223 NULL == functions->fPopGroupMarker) { | |
224 extensions->remove("GL_EXT_debug_marker"); | |
225 } | |
226 } | |
227 | |
228 #if GL_ES_VERSION_3_0 | |
229 functions->fInvalidateFramebuffer = glInvalidateFramebuffer; | |
230 functions->fInvalidateSubFramebuffer = glInvalidateSubFramebuffer; | |
231 #else | |
232 functions->fInvalidateFramebuffer = (GrGLInvalidateFramebufferProc) eglGetPr
ocAddress("glInvalidateFramebuffer"); | |
233 functions->fInvalidateSubFramebuffer = (GrGLInvalidateSubFramebufferProc) eg
lGetProcAddress("glInvalidateSubFramebuffer"); | |
234 #endif | |
235 functions->fInvalidateBufferData = (GrGLInvalidateBufferDataProc) eglGetProc
Address("glInvalidateBufferData"); | |
236 functions->fInvalidateBufferSubData = (GrGLInvalidateBufferSubDataProc) eglG
etProcAddress("glInvalidateBufferSubData"); | |
237 functions->fInvalidateTexImage = (GrGLInvalidateTexImageProc) eglGetProcAddr
ess("glInvalidateTexImage"); | |
238 functions->fInvalidateTexSubImage = (GrGLInvalidateTexSubImageProc) eglGetPr
ocAddress("glInvalidateTexSubImage"); | |
239 | |
240 return interface; | |
241 } | |
242 | 29 |
243 static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) { | 30 static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) { |
244 SkASSERT(NULL == ctx); | 31 SkASSERT(NULL == ctx); |
245 return eglGetProcAddress(name); | 32 return eglGetProcAddress(name); |
246 } | 33 } |
247 | 34 |
248 static const GrGLInterface* create_desktop_interface() { | |
249 return GrGLAssembleGLInterface(NULL, android_get_gl_proc); | |
250 } | |
251 | |
252 const GrGLInterface* GrGLCreateNativeInterface() { | 35 const GrGLInterface* GrGLCreateNativeInterface() { |
253 | 36 |
254 const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION
)); | 37 const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION
)); |
255 GrGLStandard standard = GrGLGetStandardInUseFromString(verStr); | 38 GrGLStandard standard = GrGLGetStandardInUseFromString(verStr); |
256 | 39 |
257 if (kGLES_GrGLStandard == standard) { | 40 if (kGLES_GrGLStandard == standard) { |
258 GrGLVersion version = GrGLGetVersionFromString(verStr); | 41 return GrGLAssembleGLESInterface(NULL, android_get_gl_proc); |
259 GrGLExtensions extensions; | |
260 GrGLGetStringiProc getStringi = (GrGLGetStringiProc) eglGetProcAddress("
glGetStringi"); | |
261 if (!extensions.init(standard, glGetString, getStringi, glGetIntegerv))
{ | |
262 return NULL; | |
263 } | |
264 GrGLInterface* interface = create_es_interface(version, &extensions); | |
265 | |
266 if (NULL != interface) { | |
267 interface->fExtensions.swap(&extensions); | |
268 } | |
269 | |
270 return interface; | |
271 } else if (kGL_GrGLStandard == standard) { | 42 } else if (kGL_GrGLStandard == standard) { |
272 return create_desktop_interface(); | 43 return GrGLAssembleGLInterface(NULL, android_get_gl_proc); |
273 } | 44 } |
274 | 45 |
275 return NULL; | 46 return NULL; |
276 } | 47 } |
OLD | NEW |