Home | History | Annotate | Download | only in android
      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/GrGLInterface.h"
      8 #include "gl/GrGLAssembleInterface.h"
      9 #include "gl/GrGLExtensions.h"
     10 #include "gl/GrGLUtil.h"
     11 
     12 #ifndef GL_GLEXT_PROTOTYPES
     13 #define GL_GLEXT_PROTOTYPES
     14 #endif
     15 
     16 #include <GLES2/gl2.h>
     17 #include <GLES2/gl2ext.h>
     18 
     19 #include <EGL/egl.h>
     20 
     21 static GrGLInterface* create_es_interface(GrGLVersion version,
     22                                           GrGLExtensions* extensions) {
     23     if (version < GR_GL_VER(2,0)) {
     24         return NULL;
     25     }
     26 
     27     GrGLInterface* interface = SkNEW(GrGLInterface);
     28     interface->fStandard = kGLES_GrGLStandard;
     29     GrGLInterface::Functions* functions = &interface->fFunctions;
     30 
     31     functions->fActiveTexture = glActiveTexture;
     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("glGetStringi");
     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("glTexStorage2D");
    111 #endif
    112     } else {
    113 #if GL_EXT_texture_storage
    114         functions->fTexStorage2D = glTexStorage2DEXT;
    115 #else
    116         functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT");
    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 = glRenderbufferStorageMultisample;
    157         functions->fBlitFramebuffer = glBlitFramebuffer;
    158 #else
    159         functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample");
    160         functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("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 = glFramebufferTexture2DMultisampleEXT;
    167         functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT;
    168 #else
    169         functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleEXT");
    170         functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) 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 = glFramebufferTexture2DMultisampleIMG;
    175         functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG;
    176 #else
    177         functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleIMG");
    178         functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG");
    179 #endif
    180     }
    181 
    182     functions->fGenFramebuffers = glGenFramebuffers;
    183     functions->fGenRenderbuffers = glGenRenderbuffers;
    184     functions->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
    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("glMapBufferOES");
    193     functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES");
    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) eglGetProcAddress("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) eglGetProcAddress("glFlushMappedBufferRangeEXT");
    212 #endif
    213     }
    214 
    215     if (extensions->has("GL_EXT_debug_marker")) {
    216         functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarker");
    217         functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("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) eglGetProcAddress("glInvalidateFramebuffer");
    233     functions->fInvalidateSubFramebuffer = (GrGLInvalidateSubFramebufferProc) eglGetProcAddress("glInvalidateSubFramebuffer");
    234 #endif
    235     functions->fInvalidateBufferData = (GrGLInvalidateBufferDataProc) eglGetProcAddress("glInvalidateBufferData");
    236     functions->fInvalidateBufferSubData = (GrGLInvalidateBufferSubDataProc) eglGetProcAddress("glInvalidateBufferSubData");
    237     functions->fInvalidateTexImage = (GrGLInvalidateTexImageProc) eglGetProcAddress("glInvalidateTexImage");
    238     functions->fInvalidateTexSubImage = (GrGLInvalidateTexSubImageProc) eglGetProcAddress("glInvalidateTexSubImage");
    239 
    240     return interface;
    241 }
    242 
    243 static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) {
    244     SkASSERT(NULL == ctx);
    245     return eglGetProcAddress(name);
    246 }
    247 
    248 static const GrGLInterface* create_desktop_interface() {
    249     return GrGLAssembleGLInterface(NULL, android_get_gl_proc);
    250 }
    251 
    252 const GrGLInterface* GrGLCreateNativeInterface() {
    253 
    254     const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION));
    255     GrGLStandard standard = GrGLGetStandardInUseFromString(verStr);
    256 
    257     if (kGLES_GrGLStandard == standard) {
    258         GrGLVersion version = GrGLGetVersionFromString(verStr);
    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) {
    272         return create_desktop_interface();
    273     }
    274 
    275     return NULL;
    276 }
    277