diff options
author | 2014-06-22 22:56:53 -0700 | |
---|---|---|
committer | 2014-06-22 22:56:54 -0700 | |
commit | 74fc727dc88ee24d89f88cb1709f963e9073aeb3 (patch) | |
tree | c1bc9dd2101168a5fbb2b9d523aafac3828c7876 /src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp | |
parent | 32956400b4d8f33394e2cdef9b66e8369ba2a0f3 (diff) |
Support using OpenGL ES context on desktop
Support using OpenGL ES context on desktop for unix and Android platforms. This
is mainly useful in development.
Add --gpuAPI flag to gm, dm, bench, bench_pictures and render_pictures. The
possible parameters for the flag are "gl" and "gles".
R=bsalomon@google.com, mtklein@google.com, robertphillips@google.com
Author: kkinnunen@nvidia.com
Review URL: https://codereview.chromium.org/319043005
Diffstat (limited to 'src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp')
-rw-r--r-- | src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp | 246 |
1 files changed, 9 insertions, 237 deletions
diff --git a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp index 781e29bc9d..ba1c4be329 100644 --- a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp +++ b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp @@ -18,258 +18,30 @@ #include <EGL/egl.h> -static GrGLInterface* create_es_interface(GrGLVersion version, - GrGLExtensions* extensions) { - if (version < GR_GL_VER(2,0)) { - return NULL; - } - - GrGLInterface* interface = SkNEW(GrGLInterface); - interface->fStandard = kGLES_GrGLStandard; - GrGLInterface::Functions* functions = &interface->fFunctions; - - functions->fActiveTexture = glActiveTexture; - functions->fAttachShader = glAttachShader; - functions->fBindAttribLocation = glBindAttribLocation; - functions->fBindBuffer = glBindBuffer; - functions->fBindTexture = glBindTexture; - functions->fBindVertexArray = glBindVertexArrayOES; - functions->fBlendColor = glBlendColor; - functions->fBlendFunc = glBlendFunc; - functions->fBufferData = glBufferData; - functions->fBufferSubData = glBufferSubData; - functions->fClear = glClear; - functions->fClearColor = glClearColor; - functions->fClearStencil = glClearStencil; - functions->fColorMask = glColorMask; - functions->fCompileShader = glCompileShader; - functions->fCompressedTexImage2D = glCompressedTexImage2D; - functions->fCompressedTexSubImage2D = glCompressedTexSubImage2D; - functions->fCopyTexSubImage2D = glCopyTexSubImage2D; - functions->fCreateProgram = glCreateProgram; - functions->fCreateShader = glCreateShader; - functions->fCullFace = glCullFace; - functions->fDeleteBuffers = glDeleteBuffers; - functions->fDeleteProgram = glDeleteProgram; - functions->fDeleteShader = glDeleteShader; - functions->fDeleteTextures = glDeleteTextures; - functions->fDeleteVertexArrays = glDeleteVertexArraysOES; - functions->fDepthMask = glDepthMask; - functions->fDisable = glDisable; - functions->fDisableVertexAttribArray = glDisableVertexAttribArray; - functions->fDrawArrays = glDrawArrays; - functions->fDrawElements = glDrawElements; - functions->fEnable = glEnable; - functions->fEnableVertexAttribArray = glEnableVertexAttribArray; - functions->fFinish = glFinish; - functions->fFlush = glFlush; - functions->fFrontFace = glFrontFace; - functions->fGenBuffers = glGenBuffers; - functions->fGenerateMipmap = glGenerateMipmap; - functions->fGenTextures = glGenTextures; - functions->fGenVertexArrays = glGenVertexArraysOES; - functions->fGetBufferParameteriv = glGetBufferParameteriv; - functions->fGetError = glGetError; - functions->fGetIntegerv = glGetIntegerv; - functions->fGetProgramInfoLog = glGetProgramInfoLog; - functions->fGetProgramiv = glGetProgramiv; - functions->fGetShaderInfoLog = glGetShaderInfoLog; - functions->fGetShaderiv = glGetShaderiv; - functions->fGetString = glGetString; -#if GL_ES_VERSION_3_0 - functions->fGetStringi = glGetStringi; -#else - functions->fGetStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi"); -#endif - functions->fGetUniformLocation = glGetUniformLocation; - functions->fLineWidth = glLineWidth; - functions->fLinkProgram = glLinkProgram; - functions->fPixelStorei = glPixelStorei; - functions->fReadPixels = glReadPixels; - functions->fScissor = glScissor; -#if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE - functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource; -#else - functions->fShaderSource = glShaderSource; -#endif - functions->fStencilFunc = glStencilFunc; - functions->fStencilFuncSeparate = glStencilFuncSeparate; - functions->fStencilMask = glStencilMask; - functions->fStencilMaskSeparate = glStencilMaskSeparate; - functions->fStencilOp = glStencilOp; - functions->fStencilOpSeparate = glStencilOpSeparate; - functions->fTexImage2D = glTexImage2D; - functions->fTexParameteri = glTexParameteri; - functions->fTexParameteriv = glTexParameteriv; - functions->fTexSubImage2D = glTexSubImage2D; - - if (version >= GR_GL_VER(3,0)) { -#if GL_ES_VERSION_3_0 - functions->fTexStorage2D = glTexStorage2D; -#else - functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2D"); -#endif - } else { -#if GL_EXT_texture_storage - functions->fTexStorage2D = glTexStorage2DEXT; -#else - functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT"); -#endif - } - -#if GL_EXT_discard_framebuffer - functions->fDiscardFramebuffer = glDiscardFramebufferEXT; -#endif - functions->fUniform1f = glUniform1f; - functions->fUniform1i = glUniform1i; - functions->fUniform1fv = glUniform1fv; - functions->fUniform1iv = glUniform1iv; - functions->fUniform2f = glUniform2f; - functions->fUniform2i = glUniform2i; - functions->fUniform2fv = glUniform2fv; - functions->fUniform2iv = glUniform2iv; - functions->fUniform3f = glUniform3f; - functions->fUniform3i = glUniform3i; - functions->fUniform3fv = glUniform3fv; - functions->fUniform3iv = glUniform3iv; - functions->fUniform4f = glUniform4f; - functions->fUniform4i = glUniform4i; - functions->fUniform4fv = glUniform4fv; - functions->fUniform4iv = glUniform4iv; - functions->fUniformMatrix2fv = glUniformMatrix2fv; - functions->fUniformMatrix3fv = glUniformMatrix3fv; - functions->fUniformMatrix4fv = glUniformMatrix4fv; - functions->fUseProgram = glUseProgram; - functions->fVertexAttrib4fv = glVertexAttrib4fv; - functions->fVertexAttribPointer = glVertexAttribPointer; - functions->fViewport = glViewport; - functions->fBindFramebuffer = glBindFramebuffer; - functions->fBindRenderbuffer = glBindRenderbuffer; - functions->fCheckFramebufferStatus = glCheckFramebufferStatus; - functions->fDeleteFramebuffers = glDeleteFramebuffers; - functions->fDeleteRenderbuffers = glDeleteRenderbuffers; - functions->fFramebufferRenderbuffer = glFramebufferRenderbuffer; - functions->fFramebufferTexture2D = glFramebufferTexture2D; - - if (version >= GR_GL_VER(3,0)) { -#if GL_ES_VERSION_3_0 - functions->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample; - functions->fBlitFramebuffer = glBlitFramebuffer; -#else - functions->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample"); - functions->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("glBlitFramebuffer"); -#endif - } - - if (extensions->has("GL_EXT_multisampled_render_to_texture")) { -#if GL_EXT_multisampled_render_to_texture - functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleEXT; - functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT; -#else - functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleEXT"); - functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleEXT"); -#endif - } else if (extensions->has("GL_IMG_multisampled_render_to_texture")) { -#if GL_IMG_multisampled_render_to_texture - functions->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleIMG; - functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG; -#else - functions->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleIMG"); - functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG"); -#endif - } - - functions->fGenFramebuffers = glGenFramebuffers; - functions->fGenRenderbuffers = glGenRenderbuffers; - functions->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv; - functions->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv; - functions->fRenderbufferStorage = glRenderbufferStorage; +#define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F) +#define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F #S) +#define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl" #F) -#if GL_OES_mapbuffer - functions->fMapBuffer = glMapBufferOES; - functions->fUnmapBuffer = glUnmapBufferOES; -#else - functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES"); - functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES"); +#define GET_LINKED(F) functions->f ## F = gl ## F +#define GET_LINKED_SUFFIX(F, S) functions->f ## F = gl ## F ##S +#define USE_LINKED 1 -#endif - - if (version >= GR_GL_VER(3,0)) { -#if GL_ES_VERSION_3_0 - functions->fMapBufferRange = glMapBufferRange; - functions->fFlushMappedBufferRange = glFlushMappedBufferRange; -#else - functions->fMapBufferRange = (GrGLMapBufferRangeProc) eglGetProcAddress("glMapBufferRange"); - functions->fFlushMappedBufferRange = (GrGLFlushMappedBufferRangeProc) eglGetProcAddress("glFlushMappedBufferRange"); -#endif - } else if (extensions->has("GL_EXT_map_buffer_range")) { -#if GL_EXT_map_buffer_range - functions->fMapBufferRange = glMapBufferRangeEXT; - functions->fFlushMappedBufferRange = glFlushMappedBufferRangeEXT; -#else - functions->fMapBufferRange = (GrGLMapBufferRangeProc) eglGetProcAddress("glMapBufferRangeEXT"); - functions->fFlushMappedBufferRange = (GrGLFlushMappedBufferRangeProc) eglGetProcAddress("glFlushMappedBufferRangeEXT"); -#endif - } - - if (extensions->has("GL_EXT_debug_marker")) { - functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarker"); - functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarker"); - functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGroupMarker"); - // The below check is here because a device has been found that has the extension string but - // returns NULL from the eglGetProcAddress for the functions - if (NULL == functions->fInsertEventMarker || - NULL == functions->fPushGroupMarker || - NULL == functions->fPopGroupMarker) { - extensions->remove("GL_EXT_debug_marker"); - } - } - -#if GL_ES_VERSION_3_0 - functions->fInvalidateFramebuffer = glInvalidateFramebuffer; - functions->fInvalidateSubFramebuffer = glInvalidateSubFramebuffer; -#else - functions->fInvalidateFramebuffer = (GrGLInvalidateFramebufferProc) eglGetProcAddress("glInvalidateFramebuffer"); - functions->fInvalidateSubFramebuffer = (GrGLInvalidateSubFramebufferProc) eglGetProcAddress("glInvalidateSubFramebuffer"); -#endif - functions->fInvalidateBufferData = (GrGLInvalidateBufferDataProc) eglGetProcAddress("glInvalidateBufferData"); - functions->fInvalidateBufferSubData = (GrGLInvalidateBufferSubDataProc) eglGetProcAddress("glInvalidateBufferSubData"); - functions->fInvalidateTexImage = (GrGLInvalidateTexImageProc) eglGetProcAddress("glInvalidateTexImage"); - functions->fInvalidateTexSubImage = (GrGLInvalidateTexSubImageProc) eglGetProcAddress("glInvalidateTexSubImage"); - - return interface; -} +#include "gl/GrGLAssembleGLESInterface.h" static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) { SkASSERT(NULL == ctx); return eglGetProcAddress(name); } -static const GrGLInterface* create_desktop_interface() { - return GrGLAssembleGLInterface(NULL, android_get_gl_proc); -} - const GrGLInterface* GrGLCreateNativeInterface() { const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION)); GrGLStandard standard = GrGLGetStandardInUseFromString(verStr); if (kGLES_GrGLStandard == standard) { - GrGLVersion version = GrGLGetVersionFromString(verStr); - GrGLExtensions extensions; - GrGLGetStringiProc getStringi = (GrGLGetStringiProc) eglGetProcAddress("glGetStringi"); - if (!extensions.init(standard, glGetString, getStringi, glGetIntegerv)) { - return NULL; - } - GrGLInterface* interface = create_es_interface(version, &extensions); - - if (NULL != interface) { - interface->fExtensions.swap(&extensions); - } - - return interface; + return GrGLAssembleGLESInterface(NULL, android_get_gl_proc); } else if (kGL_GrGLStandard == standard) { - return create_desktop_interface(); + return GrGLAssembleGLInterface(NULL, android_get_gl_proc); } return NULL; |