Upstream version 6.35.121.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / gl / android / GrGLCreateNativeInterface_android.cpp
1 // Modified from chromium/src/webkit/glue/gl_bindings_skia_cmd_buffer.cc
2
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
5 // found in the LICENSE file.
6
7 #include "gl/GrGLExtensions.h"
8 #include "gl/GrGLInterface.h"
9 #include "gl/GrGLUtil.h"
10
11 #ifndef GL_GLEXT_PROTOTYPES
12 #define GL_GLEXT_PROTOTYPES
13 #endif
14
15 #include <GLES2/gl2.h>
16 #include <GLES2/gl2ext.h>
17
18 #include <EGL/egl.h>
19
20 static GrGLInterface* create_es_interface(GrGLVersion version,
21                                           GrGLExtensions* extensions) {
22     if (version < GR_GL_VER(2,0)) {
23         return NULL;
24     }
25
26     GrGLInterface* interface = SkNEW(GrGLInterface);
27     interface->fStandard = kGLES_GrGLStandard;
28     GrGLInterface::Functions* functions = &interface->fFunctions;
29
30     functions->fActiveTexture = glActiveTexture;
31     functions->fAttachShader = glAttachShader;
32     functions->fBindAttribLocation = glBindAttribLocation;
33     functions->fBindBuffer = glBindBuffer;
34     functions->fBindTexture = glBindTexture;
35     functions->fBindVertexArray = glBindVertexArrayOES;
36     functions->fBlendColor = glBlendColor;
37     functions->fBlendFunc = glBlendFunc;
38     functions->fBufferData = glBufferData;
39     functions->fBufferSubData = glBufferSubData;
40     functions->fClear = glClear;
41     functions->fClearColor = glClearColor;
42     functions->fClearStencil = glClearStencil;
43     functions->fColorMask = glColorMask;
44     functions->fCompileShader = glCompileShader;
45     functions->fCompressedTexImage2D = glCompressedTexImage2D;
46     functions->fCopyTexSubImage2D = glCopyTexSubImage2D;
47     functions->fCreateProgram = glCreateProgram;
48     functions->fCreateShader = glCreateShader;
49     functions->fCullFace = glCullFace;
50     functions->fDeleteBuffers = glDeleteBuffers;
51     functions->fDeleteProgram = glDeleteProgram;
52     functions->fDeleteShader = glDeleteShader;
53     functions->fDeleteTextures = glDeleteTextures;
54     functions->fDeleteVertexArrays = glDeleteVertexArraysOES;
55     functions->fDepthMask = glDepthMask;
56     functions->fDisable = glDisable;
57     functions->fDisableVertexAttribArray = glDisableVertexAttribArray;
58     functions->fDrawArrays = glDrawArrays;
59     functions->fDrawElements = glDrawElements;
60     functions->fEnable = glEnable;
61     functions->fEnableVertexAttribArray = glEnableVertexAttribArray;
62     functions->fFinish = glFinish;
63     functions->fFlush = glFlush;
64     functions->fFrontFace = glFrontFace;
65     functions->fGenBuffers = glGenBuffers;
66     functions->fGenerateMipmap = glGenerateMipmap;
67     functions->fGenTextures = glGenTextures;
68     functions->fGenVertexArrays = glGenVertexArraysOES;
69     functions->fGetBufferParameteriv = glGetBufferParameteriv;
70     functions->fGetError = glGetError;
71     functions->fGetIntegerv = glGetIntegerv;
72     functions->fGetProgramInfoLog = glGetProgramInfoLog;
73     functions->fGetProgramiv = glGetProgramiv;
74     functions->fGetShaderInfoLog = glGetShaderInfoLog;
75     functions->fGetShaderiv = glGetShaderiv;
76     functions->fGetString = glGetString;
77 #if GL_ES_VERSION_30
78     functions->fGetStringi = glGetStringi;
79 #else
80     functions->fGetStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi");
81 #endif
82     functions->fGetUniformLocation = glGetUniformLocation;
83     functions->fLineWidth = glLineWidth;
84     functions->fLinkProgram = glLinkProgram;
85     functions->fPixelStorei = glPixelStorei;
86     functions->fReadPixels = glReadPixels;
87     functions->fScissor = glScissor;
88 #if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE
89     functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource;
90 #else
91     functions->fShaderSource = glShaderSource;
92 #endif
93     functions->fStencilFunc = glStencilFunc;
94     functions->fStencilFuncSeparate = glStencilFuncSeparate;
95     functions->fStencilMask = glStencilMask;
96     functions->fStencilMaskSeparate = glStencilMaskSeparate;
97     functions->fStencilOp = glStencilOp;
98     functions->fStencilOpSeparate = glStencilOpSeparate;
99     functions->fTexImage2D = glTexImage2D;
100     functions->fTexParameteri = glTexParameteri;
101     functions->fTexParameteriv = glTexParameteriv;
102     functions->fTexSubImage2D = glTexSubImage2D;
103
104     if (version >= GR_GL_VER(3,0)) {
105 #if GL_ES_VERSION_3_0
106         functions->fTexStorage2D = glTexStorage2D;
107 #else
108         functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2D");
109 #endif
110     } else {
111 #if GL_EXT_texture_storage
112         functions->fTexStorage2D = glTexStorage2DEXT;
113 #else
114         functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT");
115 #endif
116     }
117
118 #if GL_EXT_discard_framebuffer
119     functions->fDiscardFramebuffer = glDiscardFramebufferEXT;
120 #endif
121     functions->fUniform1f = glUniform1f;
122     functions->fUniform1i = glUniform1i;
123     functions->fUniform1fv = glUniform1fv;
124     functions->fUniform1iv = glUniform1iv;
125     functions->fUniform2f = glUniform2f;
126     functions->fUniform2i = glUniform2i;
127     functions->fUniform2fv = glUniform2fv;
128     functions->fUniform2iv = glUniform2iv;
129     functions->fUniform3f = glUniform3f;
130     functions->fUniform3i = glUniform3i;
131     functions->fUniform3fv = glUniform3fv;
132     functions->fUniform3iv = glUniform3iv;
133     functions->fUniform4f = glUniform4f;
134     functions->fUniform4i = glUniform4i;
135     functions->fUniform4fv = glUniform4fv;
136     functions->fUniform4iv = glUniform4iv;
137     functions->fUniformMatrix2fv = glUniformMatrix2fv;
138     functions->fUniformMatrix3fv = glUniformMatrix3fv;
139     functions->fUniformMatrix4fv = glUniformMatrix4fv;
140     functions->fUseProgram = glUseProgram;
141     functions->fVertexAttrib4fv = glVertexAttrib4fv;
142     functions->fVertexAttribPointer = glVertexAttribPointer;
143     functions->fViewport = glViewport;
144     functions->fBindFramebuffer = glBindFramebuffer;
145     functions->fBindRenderbuffer = glBindRenderbuffer;
146     functions->fCheckFramebufferStatus = glCheckFramebufferStatus;
147     functions->fDeleteFramebuffers = glDeleteFramebuffers;
148     functions->fDeleteRenderbuffers = glDeleteRenderbuffers;
149     functions->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
150     functions->fFramebufferTexture2D = glFramebufferTexture2D;
151
152     if (version >= GR_GL_VER(3,0)) {
153 #if GL_ES_VERSION_3_0
154         functions->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample;
155         functions->fBlitFramebuffer = glBlitFramebuffer;
156 #else
157         functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample");
158         functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("glBlitFramebuffer");
159 #endif
160     }
161
162     if (extensions->has("GL_EXT_multisampled_render_to_texture")) {
163 #if GL_EXT_multisampled_render_to_texture
164         functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleEXT;
165         functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT;
166 #else
167         functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleEXT");
168         functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleEXT");
169 #endif
170     } else if (extensions->has("GL_IMG_multisampled_render_to_texture")) {
171 #if GL_IMG_multisampled_render_to_texture
172         functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleIMG;
173         functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG;
174 #else
175         functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleIMG");
176         functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG");
177 #endif
178     }
179
180     functions->fGenFramebuffers = glGenFramebuffers;
181     functions->fGenRenderbuffers = glGenRenderbuffers;
182     functions->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
183     functions->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
184     functions->fRenderbufferStorage = glRenderbufferStorage;
185 #if GL_OES_mapbuffer
186     functions->fMapBuffer = glMapBufferOES;
187     functions->fUnmapBuffer = glUnmapBufferOES;
188 #else
189     functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES");
190     functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES");
191 #endif
192
193     if (extensions->has("GL_EXT_debug_marker")) {
194         functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarker");
195         functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarker");
196         functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGroupMarker");
197         // The below check is here because a device has been found that has the extension string but
198         // returns NULL from the eglGetProcAddress for the functions
199         if (NULL == functions->fInsertEventMarker ||
200             NULL == functions->fPushGroupMarker ||
201             NULL == functions->fPopGroupMarker) {
202             extensions->remove("GL_EXT_debug_marker");
203         }
204     }
205
206     return interface;
207 }
208
209 static GrGLInterface* create_desktop_interface(GrGLVersion version,
210                                                const GrGLExtensions& extensions) {
211     // Currently this assumes a 4.4 context or later. Supporting lower GL versions would require
212     // getting suffixed versions of pointers for supported extensions.
213     if (version < GR_GL_VER(4,4)) {
214         return NULL;
215     }
216
217     GrGLInterface* interface = SkNEW(GrGLInterface);
218     interface->fStandard = kGL_GrGLStandard;
219     GrGLInterface::Functions* functions = &interface->fFunctions;
220
221     functions->fActiveTexture = (GrGLActiveTextureProc) eglGetProcAddress("glActiveTexture");
222     functions->fAttachShader = (GrGLAttachShaderProc) eglGetProcAddress("glAttachShader");
223     functions->fBeginQuery = (GrGLBeginQueryProc) eglGetProcAddress("glBeginQuery");
224     functions->fBindAttribLocation = (GrGLBindAttribLocationProc) eglGetProcAddress("glBindAttribLocation");
225     functions->fBindBuffer = (GrGLBindBufferProc) eglGetProcAddress("glBindBuffer");
226     functions->fBindFragDataLocation = (GrGLBindFragDataLocationProc) eglGetProcAddress("glBindFragDataLocation");
227     functions->fBindFragDataLocationIndexed = (GrGLBindFragDataLocationIndexedProc) eglGetProcAddress("glBindFragDataLocationIndexed");
228     functions->fBindFramebuffer = (GrGLBindFramebufferProc) eglGetProcAddress("glBindFramebuffer");
229     functions->fBindRenderbuffer = (GrGLBindRenderbufferProc) eglGetProcAddress("glBindRenderbuffer");
230     functions->fBindTexture = (GrGLBindTextureProc) eglGetProcAddress("glBindTexture");
231     functions->fBindVertexArray = (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArray");
232     functions->fBlendColor = (GrGLBlendColorProc) eglGetProcAddress("glBlendColor");
233     functions->fBlendFunc = (GrGLBlendFuncProc) eglGetProcAddress("glBlendFunc");
234     functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("glBlitFramebuffer");
235     functions->fBufferData = (GrGLBufferDataProc) eglGetProcAddress("glBufferData");
236     functions->fBufferSubData = (GrGLBufferSubDataProc) eglGetProcAddress("glBufferSubData");
237     functions->fCheckFramebufferStatus = (GrGLCheckFramebufferStatusProc) eglGetProcAddress("glCheckFramebufferStatus");
238     functions->fClear = (GrGLClearProc) eglGetProcAddress("glClear");
239     functions->fClearColor = (GrGLClearColorProc) eglGetProcAddress("glClearColor");
240     functions->fClearStencil = (GrGLClearStencilProc) eglGetProcAddress("glClearStencil");
241     functions->fColorMask = (GrGLColorMaskProc) eglGetProcAddress("glColorMask");
242     functions->fCompileShader = (GrGLCompileShaderProc) eglGetProcAddress("glCompileShader");
243     functions->fCompressedTexImage2D = (GrGLCompressedTexImage2DProc) eglGetProcAddress("glCompressedTexImage2D");
244     functions->fCopyTexSubImage2D = (GrGLCopyTexSubImage2DProc) eglGetProcAddress("glCopyTexSubImage2D");
245     functions->fCreateProgram = (GrGLCreateProgramProc) eglGetProcAddress("glCreateProgram");
246     functions->fCreateShader = (GrGLCreateShaderProc) eglGetProcAddress("glCreateShader");
247     functions->fCullFace = (GrGLCullFaceProc) eglGetProcAddress("glCullFace");
248     functions->fDeleteBuffers = (GrGLDeleteBuffersProc) eglGetProcAddress("glDeleteBuffers");
249     functions->fDeleteFramebuffers = (GrGLDeleteFramebuffersProc) eglGetProcAddress("glDeleteFramebuffers");
250     functions->fDeleteProgram = (GrGLDeleteProgramProc) eglGetProcAddress("glDeleteProgram");
251     functions->fDeleteQueries = (GrGLDeleteQueriesProc) eglGetProcAddress("glDeleteQueries");
252     functions->fDeleteRenderbuffers = (GrGLDeleteRenderbuffersProc) eglGetProcAddress("glDeleteRenderbuffers");
253     functions->fDeleteShader = (GrGLDeleteShaderProc) eglGetProcAddress("glDeleteShader");
254     functions->fDeleteTextures = (GrGLDeleteTexturesProc) eglGetProcAddress("glDeleteTextures");
255     functions->fDeleteVertexArrays = (GrGLDeleteVertexArraysProc) eglGetProcAddress("glDeleteVertexArrays");
256     functions->fDepthMask = (GrGLDepthMaskProc) eglGetProcAddress("glDepthMask");
257     functions->fDisable = (GrGLDisableProc) eglGetProcAddress("glDisable");
258     functions->fDisableVertexAttribArray = (GrGLDisableVertexAttribArrayProc) eglGetProcAddress("glDisableVertexAttribArray");
259     functions->fDrawArrays = (GrGLDrawArraysProc) eglGetProcAddress("glDrawArrays");
260     functions->fDrawBuffer = (GrGLDrawBufferProc) eglGetProcAddress("glDrawBuffer");
261     functions->fDrawBuffers = (GrGLDrawBuffersProc) eglGetProcAddress("glDrawBuffers");
262     functions->fDrawElements = (GrGLDrawElementsProc) eglGetProcAddress("glDrawElements");
263     functions->fEnable = (GrGLEnableProc) eglGetProcAddress("glEnable");
264     functions->fEnableVertexAttribArray = (GrGLEnableVertexAttribArrayProc) eglGetProcAddress("glEnableVertexAttribArray");
265     functions->fEndQuery = (GrGLEndQueryProc) eglGetProcAddress("glEndQuery");
266     functions->fFinish = (GrGLFinishProc) eglGetProcAddress("glFinish");
267     functions->fFlush = (GrGLFlushProc) eglGetProcAddress("glFlush");
268     functions->fFramebufferRenderbuffer = (GrGLFramebufferRenderbufferProc) eglGetProcAddress("glFramebufferRenderbuffer");
269     functions->fFramebufferTexture2D = (GrGLFramebufferTexture2DProc) eglGetProcAddress("glFramebufferTexture2D");
270     functions->fFrontFace = (GrGLFrontFaceProc) eglGetProcAddress("glFrontFace");
271     functions->fGenBuffers = (GrGLGenBuffersProc) eglGetProcAddress("glGenBuffers");
272     functions->fGenFramebuffers = (GrGLGenFramebuffersProc) eglGetProcAddress("glGenFramebuffers");
273     functions->fGenerateMipmap = (GrGLGenerateMipmapProc) eglGetProcAddress("glGenerateMipmap");
274     functions->fGenQueries = (GrGLGenQueriesProc) eglGetProcAddress("glGenQueries");
275     functions->fGenRenderbuffers = (GrGLGenRenderbuffersProc) eglGetProcAddress("glGenRenderbuffers");
276     functions->fGenTextures = (GrGLGenTexturesProc) eglGetProcAddress("glGenTextures");
277     functions->fGenVertexArrays = (GrGLGenVertexArraysProc) eglGetProcAddress("glGenVertexArrays");
278     functions->fGetBufferParameteriv = (GrGLGetBufferParameterivProc) eglGetProcAddress("glGetBufferParameteriv");
279     functions->fGetError = (GrGLGetErrorProc) eglGetProcAddress("glGetError");
280     functions->fGetFramebufferAttachmentParameteriv = (GrGLGetFramebufferAttachmentParameterivProc) eglGetProcAddress("glGetFramebufferAttachmentParameteriv");
281     functions->fGetIntegerv = (GrGLGetIntegervProc) eglGetProcAddress("glGetIntegerv");
282     functions->fGetQueryObjecti64v = (GrGLGetQueryObjecti64vProc) eglGetProcAddress("glGetQueryObjecti64v");
283     functions->fGetQueryObjectiv = (GrGLGetQueryObjectivProc) eglGetProcAddress("glGetQueryObjectiv");
284     functions->fGetQueryObjectui64v = (GrGLGetQueryObjectui64vProc) eglGetProcAddress("glGetQueryObjectui64v");
285     functions->fGetQueryObjectuiv = (GrGLGetQueryObjectuivProc) eglGetProcAddress("glGetQueryObjectuiv");
286     functions->fGetQueryiv = (GrGLGetQueryivProc) eglGetProcAddress("glGetQueryiv");
287     functions->fGetProgramInfoLog = (GrGLGetProgramInfoLogProc) eglGetProcAddress("glGetProgramInfoLog");
288     functions->fGetProgramiv = (GrGLGetProgramivProc) eglGetProcAddress("glGetProgramiv");
289     functions->fGetRenderbufferParameteriv = (GrGLGetRenderbufferParameterivProc) eglGetProcAddress("glGetRenderbufferParameteriv");
290     functions->fGetShaderInfoLog = (GrGLGetShaderInfoLogProc) eglGetProcAddress("glGetShaderInfoLog");
291     functions->fGetShaderiv = (GrGLGetShaderivProc) eglGetProcAddress("glGetShaderiv");
292     functions->fGetString = (GrGLGetStringProc) eglGetProcAddress("glGetString");
293     functions->fGetStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi");
294     functions->fGetTexLevelParameteriv = (GrGLGetTexLevelParameterivProc) eglGetProcAddress("glGetTexLevelParameteriv");
295     functions->fGetUniformLocation = (GrGLGetUniformLocationProc) eglGetProcAddress("glGetUniformLocation");
296     functions->fLineWidth = (GrGLLineWidthProc) eglGetProcAddress("glLineWidth");
297     functions->fLinkProgram = (GrGLLinkProgramProc) eglGetProcAddress("glLinkProgram");
298     functions->fLoadIdentity = (GrGLLoadIdentityProc) eglGetProcAddress("glLoadIdentity");
299     functions->fLoadMatrixf = (GrGLLoadMatrixfProc) eglGetProcAddress("glLoadMatrixf");
300     functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBuffer");
301     functions->fMatrixMode = (GrGLMatrixModeProc) eglGetProcAddress("glMatrixMode");
302     functions->fPixelStorei = (GrGLPixelStoreiProc) eglGetProcAddress("glPixelStorei");
303     functions->fQueryCounter = (GrGLQueryCounterProc) eglGetProcAddress("glQueryCounter");
304     functions->fReadBuffer = (GrGLReadBufferProc) eglGetProcAddress("glReadBuffer");
305     functions->fReadPixels = (GrGLReadPixelsProc) eglGetProcAddress("glReadPixels");
306     functions->fRenderbufferStorage = (GrGLRenderbufferStorageProc) eglGetProcAddress("glRenderbufferStorage");
307     functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample");
308     functions->fScissor = (GrGLScissorProc) eglGetProcAddress("glScissor");
309     functions->fShaderSource = (GrGLShaderSourceProc) eglGetProcAddress("glShaderSource");
310     functions->fStencilFunc = (GrGLStencilFuncProc) eglGetProcAddress("glStencilFunc");
311     functions->fStencilFuncSeparate = (GrGLStencilFuncSeparateProc) eglGetProcAddress("glStencilFuncSeparate");
312     functions->fStencilMask = (GrGLStencilMaskProc) eglGetProcAddress("glStencilMask");
313     functions->fStencilMaskSeparate = (GrGLStencilMaskSeparateProc) eglGetProcAddress("glStencilMaskSeparate");
314     functions->fStencilOp = (GrGLStencilOpProc) eglGetProcAddress("glStencilOp");
315     functions->fStencilOpSeparate = (GrGLStencilOpSeparateProc) eglGetProcAddress("glStencilOpSeparate");
316     functions->fTexGenfv = (GrGLTexGenfvProc) eglGetProcAddress("glTexGenfv");
317     functions->fTexGeni = (GrGLTexGeniProc) eglGetProcAddress("glTexGeni");
318     functions->fTexImage2D = (GrGLTexImage2DProc) eglGetProcAddress("glTexImage2D");
319     functions->fTexParameteri = (GrGLTexParameteriProc) eglGetProcAddress("glTexParameteri");
320     functions->fTexParameteriv = (GrGLTexParameterivProc) eglGetProcAddress("glTexParameteriv");
321     functions->fTexSubImage2D = (GrGLTexSubImage2DProc) eglGetProcAddress("glTexSubImage2D");
322     functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2D");
323     functions->fUniform1f = (GrGLUniform1fProc) eglGetProcAddress("glUniform1f");
324     functions->fUniform1i = (GrGLUniform1iProc) eglGetProcAddress("glUniform1i");
325     functions->fUniform1fv = (GrGLUniform1fvProc) eglGetProcAddress("glUniform1fv");
326     functions->fUniform1iv = (GrGLUniform1ivProc) eglGetProcAddress("glUniform1iv");
327     functions->fUniform2f = (GrGLUniform2fProc) eglGetProcAddress("glUniform2f");
328     functions->fUniform2i = (GrGLUniform2iProc) eglGetProcAddress("glUniform2i");
329     functions->fUniform2fv = (GrGLUniform2fvProc) eglGetProcAddress("glUniform2fv");
330     functions->fUniform2iv = (GrGLUniform2ivProc) eglGetProcAddress("glUniform2iv");
331     functions->fUniform3f = (GrGLUniform3fProc) eglGetProcAddress("glUniform3f");
332     functions->fUniform3i = (GrGLUniform3iProc) eglGetProcAddress("glUniform3i");
333     functions->fUniform3fv = (GrGLUniform3fvProc) eglGetProcAddress("glUniform3fv");
334     functions->fUniform3iv = (GrGLUniform3ivProc) eglGetProcAddress("glUniform3iv");
335     functions->fUniform4f = (GrGLUniform4fProc) eglGetProcAddress("glUniform4f");
336     functions->fUniform4i = (GrGLUniform4iProc) eglGetProcAddress("glUniform4i");
337     functions->fUniform4fv = (GrGLUniform4fvProc) eglGetProcAddress("glUniform4fv");
338     functions->fUniform4iv = (GrGLUniform4ivProc) eglGetProcAddress("glUniform4iv");
339     functions->fUniformMatrix2fv = (GrGLUniformMatrix2fvProc) eglGetProcAddress("glUniformMatrix2fv");
340     functions->fUniformMatrix3fv = (GrGLUniformMatrix3fvProc) eglGetProcAddress("glUniformMatrix3fv");
341     functions->fUniformMatrix4fv = (GrGLUniformMatrix4fvProc) eglGetProcAddress("glUniformMatrix4fv");
342     functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBuffer");
343     functions->fUseProgram = (GrGLUseProgramProc) eglGetProcAddress("glUseProgram");
344     functions->fVertexAttrib4fv = (GrGLVertexAttrib4fvProc) eglGetProcAddress("glVertexAttrib4fv");
345     functions->fVertexAttribPointer = (GrGLVertexAttribPointerProc) eglGetProcAddress("glVertexAttribPointer");
346     functions->fViewport = (GrGLViewportProc) eglGetProcAddress("glViewport");
347
348     if (extensions.has("GL_NV_path_rendering")) {
349         functions->fPathCommands = (GrGLPathCommandsProc) eglGetProcAddress("glPathCommandsNV");
350         functions->fPathCoords = (GrGLPathCoordsProc) eglGetProcAddress("glPathCoordsNV");
351         functions->fPathSubCommands = (GrGLPathSubCommandsProc) eglGetProcAddress("glPathSubCommandsNV");
352         functions->fPathSubCoords = (GrGLPathSubCoordsProc) eglGetProcAddress("glPathSubCoordsNV");
353         functions->fPathString = (GrGLPathStringProc) eglGetProcAddress("glPathStringNV");
354         functions->fPathGlyphs = (GrGLPathGlyphsProc) eglGetProcAddress("glPathGlyphsNV");
355         functions->fPathGlyphRange = (GrGLPathGlyphRangeProc) eglGetProcAddress("glPathGlyphRangeNV");
356         functions->fWeightPaths = (GrGLWeightPathsProc) eglGetProcAddress("glWeightPathsNV");
357         functions->fCopyPath = (GrGLCopyPathProc) eglGetProcAddress("glCopyPathNV");
358         functions->fInterpolatePaths = (GrGLInterpolatePathsProc) eglGetProcAddress("glInterpolatePathsNV");
359         functions->fTransformPath = (GrGLTransformPathProc) eglGetProcAddress("glTransformPathNV");
360         functions->fPathParameteriv = (GrGLPathParameterivProc) eglGetProcAddress("glPathParameterivNV");
361         functions->fPathParameteri = (GrGLPathParameteriProc) eglGetProcAddress("glPathParameteriNV");
362         functions->fPathParameterfv = (GrGLPathParameterfvProc) eglGetProcAddress("glPathParameterfvNV");
363         functions->fPathParameterf = (GrGLPathParameterfProc) eglGetProcAddress("glPathParameterfNV");
364         functions->fPathDashArray = (GrGLPathDashArrayProc) eglGetProcAddress("glPathDashArrayNV");
365         functions->fGenPaths = (GrGLGenPathsProc) eglGetProcAddress("glGenPathsNV");
366         functions->fDeletePaths = (GrGLDeletePathsProc) eglGetProcAddress("glDeletePathsNV");
367         functions->fIsPath = (GrGLIsPathProc) eglGetProcAddress("glIsPathNV");
368         functions->fPathStencilFunc = (GrGLPathStencilFuncProc) eglGetProcAddress("glPathStencilFuncNV");
369         functions->fPathStencilDepthOffset = (GrGLPathStencilDepthOffsetProc) eglGetProcAddress("glPathStencilDepthOffsetNV");
370         functions->fStencilFillPath = (GrGLStencilFillPathProc) eglGetProcAddress("glStencilFillPathNV");
371         functions->fStencilStrokePath = (GrGLStencilStrokePathProc) eglGetProcAddress("glStencilStrokePathNV");
372         functions->fStencilFillPathInstanced = (GrGLStencilFillPathInstancedProc) eglGetProcAddress("glStencilFillPathInstancedNV");
373         functions->fStencilStrokePathInstanced = (GrGLStencilStrokePathInstancedProc) eglGetProcAddress("glStencilStrokePathInstancedNV");
374         functions->fPathCoverDepthFunc = (GrGLPathCoverDepthFuncProc) eglGetProcAddress("glPathCoverDepthFuncNV");
375         functions->fPathColorGen = (GrGLPathColorGenProc) eglGetProcAddress("glPathColorGenNV");
376         functions->fPathTexGen = (GrGLPathTexGenProc) eglGetProcAddress("glPathTexGenNV");
377         functions->fPathFogGen = (GrGLPathFogGenProc) eglGetProcAddress("glPathFogGenNV");
378         functions->fCoverFillPath = (GrGLCoverFillPathProc) eglGetProcAddress("glCoverFillPathNV");
379         functions->fCoverStrokePath = (GrGLCoverStrokePathProc) eglGetProcAddress("glCoverStrokePathNV");
380         functions->fCoverFillPathInstanced = (GrGLCoverFillPathInstancedProc) eglGetProcAddress("glCoverFillPathInstancedNV");
381         functions->fCoverStrokePathInstanced = (GrGLCoverStrokePathInstancedProc) eglGetProcAddress("glCoverStrokePathInstancedNV");
382         functions->fGetPathParameteriv = (GrGLGetPathParameterivProc) eglGetProcAddress("glGetPathParameterivNV");
383         functions->fGetPathParameterfv = (GrGLGetPathParameterfvProc) eglGetProcAddress("glGetPathParameterfvNV");
384         functions->fGetPathCommands = (GrGLGetPathCommandsProc) eglGetProcAddress("glGetPathCommandsNV");
385         functions->fGetPathCoords = (GrGLGetPathCoordsProc) eglGetProcAddress("glGetPathCoordsNV");
386         functions->fGetPathDashArray = (GrGLGetPathDashArrayProc) eglGetProcAddress("glGetPathDashArrayNV");
387         functions->fGetPathMetrics = (GrGLGetPathMetricsProc) eglGetProcAddress("glGetPathMetricsNV");
388         functions->fGetPathMetricRange = (GrGLGetPathMetricRangeProc) eglGetProcAddress("glGetPathMetricRangeNV");
389         functions->fGetPathSpacing = (GrGLGetPathSpacingProc) eglGetProcAddress("glGetPathSpacingNV");
390         functions->fGetPathColorGeniv = (GrGLGetPathColorGenivProc) eglGetProcAddress("glGetPathColorGenivNV");
391         functions->fGetPathColorGenfv = (GrGLGetPathColorGenfvProc) eglGetProcAddress("glGetPathColorGenfvNV");
392         functions->fGetPathTexGeniv = (GrGLGetPathTexGenivProc) eglGetProcAddress("glGetPathTexGenivNV");
393         functions->fGetPathTexGenfv = (GrGLGetPathTexGenfvProc) eglGetProcAddress("glGetPathTexGenfvNV");
394         functions->fIsPointInFillPath = (GrGLIsPointInFillPathProc) eglGetProcAddress("glIsPointInFillPathNV");
395         functions->fIsPointInStrokePath = (GrGLIsPointInStrokePathProc) eglGetProcAddress("glIsPointInStrokePathNV");
396         functions->fGetPathLength = (GrGLGetPathLengthProc) eglGetProcAddress("glGetPathLengthNV");
397         functions->fPointAlongPath = (GrGLPointAlongPathProc) eglGetProcAddress("glPointAlongPathNV");
398     }
399
400     if (extensions.has("GL_EXT_debug_marker")) {
401         functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarkerEXT");
402         functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarkerEXT");
403         functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGroupMarkerEXT");
404     }
405
406     return interface;
407 }
408
409 const GrGLInterface* GrGLCreateNativeInterface() {
410
411     GrGLGetStringiProc getStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi");
412
413     const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION));
414     GrGLVersion version = GrGLGetVersionFromString(verStr);
415     GrGLStandard standard = GrGLGetStandardInUseFromString(verStr);
416
417     GrGLExtensions extensions;
418     if (!extensions.init(standard, glGetString, getStringi, glGetIntegerv)) {
419         return NULL;
420     }
421
422     GrGLInterface* interface = NULL;
423     if (kGLES_GrGLStandard == standard) {
424         interface = create_es_interface(version, &extensions);
425     } else if (kGL_GrGLStandard == standard) {
426         interface = create_desktop_interface(version, extensions);
427     }
428
429     if (NULL != interface) {
430         interface->fExtensions.swap(&extensions);
431     }
432
433     return interface;
434 }