| /****************************************************************************** | 
 |  | 
 |  @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) | 
 | *****************************************************************************/ | 
 |  |