|  | /****************************************************************************** | 
|  |  | 
|  | @File         OGLES3/PVRTgles3Ext.cpp | 
|  |  | 
|  | @Title        OGLES3/PVRTgles3Ext | 
|  |  | 
|  | @Version | 
|  |  | 
|  | @Copyright    Copyright (c) Imagination Technologies Limited. | 
|  |  | 
|  | @Platform     Independent | 
|  |  | 
|  | @Description  OpenGL ES 3.0 extensions | 
|  |  | 
|  | ******************************************************************************/ | 
|  | #include <string.h> | 
|  |  | 
|  | #include "PVRTContext.h" | 
|  | #include "PVRTgles3Ext.h" | 
|  |  | 
|  | /**************************************************************************** | 
|  | ** Local code | 
|  | ****************************************************************************/ | 
|  |  | 
|  | /**************************************************************************** | 
|  | ** Class: CPVRTgles3Ext | 
|  | ****************************************************************************/ | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @Function			LoadExtensions | 
|  | @Description		Initialises IMG extensions | 
|  | *****************************************************************************/ | 
|  | void CPVRTgles3Ext::LoadExtensions() | 
|  | { | 
|  |  | 
|  | glRenderbufferStorageMultisampleIMG = 0; | 
|  | glFramebufferTexture2DMultisampleIMG = 0; | 
|  | glRenderbufferStorageMultisampleEXT = 0; | 
|  | glFramebufferTexture2DMultisampleEXT = 0; | 
|  |  | 
|  | // Supported extensions provide new entry points for OpenGL ES 3.0. | 
|  |  | 
|  | const GLubyte *pszGLExtensions; | 
|  |  | 
|  | /* Retrieve GL extension string */ | 
|  | pszGLExtensions = glGetString(GL_EXTENSIONS); | 
|  |  | 
|  | #if !defined(TARGET_OS_IPHONE) | 
|  | /* 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_EXT_multisampled_render_to_texture */ | 
|  | if (strstr((char *)pszGLExtensions, "GL_EXT_multisampled_render_to_texture")) | 
|  | { | 
|  | glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXT) PVRGetProcAddress(glRenderbufferStorageMultisampleEXT); | 
|  | glFramebufferTexture2DMultisampleEXT = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXT) PVRGetProcAddress(glFramebufferTexture2DMultisampleEXT); | 
|  | } | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			IsGLExtensionSupported | 
|  | @Input				extension extension to query for | 
|  | @Returns			True if the extension is supported | 
|  | @Description		Queries for support of an extension | 
|  | *************************************************************************/ | 
|  | bool CPVRTgles3Ext::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) | 
|  | *****************************************************************************/ | 
|  |  |