| /****************************************************************************** |
| |
| @File OGLES2/PVRTgles2Ext.cpp |
| |
| @Title OGLES2/PVRTgles2Ext |
| |
| @Version |
| |
| @Copyright Copyright (c) Imagination Technologies Limited. |
| |
| @Platform Independent |
| |
| @Description OpenGL ES 2.0 extensions |
| |
| ******************************************************************************/ |
| #include <string.h> |
| |
| #include "PVRTContext.h" |
| #include "PVRTgles2Ext.h" |
| |
| /**************************************************************************** |
| ** Local code |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| ** Class: CPVRTgles2Ext |
| ****************************************************************************/ |
| |
| /*!*************************************************************************** |
| @Function LoadExtensions |
| @Description Initialises IMG extensions |
| *****************************************************************************/ |
| void CPVRTgles2Ext::LoadExtensions() |
| { |
| glMultiDrawElementsEXT = 0; |
| glMultiDrawArraysEXT = 0; |
| glMapBufferOES = 0; |
| glUnmapBufferOES = 0; |
| glGetBufferPointervOES = 0; |
| glDiscardFramebufferEXT = 0; |
| glBindVertexArrayOES = 0; |
| glDeleteVertexArraysOES = 0; |
| glGenVertexArraysOES = 0; |
| glIsVertexArrayOES = 0; |
| glRenderbufferStorageMultisampleIMG = 0; |
| glFramebufferTexture2DMultisampleIMG = 0; |
| glGenQueriesEXT = 0; |
| glDeleteQueriesEXT = 0; |
| glIsQueryEXT = 0; |
| glBeginQueryEXT = 0; |
| glEndQueryEXT = 0; |
| glGetQueryivEXT = 0; |
| glGetQueryObjectuivEXT = 0; |
| glRenderbufferStorageMultisampleANGLE = 0; |
| glBlitFramebufferNV = 0; |
| glTexImage3DOES = 0;
|
| glTexSubImage3DOES = 0;
|
| glCopyTexSubImage3DOES = 0;
|
| glCompressedTexImage3DOES = 0;
|
| glCompressedTexSubImage3DOES = 0;
|
| glFramebufferTexture3DOES = 0; |
| glDrawBuffersEXT = 0; |
| |
| // Supported extensions provide new entry points for OpenGL ES 2.0. |
| |
| const GLubyte *pszGLExtensions; |
| |
| /* Retrieve GL extension string */ |
| pszGLExtensions = glGetString(GL_EXTENSIONS); |
| |
| #if !defined(TARGET_OS_IPHONE) |
| /* GL_EXT_multi_draw_arrays */ |
| if (strstr((char *)pszGLExtensions, "GL_EXT_multi_draw_arrays")) |
| { |
| glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTS) PVRGetProcAddress(glMultiDrawElementsEXT); |
| glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYS) PVRGetProcAddress(glMultiDrawArraysEXT); |
| } |
| |
| /* GL_EXT_multi_draw_arrays */ |
| if (strstr((char *)pszGLExtensions, "GL_OES_mapbuffer")) |
| { |
| glMapBufferOES = (PFNGLMAPBUFFEROES) PVRGetProcAddress(glMapBufferOES); |
| glUnmapBufferOES = (PFNGLUNMAPBUFFEROES) PVRGetProcAddress(glUnmapBufferOES); |
| glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOES) PVRGetProcAddress(glGetBufferPointervOES); |
| } |
| |
| /* GL_OES_vertex_array_object */ |
| if (strstr((char *)pszGLExtensions, "GL_OES_vertex_array_object")) |
| { |
| glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOES) PVRGetProcAddress(glBindVertexArrayOES); |
| glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOES) PVRGetProcAddress(glDeleteVertexArraysOES); |
| glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOES) PVRGetProcAddress(glGenVertexArraysOES); |
| glIsVertexArrayOES = (PFNGLISVERTEXARRAYOES) PVRGetProcAddress(glIsVertexArrayOES); |
| } |
| |
| /* GL_IMG_multisampled_render_to_texture */ |
| if (strstr((char *)pszGLExtensions, "GL_IMG_multisampled_render_to_texture")) |
| { |
| glRenderbufferStorageMultisampleIMG = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG) PVRGetProcAddress(glRenderbufferStorageMultisampleIMG); |
| glFramebufferTexture2DMultisampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG) PVRGetProcAddress(glFramebufferTexture2DMultisampleIMG); |
| } |
| |
| /* GL_ANGLE_framebuffer_multisample */ |
| if (strstr((char *)pszGLExtensions, "GL_ANGLE_framebuffer_multisample")) |
| { |
| glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)PVRGetProcAddress(glRenderbufferStorageMultisampleANGLE); |
| } |
| |
| /* GL_NV_framebuffer_blit */ |
| if (strstr((char *)pszGLExtensions, "GL_NV_framebuffer_blit")) |
| { |
| glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC) PVRGetProcAddress(glBlitFramebufferNV); |
| } |
| |
| /* GL_OES_texture_3D */ |
| if(strstr((char *)pszGLExtensions, "GL_OES_texture_3D")) |
| { |
| glTexImage3DOES = (PFNGLTEXIMAGE3DOES) PVRGetProcAddress(glTexImage3DOES); |
| glTexSubImage3DOES = (PFNGLTEXSUBIMAGE3DOES) PVRGetProcAddress(glTexSubImage3DOES); |
| glCopyTexSubImage3DOES = (PFNGLCOPYTEXSUBIMAGE3DOES) PVRGetProcAddress(glCopyTexSubImage3DOES); |
| glCompressedTexImage3DOES = (PFNGLCOMPRESSEDTEXIMAGE3DOES) PVRGetProcAddress(glCompressedTexImage3DOES); |
| glCompressedTexSubImage3DOES = (PFNGLCOMPRESSEDTEXSUBIMAGE3DOES) PVRGetProcAddress(glCompressedTexSubImage3DOES); |
| glFramebufferTexture3DOES = (PFNGLFRAMEBUFFERTEXTURE3DOES) PVRGetProcAddress(glFramebufferTexture3DOES); |
| } |
| |
| /* GL_EXT_draw_buffers */ |
| if (strstr((char *)pszGLExtensions, "GL_EXT_draw_buffers")) |
| { |
| glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXT) PVRGetProcAddress(glDrawBuffersEXT); |
| } |
| #endif |
| |
| #if defined(GL_EXT_discard_framebuffer) |
| /* GL_EXT_discard_framebuffer */ |
| if (strstr((char *)pszGLExtensions, "GL_EXT_discard_framebuffer")) |
| { |
| glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXT) PVRGetProcAddress(glDiscardFramebufferEXT); |
| } |
| #endif |
| |
| /* GL_EXT_occlusion_query_boolean */ |
| if (strstr((char *)pszGLExtensions, "GL_EXT_occlusion_query_boolean")) |
| { |
| glGenQueriesEXT = (PFNGLGENQUERIESEXT) PVRGetProcAddress(glGenQueriesEXT); |
| glDeleteQueriesEXT = (PFNGLDELETEQUERIESEXT) PVRGetProcAddress(glDeleteQueriesEXT); |
| glIsQueryEXT = (PFNGLISQUERYEXT) PVRGetProcAddress(glIsQueryEXT); |
| glBeginQueryEXT = (PFNGLBEGINQUERYEXT) PVRGetProcAddress(glBeginQueryEXT); |
| glEndQueryEXT = (PFNGLENDQUERYEXT) PVRGetProcAddress(glEndQueryEXT); |
| glGetQueryivEXT = (PFNGLGETQUERYIVEXT) PVRGetProcAddress(glGetQueryivEXT); |
| glGetQueryObjectuivEXT = (PFNGLGETQUERYOBJECTUIVEXT) PVRGetProcAddress(glGetQueryObjectuivEXT); |
| } |
| } |
| |
| /*!*********************************************************************** |
| @Function IsGLExtensionSupported |
| @Input extension extension to query for |
| @Returns True if the extension is supported |
| @Description Queries for support of an extension |
| *************************************************************************/ |
| bool CPVRTgles2Ext::IsGLExtensionSupported(const char * const extension) |
| { |
| // The recommended technique for querying OpenGL extensions; |
| // from http://opengl.org/resources/features/OGLextensions/ |
| const GLubyte *extensions = NULL; |
| const GLubyte *start; |
| GLubyte *where, *terminator; |
| |
| /* Extension names should not have spaces. */ |
| where = (GLubyte *) strchr(extension, ' '); |
| if (where || *extension == '\0') |
| return 0; |
| |
| extensions = glGetString(GL_EXTENSIONS); |
| |
| /* It takes a bit of care to be fool-proof about parsing the |
| OpenGL extensions string. Don't be fooled by sub-strings, etc. */ |
| start = extensions; |
| for (;;) { |
| where = (GLubyte *) strstr((const char *) start, extension); |
| if (!where) |
| break; |
| terminator = where + strlen(extension); |
| if (where == start || *(where - 1) == ' ') |
| if (*terminator == ' ' || *terminator == '\0') |
| return true; |
| start = terminator; |
| } |
| |
| return false; |
| } |
| |
| /***************************************************************************** |
| End of file (PVRTglesExt.cpp) |
| *****************************************************************************/ |
| |