diff --git a/CMakeLists.txt b/CMakeLists.txt
index 899f676..ce17b8d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,7 +117,8 @@
 
 option_if_not_defined(SWIFTSHADER_USE_GROUP_SOURCES "Group the source files in a folder tree for Visual Studio" TRUE)
 
-option_if_not_defined(SWIFTSHADER_BUILD_TESTS "Build unit tests" TRUE)
+option_if_not_defined(SWIFTSHADER_BUILD_SAMPLES "Build sample programs" TRUE)
+option_if_not_defined(SWIFTSHADER_BUILD_TESTS "Build test programs" TRUE)
 option_if_not_defined(SWIFTSHADER_BUILD_BENCHMARKS "Build benchmarks" FALSE)
 
 option_if_not_defined(SWIFTSHADER_MSAN "Build with memory sanitizer" FALSE)
@@ -179,6 +180,7 @@
 set(SOURCE_DIR ${SWIFTSHADER_DIR}/src)
 set(THIRD_PARTY_DIR ${SWIFTSHADER_DIR}/third_party)
 set(TESTS_DIR ${SWIFTSHADER_DIR}/tests)
+set(POWERVR_DIR ${THIRD_PARTY_DIR}/PowerVR_SDK)
 
 ###########################################################
 # Initialize submodules
@@ -733,6 +735,51 @@
 # Sample programs and tests
 ###########################################################
 
+if(SWIFTSHADER_BUILD_SAMPLES)
+    if(WIN32)
+        add_executable(BasicTnL
+            ${POWERVR_DIR}/Examples/Beginner/04_BasicTnL/OGLES/OGLESBasicTnL.cpp
+            ${POWERVR_DIR}/Shell/PVRShell.cpp
+            ${POWERVR_DIR}/Shell/OS/Windows/PVRShellOS.cpp
+            ${POWERVR_DIR}/Shell/API/KEGL/PVRShellAPI.cpp
+        )
+        target_include_directories(BasicTnL PRIVATE
+            ${CMAKE_CURRENT_SOURCE_DIR}/include
+            ${POWERVR_DIR}/Shell
+            ${POWERVR_DIR}/Shell/OS/Windows
+            ${POWERVR_DIR}/Shell/API/KEGL
+            ${POWERVR_DIR}/Builds/Include
+        )
+        set_target_properties(BasicTnL PROPERTIES
+            COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS}"
+            FOLDER "Samples"
+        )
+        target_link_libraries(BasicTnL libEGL libGLES_CM)
+        set_property(TARGET BasicTnL APPEND_STRING PROPERTY LINK_FLAGS "/SUBSYSTEM:WINDOWS")
+        set(CMAKE_DEFAULT_STARTUP_PROJECT BasicTnL)
+    elseif(LINUX)
+        add_executable(BasicTnL
+            ${POWERVR_DIR}/Examples/Beginner/04_BasicTnL/OGLES/OGLESBasicTnL.cpp
+            ${POWERVR_DIR}/Shell/PVRShell.cpp
+            ${POWERVR_DIR}/Shell/OS/LinuxX11/PVRShellOS.cpp
+            ${POWERVR_DIR}/Shell/API/KEGL/PVRShellAPI.cpp
+        )
+        target_include_directories(BasicTnL PRIVATE
+            ${CMAKE_CURRENT_SOURCE_DIR}/include
+            ${POWERVR_DIR}/Shell
+            ${POWERVR_DIR}/Shell/OS/LinuxX11
+            ${POWERVR_DIR}/Shell/API/KEGL
+            ${POWERVR_DIR}/Builds/Include
+        )
+        set_target_properties(BasicTnL PROPERTIES
+            COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS}"
+            COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
+            LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
+        )
+        target_link_libraries(BasicTnL dl ${X11} libEGL libGLES_CM)   # Explicitly link our "lib*" targets, not the platform provided "EGL" and "GLES_CM"
+    endif()
+endif(SWIFTSHADER_BUILD_SAMPLES)
+
 if(HAVE_PVR_SUBMODULE AND SWIFTSHADER_BUILD_PVR)
     if(UNIX AND NOT APPLE)
         set(PVR_WINDOW_SYSTEM XCB)
diff --git a/third_party/PowerVR_SDK/Builds/Include/EGL/egl.h b/third_party/PowerVR_SDK/Builds/Include/EGL/egl.h
new file mode 100644
index 0000000..9c78e85
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/EGL/egl.h
@@ -0,0 +1,330 @@
+/* -*- mode: c; tab-width: 8; -*- */
+/* vi: set sw=4 ts=8: */
+/* Reference version of egl.h for EGL 1.4.
+ * $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $
+ */
+
+/*
+** Copyright (c) 2007-2009 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#ifndef __egl_h_
+#define __egl_h_
+
+/* All platform-dependent types and macro boilerplate (such as EGLAPI
+ * and EGLAPIENTRY) should go in eglplatform.h.
+ */
+#include <EGL/eglplatform.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EGL Types */
+/* EGLint is defined in eglplatform.h */
+typedef unsigned int EGLBoolean;
+typedef unsigned int EGLenum;
+typedef void *EGLConfig;
+typedef void *EGLContext;
+typedef void *EGLDisplay;
+typedef void *EGLSurface;
+typedef void *EGLClientBuffer;
+
+/* EGL Versioning */
+#define EGL_VERSION_1_0			1
+#define EGL_VERSION_1_1			1
+#define EGL_VERSION_1_2			1
+#define EGL_VERSION_1_3			1
+#define EGL_VERSION_1_4			1
+
+/* EGL Enumerants. Bitmasks and other exceptional cases aside, most
+ * enums are assigned unique values starting at 0x3000.
+ */
+
+/* EGL aliases */
+#define EGL_FALSE			0
+#define EGL_TRUE			1
+
+/* Out-of-band handle values */
+#define EGL_DEFAULT_DISPLAY		((EGLNativeDisplayType)0)
+#define EGL_NO_CONTEXT			((EGLContext)0)
+#define EGL_NO_DISPLAY			((EGLDisplay)0)
+#define EGL_NO_SURFACE			((EGLSurface)0)
+
+/* Out-of-band attribute value */
+#define EGL_DONT_CARE			((EGLint)-1)
+
+/* Errors / GetError return values */
+#define EGL_SUCCESS			0x3000
+#define EGL_NOT_INITIALIZED		0x3001
+#define EGL_BAD_ACCESS			0x3002
+#define EGL_BAD_ALLOC			0x3003
+#define EGL_BAD_ATTRIBUTE		0x3004
+#define EGL_BAD_CONFIG			0x3005
+#define EGL_BAD_CONTEXT			0x3006
+#define EGL_BAD_CURRENT_SURFACE		0x3007
+#define EGL_BAD_DISPLAY			0x3008
+#define EGL_BAD_MATCH			0x3009
+#define EGL_BAD_NATIVE_PIXMAP		0x300A
+#define EGL_BAD_NATIVE_WINDOW		0x300B
+#define EGL_BAD_PARAMETER		0x300C
+#define EGL_BAD_SURFACE			0x300D
+#define EGL_CONTEXT_LOST		0x300E	/* EGL 1.1 - IMG_power_management */
+
+/* Reserved 0x300F-0x301F for additional errors */
+
+/* Config attributes */
+#define EGL_BUFFER_SIZE			0x3020
+#define EGL_ALPHA_SIZE			0x3021
+#define EGL_BLUE_SIZE			0x3022
+#define EGL_GREEN_SIZE			0x3023
+#define EGL_RED_SIZE			0x3024
+#define EGL_DEPTH_SIZE			0x3025
+#define EGL_STENCIL_SIZE		0x3026
+#define EGL_CONFIG_CAVEAT		0x3027
+#define EGL_CONFIG_ID			0x3028
+#define EGL_LEVEL			0x3029
+#define EGL_MAX_PBUFFER_HEIGHT		0x302A
+#define EGL_MAX_PBUFFER_PIXELS		0x302B
+#define EGL_MAX_PBUFFER_WIDTH		0x302C
+#define EGL_NATIVE_RENDERABLE		0x302D
+#define EGL_NATIVE_VISUAL_ID		0x302E
+#define EGL_NATIVE_VISUAL_TYPE		0x302F
+#define EGL_PRESERVED_RESOURCES		0x3030
+#define EGL_SAMPLES			0x3031
+#define EGL_SAMPLE_BUFFERS		0x3032
+#define EGL_SURFACE_TYPE		0x3033
+#define EGL_TRANSPARENT_TYPE		0x3034
+#define EGL_TRANSPARENT_BLUE_VALUE	0x3035
+#define EGL_TRANSPARENT_GREEN_VALUE	0x3036
+#define EGL_TRANSPARENT_RED_VALUE	0x3037
+#define EGL_NONE			0x3038	/* Attrib list terminator */
+#define EGL_BIND_TO_TEXTURE_RGB		0x3039
+#define EGL_BIND_TO_TEXTURE_RGBA	0x303A
+#define EGL_MIN_SWAP_INTERVAL		0x303B
+#define EGL_MAX_SWAP_INTERVAL		0x303C
+#define EGL_LUMINANCE_SIZE		0x303D
+#define EGL_ALPHA_MASK_SIZE		0x303E
+#define EGL_COLOR_BUFFER_TYPE		0x303F
+#define EGL_RENDERABLE_TYPE		0x3040
+#define EGL_MATCH_NATIVE_PIXMAP		0x3041	/* Pseudo-attribute (not queryable) */
+#define EGL_CONFORMANT			0x3042
+
+/* Reserved 0x3041-0x304F for additional config attributes */
+
+/* Config attribute values */
+#define EGL_SLOW_CONFIG			0x3050	/* EGL_CONFIG_CAVEAT value */
+#define EGL_NON_CONFORMANT_CONFIG	0x3051	/* EGL_CONFIG_CAVEAT value */
+#define EGL_TRANSPARENT_RGB		0x3052	/* EGL_TRANSPARENT_TYPE value */
+#define EGL_RGB_BUFFER			0x308E	/* EGL_COLOR_BUFFER_TYPE value */
+#define EGL_LUMINANCE_BUFFER		0x308F	/* EGL_COLOR_BUFFER_TYPE value */
+
+/* More config attribute values, for EGL_TEXTURE_FORMAT */
+#define EGL_NO_TEXTURE			0x305C
+#define EGL_TEXTURE_RGB			0x305D
+#define EGL_TEXTURE_RGBA		0x305E
+#define EGL_TEXTURE_2D			0x305F
+
+/* Config attribute mask bits */
+#define EGL_PBUFFER_BIT			0x0001	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_PIXMAP_BIT			0x0002	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_WINDOW_BIT			0x0004	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_VG_COLORSPACE_LINEAR_BIT	0x0020	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT	0x0040	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400	/* EGL_SURFACE_TYPE mask bits */
+
+#define EGL_OPENGL_ES_BIT		0x0001	/* EGL_RENDERABLE_TYPE mask bits */
+#define EGL_OPENVG_BIT			0x0002	/* EGL_RENDERABLE_TYPE mask bits */
+#define EGL_OPENGL_ES2_BIT		0x0004	/* EGL_RENDERABLE_TYPE mask bits */
+#define EGL_OPENGL_BIT			0x0008	/* EGL_RENDERABLE_TYPE mask bits */
+
+/* QueryString targets */
+#define EGL_VENDOR			0x3053
+#define EGL_VERSION			0x3054
+#define EGL_EXTENSIONS			0x3055
+#define EGL_CLIENT_APIS			0x308D
+
+/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */
+#define EGL_HEIGHT			0x3056
+#define EGL_WIDTH			0x3057
+#define EGL_LARGEST_PBUFFER		0x3058
+#define EGL_TEXTURE_FORMAT		0x3080
+#define EGL_TEXTURE_TARGET		0x3081
+#define EGL_MIPMAP_TEXTURE		0x3082
+#define EGL_MIPMAP_LEVEL		0x3083
+#define EGL_RENDER_BUFFER		0x3086
+#define EGL_VG_COLORSPACE		0x3087
+#define EGL_VG_ALPHA_FORMAT		0x3088
+#define EGL_HORIZONTAL_RESOLUTION	0x3090
+#define EGL_VERTICAL_RESOLUTION		0x3091
+#define EGL_PIXEL_ASPECT_RATIO		0x3092
+#define EGL_SWAP_BEHAVIOR		0x3093
+#define EGL_MULTISAMPLE_RESOLVE		0x3099
+
+/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */
+#define EGL_BACK_BUFFER			0x3084
+#define EGL_SINGLE_BUFFER		0x3085
+
+/* OpenVG color spaces */
+#define EGL_VG_COLORSPACE_sRGB		0x3089	/* EGL_VG_COLORSPACE value */
+#define EGL_VG_COLORSPACE_LINEAR	0x308A	/* EGL_VG_COLORSPACE value */
+
+/* OpenVG alpha formats */
+#define EGL_VG_ALPHA_FORMAT_NONPRE	0x308B	/* EGL_ALPHA_FORMAT value */
+#define EGL_VG_ALPHA_FORMAT_PRE		0x308C	/* EGL_ALPHA_FORMAT value */
+
+/* Constant scale factor by which fractional display resolutions &
+ * aspect ratio are scaled when queried as integer values.
+ */
+#define EGL_DISPLAY_SCALING		10000
+
+/* Unknown display resolution/aspect ratio */
+#define EGL_UNKNOWN			((EGLint)-1)
+
+/* Back buffer swap behaviors */
+#define EGL_BUFFER_PRESERVED		0x3094	/* EGL_SWAP_BEHAVIOR value */
+#define EGL_BUFFER_DESTROYED		0x3095	/* EGL_SWAP_BEHAVIOR value */
+
+/* CreatePbufferFromClientBuffer buffer types */
+#define EGL_OPENVG_IMAGE		0x3096
+
+/* QueryContext targets */
+#define EGL_CONTEXT_CLIENT_TYPE		0x3097
+
+/* CreateContext attributes */
+#define EGL_CONTEXT_CLIENT_VERSION	0x3098
+
+/* Multisample resolution behaviors */
+#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A	/* EGL_MULTISAMPLE_RESOLVE value */
+#define EGL_MULTISAMPLE_RESOLVE_BOX	0x309B	/* EGL_MULTISAMPLE_RESOLVE value */
+
+/* BindAPI/QueryAPI targets */
+#define EGL_OPENGL_ES_API		0x30A0
+#define EGL_OPENVG_API			0x30A1
+#define EGL_OPENGL_API			0x30A2
+
+/* GetCurrentSurface targets */
+#define EGL_DRAW			0x3059
+#define EGL_READ			0x305A
+
+/* WaitNative engines */
+#define EGL_CORE_NATIVE_ENGINE		0x305B
+
+/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */
+#define EGL_COLORSPACE			EGL_VG_COLORSPACE
+#define EGL_ALPHA_FORMAT		EGL_VG_ALPHA_FORMAT
+#define EGL_COLORSPACE_sRGB		EGL_VG_COLORSPACE_sRGB
+#define EGL_COLORSPACE_LINEAR		EGL_VG_COLORSPACE_LINEAR
+#define EGL_ALPHA_FORMAT_NONPRE		EGL_VG_ALPHA_FORMAT_NONPRE
+#define EGL_ALPHA_FORMAT_PRE		EGL_VG_ALPHA_FORMAT_PRE
+
+/* EGL extensions must request enum blocks from the Khronos
+ * API Registrar, who maintains the enumerant registry. Submit
+ * a bug in Khronos Bugzilla against task "Registry".
+ */
+
+
+
+/* EGL Functions */
+
+EGLAPI EGLint EGLAPIENTRY eglGetError(void);
+
+EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);
+EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
+EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy);
+
+EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
+			 EGLint config_size, EGLint *num_config);
+EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
+			   EGLConfig *configs, EGLint config_size,
+			   EGLint *num_config);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
+			      EGLint attribute, EGLint *value);
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
+				  EGLNativeWindowType win,
+				  const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
+				   const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
+				  EGLNativePixmapType pixmap,
+				  const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface,
+			   EGLint attribute, EGLint *value);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api);
+EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void);
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(
+	      EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
+	      EGLConfig config, const EGLint *attrib_list);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
+			    EGLint attribute, EGLint value);
+EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval);
+
+
+EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config,
+			    EGLContext share_context,
+			    const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx);
+EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,
+			  EGLSurface read, EGLContext ctx);
+
+EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void);
+EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw);
+EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx,
+			   EGLint attribute, EGLint *value);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void);
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine);
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
+EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface,
+			  EGLNativePixmapType target);
+
+/* This is a generic function pointer type, whose name indicates it must
+ * be cast to the proper type *and calling convention* before use.
+ */
+typedef void (*__eglMustCastToProperFunctionPointerType)(void);
+
+/* Now, define eglGetProcAddress using the generic function ptr. type */
+EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY
+       eglGetProcAddress(const char *procname);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __egl_h_ */
diff --git a/third_party/PowerVR_SDK/Builds/Include/EGL/eglext.h b/third_party/PowerVR_SDK/Builds/Include/EGL/eglext.h
new file mode 100644
index 0000000..13ed9d4
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/EGL/eglext.h
@@ -0,0 +1,565 @@
+#ifndef __eglext_h_
+#define __eglext_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2007-2013 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#include <EGL/eglplatform.h>
+
+/*************************************************************/
+
+/* Header file version number */
+/* Current version at http://www.khronos.org/registry/egl/ */
+/* $Revision: 20690 $ on $Date: 2013-02-22 17:15:05 -0800 (Fri, 22 Feb 2013) $ */
+#define EGL_EGLEXT_VERSION 15
+
+#ifndef EGL_KHR_config_attribs
+#define EGL_KHR_config_attribs 1
+#define EGL_CONFORMANT_KHR			0x3042	/* EGLConfig attribute */
+#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR	0x0020	/* EGL_SURFACE_TYPE bitfield */
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR		0x0040	/* EGL_SURFACE_TYPE bitfield */
+#endif
+
+#ifndef EGL_KHR_lock_surface
+#define EGL_KHR_lock_surface 1
+#define EGL_READ_SURFACE_BIT_KHR		0x0001	/* EGL_LOCK_USAGE_HINT_KHR bitfield */
+#define EGL_WRITE_SURFACE_BIT_KHR		0x0002	/* EGL_LOCK_USAGE_HINT_KHR bitfield */
+#define EGL_LOCK_SURFACE_BIT_KHR		0x0080	/* EGL_SURFACE_TYPE bitfield */
+#define EGL_OPTIMAL_FORMAT_BIT_KHR		0x0100	/* EGL_SURFACE_TYPE bitfield */
+#define EGL_MATCH_FORMAT_KHR			0x3043	/* EGLConfig attribute */
+#define EGL_FORMAT_RGB_565_EXACT_KHR		0x30C0	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_FORMAT_RGB_565_KHR			0x30C1	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_FORMAT_RGBA_8888_EXACT_KHR		0x30C2	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_FORMAT_RGBA_8888_KHR		0x30C3	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_MAP_PRESERVE_PIXELS_KHR		0x30C4	/* eglLockSurfaceKHR attribute */
+#define EGL_LOCK_USAGE_HINT_KHR			0x30C5	/* eglLockSurfaceKHR attribute */
+#define EGL_BITMAP_POINTER_KHR			0x30C6	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PITCH_KHR			0x30C7	/* eglQuerySurface attribute */
+#define EGL_BITMAP_ORIGIN_KHR			0x30C8	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR		0x30C9	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR	0x30CA	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR	0x30CB	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR	0x30CC	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR	0x30CD	/* eglQuerySurface attribute */
+#define EGL_LOWER_LEFT_KHR			0x30CE	/* EGL_BITMAP_ORIGIN_KHR value */
+#define EGL_UPPER_LEFT_KHR			0x30CF	/* EGL_BITMAP_ORIGIN_KHR value */
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface);
+#endif
+
+#ifndef EGL_KHR_image
+#define EGL_KHR_image 1
+#define EGL_NATIVE_PIXMAP_KHR			0x30B0	/* eglCreateImageKHR target */
+typedef void *EGLImageKHR;
+#define EGL_NO_IMAGE_KHR			((EGLImageKHR)0)
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);
+#endif
+
+#ifndef EGL_KHR_vg_parent_image
+#define EGL_KHR_vg_parent_image 1
+#define EGL_VG_PARENT_IMAGE_KHR			0x30BA	/* eglCreateImageKHR target */
+#endif
+
+#ifndef EGL_KHR_gl_texture_2D_image
+#define EGL_KHR_gl_texture_2D_image 1
+#define EGL_GL_TEXTURE_2D_KHR			0x30B1	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_LEVEL_KHR		0x30BC	/* eglCreateImageKHR attribute */
+#endif
+
+#ifndef EGL_KHR_gl_texture_cubemap_image
+#define EGL_KHR_gl_texture_cubemap_image 1
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR	0x30B3	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR	0x30B4	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR	0x30B5	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR	0x30B6	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR	0x30B7	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR	0x30B8	/* eglCreateImageKHR target */
+#endif
+
+#ifndef EGL_KHR_gl_texture_3D_image
+#define EGL_KHR_gl_texture_3D_image 1
+#define EGL_GL_TEXTURE_3D_KHR			0x30B2	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_ZOFFSET_KHR		0x30BD	/* eglCreateImageKHR attribute */
+#endif
+
+#ifndef EGL_KHR_gl_renderbuffer_image
+#define EGL_KHR_gl_renderbuffer_image 1
+#define EGL_GL_RENDERBUFFER_KHR			0x30B9	/* eglCreateImageKHR target */
+#endif
+
+#if KHRONOS_SUPPORT_INT64   /* EGLTimeKHR requires 64-bit uint support */
+#ifndef EGL_KHR_reusable_sync
+#define EGL_KHR_reusable_sync 1
+
+typedef void* EGLSyncKHR;
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+
+#define EGL_SYNC_STATUS_KHR			0x30F1
+#define EGL_SIGNALED_KHR			0x30F2
+#define EGL_UNSIGNALED_KHR			0x30F3
+#define EGL_TIMEOUT_EXPIRED_KHR			0x30F5
+#define EGL_CONDITION_SATISFIED_KHR		0x30F6
+#define EGL_SYNC_TYPE_KHR			0x30F7
+#define EGL_SYNC_REUSABLE_KHR			0x30FA
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR		0x0001	/* eglClientWaitSyncKHR <flags> bitfield */
+#define EGL_FOREVER_KHR				0xFFFFFFFFFFFFFFFFull
+#define EGL_NO_SYNC_KHR				((EGLSyncKHR)0)
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#endif
+#endif
+
+#ifndef EGL_KHR_image_base
+#define EGL_KHR_image_base 1
+/* Most interfaces defined by EGL_KHR_image_pixmap above */
+#define EGL_IMAGE_PRESERVED_KHR			0x30D2	/* eglCreateImageKHR attribute */
+#endif
+
+#ifndef EGL_KHR_image_pixmap
+#define EGL_KHR_image_pixmap 1
+/* Interfaces defined by EGL_KHR_image above */
+#endif
+
+#ifndef EGL_IMG_context_priority
+#define EGL_IMG_context_priority 1
+#define EGL_CONTEXT_PRIORITY_LEVEL_IMG		0x3100
+#define EGL_CONTEXT_PRIORITY_HIGH_IMG		0x3101
+#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG		0x3102
+#define EGL_CONTEXT_PRIORITY_LOW_IMG		0x3103
+#endif
+
+#ifndef EGL_KHR_lock_surface2
+#define EGL_KHR_lock_surface2 1
+#define EGL_BITMAP_PIXEL_SIZE_KHR		0x3110
+#endif
+
+#ifndef EGL_NV_coverage_sample
+#define EGL_NV_coverage_sample 1
+#define EGL_COVERAGE_BUFFERS_NV			0x30E0
+#define EGL_COVERAGE_SAMPLES_NV			0x30E1
+#endif
+
+#ifndef EGL_NV_depth_nonlinear
+#define EGL_NV_depth_nonlinear 1
+#define EGL_DEPTH_ENCODING_NV			0x30E2
+#define EGL_DEPTH_ENCODING_NONE_NV 0
+#define EGL_DEPTH_ENCODING_NONLINEAR_NV		0x30E3
+#endif
+
+#if KHRONOS_SUPPORT_INT64   /* EGLTimeNV requires 64-bit uint support */
+#ifndef EGL_NV_sync
+#define EGL_NV_sync 1
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV	0x30E6
+#define EGL_SYNC_STATUS_NV			0x30E7
+#define EGL_SIGNALED_NV				0x30E8
+#define EGL_UNSIGNALED_NV			0x30E9
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV		0x0001
+#define EGL_FOREVER_NV				0xFFFFFFFFFFFFFFFFull
+#define EGL_ALREADY_SIGNALED_NV			0x30EA
+#define EGL_TIMEOUT_EXPIRED_NV			0x30EB
+#define EGL_CONDITION_SATISFIED_NV		0x30EC
+#define EGL_SYNC_TYPE_NV			0x30ED
+#define EGL_SYNC_CONDITION_NV			0x30EE
+#define EGL_SYNC_FENCE_NV			0x30EF
+#define EGL_NO_SYNC_NV				((EGLSyncNV)0)
+typedef void* EGLSyncNV;
+typedef khronos_utime_nanoseconds_t EGLTimeNV;
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync);
+EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value);
+#endif
+#endif
+
+#if KHRONOS_SUPPORT_INT64   /* Dependent on EGL_KHR_reusable_sync which requires 64-bit uint support */
+#ifndef EGL_KHR_fence_sync
+#define EGL_KHR_fence_sync 1
+/* Reuses most tokens and entry points from EGL_KHR_reusable_sync */
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR	0x30F0
+#define EGL_SYNC_CONDITION_KHR			0x30F8
+#define EGL_SYNC_FENCE_KHR			0x30F9
+#endif
+#endif
+
+#ifndef EGL_HI_clientpixmap
+#define EGL_HI_clientpixmap 1
+
+/* Surface Attribute */
+#define EGL_CLIENT_PIXMAP_POINTER_HI		0x8F74
+/*
+ * Structure representing a client pixmap
+ * (pixmap's data is in client-space memory).
+ */
+struct EGLClientPixmapHI
+{
+	void*		pData;
+	EGLint		iWidth;
+	EGLint		iHeight;
+	EGLint		iStride;
+};
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI(EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI* pixmap);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI* pixmap);
+#endif	/* EGL_HI_clientpixmap */
+
+#ifndef EGL_HI_colorformats
+#define EGL_HI_colorformats 1
+/* Config Attribute */
+#define EGL_COLOR_FORMAT_HI			0x8F70
+/* Color Formats */
+#define EGL_COLOR_RGB_HI			0x8F71
+#define EGL_COLOR_RGBA_HI			0x8F72
+#define EGL_COLOR_ARGB_HI			0x8F73
+#endif /* EGL_HI_colorformats */
+
+#ifndef EGL_MESA_drm_image
+#define EGL_MESA_drm_image 1
+#define EGL_DRM_BUFFER_FORMAT_MESA		0x31D0	    /* CreateDRMImageMESA attribute */
+#define EGL_DRM_BUFFER_USE_MESA			0x31D1	    /* CreateDRMImageMESA attribute */
+#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA	0x31D2	    /* EGL_IMAGE_FORMAT_MESA attribute value */
+#define EGL_DRM_BUFFER_MESA			0x31D3	    /* eglCreateImageKHR target */
+#define EGL_DRM_BUFFER_STRIDE_MESA		0x31D4
+#define EGL_DRM_BUFFER_USE_SCANOUT_MESA		0x00000001  /* EGL_DRM_BUFFER_USE_MESA bits */
+#define EGL_DRM_BUFFER_USE_SHARE_MESA		0x00000002  /* EGL_DRM_BUFFER_USE_MESA bits */
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
+#endif
+
+#ifndef EGL_NV_post_sub_buffer
+#define EGL_NV_post_sub_buffer 1
+#define EGL_POST_SUB_BUFFER_SUPPORTED_NV	0x30BE
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
+#endif
+
+#ifndef EGL_ANGLE_query_surface_pointer
+#define EGL_ANGLE_query_surface_pointer 1
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
+#endif
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
+#endif
+
+#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle
+#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
+#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE	0x3200
+#endif
+
+#ifndef EGL_NV_coverage_sample_resolve
+#define EGL_NV_coverage_sample_resolve 1
+#define EGL_COVERAGE_SAMPLE_RESOLVE_NV		0x3131
+#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV	0x3132
+#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV	0x3133
+#endif
+
+#if KHRONOS_SUPPORT_INT64   /* EGLuint64NV requires 64-bit uint support */
+#ifndef EGL_NV_system_time
+#define EGL_NV_system_time 1
+typedef khronos_utime_nanoseconds_t EGLuint64NV;
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV(void);
+EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV(void);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void);
+typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void);
+#endif
+#endif
+
+#if KHRONOS_SUPPORT_INT64 /* EGLuint64KHR requires 64-bit uint support */
+#ifndef EGL_KHR_stream
+#define EGL_KHR_stream 1
+typedef void* EGLStreamKHR;
+typedef khronos_uint64_t EGLuint64KHR;
+#define EGL_NO_STREAM_KHR			((EGLStreamKHR)0)
+#define EGL_CONSUMER_LATENCY_USEC_KHR		0x3210
+#define EGL_PRODUCER_FRAME_KHR			0x3212
+#define EGL_CONSUMER_FRAME_KHR			0x3213
+#define EGL_STREAM_STATE_KHR			0x3214
+#define EGL_STREAM_STATE_CREATED_KHR		0x3215
+#define EGL_STREAM_STATE_CONNECTING_KHR		0x3216
+#define EGL_STREAM_STATE_EMPTY_KHR		0x3217
+#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR    0x3218
+#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR    0x3219
+#define EGL_STREAM_STATE_DISCONNECTED_KHR	0x321A
+#define EGL_BAD_STREAM_KHR			0x321B
+#define EGL_BAD_STATE_KHR			0x321C
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC)(EGLDisplay dpy, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
+#endif
+#endif
+
+#ifdef EGL_KHR_stream /* Requires KHR_stream extension */
+#ifndef EGL_KHR_stream_consumer_gltexture
+#define EGL_KHR_stream_consumer_gltexture 1
+#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR	0x321E
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+#endif
+#endif
+
+#ifdef EGL_KHR_stream /* Requires KHR_stream extension */
+#ifndef EGL_KHR_stream_producer_eglsurface
+#define EGL_KHR_stream_producer_eglsurface 1
+#define EGL_STREAM_BIT_KHR			0x0800
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
+#endif
+#endif
+
+#ifdef EGL_KHR_stream /* Requires KHR_stream extension */
+#ifndef EGL_KHR_stream_producer_aldatalocator
+#define EGL_KHR_stream_producer_aldatalocator 1
+#endif
+#endif
+
+#ifdef EGL_KHR_stream /* Requires KHR_stream extension */
+#ifndef EGL_KHR_stream_fifo
+#define EGL_KHR_stream_fifo 1
+/* reuse EGLTimeKHR */
+#define EGL_STREAM_FIFO_LENGTH_KHR		0x31FC
+#define EGL_STREAM_TIME_NOW_KHR			0x31FD
+#define EGL_STREAM_TIME_CONSUMER_KHR		0x31FE
+#define EGL_STREAM_TIME_PRODUCER_KHR		0x31FF
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
+#endif
+#endif
+
+#ifndef EGL_EXT_create_context_robustness
+#define EGL_EXT_create_context_robustness 1
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT	0x30BF
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138
+#define EGL_NO_RESET_NOTIFICATION_EXT		0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_EXT		0x31BF
+#endif
+
+#ifndef EGL_ANGLE_d3d_share_handle_client_buffer
+#define EGL_ANGLE_d3d_share_handle_client_buffer 1
+/* reuse EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE */
+#endif
+
+#ifndef EGL_KHR_create_context
+#define EGL_KHR_create_context 1
+#define EGL_CONTEXT_MAJOR_VERSION_KHR			    EGL_CONTEXT_CLIENT_VERSION
+#define EGL_CONTEXT_MINOR_VERSION_KHR			    0x30FB
+#define EGL_CONTEXT_FLAGS_KHR				    0x30FC
+#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR		    0x30FD
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR  0x31BD
+#define EGL_NO_RESET_NOTIFICATION_KHR			    0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_KHR			    0x31BF
+#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR		    0x00000001
+#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR	    0x00000002
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR	    0x00000004
+#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR		    0x00000001
+#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR    0x00000002
+#define EGL_OPENGL_ES3_BIT_KHR				    0x00000040
+#endif
+
+#ifndef EGL_KHR_surfaceless_context
+#define EGL_KHR_surfaceless_context 1
+/* No tokens/entry points, just relaxes an error condition */
+#endif
+
+#ifdef EGL_KHR_stream /* Requires KHR_stream extension */
+#ifndef EGL_KHR_stream_cross_process_fd
+#define EGL_KHR_stream_cross_process_fd 1
+typedef int EGLNativeFileDescriptorKHR;
+#define EGL_NO_FILE_DESCRIPTOR_KHR		((EGLNativeFileDescriptorKHR)(-1))
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR(EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR(EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)(EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
+#endif
+#endif
+
+#ifndef EGL_EXT_multiview_window
+#define EGL_EXT_multiview_window 1
+#define EGL_MULTIVIEW_VIEW_COUNT_EXT		0x3134
+#endif
+
+#ifndef EGL_KHR_wait_sync
+#define EGL_KHR_wait_sync 1
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
+#endif
+
+#ifndef EGL_NV_post_convert_rounding
+#define EGL_NV_post_convert_rounding 1
+/* No tokens or entry points, just relaxes behavior of SwapBuffers */
+#endif
+
+#ifndef EGL_NV_native_query
+#define EGL_NV_native_query 1
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV( EGLDisplay dpy, EGLNativeDisplayType* display_id);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV( EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType* window);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV( EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType* pixmap);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC)(EGLDisplay dpy, EGLNativeDisplayType *display_id);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC)(EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC)(EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);
+#endif
+
+#ifndef EGL_NV_3dvision_surface
+#define EGL_NV_3dvision_surface 1
+#define EGL_AUTO_STEREO_NV			0x3136
+#endif
+
+#ifndef EGL_ANDROID_framebuffer_target
+#define EGL_ANDROID_framebuffer_target 1
+#define EGL_FRAMEBUFFER_TARGET_ANDROID		0x3147
+#endif
+
+#ifndef EGL_ANDROID_blob_cache
+#define EGL_ANDROID_blob_cache 1
+typedef khronos_ssize_t EGLsizeiANDROID;
+typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);
+typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID(EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)(EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
+#endif
+
+#ifndef EGL_ANDROID_image_native_buffer
+#define EGL_ANDROID_image_native_buffer 1
+#define EGL_NATIVE_BUFFER_ANDROID		0x3140
+#endif
+
+#ifndef EGL_ANDROID_native_fence_sync
+#define EGL_ANDROID_native_fence_sync 1
+#define EGL_SYNC_NATIVE_FENCE_ANDROID		0x3144
+#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID	0x3145
+#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID	0x3146
+#define EGL_NO_NATIVE_FENCE_FD_ANDROID		-1
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID( EGLDisplay dpy, EGLSyncKHR);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC)(EGLDisplay dpy, EGLSyncKHR);
+#endif
+
+#ifndef EGL_ANDROID_recordable
+#define EGL_ANDROID_recordable 1
+#define EGL_RECORDABLE_ANDROID			0x3142
+#endif
+
+#ifndef EGL_EXT_buffer_age
+#define EGL_EXT_buffer_age 1
+#define EGL_BUFFER_AGE_EXT			0x313D
+#endif
+
+#ifndef EGL_EXT_image_dma_buf_import
+#define EGL_EXT_image_dma_buf_import 1
+#define EGL_LINUX_DMA_BUF_EXT			0x3270
+#define EGL_LINUX_DRM_FOURCC_EXT		0x3271
+#define EGL_DMA_BUF_PLANE0_FD_EXT		0x3272
+#define EGL_DMA_BUF_PLANE0_OFFSET_EXT		0x3273
+#define EGL_DMA_BUF_PLANE0_PITCH_EXT		0x3274
+#define EGL_DMA_BUF_PLANE1_FD_EXT		0x3275
+#define EGL_DMA_BUF_PLANE1_OFFSET_EXT		0x3276
+#define EGL_DMA_BUF_PLANE1_PITCH_EXT		0x3277
+#define EGL_DMA_BUF_PLANE2_FD_EXT		0x3278
+#define EGL_DMA_BUF_PLANE2_OFFSET_EXT		0x3279
+#define EGL_DMA_BUF_PLANE2_PITCH_EXT		0x327A
+#define EGL_YUV_COLOR_SPACE_HINT_EXT		0x327B
+#define EGL_SAMPLE_RANGE_HINT_EXT		0x327C
+#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D
+#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E
+#define EGL_ITU_REC601_EXT			0x327F
+#define EGL_ITU_REC709_EXT			0x3280
+#define EGL_ITU_REC2020_EXT			0x3281
+#define EGL_YUV_FULL_RANGE_EXT			0x3282
+#define EGL_YUV_NARROW_RANGE_EXT		0x3283
+#define EGL_YUV_CHROMA_SITING_0_EXT		0x3284
+#define EGL_YUV_CHROMA_SITING_0_5_EXT		0x3285
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __eglext_h_ */
diff --git a/third_party/PowerVR_SDK/Builds/Include/EGL/eglplatform.h b/third_party/PowerVR_SDK/Builds/Include/EGL/eglplatform.h
new file mode 100644
index 0000000..6cabd79
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/EGL/eglplatform.h
@@ -0,0 +1,129 @@
+#ifndef __eglplatform_h_
+#define __eglplatform_h_
+
+/*
+** Copyright (c) 2007-2009 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Platform-specific types and definitions for egl.h
+ * $Revision: 12306 $ on $Date: 2010-08-25 09:51:28 -0700 (Wed, 25 Aug 2010) $
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file.  Please submit changes
+ * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
+ * by filing a bug against product "EGL" component "Registry".
+ */
+
+#include <KHR/khrplatform.h>
+
+/* Macros used in EGL function prototype declarations.
+ *
+ * EGL functions should be prototyped as:
+ *
+ * EGLAPI return-type EGLAPIENTRY eglFunction(arguments);
+ * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);
+ *
+ * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h
+ */
+
+#ifndef EGLAPI
+#define EGLAPI KHRONOS_APICALL
+#endif
+
+#ifndef EGLAPIENTRY
+#define EGLAPIENTRY  KHRONOS_APIENTRY
+#endif
+#define EGLAPIENTRYP EGLAPIENTRY*
+
+/* The types NativeDisplayType, NativeWindowType, and NativePixmapType
+ * are aliases of window-system-dependent types, such as X Display * or
+ * Windows Device Context. They must be defined in platform-specific
+ * code below. The EGL-prefixed versions of Native*Type are the same
+ * types, renamed in EGL 1.3 so all types in the API start with "EGL".
+ *
+ * Khronos STRONGLY RECOMMENDS that you use the default definitions
+ * provided below, since these changes affect both binary and source
+ * portability of applications using EGL running on different EGL
+ * implementations.
+ */
+
+#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+
+typedef HDC     EGLNativeDisplayType;
+typedef HBITMAP EGLNativePixmapType;
+typedef HWND    EGLNativeWindowType;
+
+#elif defined(SUPPORT_X11)
+
+/* X11 (tentative)  */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+typedef Display *EGLNativeDisplayType;
+typedef Pixmap   EGLNativePixmapType;
+typedef Window   EGLNativeWindowType;
+
+
+#elif defined(__ANDROID__) || defined(ANDROID)
+
+#include <android/native_window.h>
+
+struct egl_native_pixmap_t;
+
+typedef struct ANativeWindow*           EGLNativeWindowType;
+typedef struct egl_native_pixmap_t*     EGLNativePixmapType;
+typedef void*                           EGLNativeDisplayType;
+
+#else
+
+#if defined(_WIN64) ||  __WORDSIZE == 64
+typedef khronos_int64_t EGLNativeDisplayType;
+#else
+typedef int EGLNativeDisplayType;
+#endif
+
+typedef void *EGLNativeWindowType;
+typedef void *EGLNativePixmapType;
+
+#endif
+
+/* EGL 1.2 types, renamed for consistency in EGL 1.3 */
+typedef EGLNativeDisplayType NativeDisplayType;
+typedef EGLNativePixmapType  NativePixmapType;
+typedef EGLNativeWindowType  NativeWindowType;
+
+
+/* Define EGLint. This must be a signed integral type large enough to contain
+ * all legal attribute names and values passed into and out of EGL, whether
+ * their type is boolean, bitmask, enumerant (symbolic constant), integer,
+ * handle, or other.  While in general a 32-bit integer will suffice, if
+ * handles are 64 bit types, then EGLint should be defined as a signed 64-bit
+ * integer type.
+ */
+typedef khronos_int32_t EGLint;
+
+#endif /* __eglplatform_h */
diff --git a/third_party/PowerVR_SDK/Builds/Include/GLES/egl.h b/third_party/PowerVR_SDK/Builds/Include/GLES/egl.h
new file mode 100644
index 0000000..37bb02a
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/GLES/egl.h
@@ -0,0 +1,15 @@
+/*
+ * Skeleton egl.h to provide compatibility for early GLES 1.0
+ * applications. Several early implementations included gl.h
+ * in egl.h leading applications to include only egl.h
+ *
+ * $Revision: 6252 $ on $Date:: 2008-08-06 16:35:08 -0700 #$
+ */
+
+#ifndef __legacy_egl_h_
+#define __legacy_egl_h_
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#endif /* __legacy_egl_h_ */
diff --git a/third_party/PowerVR_SDK/Builds/Include/GLES/gl.h b/third_party/PowerVR_SDK/Builds/Include/GLES/gl.h
new file mode 100644
index 0000000..c95ddb0
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/GLES/gl.h
@@ -0,0 +1,770 @@
+#ifndef __gl_h_
+#define __gl_h_
+
+/* $Revision: 10601 $ on $Date:: 2010-03-04 22:15:27 -0800 #$ */
+
+#include <GLES/glplatform.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+typedef void             GLvoid;
+typedef char             GLchar;
+typedef unsigned int     GLenum;
+typedef unsigned char    GLboolean;
+typedef unsigned int     GLbitfield;
+typedef khronos_int8_t   GLbyte;
+typedef short            GLshort;
+typedef int              GLint;
+typedef int              GLsizei;
+typedef khronos_uint8_t  GLubyte;
+typedef unsigned short   GLushort;
+typedef unsigned int     GLuint;
+typedef khronos_float_t  GLfloat;
+typedef khronos_float_t  GLclampf;
+typedef khronos_int32_t  GLfixed;
+typedef khronos_int32_t  GLclampx;
+
+typedef khronos_intptr_t GLintptr;
+typedef khronos_ssize_t  GLsizeiptr;
+
+
+/*************************************************************/
+
+/* OpenGL ES core versions */
+#define GL_VERSION_ES_CM_1_0          1
+#define GL_VERSION_ES_CL_1_0          1
+#define GL_VERSION_ES_CM_1_1          1
+#define GL_VERSION_ES_CL_1_1          1
+
+/* ClearBufferMask */
+#define GL_DEPTH_BUFFER_BIT               0x00000100
+#define GL_STENCIL_BUFFER_BIT             0x00000400
+#define GL_COLOR_BUFFER_BIT               0x00004000
+
+/* Boolean */
+#define GL_FALSE                          0
+#define GL_TRUE                           1
+
+/* BeginMode */
+#define GL_POINTS                         0x0000
+#define GL_LINES                          0x0001
+#define GL_LINE_LOOP                      0x0002
+#define GL_LINE_STRIP                     0x0003
+#define GL_TRIANGLES                      0x0004
+#define GL_TRIANGLE_STRIP                 0x0005
+#define GL_TRIANGLE_FAN                   0x0006
+
+/* AlphaFunction */
+#define GL_NEVER                          0x0200
+#define GL_LESS                           0x0201
+#define GL_EQUAL                          0x0202
+#define GL_LEQUAL                         0x0203
+#define GL_GREATER                        0x0204
+#define GL_NOTEQUAL                       0x0205
+#define GL_GEQUAL                         0x0206
+#define GL_ALWAYS                         0x0207
+
+/* BlendingFactorDest */
+#define GL_ZERO                           0
+#define GL_ONE                            1
+#define GL_SRC_COLOR                      0x0300
+#define GL_ONE_MINUS_SRC_COLOR            0x0301
+#define GL_SRC_ALPHA                      0x0302
+#define GL_ONE_MINUS_SRC_ALPHA            0x0303
+#define GL_DST_ALPHA                      0x0304
+#define GL_ONE_MINUS_DST_ALPHA            0x0305
+
+/* BlendingFactorSrc */
+/*      GL_ZERO */
+/*      GL_ONE */
+#define GL_DST_COLOR                      0x0306
+#define GL_ONE_MINUS_DST_COLOR            0x0307
+#define GL_SRC_ALPHA_SATURATE             0x0308
+/*      GL_SRC_ALPHA */
+/*      GL_ONE_MINUS_SRC_ALPHA */
+/*      GL_DST_ALPHA */
+/*      GL_ONE_MINUS_DST_ALPHA */
+
+/* ClipPlaneName */
+#define GL_CLIP_PLANE0                    0x3000
+#define GL_CLIP_PLANE1                    0x3001
+#define GL_CLIP_PLANE2                    0x3002
+#define GL_CLIP_PLANE3                    0x3003
+#define GL_CLIP_PLANE4                    0x3004
+#define GL_CLIP_PLANE5                    0x3005
+
+/* ColorMaterialFace */
+/*      GL_FRONT_AND_BACK */
+
+/* ColorMaterialParameter */
+/*      GL_AMBIENT_AND_DIFFUSE */
+
+/* ColorPointerType */
+/*      GL_UNSIGNED_BYTE */
+/*      GL_FLOAT */
+/*      GL_FIXED */
+
+/* CullFaceMode */
+#define GL_FRONT                          0x0404
+#define GL_BACK                           0x0405
+#define GL_FRONT_AND_BACK                 0x0408
+
+/* DepthFunction */
+/*      GL_NEVER */
+/*      GL_LESS */
+/*      GL_EQUAL */
+/*      GL_LEQUAL */
+/*      GL_GREATER */
+/*      GL_NOTEQUAL */
+/*      GL_GEQUAL */
+/*      GL_ALWAYS */
+
+/* EnableCap */
+#define GL_FOG                            0x0B60
+#define GL_LIGHTING                       0x0B50
+#define GL_TEXTURE_2D                     0x0DE1
+#define GL_CULL_FACE                      0x0B44
+#define GL_ALPHA_TEST                     0x0BC0
+#define GL_BLEND                          0x0BE2
+#define GL_COLOR_LOGIC_OP                 0x0BF2
+#define GL_DITHER                         0x0BD0
+#define GL_STENCIL_TEST                   0x0B90
+#define GL_DEPTH_TEST                     0x0B71
+/*      GL_LIGHT0 */
+/*      GL_LIGHT1 */
+/*      GL_LIGHT2 */
+/*      GL_LIGHT3 */
+/*      GL_LIGHT4 */
+/*      GL_LIGHT5 */
+/*      GL_LIGHT6 */
+/*      GL_LIGHT7 */
+#define GL_POINT_SMOOTH                   0x0B10
+#define GL_LINE_SMOOTH                    0x0B20
+#define GL_SCISSOR_TEST                   0x0C11
+#define GL_COLOR_MATERIAL                 0x0B57
+#define GL_NORMALIZE                      0x0BA1
+#define GL_RESCALE_NORMAL                 0x803A
+#define GL_POLYGON_OFFSET_FILL            0x8037
+#define GL_VERTEX_ARRAY                   0x8074
+#define GL_NORMAL_ARRAY                   0x8075
+#define GL_COLOR_ARRAY                    0x8076
+#define GL_TEXTURE_COORD_ARRAY            0x8078
+#define GL_MULTISAMPLE                    0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE            0x809F
+#define GL_SAMPLE_COVERAGE                0x80A0
+
+/* ErrorCode */
+#define GL_NO_ERROR                       0
+#define GL_INVALID_ENUM                   0x0500
+#define GL_INVALID_VALUE                  0x0501
+#define GL_INVALID_OPERATION              0x0502
+#define GL_STACK_OVERFLOW                 0x0503
+#define GL_STACK_UNDERFLOW                0x0504
+#define GL_OUT_OF_MEMORY                  0x0505
+
+/* FogMode */
+/*      GL_LINEAR */
+#define GL_EXP                            0x0800
+#define GL_EXP2                           0x0801
+
+/* FogParameter */
+#define GL_FOG_DENSITY                    0x0B62
+#define GL_FOG_START                      0x0B63
+#define GL_FOG_END                        0x0B64
+#define GL_FOG_MODE                       0x0B65
+#define GL_FOG_COLOR                      0x0B66
+
+/* FrontFaceDirection */
+#define GL_CW                             0x0900
+#define GL_CCW                            0x0901
+
+/* GetPName */
+#define GL_CURRENT_COLOR                  0x0B00
+#define GL_CURRENT_NORMAL                 0x0B02
+#define GL_CURRENT_TEXTURE_COORDS         0x0B03
+#define GL_POINT_SIZE                     0x0B11
+#define GL_POINT_SIZE_MIN                 0x8126
+#define GL_POINT_SIZE_MAX                 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE      0x8128
+#define GL_POINT_DISTANCE_ATTENUATION     0x8129
+#define GL_SMOOTH_POINT_SIZE_RANGE        0x0B12
+#define GL_LINE_WIDTH                     0x0B21
+#define GL_SMOOTH_LINE_WIDTH_RANGE        0x0B22
+#define GL_ALIASED_POINT_SIZE_RANGE       0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E
+#define GL_CULL_FACE_MODE                 0x0B45
+#define GL_FRONT_FACE                     0x0B46
+#define GL_SHADE_MODEL                    0x0B54
+#define GL_DEPTH_RANGE                    0x0B70
+#define GL_DEPTH_WRITEMASK                0x0B72
+#define GL_DEPTH_CLEAR_VALUE              0x0B73
+#define GL_DEPTH_FUNC                     0x0B74
+#define GL_STENCIL_CLEAR_VALUE            0x0B91
+#define GL_STENCIL_FUNC                   0x0B92
+#define GL_STENCIL_VALUE_MASK             0x0B93
+#define GL_STENCIL_FAIL                   0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96
+#define GL_STENCIL_REF                    0x0B97
+#define GL_STENCIL_WRITEMASK              0x0B98
+#define GL_MATRIX_MODE                    0x0BA0
+#define GL_VIEWPORT                       0x0BA2
+#define GL_MODELVIEW_STACK_DEPTH          0x0BA3
+#define GL_PROJECTION_STACK_DEPTH         0x0BA4
+#define GL_TEXTURE_STACK_DEPTH            0x0BA5
+#define GL_MODELVIEW_MATRIX               0x0BA6
+#define GL_PROJECTION_MATRIX              0x0BA7
+#define GL_TEXTURE_MATRIX                 0x0BA8
+#define GL_ALPHA_TEST_FUNC                0x0BC1
+#define GL_ALPHA_TEST_REF                 0x0BC2
+#define GL_BLEND_DST                      0x0BE0
+#define GL_BLEND_SRC                      0x0BE1
+#define GL_LOGIC_OP_MODE                  0x0BF0
+#define GL_SCISSOR_BOX                    0x0C10
+#define GL_SCISSOR_TEST                   0x0C11
+#define GL_COLOR_CLEAR_VALUE              0x0C22
+#define GL_COLOR_WRITEMASK                0x0C23
+#define GL_UNPACK_ALIGNMENT               0x0CF5
+#define GL_PACK_ALIGNMENT                 0x0D05
+#define GL_MAX_LIGHTS                     0x0D31
+#define GL_MAX_CLIP_PLANES                0x0D32
+#define GL_MAX_TEXTURE_SIZE               0x0D33
+#define GL_MAX_MODELVIEW_STACK_DEPTH      0x0D36
+#define GL_MAX_PROJECTION_STACK_DEPTH     0x0D38
+#define GL_MAX_TEXTURE_STACK_DEPTH        0x0D39
+#define GL_MAX_VIEWPORT_DIMS              0x0D3A
+#define GL_MAX_TEXTURE_UNITS              0x84E2
+#define GL_SUBPIXEL_BITS                  0x0D50
+#define GL_RED_BITS                       0x0D52
+#define GL_GREEN_BITS                     0x0D53
+#define GL_BLUE_BITS                      0x0D54
+#define GL_ALPHA_BITS                     0x0D55
+#define GL_DEPTH_BITS                     0x0D56
+#define GL_STENCIL_BITS                   0x0D57
+#define GL_POLYGON_OFFSET_UNITS           0x2A00
+#define GL_POLYGON_OFFSET_FILL            0x8037
+#define GL_POLYGON_OFFSET_FACTOR          0x8038
+#define GL_TEXTURE_BINDING_2D             0x8069
+#define GL_VERTEX_ARRAY_SIZE              0x807A
+#define GL_VERTEX_ARRAY_TYPE              0x807B
+#define GL_VERTEX_ARRAY_STRIDE            0x807C
+#define GL_NORMAL_ARRAY_TYPE              0x807E
+#define GL_NORMAL_ARRAY_STRIDE            0x807F
+#define GL_COLOR_ARRAY_SIZE               0x8081
+#define GL_COLOR_ARRAY_TYPE               0x8082
+#define GL_COLOR_ARRAY_STRIDE             0x8083
+#define GL_TEXTURE_COORD_ARRAY_SIZE       0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE       0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE     0x808A
+#define GL_VERTEX_ARRAY_POINTER           0x808E
+#define GL_NORMAL_ARRAY_POINTER           0x808F
+#define GL_COLOR_ARRAY_POINTER            0x8090
+#define GL_TEXTURE_COORD_ARRAY_POINTER    0x8092
+#define GL_SAMPLE_BUFFERS                 0x80A8
+#define GL_SAMPLES                        0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE          0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT         0x80AB
+
+/* GetTextureParameter */
+/*      GL_TEXTURE_MAG_FILTER */
+/*      GL_TEXTURE_MIN_FILTER */
+/*      GL_TEXTURE_WRAP_S */
+/*      GL_TEXTURE_WRAP_T */
+
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3
+
+/* HintMode */
+#define GL_DONT_CARE                      0x1100
+#define GL_FASTEST                        0x1101
+#define GL_NICEST                         0x1102
+
+/* HintTarget */
+#define GL_PERSPECTIVE_CORRECTION_HINT    0x0C50
+#define GL_POINT_SMOOTH_HINT              0x0C51
+#define GL_LINE_SMOOTH_HINT               0x0C52
+#define GL_FOG_HINT                       0x0C54
+#define GL_GENERATE_MIPMAP_HINT           0x8192
+
+/* LightModelParameter */
+#define GL_LIGHT_MODEL_AMBIENT            0x0B53
+#define GL_LIGHT_MODEL_TWO_SIDE           0x0B52
+
+/* LightParameter */
+#define GL_AMBIENT                        0x1200
+#define GL_DIFFUSE                        0x1201
+#define GL_SPECULAR                       0x1202
+#define GL_POSITION                       0x1203
+#define GL_SPOT_DIRECTION                 0x1204
+#define GL_SPOT_EXPONENT                  0x1205
+#define GL_SPOT_CUTOFF                    0x1206
+#define GL_CONSTANT_ATTENUATION           0x1207
+#define GL_LINEAR_ATTENUATION             0x1208
+#define GL_QUADRATIC_ATTENUATION          0x1209
+
+/* DataType */
+#define GL_BYTE                           0x1400
+#define GL_UNSIGNED_BYTE                  0x1401
+#define GL_SHORT                          0x1402
+#define GL_UNSIGNED_SHORT                 0x1403
+#define GL_FLOAT                          0x1406
+#define GL_FIXED                          0x140C
+
+/* LogicOp */
+#define GL_CLEAR                          0x1500
+#define GL_AND                            0x1501
+#define GL_AND_REVERSE                    0x1502
+#define GL_COPY                           0x1503
+#define GL_AND_INVERTED                   0x1504
+#define GL_NOOP                           0x1505
+#define GL_XOR                            0x1506
+#define GL_OR                             0x1507
+#define GL_NOR                            0x1508
+#define GL_EQUIV                          0x1509
+#define GL_INVERT                         0x150A
+#define GL_OR_REVERSE                     0x150B
+#define GL_COPY_INVERTED                  0x150C
+#define GL_OR_INVERTED                    0x150D
+#define GL_NAND                           0x150E
+#define GL_SET                            0x150F
+
+/* MaterialFace */
+/*      GL_FRONT_AND_BACK */
+
+/* MaterialParameter */
+#define GL_EMISSION                       0x1600
+#define GL_SHININESS                      0x1601
+#define GL_AMBIENT_AND_DIFFUSE            0x1602
+/*      GL_AMBIENT */
+/*      GL_DIFFUSE */
+/*      GL_SPECULAR */
+
+/* MatrixMode */
+#define GL_MODELVIEW                      0x1700
+#define GL_PROJECTION                     0x1701
+#define GL_TEXTURE                        0x1702
+
+/* NormalPointerType */
+/*      GL_BYTE */
+/*      GL_SHORT */
+/*      GL_FLOAT */
+/*      GL_FIXED */
+
+/* PixelFormat */
+#define GL_ALPHA                          0x1906
+#define GL_RGB                            0x1907
+#define GL_RGBA                           0x1908
+#define GL_LUMINANCE                      0x1909
+#define GL_LUMINANCE_ALPHA                0x190A
+
+/* PixelStoreParameter */
+#define GL_UNPACK_ALIGNMENT               0x0CF5
+#define GL_PACK_ALIGNMENT                 0x0D05
+
+/* PixelType */
+/*      GL_UNSIGNED_BYTE */
+#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034
+#define GL_UNSIGNED_SHORT_5_6_5           0x8363
+
+/* ShadingModel */
+#define GL_FLAT                           0x1D00
+#define GL_SMOOTH                         0x1D01
+
+/* StencilFunction */
+/*      GL_NEVER */
+/*      GL_LESS */
+/*      GL_EQUAL */
+/*      GL_LEQUAL */
+/*      GL_GREATER */
+/*      GL_NOTEQUAL */
+/*      GL_GEQUAL */
+/*      GL_ALWAYS */
+
+/* StencilOp */
+/*      GL_ZERO */
+#define GL_KEEP                           0x1E00
+#define GL_REPLACE                        0x1E01
+#define GL_INCR                           0x1E02
+#define GL_DECR                           0x1E03
+/*      GL_INVERT */
+
+/* StringName */
+#define GL_VENDOR                         0x1F00
+#define GL_RENDERER                       0x1F01
+#define GL_VERSION                        0x1F02
+#define GL_EXTENSIONS                     0x1F03
+
+/* TexCoordPointerType */
+/*      GL_SHORT */
+/*      GL_FLOAT */
+/*      GL_FIXED */
+/*      GL_BYTE */
+
+/* TextureEnvMode */
+#define GL_MODULATE                       0x2100
+#define GL_DECAL                          0x2101
+/*      GL_BLEND */
+#define GL_ADD                            0x0104
+/*      GL_REPLACE */
+
+/* TextureEnvParameter */
+#define GL_TEXTURE_ENV_MODE               0x2200
+#define GL_TEXTURE_ENV_COLOR              0x2201
+
+/* TextureEnvTarget */
+#define GL_TEXTURE_ENV                    0x2300
+
+/* TextureMagFilter */
+#define GL_NEAREST                        0x2600
+#define GL_LINEAR                         0x2601
+
+/* TextureMinFilter */
+/*      GL_NEAREST */
+/*      GL_LINEAR */
+#define GL_NEAREST_MIPMAP_NEAREST         0x2700
+#define GL_LINEAR_MIPMAP_NEAREST          0x2701
+#define GL_NEAREST_MIPMAP_LINEAR          0x2702
+#define GL_LINEAR_MIPMAP_LINEAR           0x2703
+
+/* TextureParameterName */
+#define GL_TEXTURE_MAG_FILTER             0x2800
+#define GL_TEXTURE_MIN_FILTER             0x2801
+#define GL_TEXTURE_WRAP_S                 0x2802
+#define GL_TEXTURE_WRAP_T                 0x2803
+#define GL_GENERATE_MIPMAP                0x8191
+
+/* TextureTarget */
+/*      GL_TEXTURE_2D */
+
+/* TextureUnit */
+#define GL_TEXTURE0                       0x84C0
+#define GL_TEXTURE1                       0x84C1
+#define GL_TEXTURE2                       0x84C2
+#define GL_TEXTURE3                       0x84C3
+#define GL_TEXTURE4                       0x84C4
+#define GL_TEXTURE5                       0x84C5
+#define GL_TEXTURE6                       0x84C6
+#define GL_TEXTURE7                       0x84C7
+#define GL_TEXTURE8                       0x84C8
+#define GL_TEXTURE9                       0x84C9
+#define GL_TEXTURE10                      0x84CA
+#define GL_TEXTURE11                      0x84CB
+#define GL_TEXTURE12                      0x84CC
+#define GL_TEXTURE13                      0x84CD
+#define GL_TEXTURE14                      0x84CE
+#define GL_TEXTURE15                      0x84CF
+#define GL_TEXTURE16                      0x84D0
+#define GL_TEXTURE17                      0x84D1
+#define GL_TEXTURE18                      0x84D2
+#define GL_TEXTURE19                      0x84D3
+#define GL_TEXTURE20                      0x84D4
+#define GL_TEXTURE21                      0x84D5
+#define GL_TEXTURE22                      0x84D6
+#define GL_TEXTURE23                      0x84D7
+#define GL_TEXTURE24                      0x84D8
+#define GL_TEXTURE25                      0x84D9
+#define GL_TEXTURE26                      0x84DA
+#define GL_TEXTURE27                      0x84DB
+#define GL_TEXTURE28                      0x84DC
+#define GL_TEXTURE29                      0x84DD
+#define GL_TEXTURE30                      0x84DE
+#define GL_TEXTURE31                      0x84DF
+#define GL_ACTIVE_TEXTURE                 0x84E0
+#define GL_CLIENT_ACTIVE_TEXTURE          0x84E1
+
+/* TextureWrapMode */
+#define GL_REPEAT                         0x2901
+#define GL_CLAMP_TO_EDGE                  0x812F
+
+/* VertexPointerType */
+/*      GL_SHORT */
+/*      GL_FLOAT */
+/*      GL_FIXED */
+/*      GL_BYTE */
+
+/* LightName */
+#define GL_LIGHT0                         0x4000
+#define GL_LIGHT1                         0x4001
+#define GL_LIGHT2                         0x4002
+#define GL_LIGHT3                         0x4003
+#define GL_LIGHT4                         0x4004
+#define GL_LIGHT5                         0x4005
+#define GL_LIGHT6                         0x4006
+#define GL_LIGHT7                         0x4007
+
+/* Buffer Objects */
+#define GL_ARRAY_BUFFER                   0x8892
+#define GL_ELEMENT_ARRAY_BUFFER           0x8893
+
+#define GL_ARRAY_BUFFER_BINDING               0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING       0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING        0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING        0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING         0x8898
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+
+#define GL_STATIC_DRAW                    0x88E4
+#define GL_DYNAMIC_DRAW                   0x88E8
+
+#define GL_BUFFER_SIZE                    0x8764
+#define GL_BUFFER_USAGE                   0x8765
+
+/* Texture combine + dot3 */
+#define GL_SUBTRACT                       0x84E7
+#define GL_COMBINE                        0x8570
+#define GL_COMBINE_RGB                    0x8571
+#define GL_COMBINE_ALPHA                  0x8572
+#define GL_RGB_SCALE                      0x8573
+#define GL_ADD_SIGNED                     0x8574
+#define GL_INTERPOLATE                    0x8575
+#define GL_CONSTANT                       0x8576
+#define GL_PRIMARY_COLOR                  0x8577
+#define GL_PREVIOUS                       0x8578
+#define GL_OPERAND0_RGB                   0x8590
+#define GL_OPERAND1_RGB                   0x8591
+#define GL_OPERAND2_RGB                   0x8592
+#define GL_OPERAND0_ALPHA                 0x8598
+#define GL_OPERAND1_ALPHA                 0x8599
+#define GL_OPERAND2_ALPHA                 0x859A
+
+#define GL_ALPHA_SCALE                    0x0D1C
+
+#define GL_SRC0_RGB                       0x8580
+#define GL_SRC1_RGB                       0x8581
+#define GL_SRC2_RGB                       0x8582
+#define GL_SRC0_ALPHA                     0x8588
+#define GL_SRC1_ALPHA                     0x8589
+#define GL_SRC2_ALPHA                     0x858A
+
+#define GL_DOT3_RGB                       0x86AE
+#define GL_DOT3_RGBA                      0x86AF
+
+/*------------------------------------------------------------------------*
+ * required OES extension tokens
+ *------------------------------------------------------------------------*/
+
+/* OES_read_format */
+#ifndef GL_OES_read_format
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES                   0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES                 0x8B9B
+#endif
+
+/* GL_OES_compressed_paletted_texture */
+#ifndef GL_OES_compressed_paletted_texture
+#define GL_PALETTE4_RGB8_OES                                    0x8B90
+#define GL_PALETTE4_RGBA8_OES                                   0x8B91
+#define GL_PALETTE4_R5_G6_B5_OES                                0x8B92
+#define GL_PALETTE4_RGBA4_OES                                   0x8B93
+#define GL_PALETTE4_RGB5_A1_OES                                 0x8B94
+#define GL_PALETTE8_RGB8_OES                                    0x8B95
+#define GL_PALETTE8_RGBA8_OES                                   0x8B96
+#define GL_PALETTE8_R5_G6_B5_OES                                0x8B97
+#define GL_PALETTE8_RGBA4_OES                                   0x8B98
+#define GL_PALETTE8_RGB5_A1_OES                                 0x8B99
+#endif
+
+/* OES_point_size_array */
+#ifndef GL_OES_point_size_array
+#define GL_POINT_SIZE_ARRAY_OES                                 0x8B9C
+#define GL_POINT_SIZE_ARRAY_TYPE_OES                            0x898A
+#define GL_POINT_SIZE_ARRAY_STRIDE_OES                          0x898B
+#define GL_POINT_SIZE_ARRAY_POINTER_OES                         0x898C
+#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES                  0x8B9F
+#endif
+
+/* GL_OES_point_sprite */
+#ifndef GL_OES_point_sprite
+#define GL_POINT_SPRITE_OES                                     0x8861
+#define GL_COORD_REPLACE_OES                                    0x8862
+#endif
+
+/*************************************************************/
+
+/* Available only in Common profile */
+GL_API void GL_APIENTRY glAlphaFunc (GLenum func, GLclampf ref);
+GL_API void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+GL_API void GL_APIENTRY glClearDepthf (GLclampf depth);
+GL_API void GL_APIENTRY glClipPlanef (GLenum plane, const GLfloat *equation);
+GL_API void GL_APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_API void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar);
+GL_API void GL_APIENTRY glFogf (GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glFogfv (GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+GL_API void GL_APIENTRY glGetClipPlanef (GLenum pname, GLfloat eqn[4]);
+GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *params);
+GL_API void GL_APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);
+GL_API void GL_APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);
+GL_API void GL_APIENTRY glGetTexEnvfv (GLenum env, GLenum pname, GLfloat *params);
+GL_API void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_API void GL_APIENTRY glLightModelf (GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glLightModelfv (GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glLineWidth (GLfloat width);
+GL_API void GL_APIENTRY glLoadMatrixf (const GLfloat *m);
+GL_API void GL_APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m);
+GL_API void GL_APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+GL_API void GL_APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
+GL_API void GL_APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+GL_API void GL_APIENTRY glPointParameterf (GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glPointSize (GLfloat size);
+GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_API void GL_APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);
+GL_API void GL_APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
+
+/* Available in both Common and Common-Lite profiles */
+GL_API void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_API void GL_APIENTRY glAlphaFuncx (GLenum func, GLclampx ref);
+GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_API void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+GL_API void GL_APIENTRY glClear (GLbitfield mask);
+GL_API void GL_APIENTRY glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+GL_API void GL_APIENTRY glClearDepthx (GLclampx depth);
+GL_API void GL_APIENTRY glClearStencil (GLint s);
+GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture);
+GL_API void GL_APIENTRY glClipPlanex (GLenum plane, const GLfixed *equation);
+GL_API void GL_APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+GL_API void GL_APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_API void GL_APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GL_API void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+GL_API void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+GL_API void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_API void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glCullFace (GLenum mode);
+GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_API void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_API void GL_APIENTRY glDepthFunc (GLenum func);
+GL_API void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_API void GL_APIENTRY glDepthRangex (GLclampx zNear, GLclampx zFar);
+GL_API void GL_APIENTRY glDisable (GLenum cap);
+GL_API void GL_APIENTRY glDisableClientState (GLenum array);
+GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+GL_API void GL_APIENTRY glEnable (GLenum cap);
+GL_API void GL_APIENTRY glEnableClientState (GLenum array);
+GL_API void GL_APIENTRY glFinish (void);
+GL_API void GL_APIENTRY glFlush (void);
+GL_API void GL_APIENTRY glFogx (GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glFogxv (GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glFrontFace (GLenum mode);
+GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
+GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glGetClipPlanex (GLenum pname, GLfixed eqn[4]);
+GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_API void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_API GLenum GL_APIENTRY glGetError (void);
+GL_API void GL_APIENTRY glGetFixedv (GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glGetLightxv (GLenum light, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetPointerv (GLenum pname, GLvoid **params);
+GL_API const GLubyte * GL_APIENTRY glGetString (GLenum name);
+GL_API void GL_APIENTRY glGetTexEnviv (GLenum env, GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glGetTexEnvxv (GLenum env, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_API GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_API void GL_APIENTRY glLightModelx (GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glLightModelxv (GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glLineWidthx (GLfixed width);
+GL_API void GL_APIENTRY glLoadIdentity (void);
+GL_API void GL_APIENTRY glLoadMatrixx (const GLfixed *m);
+GL_API void GL_APIENTRY glLogicOp (GLenum opcode);
+GL_API void GL_APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glMatrixMode (GLenum mode);
+GL_API void GL_APIENTRY glMultMatrixx (const GLfixed *m);
+GL_API void GL_APIENTRY glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+GL_API void GL_APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz);
+GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+GL_API void GL_APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_API void GL_APIENTRY glPointParameterx (GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glPointParameterxv (GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glPointSizex (GLfixed size);
+GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units);
+GL_API void GL_APIENTRY glPopMatrix (void);
+GL_API void GL_APIENTRY glPushMatrix (void);
+GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+GL_API void GL_APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+GL_API void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert);
+GL_API void GL_APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert);
+GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z);
+GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glShadeModel (GLenum mode);
+GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_API void GL_APIENTRY glStencilMask (GLuint mask);
+GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GL_API void GL_APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);
+GL_API void GL_APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);
+GL_API void GL_APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GL_API void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_API void GL_APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_API void GL_APIENTRY glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z);
+GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+
+/*------------------------------------------------------------------------*
+ * Required OES extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_OES_read_format */
+#ifndef GL_OES_read_format
+#define GL_OES_read_format 1
+#endif
+
+/* GL_OES_compressed_paletted_texture */
+#ifndef GL_OES_compressed_paletted_texture
+#define GL_OES_compressed_paletted_texture 1
+#endif
+
+/* GL_OES_point_size_array */
+#ifndef GL_OES_point_size_array
+#define GL_OES_point_size_array 1
+GL_API void GL_APIENTRY glPointSizePointerOES (GLenum type, GLsizei stride, const GLvoid *pointer);
+#endif
+
+/* GL_OES_point_sprite */
+#ifndef GL_OES_point_sprite
+#define GL_OES_point_sprite 1
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gl_h_ */
+
diff --git a/third_party/PowerVR_SDK/Builds/Include/GLES/glext.h b/third_party/PowerVR_SDK/Builds/Include/GLES/glext.h
new file mode 100644
index 0000000..295e6eb
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/GLES/glext.h
@@ -0,0 +1,1278 @@
+#ifndef __glext_h_
+#define __glext_h_
+
+/* $Revision: 20798 $ on $Date:: 2013-03-07 01:19:34 -0800 #$ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+#ifndef GL_APIENTRYP
+#   define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+/*------------------------------------------------------------------------*
+ * OES extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_OES_blend_equation_separate */
+#ifndef GL_OES_blend_equation_separate
+/* BLEND_EQUATION_RGB_OES same as BLEND_EQUATION_OES */
+#define GL_BLEND_EQUATION_RGB_OES                               0x8009
+#define GL_BLEND_EQUATION_ALPHA_OES                             0x883D
+#endif
+
+/* GL_OES_blend_func_separate */
+#ifndef GL_OES_blend_func_separate
+#define GL_BLEND_DST_RGB_OES                                    0x80C8
+#define GL_BLEND_SRC_RGB_OES                                    0x80C9
+#define GL_BLEND_DST_ALPHA_OES                                  0x80CA
+#define GL_BLEND_SRC_ALPHA_OES                                  0x80CB
+#endif
+
+/* GL_OES_blend_subtract */
+#ifndef GL_OES_blend_subtract
+#define GL_BLEND_EQUATION_OES                                   0x8009
+#define GL_FUNC_ADD_OES                                         0x8006
+#define GL_FUNC_SUBTRACT_OES                                    0x800A
+#define GL_FUNC_REVERSE_SUBTRACT_OES                            0x800B
+#endif
+
+/* GL_OES_compressed_ETC1_RGB8_texture */
+#ifndef GL_OES_compressed_ETC1_RGB8_texture
+#define GL_ETC1_RGB8_OES                                        0x8D64
+#endif
+
+/* GL_OES_depth24 */
+#ifndef GL_OES_depth24
+#define GL_DEPTH_COMPONENT24_OES                                0x81A6
+#endif
+
+/* GL_OES_depth32 */
+#ifndef GL_OES_depth32
+#define GL_DEPTH_COMPONENT32_OES                                0x81A7
+#endif
+
+/* GL_OES_draw_texture */
+#ifndef GL_OES_draw_texture
+#define GL_TEXTURE_CROP_RECT_OES                                0x8B9D
+#endif
+
+/* GL_OES_EGL_image */
+#ifndef GL_OES_EGL_image
+typedef void* GLeglImageOES;
+#endif
+
+/* GL_OES_EGL_image_external */
+#ifndef GL_OES_EGL_image_external
+/* GLeglImageOES defined in GL_OES_EGL_image already. */
+#define GL_TEXTURE_EXTERNAL_OES                                 0x8D65
+#define GL_TEXTURE_BINDING_EXTERNAL_OES                         0x8D67
+#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES                     0x8D68
+#endif
+
+/* GL_OES_element_index_uint */
+#ifndef GL_OES_element_index_uint
+#define GL_UNSIGNED_INT                                         0x1405
+#endif
+
+/* GL_OES_fixed_point */
+#ifndef GL_OES_fixed_point
+#define GL_FIXED_OES                                            0x140C
+#endif
+
+/* GL_OES_framebuffer_object */
+#ifndef GL_OES_framebuffer_object
+#define GL_NONE_OES                                             0
+#define GL_FRAMEBUFFER_OES                                      0x8D40
+#define GL_RENDERBUFFER_OES                                     0x8D41
+#define GL_RGBA4_OES                                            0x8056
+#define GL_RGB5_A1_OES                                          0x8057
+#define GL_RGB565_OES                                           0x8D62
+#define GL_DEPTH_COMPONENT16_OES                                0x81A5
+#define GL_RENDERBUFFER_WIDTH_OES                               0x8D42
+#define GL_RENDERBUFFER_HEIGHT_OES                              0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES                     0x8D44
+#define GL_RENDERBUFFER_RED_SIZE_OES                            0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE_OES                          0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE_OES                           0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE_OES                          0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE_OES                          0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE_OES                        0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES               0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES               0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES             0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES     0x8CD3
+#define GL_COLOR_ATTACHMENT0_OES                                0x8CE0
+#define GL_DEPTH_ATTACHMENT_OES                                 0x8D00
+#define GL_STENCIL_ATTACHMENT_OES                               0x8D20
+#define GL_FRAMEBUFFER_COMPLETE_OES                             0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES                0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES        0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES                0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES                   0x8CDA
+#define GL_FRAMEBUFFER_UNSUPPORTED_OES                          0x8CDD
+#define GL_FRAMEBUFFER_BINDING_OES                              0x8CA6
+#define GL_RENDERBUFFER_BINDING_OES                             0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE_OES                            0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION_OES                    0x0506
+#endif
+
+/* GL_OES_mapbuffer */
+#ifndef GL_OES_mapbuffer
+#define GL_WRITE_ONLY_OES                                       0x88B9
+#define GL_BUFFER_ACCESS_OES                                    0x88BB
+#define GL_BUFFER_MAPPED_OES                                    0x88BC
+#define GL_BUFFER_MAP_POINTER_OES                               0x88BD
+#endif
+
+/* GL_OES_matrix_get */
+#ifndef GL_OES_matrix_get
+#define GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES               0x898D
+#define GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES              0x898E
+#define GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES                 0x898F
+#endif
+
+/* GL_OES_matrix_palette */
+#ifndef GL_OES_matrix_palette
+#define GL_MAX_VERTEX_UNITS_OES                                 0x86A4
+#define GL_MAX_PALETTE_MATRICES_OES                             0x8842
+#define GL_MATRIX_PALETTE_OES                                   0x8840
+#define GL_MATRIX_INDEX_ARRAY_OES                               0x8844
+#define GL_WEIGHT_ARRAY_OES                                     0x86AD
+#define GL_CURRENT_PALETTE_MATRIX_OES                           0x8843
+#define GL_MATRIX_INDEX_ARRAY_SIZE_OES                          0x8846
+#define GL_MATRIX_INDEX_ARRAY_TYPE_OES                          0x8847
+#define GL_MATRIX_INDEX_ARRAY_STRIDE_OES                        0x8848
+#define GL_MATRIX_INDEX_ARRAY_POINTER_OES                       0x8849
+#define GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES                0x8B9E
+#define GL_WEIGHT_ARRAY_SIZE_OES                                0x86AB
+#define GL_WEIGHT_ARRAY_TYPE_OES                                0x86A9
+#define GL_WEIGHT_ARRAY_STRIDE_OES                              0x86AA
+#define GL_WEIGHT_ARRAY_POINTER_OES                             0x86AC
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_OES                      0x889E
+#endif
+
+/* GL_OES_packed_depth_stencil */
+#ifndef GL_OES_packed_depth_stencil
+#define GL_DEPTH_STENCIL_OES                                    0x84F9
+#define GL_UNSIGNED_INT_24_8_OES                                0x84FA
+#define GL_DEPTH24_STENCIL8_OES                                 0x88F0
+#endif
+
+/* GL_OES_required_internalformat */
+/* No new tokens introduced by this extension. */
+
+/* GL_OES_rgb8_rgba8 */
+#ifndef GL_OES_rgb8_rgba8
+#define GL_RGB8_OES                                             0x8051
+#define GL_RGBA8_OES                                            0x8058
+#endif
+
+/* GL_OES_stencil1 */
+#ifndef GL_OES_stencil1
+#define GL_STENCIL_INDEX1_OES                                   0x8D46
+#endif
+
+/* GL_OES_stencil4 */
+#ifndef GL_OES_stencil4
+#define GL_STENCIL_INDEX4_OES                                   0x8D47
+#endif
+
+/* GL_OES_stencil8 */
+#ifndef GL_OES_stencil8
+#define GL_STENCIL_INDEX8_OES                                   0x8D48
+#endif
+
+/* GL_OES_stencil_wrap */
+#ifndef GL_OES_stencil_wrap
+#define GL_INCR_WRAP_OES                                        0x8507
+#define GL_DECR_WRAP_OES                                        0x8508
+#endif
+
+/* GL_OES_texture_cube_map */
+#ifndef GL_OES_texture_cube_map
+#define GL_NORMAL_MAP_OES                                       0x8511
+#define GL_REFLECTION_MAP_OES                                   0x8512
+#define GL_TEXTURE_CUBE_MAP_OES                                 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_OES                         0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES                      0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES                      0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES                      0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES                      0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES                      0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES                      0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES                        0x851C
+#define GL_TEXTURE_GEN_MODE_OES                                 0x2500
+#define GL_TEXTURE_GEN_STR_OES                                  0x8D60
+#endif
+
+/* GL_OES_texture_mirrored_repeat */
+#ifndef GL_OES_texture_mirrored_repeat
+#define GL_MIRRORED_REPEAT_OES                                  0x8370
+#endif
+
+/* GL_OES_vertex_array_object */
+#ifndef GL_OES_vertex_array_object
+#define GL_VERTEX_ARRAY_BINDING_OES                             0x85B5
+#endif
+
+/*------------------------------------------------------------------------*
+ * AMD extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_AMD_compressed_3DC_texture */
+#ifndef GL_AMD_compressed_3DC_texture
+#define GL_3DC_X_AMD                                            0x87F9
+#define GL_3DC_XY_AMD                                           0x87FA
+#endif
+
+/* GL_AMD_compressed_ATC_texture */
+#ifndef GL_AMD_compressed_ATC_texture
+#define GL_ATC_RGB_AMD                                          0x8C92
+#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD                          0x8C93
+#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD                      0x87EE
+#endif
+
+/*------------------------------------------------------------------------*
+ * APPLE extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_APPLE_copy_texture_levels */
+/* No new tokens introduced by this extension. */
+
+/* GL_APPLE_framebuffer_multisample */
+#ifndef GL_APPLE_framebuffer_multisample
+#define GL_RENDERBUFFER_SAMPLES_APPLE                           0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE             0x8D56
+#define GL_MAX_SAMPLES_APPLE                                    0x8D57
+#define GL_READ_FRAMEBUFFER_APPLE                               0x8CA8
+#define GL_DRAW_FRAMEBUFFER_APPLE                               0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE                       0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_APPLE                       0x8CAA
+#endif
+
+/* GL_APPLE_sync */
+#ifndef GL_APPLE_sync
+
+/* These types are defined with reference to <inttypes.h>
+ * in the Apple extension spec, but here we use the Khronos
+ * portable types in khrplatform.h, and assume those types
+ * are always defined.
+ * If any other extensions using these types are defined,
+ * the typedefs must move out of this block and be shared.
+ */
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef struct __GLsync *GLsync;
+
+#define GL_SYNC_OBJECT_APPLE                                    0x8A53
+#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE                        0x9111
+#define GL_OBJECT_TYPE_APPLE                                    0x9112
+#define GL_SYNC_CONDITION_APPLE                                 0x9113
+#define GL_SYNC_STATUS_APPLE                                    0x9114
+#define GL_SYNC_FLAGS_APPLE                                     0x9115
+#define GL_SYNC_FENCE_APPLE                                     0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE                     0x9117
+#define GL_UNSIGNALED_APPLE                                     0x9118
+#define GL_SIGNALED_APPLE                                       0x9119
+#define GL_ALREADY_SIGNALED_APPLE                               0x911A
+#define GL_TIMEOUT_EXPIRED_APPLE                                0x911B
+#define GL_CONDITION_SATISFIED_APPLE                            0x911C
+#define GL_WAIT_FAILED_APPLE                                    0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE                        0x00000001
+#define GL_TIMEOUT_IGNORED_APPLE                                0xFFFFFFFFFFFFFFFFull
+#endif
+
+/* GL_APPLE_texture_2D_limited_npot */
+/* No new tokens introduced by this extension. */
+
+/* GL_APPLE_texture_format_BGRA8888 */
+#ifndef GL_APPLE_texture_format_BGRA8888
+#define GL_BGRA_EXT                                             0x80E1
+#endif
+
+/* GL_APPLE_texture_max_level */
+#ifndef GL_APPLE_texture_max_level
+#define GL_TEXTURE_MAX_LEVEL_APPLE                              0x813D
+#endif
+
+/*------------------------------------------------------------------------*
+ * ARM extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_ARM_rgba8 */
+/* No new tokens introduced by this extension. */
+
+/*------------------------------------------------------------------------*
+ * EXT extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_EXT_blend_minmax */
+#ifndef GL_EXT_blend_minmax
+#define GL_MIN_EXT                                              0x8007
+#define GL_MAX_EXT                                              0x8008
+#endif
+
+/* GL_EXT_discard_framebuffer */
+#ifndef GL_EXT_discard_framebuffer
+#define GL_COLOR_EXT                                            0x1800
+#define GL_DEPTH_EXT                                            0x1801
+#define GL_STENCIL_EXT                                          0x1802
+#endif
+
+/* GL_EXT_map_buffer_range */
+#ifndef GL_EXT_map_buffer_range
+#define GL_MAP_READ_BIT_EXT                                     0x0001
+#define GL_MAP_WRITE_BIT_EXT                                    0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT_EXT                         0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT                        0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT                           0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT_EXT                           0x0020
+#endif
+
+/* GL_EXT_multisampled_render_to_texture */
+#ifndef GL_EXT_multisampled_render_to_texture
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT           0x8D6C
+/* reuse values from GL_EXT_framebuffer_multisample (desktop extension) */
+#define GL_RENDERBUFFER_SAMPLES_EXT                             0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT               0x8D56
+#define GL_MAX_SAMPLES_EXT                                      0x8D57
+#endif
+
+/* GL_EXT_multi_draw_arrays */
+/* No new tokens introduced by this extension. */
+
+/* GL_EXT_read_format_bgra */
+#ifndef GL_EXT_read_format_bgra
+#define GL_BGRA_EXT                                             0x80E1
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT                       0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT                       0x8366
+#endif
+
+/* GL_EXT_robustness */
+#ifndef GL_EXT_robustness
+/* reuse GL_NO_ERROR */
+#define GL_GUILTY_CONTEXT_RESET_EXT                             0x8253
+#define GL_INNOCENT_CONTEXT_RESET_EXT                           0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_EXT                            0x8255
+#define GL_CONTEXT_ROBUST_ACCESS_EXT                            0x90F3
+#define GL_RESET_NOTIFICATION_STRATEGY_EXT                      0x8256
+#define GL_LOSE_CONTEXT_ON_RESET_EXT                            0x8252
+#define GL_NO_RESET_NOTIFICATION_EXT                            0x8261
+#endif
+
+/* GL_EXT_sRGB */
+#ifndef GL_EXT_sRGB
+#define GL_SRGB_EXT                                             0x8C40
+#define GL_SRGB_ALPHA_EXT                                       0x8C42
+#define GL_SRGB8_ALPHA8_EXT                                     0x8C43
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT            0x8210
+#endif
+
+/* GL_EXT_texture_compression_dxt1 */
+#ifndef GL_EXT_texture_compression_dxt1
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                         0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                        0x83F1
+#endif
+
+/* GL_EXT_texture_filter_anisotropic */
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT                           0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                       0x84FF
+#endif
+
+/* GL_EXT_texture_format_BGRA8888 */
+#ifndef GL_EXT_texture_format_BGRA8888
+#define GL_BGRA_EXT                                             0x80E1
+#endif
+
+/* GL_EXT_texture_lod_bias */
+#ifndef GL_EXT_texture_lod_bias
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT                             0x84FD
+#define GL_TEXTURE_FILTER_CONTROL_EXT                           0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT                                 0x8501
+#endif
+
+/* GL_EXT_texture_storage */
+#ifndef GL_EXT_texture_storage
+#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT                         0x912F
+#define GL_ALPHA8_EXT                                           0x803C
+#define GL_LUMINANCE8_EXT                                       0x8040
+#define GL_LUMINANCE8_ALPHA8_EXT                                0x8045
+#define GL_RGBA32F_EXT                                          0x8814
+#define GL_RGB32F_EXT                                           0x8815
+#define GL_ALPHA32F_EXT                                         0x8816
+#define GL_LUMINANCE32F_EXT                                     0x8818
+#define GL_LUMINANCE_ALPHA32F_EXT                               0x8819
+/* reuse GL_RGBA16F_EXT */
+#define GL_RGB16F_EXT                                           0x881B
+#define GL_ALPHA16F_EXT                                         0x881C
+#define GL_LUMINANCE16F_EXT                                     0x881E
+#define GL_LUMINANCE_ALPHA16F_EXT                               0x881F
+#define GL_RGB10_A2_EXT                                         0x8059
+#define GL_RGB10_EXT                                            0x8052
+#define GL_BGRA8_EXT                                            0x93A1
+#endif
+
+/*------------------------------------------------------------------------*
+ * IMG extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_IMG_read_format */
+#ifndef GL_IMG_read_format
+#define GL_BGRA_IMG                                             0x80E1
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG                       0x8365
+#endif
+
+/* GL_IMG_texture_compression_pvrtc */
+#ifndef GL_IMG_texture_compression_pvrtc
+#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG                      0x8C00
+#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG                      0x8C01
+#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG                     0x8C02
+#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG                     0x8C03
+#endif
+
+/* GL_IMG_texture_env_enhanced_fixed_function */
+#ifndef GL_IMG_texture_env_enhanced_fixed_function
+#define GL_MODULATE_COLOR_IMG                                   0x8C04
+#define GL_RECIP_ADD_SIGNED_ALPHA_IMG                           0x8C05
+#define GL_TEXTURE_ALPHA_MODULATE_IMG                           0x8C06
+#define GL_FACTOR_ALPHA_MODULATE_IMG                            0x8C07
+#define GL_FRAGMENT_ALPHA_MODULATE_IMG                          0x8C08
+#define GL_ADD_BLEND_IMG                                        0x8C09
+#define GL_DOT3_RGBA_IMG                                        0x86AF
+#endif
+
+/* GL_IMG_user_clip_plane */
+#ifndef GL_IMG_user_clip_plane
+#define GL_CLIP_PLANE0_IMG                                      0x3000
+#define GL_CLIP_PLANE1_IMG                                      0x3001
+#define GL_CLIP_PLANE2_IMG                                      0x3002
+#define GL_CLIP_PLANE3_IMG                                      0x3003
+#define GL_CLIP_PLANE4_IMG                                      0x3004
+#define GL_CLIP_PLANE5_IMG                                      0x3005
+#define GL_MAX_CLIP_PLANES_IMG                                  0x0D32
+#endif
+
+/* GL_IMG_multisampled_render_to_texture */
+#ifndef GL_IMG_multisampled_render_to_texture
+#define GL_RENDERBUFFER_SAMPLES_IMG                             0x9133
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG               0x9134
+#define GL_MAX_SAMPLES_IMG                                      0x9135
+#define GL_TEXTURE_SAMPLES_IMG                                  0x9136
+#endif
+
+/*------------------------------------------------------------------------*
+ * NV extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_NV_fence */
+#ifndef GL_NV_fence
+#define GL_ALL_COMPLETED_NV                                     0x84F2
+#define GL_FENCE_STATUS_NV                                      0x84F3
+#define GL_FENCE_CONDITION_NV                                   0x84F4
+#endif
+
+/*------------------------------------------------------------------------*
+ * QCOM extension tokens
+ *------------------------------------------------------------------------*/
+
+/* GL_QCOM_driver_control */
+/* No new tokens introduced by this extension. */
+
+/* GL_QCOM_extended_get */
+#ifndef GL_QCOM_extended_get
+#define GL_TEXTURE_WIDTH_QCOM                                   0x8BD2
+#define GL_TEXTURE_HEIGHT_QCOM                                  0x8BD3
+#define GL_TEXTURE_DEPTH_QCOM                                   0x8BD4
+#define GL_TEXTURE_INTERNAL_FORMAT_QCOM                         0x8BD5
+#define GL_TEXTURE_FORMAT_QCOM                                  0x8BD6
+#define GL_TEXTURE_TYPE_QCOM                                    0x8BD7
+#define GL_TEXTURE_IMAGE_VALID_QCOM                             0x8BD8
+#define GL_TEXTURE_NUM_LEVELS_QCOM                              0x8BD9
+#define GL_TEXTURE_TARGET_QCOM                                  0x8BDA
+#define GL_TEXTURE_OBJECT_VALID_QCOM                            0x8BDB
+#define GL_STATE_RESTORE                                        0x8BDC
+#endif
+
+/* GL_QCOM_extended_get2 */
+/* No new tokens introduced by this extension. */
+
+/* GL_QCOM_perfmon_global_mode */
+#ifndef GL_QCOM_perfmon_global_mode
+#define GL_PERFMON_GLOBAL_MODE_QCOM                             0x8FA0
+#endif
+
+/* GL_QCOM_writeonly_rendering */
+#ifndef GL_QCOM_writeonly_rendering
+#define GL_WRITEONLY_RENDERING_QCOM                             0x8823
+#endif
+
+/* GL_QCOM_tiled_rendering */
+#ifndef GL_QCOM_tiled_rendering
+#define GL_COLOR_BUFFER_BIT0_QCOM                               0x00000001
+#define GL_COLOR_BUFFER_BIT1_QCOM                               0x00000002
+#define GL_COLOR_BUFFER_BIT2_QCOM                               0x00000004
+#define GL_COLOR_BUFFER_BIT3_QCOM                               0x00000008
+#define GL_COLOR_BUFFER_BIT4_QCOM                               0x00000010
+#define GL_COLOR_BUFFER_BIT5_QCOM                               0x00000020
+#define GL_COLOR_BUFFER_BIT6_QCOM                               0x00000040
+#define GL_COLOR_BUFFER_BIT7_QCOM                               0x00000080
+#define GL_DEPTH_BUFFER_BIT0_QCOM                               0x00000100
+#define GL_DEPTH_BUFFER_BIT1_QCOM                               0x00000200
+#define GL_DEPTH_BUFFER_BIT2_QCOM                               0x00000400
+#define GL_DEPTH_BUFFER_BIT3_QCOM                               0x00000800
+#define GL_DEPTH_BUFFER_BIT4_QCOM                               0x00001000
+#define GL_DEPTH_BUFFER_BIT5_QCOM                               0x00002000
+#define GL_DEPTH_BUFFER_BIT6_QCOM                               0x00004000
+#define GL_DEPTH_BUFFER_BIT7_QCOM                               0x00008000
+#define GL_STENCIL_BUFFER_BIT0_QCOM                             0x00010000
+#define GL_STENCIL_BUFFER_BIT1_QCOM                             0x00020000
+#define GL_STENCIL_BUFFER_BIT2_QCOM                             0x00040000
+#define GL_STENCIL_BUFFER_BIT3_QCOM                             0x00080000
+#define GL_STENCIL_BUFFER_BIT4_QCOM                             0x00100000
+#define GL_STENCIL_BUFFER_BIT5_QCOM                             0x00200000
+#define GL_STENCIL_BUFFER_BIT6_QCOM                             0x00400000
+#define GL_STENCIL_BUFFER_BIT7_QCOM                             0x00800000
+#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM                         0x01000000
+#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM                         0x02000000
+#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM                         0x04000000
+#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM                         0x08000000
+#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM                         0x10000000
+#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM                         0x20000000
+#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM                         0x40000000
+#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM                         0x80000000
+#endif
+
+/*------------------------------------------------------------------------*
+ * End of extension tokens, start of corresponding extension functions
+ *------------------------------------------------------------------------*/
+
+/*------------------------------------------------------------------------*
+ * OES extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_OES_blend_equation_separate */
+#ifndef GL_OES_blend_equation_separate
+#define GL_OES_blend_equation_separate 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glBlendEquationSeparateOES (GLenum modeRGB, GLenum modeAlpha);
+#endif
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEOESPROC) (GLenum modeRGB, GLenum modeAlpha);
+#endif
+
+/* GL_OES_blend_func_separate */
+#ifndef GL_OES_blend_func_separate
+#define GL_OES_blend_func_separate 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glBlendFuncSeparateOES (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEOESPROC) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif
+
+/* GL_OES_blend_subtract */
+#ifndef GL_OES_blend_subtract
+#define GL_OES_blend_subtract 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glBlendEquationOES (GLenum mode);
+#endif
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONOESPROC) (GLenum mode);
+#endif
+
+/* GL_OES_byte_coordinates */
+#ifndef GL_OES_byte_coordinates
+#define GL_OES_byte_coordinates 1
+#endif
+
+/* GL_OES_compressed_ETC1_RGB8_texture */
+#ifndef GL_OES_compressed_ETC1_RGB8_texture
+#define GL_OES_compressed_ETC1_RGB8_texture 1
+#endif
+
+/* GL_OES_depth24 */
+#ifndef GL_OES_depth24
+#define GL_OES_depth24 1
+#endif
+
+/* GL_OES_depth32 */
+#ifndef GL_OES_depth32
+#define GL_OES_depth32 1
+#endif
+
+/* GL_OES_draw_texture */
+#ifndef GL_OES_draw_texture
+#define GL_OES_draw_texture 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glDrawTexsOES (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+GL_API void GL_APIENTRY glDrawTexiOES (GLint x, GLint y, GLint z, GLint width, GLint height);
+GL_API void GL_APIENTRY glDrawTexxOES (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+GL_API void GL_APIENTRY glDrawTexsvOES (const GLshort *coords);
+GL_API void GL_APIENTRY glDrawTexivOES (const GLint *coords);
+GL_API void GL_APIENTRY glDrawTexxvOES (const GLfixed *coords);
+GL_API void GL_APIENTRY glDrawTexfOES (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+GL_API void GL_APIENTRY glDrawTexfvOES (const GLfloat *coords);
+#endif
+typedef void (GL_APIENTRYP PFNGLDRAWTEXSOESPROC) (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXIOESPROC) (GLint x, GLint y, GLint z, GLint width, GLint height);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXXOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXSVOESPROC) (const GLshort *coords);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXIVOESPROC) (const GLint *coords);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXXVOESPROC) (const GLfixed *coords);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXFOESPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+typedef void (GL_APIENTRYP PFNGLDRAWTEXFVOESPROC) (const GLfloat *coords);
+#endif
+
+/* GL_OES_EGL_image */
+#ifndef GL_OES_EGL_image
+#define GL_OES_EGL_image 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
+GL_API void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
+#endif
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
+#endif
+
+/* GL_OES_EGL_image_external */
+#ifndef GL_OES_EGL_image_external
+#define GL_OES_EGL_image_external 1
+/* glEGLImageTargetTexture2DOES defined in GL_OES_EGL_image already. */
+#endif
+
+/* GL_OES_element_index_uint */
+#ifndef GL_OES_element_index_uint
+#define GL_OES_element_index_uint 1
+#endif
+
+/* GL_OES_extended_matrix_palette */
+#ifndef GL_OES_extended_matrix_palette
+#define GL_OES_extended_matrix_palette 1
+#endif
+
+/* GL_OES_fbo_render_mipmap */
+#ifndef GL_OES_fbo_render_mipmap
+#define GL_OES_fbo_render_mipmap 1
+#endif
+
+/* GL_OES_fixed_point */
+#ifndef GL_OES_fixed_point
+#define GL_OES_fixed_point 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glAlphaFuncxOES (GLenum func, GLclampx ref);
+GL_API void GL_APIENTRY glClearColorxOES (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+GL_API void GL_APIENTRY glClearDepthxOES (GLclampx depth);
+GL_API void GL_APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation);
+GL_API void GL_APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+GL_API void GL_APIENTRY glDepthRangexOES (GLclampx zNear, GLclampx zFar);
+GL_API void GL_APIENTRY glFogxOES (GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glFogxvOES (GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glFrustumxOES (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+GL_API void GL_APIENTRY glGetClipPlanexOES (GLenum pname, GLfixed eqn[4]);
+GL_API void GL_APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetLightxvOES (GLenum light, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetMaterialxvOES (GLenum face, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetTexEnvxvOES (GLenum env, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params);
+GL_API void GL_APIENTRY glLightModelxOES (GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glLineWidthxOES (GLfixed width);
+GL_API void GL_APIENTRY glLoadMatrixxOES (const GLfixed *m);
+GL_API void GL_APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glMultMatrixxOES (const GLfixed *m);
+GL_API void GL_APIENTRY glMultiTexCoord4xOES (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+GL_API void GL_APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz);
+GL_API void GL_APIENTRY glOrthoxOES (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+GL_API void GL_APIENTRY glPointParameterxOES (GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glPointSizexOES (GLfixed size);
+GL_API void GL_APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units);
+GL_API void GL_APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+GL_API void GL_APIENTRY glSampleCoveragexOES (GLclampx value, GLboolean invert);
+GL_API void GL_APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z);
+GL_API void GL_APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z);
+#endif
+typedef void (GL_APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLclampx ref);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLclampx depth);
+typedef void (GL_APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation);
+typedef void (GL_APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLclampx zNear, GLclampx zFar);
+typedef void (GL_APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum pname, GLfixed eqn[4]);
+typedef void (GL_APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLGETLIGHTXVOESPROC) (GLenum light, GLenum pname, GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLGETMATERIALXVOESPROC) (GLenum face, GLenum pname, GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum env, GLenum pname, GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width);
+typedef void (GL_APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m);
+typedef void (GL_APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m);
+typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (GL_APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz);
+typedef void (GL_APIENTRYP PFNGLORTHOXOESPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXOESPROC) (GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units);
+typedef void (GL_APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEXOESPROC) (GLclampx value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z);
+typedef void (GL_APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z);
+#endif
+
+/* GL_OES_framebuffer_object */
+#ifndef GL_OES_framebuffer_object
+#define GL_OES_framebuffer_object 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API GLboolean GL_APIENTRY glIsRenderbufferOES (GLuint renderbuffer);
+GL_API void GL_APIENTRY glBindRenderbufferOES (GLenum target, GLuint renderbuffer);
+GL_API void GL_APIENTRY glDeleteRenderbuffersOES (GLsizei n, const GLuint* renderbuffers);
+GL_API void GL_APIENTRY glGenRenderbuffersOES (GLsizei n, GLuint* renderbuffers);
+GL_API void GL_APIENTRY glRenderbufferStorageOES (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glGetRenderbufferParameterivOES (GLenum target, GLenum pname, GLint* params);
+GL_API GLboolean GL_APIENTRY glIsFramebufferOES (GLuint framebuffer);
+GL_API void GL_APIENTRY glBindFramebufferOES (GLenum target, GLuint framebuffer);
+GL_API void GL_APIENTRY glDeleteFramebuffersOES (GLsizei n, const GLuint* framebuffers);
+GL_API void GL_APIENTRY glGenFramebuffersOES (GLsizei n, GLuint* framebuffers);
+GL_API GLenum GL_APIENTRY glCheckFramebufferStatusOES (GLenum target);
+GL_API void GL_APIENTRY glFramebufferRenderbufferOES (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_API void GL_APIENTRY glFramebufferTexture2DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_API void GL_APIENTRY glGetFramebufferAttachmentParameterivOES (GLenum target, GLenum attachment, GLenum pname, GLint* params);
+GL_API void GL_APIENTRY glGenerateMipmapOES (GLenum target);
+#endif
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFEROESPROC) (GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFEROESPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSOESPROC) (GLsizei n, const GLuint* renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSOESPROC) (GLsizei n, GLuint* renderbuffers);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) (GLenum target, GLenum pname, GLint* params);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFEROESPROC) (GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFEROESPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSOESPROC) (GLsizei n, const GLuint* framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSOESPROC) (GLsizei n, GLuint* framebuffers);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPOESPROC) (GLenum target);
+#endif
+
+/* GL_OES_mapbuffer */
+#ifndef GL_OES_mapbuffer
+#define GL_OES_mapbuffer 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);
+GL_API GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target);
+GL_API void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid ** params);
+#endif
+typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid ** params);
+#endif
+
+/* GL_OES_matrix_get */
+#ifndef GL_OES_matrix_get
+#define GL_OES_matrix_get 1
+#endif
+
+/* GL_OES_matrix_palette */
+#ifndef GL_OES_matrix_palette
+#define GL_OES_matrix_palette 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glCurrentPaletteMatrixOES (GLuint matrixpaletteindex);
+GL_API void GL_APIENTRY glLoadPaletteFromModelViewMatrixOES (void);
+GL_API void GL_APIENTRY glMatrixIndexPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GL_API void GL_APIENTRY glWeightPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+#endif
+typedef void (GL_APIENTRYP PFNGLCURRENTPALETTEMATRIXOESPROC) (GLuint matrixpaletteindex);
+typedef void (GL_APIENTRYP PFNGLLOADPALETTEFROMMODELVIEWMATRIXOESPROC) (void);
+typedef void (GL_APIENTRYP PFNGLMATRIXINDEXPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (GL_APIENTRYP PFNGLWEIGHTPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+#endif
+
+/* GL_OES_packed_depth_stencil */
+#ifndef GL_OES_packed_depth_stencil
+#define GL_OES_packed_depth_stencil 1
+#endif
+
+/* GL_OES_required_internalformat */
+#ifndef GL_OES_required_internalformat
+#define GL_OES_required_internalformat 1
+#endif
+
+/* GL_OES_query_matrix */
+#ifndef GL_OES_query_matrix
+#define GL_OES_query_matrix 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API GLbitfield GL_APIENTRY glQueryMatrixxOES (GLfixed mantissa[16], GLint exponent[16]);
+#endif
+typedef GLbitfield (GL_APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed mantissa[16], GLint exponent[16]);
+#endif
+
+/* GL_OES_rgb8_rgba8 */
+#ifndef GL_OES_rgb8_rgba8
+#define GL_OES_rgb8_rgba8 1
+#endif
+
+/* GL_OES_single_precision */
+#ifndef GL_OES_single_precision
+#define GL_OES_single_precision 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glDepthRangefOES (GLclampf zNear, GLclampf zFar);
+GL_API void GL_APIENTRY glFrustumfOES (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+GL_API void GL_APIENTRY glOrthofOES (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+GL_API void GL_APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation);
+GL_API void GL_APIENTRY glGetClipPlanefOES (GLenum pname, GLfloat eqn[4]);
+GL_API void GL_APIENTRY glClearDepthfOES (GLclampf depth);
+#endif
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf zNear, GLclampf zFar);
+typedef void (GL_APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+typedef void (GL_APIENTRYP PFNGLORTHOFOESPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+typedef void (GL_APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation);
+typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum pname, GLfloat eqn[4]);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth);
+#endif
+
+/* GL_OES_stencil1 */
+#ifndef GL_OES_stencil1
+#define GL_OES_stencil1 1
+#endif
+
+/* GL_OES_stencil4 */
+#ifndef GL_OES_stencil4
+#define GL_OES_stencil4 1
+#endif
+
+/* GL_OES_stencil8 */
+#ifndef GL_OES_stencil8
+#define GL_OES_stencil8 1
+#endif
+
+/* GL_OES_stencil_wrap */
+#ifndef GL_OES_stencil_wrap
+#define GL_OES_stencil_wrap 1
+#endif
+
+/* GL_OES_texture_cube_map */
+#ifndef GL_OES_texture_cube_map
+#define GL_OES_texture_cube_map 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glTexGenfOES (GLenum coord, GLenum pname, GLfloat param);
+GL_API void GL_APIENTRY glTexGenfvOES (GLenum coord, GLenum pname, const GLfloat *params);
+GL_API void GL_APIENTRY glTexGeniOES (GLenum coord, GLenum pname, GLint param);
+GL_API void GL_APIENTRY glTexGenivOES (GLenum coord, GLenum pname, const GLint *params);
+GL_API void GL_APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param);
+GL_API void GL_APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params);
+GL_API void GL_APIENTRY glGetTexGenfvOES (GLenum coord, GLenum pname, GLfloat *params);
+GL_API void GL_APIENTRY glGetTexGenivOES (GLenum coord, GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params);
+#endif
+typedef void (GL_APIENTRYP PFNGLTEXGENFOESPROC) (GLenum coord, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXGENFVOESPROC) (GLenum coord, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXGENIOESPROC) (GLenum coord, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXGENIVOESPROC) (GLenum coord, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param);
+typedef void (GL_APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXGENFVOESPROC) (GLenum coord, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXGENIVOESPROC) (GLenum coord, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params);
+#endif
+
+/* GL_OES_texture_env_crossbar */
+#ifndef GL_OES_texture_env_crossbar
+#define GL_OES_texture_env_crossbar 1
+#endif
+
+/* GL_OES_texture_mirrored_repeat */
+#ifndef GL_OES_texture_mirrored_repeat
+#define GL_OES_texture_mirrored_repeat 1
+#endif
+
+/* GL_OES_vertex_array_object */
+#ifndef GL_OES_vertex_array_object
+#define GL_OES_vertex_array_object 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glBindVertexArrayOES (GLuint array);
+GL_API void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays);
+GL_API void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays);
+GL_API GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array);
+#endif
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array);
+#endif
+
+/*------------------------------------------------------------------------*
+ * AMD extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_AMD_compressed_3DC_texture */
+#ifndef GL_AMD_compressed_3DC_texture
+#define GL_AMD_compressed_3DC_texture 1
+#endif
+
+/* GL_AMD_compressed_ATC_texture */
+#ifndef GL_AMD_compressed_ATC_texture
+#define GL_AMD_compressed_ATC_texture 1
+#endif
+
+/*------------------------------------------------------------------------*
+ * APPLE extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_APPLE_copy_texture_levels */
+#ifndef GL_APPLE_copy_texture_levels
+#define GL_APPLE_copy_texture_levels 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+#endif
+typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+#endif
+
+/* GL_APPLE_framebuffer_multisample */
+#ifndef GL_APPLE_framebuffer_multisample
+#define GL_APPLE_framebuffer_multisample 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void);
+#endif
+
+/* GL_APPLE_sync */
+#ifndef GL_APPLE_sync
+#define GL_APPLE_sync 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags);
+GL_API GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync);
+GL_API void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync);
+GL_API GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_API void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_API void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params);
+GL_API void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#endif
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#endif
+
+/* GL_APPLE_texture_2D_limited_npot */
+#ifndef GL_APPLE_texture_2D_limited_npot
+#define GL_APPLE_texture_2D_limited_npot 1
+#endif
+
+/* GL_APPLE_texture_format_BGRA8888 */
+#ifndef GL_APPLE_texture_format_BGRA8888
+#define GL_APPLE_texture_format_BGRA8888 1
+#endif
+
+/* GL_APPLE_texture_max_level */
+#ifndef GL_APPLE_texture_max_level
+#define GL_APPLE_texture_max_level 1
+#endif
+
+/*------------------------------------------------------------------------*
+ * ARM extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_ARM_rgba8 */
+#ifndef GL_ARM_rgba8
+#define GL_ARM_rgba8 1
+#endif
+
+/*------------------------------------------------------------------------*
+ * EXT extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_EXT_blend_minmax */
+#ifndef GL_EXT_blend_minmax
+#define GL_EXT_blend_minmax 1
+#endif
+
+/* GL_EXT_discard_framebuffer */
+#ifndef GL_EXT_discard_framebuffer
+#define GL_EXT_discard_framebuffer 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+#endif
+typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+#endif
+
+/* GL_EXT_map_buffer_range */
+#ifndef GL_EXT_map_buffer_range
+#define GL_EXT_map_buffer_range 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_API void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length);
+#endif
+typedef void* (GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+#endif
+
+/* GL_EXT_multisampled_render_to_texture */
+#ifndef GL_EXT_multisampled_render_to_texture
+#define GL_EXT_multisampled_render_to_texture 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+
+/* GL_EXT_multi_draw_arrays */
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+GL_API void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
+#endif
+
+/* GL_EXT_read_format_bgra */
+#ifndef GL_EXT_read_format_bgra
+#define GL_EXT_read_format_bgra 1
+#endif
+
+/* GL_EXT_robustness */
+#ifndef GL_EXT_robustness
+#define GL_EXT_robustness 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);
+GL_API void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_API void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, float *params);
+GL_API void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+#endif
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, float *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+#endif
+
+/* GL_EXT_sRGB */
+#ifndef GL_EXT_sRGB
+#define GL_EXT_sRGB 1
+#endif
+
+/* GL_EXT_texture_compression_dxt1 */
+#ifndef GL_EXT_texture_compression_dxt1
+#define GL_EXT_texture_compression_dxt1 1
+#endif
+
+/* GL_EXT_texture_filter_anisotropic */
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_EXT_texture_filter_anisotropic 1
+#endif
+
+/* GL_EXT_texture_format_BGRA8888 */
+#ifndef GL_EXT_texture_format_BGRA8888
+#define GL_EXT_texture_format_BGRA8888 1
+#endif
+
+/* GL_EXT_texture_lod_bias */
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+#endif
+
+/* GL_EXT_texture_storage */
+#ifndef GL_EXT_texture_storage
+#define GL_EXT_texture_storage 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GL_API void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_API void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GL_API void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+
+/*------------------------------------------------------------------------*
+ * IMG extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_IMG_read_format */
+#ifndef GL_IMG_read_format
+#define GL_IMG_read_format 1
+#endif
+
+/* GL_IMG_texture_compression_pvrtc */
+#ifndef GL_IMG_texture_compression_pvrtc
+#define GL_IMG_texture_compression_pvrtc 1
+#endif
+
+/* GL_IMG_texture_env_enhanced_fixed_function */
+#ifndef GL_IMG_texture_env_enhanced_fixed_function
+#define GL_IMG_texture_env_enhanced_fixed_function 1
+#endif
+
+/* GL_IMG_user_clip_plane */
+#ifndef GL_IMG_user_clip_plane
+#define GL_IMG_user_clip_plane 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glClipPlanefIMG (GLenum p, const GLfloat *eqn);
+GL_API void GL_APIENTRY glClipPlanexIMG (GLenum p, const GLfixed *eqn);
+#endif
+typedef void (GL_APIENTRYP PFNGLCLIPPLANEFIMGPROC) (GLenum p, const GLfloat *eqn);
+typedef void (GL_APIENTRYP PFNGLCLIPPLANEXIMGPROC) (GLenum p, const GLfixed *eqn);
+#endif
+
+/* GL_IMG_multisampled_render_to_texture */
+#ifndef GL_IMG_multisampled_render_to_texture
+#define GL_IMG_multisampled_render_to_texture 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_API void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+
+/*------------------------------------------------------------------------*
+ * NV extension functions
+ *------------------------------------------------------------------------*/
+
+/* NV_fence */
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences);
+GL_API void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences);
+GL_API GLboolean GL_APIENTRY glIsFenceNV (GLuint fence);
+GL_API GLboolean GL_APIENTRY glTestFenceNV (GLuint fence);
+GL_API void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glFinishFenceNV (GLuint fence);
+GL_API void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition);
+#endif
+typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);
+typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);
+typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);
+typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence);
+typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);
+typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
+#endif
+
+/*------------------------------------------------------------------------*
+ * QCOM extension functions
+ *------------------------------------------------------------------------*/
+
+/* GL_QCOM_driver_control */
+#ifndef GL_QCOM_driver_control
+#define GL_QCOM_driver_control 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls);
+GL_API void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
+GL_API void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl);
+GL_API void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl);
+#endif
+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls);
+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
+typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
+typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
+#endif
+
+/* GL_QCOM_extended_get */
+#ifndef GL_QCOM_extended_get
+#define GL_QCOM_extended_get 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures);
+GL_API void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
+GL_API void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
+GL_API void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
+GL_API void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
+GL_API void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param);
+GL_API void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);
+GL_API void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params);
+#endif
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures);
+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);
+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params);
+#endif
+
+/* GL_QCOM_extended_get2 */
+#ifndef GL_QCOM_extended_get2
+#define GL_QCOM_extended_get2 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders);
+GL_API void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
+GL_API GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program);
+GL_API void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
+#endif
+typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders);
+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
+typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
+#endif
+
+/* GL_QCOM_perfmon_global_mode */
+#ifndef GL_QCOM_perfmon_global_mode
+#define GL_QCOM_perfmon_global_mode 1
+#endif
+
+/* GL_QCOM_writeonly_rendering */
+#ifndef GL_QCOM_writeonly_rendering
+#define GL_QCOM_writeonly_rendering 1
+#endif
+
+/* GL_QCOM_tiled_rendering */
+#ifndef GL_QCOM_tiled_rendering
+#define GL_QCOM_tiled_rendering 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_API void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+GL_API void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask);
+#endif
+typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __glext_h_ */
+
diff --git a/third_party/PowerVR_SDK/Builds/Include/GLES/glplatform.h b/third_party/PowerVR_SDK/Builds/Include/GLES/glplatform.h
new file mode 100644
index 0000000..71d6a0d
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/GLES/glplatform.h
@@ -0,0 +1,30 @@
+#ifndef __glplatform_h_
+#define __glplatform_h_
+
+/* $Revision: 10601 $ on $Date:: 2010-03-04 22:15:27 -0800 #$ */
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+/* Platform-specific types and definitions for OpenGL ES 1.X  gl.h
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file.  Please submit changes
+ * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
+ * by filing a bug against product "OpenGL-ES" component "Registry".
+ */
+
+#include <KHR/khrplatform.h>
+
+#ifndef GL_API
+#define GL_API      KHRONOS_APICALL
+#endif
+
+#ifndef GL_APIENTRY
+#define GL_APIENTRY KHRONOS_APIENTRY
+#endif
+
+#endif /* __glplatform_h_ */
diff --git a/third_party/PowerVR_SDK/Builds/Include/KHR/khrplatform.h b/third_party/PowerVR_SDK/Builds/Include/KHR/khrplatform.h
new file mode 100644
index 0000000..bbe179d
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/KHR/khrplatform.h
@@ -0,0 +1,272 @@
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2009 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * $Revision: 1.6 $ on $Date: 2011/06/01 14:18:13 $
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by sending them to the public Khronos Bugzilla
+ * (http://khronos.org/bugzilla) by filing a bug against product
+ * "Khronos (general)" component "Registry".
+ *
+ * A predefined template which fills in some of the bug fields can be
+ * reached using http://tinyurl.com/khrplatform-h-bugreport, but you
+ * must create a Bugzilla login first.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ *    http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ *        #include <KHR/khrplatform.h>
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ *    khronos_int8_t              signed   8  bit
+ *    khronos_uint8_t             unsigned 8  bit
+ *    khronos_int16_t             signed   16 bit
+ *    khronos_uint16_t            unsigned 16 bit
+ *    khronos_int32_t             signed   32 bit
+ *    khronos_uint32_t            unsigned 32 bit
+ *    khronos_int64_t             signed   64 bit
+ *    khronos_uint64_t            unsigned 64 bit
+ *    khronos_intptr_t            signed   same number of bits as a pointer
+ *    khronos_uintptr_t           unsigned same number of bits as a pointer
+ *    khronos_ssize_t             signed   size
+ *    khronos_usize_t             unsigned size
+ *    khronos_float_t             signed   32 bit floating point
+ *    khronos_time_ns_t           unsigned 64 bit time in nanoseconds
+ *    khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ *                                         nanoseconds
+ *    khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ *    khronos_boolean_enum_t      enumerated boolean type. This should
+ *      only be used as a base type when a client API's boolean type is
+ *      an enum. Client APIs which use an integer or other type for
+ *      booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ *    KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ *    KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ *    KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ *    KHRONOS_APICALL
+ *    KHRONOS_APIENTRY
+ *    KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ *      KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
+ *                                  int arg1,
+ *                                  int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+ 
+#if (defined(_WIN32) || defined(__VC32__)) && !defined(__SCITECH_SNAP__)
+#   if defined (_DLL_EXPORTS)
+#       define KHRONOS_APICALL __declspec(dllexport)
+#   else
+#       define KHRONOS_APICALL __declspec(dllimport)
+#   endif
+#else
+#   define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIENTRY
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function  and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
+    /* Win32 but not WinCE */
+#   define KHRONOS_APIENTRY __stdcall
+#else
+#   define KHRONOS_APIENTRY
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using <stdint.h>
+ */
+#include <stdint.h>
+typedef int32_t                 khronos_int32_t;
+typedef uint32_t                khronos_uint32_t;
+typedef int64_t                 khronos_int64_t;
+typedef uint64_t                khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64   1
+#define KHRONOS_SUPPORT_FLOAT   1
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using <inttypes.h>
+ */
+#include <inttypes.h>
+typedef int32_t                 khronos_int32_t;
+typedef uint32_t                khronos_uint32_t;
+typedef int64_t                 khronos_int64_t;
+typedef uint64_t                khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64   1
+#define KHRONOS_SUPPORT_FLOAT   1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32                 khronos_int32_t;
+typedef unsigned __int32        khronos_uint32_t;
+typedef __int64                 khronos_int64_t;
+typedef unsigned __int64        khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64   1
+#define KHRONOS_SUPPORT_FLOAT   1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int                     khronos_int32_t;
+typedef unsigned int            khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int                khronos_int64_t;
+typedef unsigned long int       khronos_uint64_t;
+#else
+typedef long long int           khronos_int64_t;
+typedef unsigned long long int  khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64   1
+#define KHRONOS_SUPPORT_FLOAT   1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int                     khronos_int32_t;
+typedef unsigned int            khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64   0
+#define KHRONOS_SUPPORT_FLOAT   0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include <stdint.h>
+typedef int32_t                 khronos_int32_t;
+typedef uint32_t                khronos_uint32_t;
+typedef int64_t                 khronos_int64_t;
+typedef uint64_t                khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64   1
+#define KHRONOS_SUPPORT_FLOAT   1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed   char          khronos_int8_t;
+typedef unsigned char          khronos_uint8_t;
+typedef signed   short int     khronos_int16_t;
+typedef unsigned short int     khronos_uint16_t;
+typedef signed   long  int     khronos_intptr_t;
+typedef unsigned long  int     khronos_uintptr_t;
+typedef signed   long  int     khronos_ssize_t;
+typedef unsigned long  int     khronos_usize_t;
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef          float         khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time.  Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted).  The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years.  Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t       khronos_utime_nanoseconds_t;
+typedef khronos_int64_t        khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true.  Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+    KHRONOS_FALSE = 0,
+    KHRONOS_TRUE  = 1,
+    KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
diff --git a/third_party/PowerVR_SDK/Builds/Include/sdkver.h b/third_party/PowerVR_SDK/Builds/Include/sdkver.h
new file mode 100644
index 0000000..4d4d7a0
--- /dev/null
+++ b/third_party/PowerVR_SDK/Builds/Include/sdkver.h
@@ -0,0 +1,39 @@
+/*!***************************************************************************
+ @File			sdkver.h
+
+ @Title			Version numbers and strings.
+
+ @Date			08/11/2011
+
+ @Copyright		Copyright (c) Imagination Technologies Ltd. All Rights Reserved
+
+ @Platform		Independant
+
+ @Description	Version numbers and strings for SDK components.
+
+*****************************************************************************/
+
+#ifndef __SDKVER_H_
+#define __SDKVER_H_
+
+/*!***************************************************************************
+	Defines
+*****************************************************************************/
+
+#define PVRSDK_VERSION 			"3.2@2654748"
+#define PVRVERSION_MAJ			"3"
+#define PVRVERSION_MIN			"2"
+#define PVRVERSION_BRANCH		"32"
+#define PVRVERSION_BRANCH_DEC	"3.2"
+#define PVRVERSION_BRANCH_NAME	"REL/3.2"
+#define PVRVERSION_BUILD		"2654748"
+#define PVRVERSION_BUILD_HI		"265"
+#define PVRVERSION_BUILD_LO		"4748"
+
+#define PVRSDK_COPYRIGHT_TXT	"Copyright (c) Imagination Technologies Ltd. All Rights Reserved."
+
+#endif /* __SDKVER_H_ */
+
+/*****************************************************************************
+ End of file (sdkver.h)
+*****************************************************************************/
diff --git a/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/BasicTnL.png b/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/BasicTnL.png
new file mode 100644
index 0000000..307b1aa
--- /dev/null
+++ b/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/BasicTnL.png
Binary files differ
diff --git a/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/BasicTnL.txt b/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/BasicTnL.txt
new file mode 100644
index 0000000..467314c
--- /dev/null
+++ b/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/BasicTnL.txt
@@ -0,0 +1,20 @@
+:Title:
+BasicTnL
+
+:ShortDescription:
+This training course consists of a demonstration of basic transformation and lighting.
+
+:FullDescription:
+This training course consists of a demonstration of basic transformation and lighting, growing on the basic drawing techniques learnt in HelloTriangle.
+
+Controls:
+	-	Esc	-	Close the application
+
+:VGP:
+Not Required
+
+:PolyCount:
+1
+
+:VertexCount:
+3
diff --git a/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/OGLES/OGLESBasicTnL.cpp b/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/OGLES/OGLESBasicTnL.cpp
new file mode 100644
index 0000000..26ffd98
--- /dev/null
+++ b/third_party/PowerVR_SDK/Examples/Beginner/04_BasicTnL/OGLES/OGLESBasicTnL.cpp
@@ -0,0 +1,265 @@
+/******************************************************************************
+
+ @File         OGLESBasicTnL.cpp
+
+ @Title        Shows basic transformations and lighting
+
+ @Version      
+
+ @Copyright    Copyright (c) Imagination Technologies Limited.
+
+ @Platform     Independant
+
+ @Description  Shows basic transformations and lighting
+
+******************************************************************************/
+#include "PVRShell.h"
+#include <math.h>
+
+#if defined(__APPLE__) && defined (TARGET_OS_IPHONE)
+#import <OpenGLES/ES1/gl.h>
+#import <OpenGLES/ES1/glext.h>
+#else
+#include <GLES/gl.h>
+#endif
+
+/******************************************************************************
+ Defines
+******************************************************************************/
+// Size of the texture we create
+const int g_i32TexSize = 128;
+
+/*!****************************************************************************
+ Class implementing the PVRShell functions.
+******************************************************************************/
+class OGLESBasicTnL : public PVRShell
+{
+	// Texture handle
+	GLuint	m_ui32Texture;
+
+	// Angle to rotate the triangle
+	float	m_fAngle;
+
+	// Vertex Buffer Object (VBO) handle
+	GLuint	m_ui32Vbo;
+
+public:
+	virtual bool InitApplication();
+	virtual bool InitView();
+	virtual bool ReleaseView();
+	virtual bool QuitApplication();
+	virtual bool RenderScene();
+};
+
+
+/*!****************************************************************************
+ @Function		InitApplication
+ @Return		bool		true if no error occured
+ @Description	Code in InitApplication() will be called by PVRShell once per
+				run, before the rendering context is created.
+				Used to initialize variables that are not dependant on it
+				(e.g. external modules, loading meshes, etc.)
+				If the rendering context is lost, InitApplication() will
+				not be called again.
+******************************************************************************/
+bool OGLESBasicTnL::InitApplication()
+{
+	m_fAngle = 0;
+	return true;
+}
+
+/*!****************************************************************************
+ @Function		QuitApplication
+ @Return		bool		true if no error occured
+ @Description	Code in QuitApplication() will be called by PVRShell once per
+				run, just before exiting the program.
+				If the rendering context is lost, QuitApplication() will
+				not be called.
+******************************************************************************/
+bool OGLESBasicTnL::QuitApplication()
+{
+    return true;
+}
+
+/*!****************************************************************************
+ @Function		InitView
+ @Return		bool		true if no error occured
+ @Description	Code in InitView() will be called by PVRShell upon
+				initialization or after a change in the rendering context.
+				Used to initialize variables that are dependant on the rendering
+				context (e.g. textures, vertex buffers, etc.)
+******************************************************************************/
+bool OGLESBasicTnL::InitView()
+{
+	// Sets the clear color
+	glClearColor(0.6f, 0.8f, 1.0f, 1.0f);
+
+	// Enables texturing
+	glEnable(GL_TEXTURE_2D);
+
+	/*
+		Creates the texture.
+		Please refer to the training course "Texturing" for a detailed explanation.
+	*/
+	glGenTextures(1, &m_ui32Texture);
+	glBindTexture(GL_TEXTURE_2D, m_ui32Texture);
+	GLuint* pTexData = new GLuint[g_i32TexSize*g_i32TexSize];
+
+	for(int i = 0; i < g_i32TexSize; ++i)
+	{
+		for(int j = 0; j < g_i32TexSize; ++j)
+		{
+			GLuint col = (255<<24) + ((255-j*2)<<16) + ((255-i)<<8) + (255-i*2);
+
+			if ( ((i*j)/8) % 2 )
+				col = 0xffff00ff;
+
+			pTexData[j*g_i32TexSize+i] = col;
+		}
+	}
+
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, g_i32TexSize, g_i32TexSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData);
+	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+	delete[] pTexData;
+
+	// Enables lighting and light 0
+	glEnable(GL_LIGHTING);
+	glEnable(GL_LIGHT0);
+
+	/*
+		Specifies the light direction.
+		If the 4th component is 0, it's a parallel light (the case here).
+		If the 4th component is not 0, it's a point light.
+	*/
+	float aLightPosition[] = {0.0f,0.0f,1.0f,0.0f};
+
+	/*
+		Assigns the light direction to the light number 0.
+		This function allows you to set also the ambiant, diffuse,
+		specular, emission colors of the light as well as attenuation parameters.
+		We keep the other parameters to their default value in this demo.
+	*/
+	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, aLightPosition);
+
+	// Create VBO for the triangle from our data
+
+	// Interleaved vertex data
+	float afVertices[] = { -0.4f,-0.4f,0.0f, // Position
+							0.0f,0.0f,			  // UV
+							0,0,1,			  // Normal
+							0.4f,-0.4f,0.0f,
+							1.0f,0.0f,
+							0,0,1,
+							0.0f,0.4f,0.0f,
+							0.5f,1.0f,
+							0,0,1};
+
+	glGenBuffers(1, &m_ui32Vbo);
+
+	unsigned int uiSize = 3 * (sizeof(float) * 8); // 3 vertices * stride (8 verttypes per vertex)
+
+	// Bind the VBO
+	glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo);
+
+	// Set the buffer's data
+	glBufferData(GL_ARRAY_BUFFER, uiSize, afVertices, GL_STATIC_DRAW);
+
+	// Unbind the VBO
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+	return true;
+}
+
+/*!****************************************************************************
+ @Function		ReleaseView
+ @Return		bool		true if no error occured
+ @Description	Code in ReleaseView() will be called by PVRShell when the
+				application quits or before a change in the rendering context.
+******************************************************************************/
+bool OGLESBasicTnL::ReleaseView()
+{
+	// Frees the texture
+	glDeleteTextures(1, &m_ui32Texture);
+
+	return true;
+}
+
+/*!****************************************************************************
+ @Function		RenderScene
+ @Return		bool		true if no error occured
+ @Description	Main rendering loop function of the program. The shell will
+				call this function every frame.
+				eglSwapBuffers() will be performed by PVRShell automatically.
+				PVRShell will also manage important OS events.
+				Will also manage relevent OS events. The user has access to
+				these events through an abstraction layer provided by PVRShell.
+******************************************************************************/
+bool OGLESBasicTnL::RenderScene()
+{
+	// Clears the color and depth buffer
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+	// Model view matrix
+	float aModelView[] =
+	{
+		(float)cos(m_fAngle), 0, (float)sin(m_fAngle), 0,
+		0, 1, 0, 0,
+		-(float)sin(m_fAngle), 0, (float)cos(m_fAngle),	0,
+		0, 0, 0, 1
+	};
+
+	// Sets the matrix mode to modify the Model View matrix
+	glMatrixMode(GL_MODELVIEW);
+
+	// Loads our matrix into OpenGL Model View matrix
+	glLoadMatrixf(aModelView);
+
+	// Increments the angle of the view
+	m_fAngle += .02f;
+
+	/*
+		Draw a triangle.
+		Please refer to the training course IntroducingPVRShell for a detailed explanation.
+	*/
+
+	// bind the VBO for the triangle
+	glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glVertexPointer(3,GL_FLOAT,sizeof(float) * 8, 0);
+
+	// Pass the texture coordinates data
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glTexCoordPointer(2,GL_FLOAT,sizeof(float) * 8, (unsigned char*) (sizeof(float) * 3));
+
+	// Pass the normals data
+	glEnableClientState(GL_NORMAL_ARRAY);
+	glNormalPointer(GL_FLOAT,sizeof(float) * 8, (unsigned char*) (sizeof(float) * 5));
+
+	// Draws a non-indexed triangle array
+	glDrawArrays(GL_TRIANGLES, 0, 3);
+
+	// unbind the vertex buffer as we don't need it bound anymore
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+	return true;
+}
+
+/*!****************************************************************************
+ @Function		NewDemo
+ @Return		PVRShell*		The demo supplied by the user
+ @Description	This function must be implemented by the user of the shell.
+				The user should return its PVRShell object defining the
+				behaviour of the application.
+******************************************************************************/
+PVRShell* NewDemo()
+{
+	return new OGLESBasicTnL();
+}
+
+/******************************************************************************
+ End of file (OGLESBasicTnL.cpp)
+******************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/License.txt b/third_party/PowerVR_SDK/License.txt
new file mode 100644
index 0000000..1689541
--- /dev/null
+++ b/third_party/PowerVR_SDK/License.txt
@@ -0,0 +1,56 @@
+SDK END USER LICENSE AGREEMENT
+
+PLEASE READ THIS AGREEMENT CAREFULLY.  BY USING ANY PORTION OF THE SDK YOU WILL BE LEGALLY BOUND TO THESE TERMS.  
+Imagination Technologies Limited ("Imagination") provides this Software Development Kit subject to the terms of this Agreement.  If you do not agree with any of these terms, then do not install or otherwise use the SDK.
+
+1.	Definitions
+"SDK" means all or any component of software in source or binary form, tools, code examples, drivers, files, libraries, utilities, reference manuals, documentation, or other materials, and including any related updates or upgrades made available by Imagination under this Agreement from time to time. 
+
+2.	Licence Grant
+Subject to your compliance with the terms of this Agreement, Imagination grants to you a non-exclusive, non-assignable licence to:
+(a)	use the SDK for the sole purpose of developing, profiling, or assisting in the optimisation of internal, commercial, or non-commercial applications ("Development License");
+(b)	distribute the SDK in source code, object file, or compiled binary form as a component of your  application, provided that:
+	i.	you do not distribute the SDK on a stand alone basis;
+	ii.	you distribute such components under terms no less restrictive than those in this Agreement; 
+	iii.	you comply with the attribution requirements set out in Appendix 1;
+	iv.	you are solely responsible for any update, support obligation or other liability that may arise from such distribution;
+	v.	you do not make any statements that your application or its performance are certified, guaranteed or otherwise endorsed by Imagination ("Production License")
+(c)	Use the SDK as expressly authorised by Imagination in writing, on the payment and/or support terms set out in Appendix 2 (if applicable) ("Custom License").  
+
+3.	Restrictions 
+Other than as expressly permitted herein, you may not: (i) use the SDK for any unauthorised purpose; (ii) modify, disassemble, decompile, reverse engineer, revise or enhance the SDK, create derivative works or attempt to discover the source code for any element of the SDK not already provided in source code form; (iii) remove any proprietary or copyright notices on or accompanying the SDK; or (iv) incorporate or combine the SDK, with any open source software in such a way that would cause the SDK, or any portion thereof, to be subject to all or part of the licence obligations or other intellectual property related terms with respect to such open source software.  
+
+4.	Ownership
+Imagination retains all ownership of the SDK, including without limitation all copyrights and other intellectual property rights therein.
+
+5.	Warranty Disclaimer
+THE SDK IS PROVIDED "AS IS". Imagination HEREBY DISCLAIMS ALL EXPRESS OR IMPLIED WARRANTIES AND CONDITIONS WITH REGARD TO THE SDK, INCLUDING ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. 
+
+6.	Limitation of Liability
+IN NO EVENT WILL Imagination BE LIABLE TO YOU FOR ANY DAMAGES, CLAIMS OR COSTS WHATSOEVER ARISING FROM THIS AGREEMENT AND/OR YOUR USE OF THE SDK OR ANY COMPONENT THEREOF, INCLUDING WITHOUT LIMITATION ANY CONSEQUENTIAL, INDIRECT, INCIDENTAL DAMAGES, OR ANY LOST PROFITS OR LOST SAVINGS, EVEN IF Imagination HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS OR FOR ANY CLAIM BY ANY THIRD PARTY. THE FOREGOING LIMITATIONS AND EXCLUSIONS APPLY TO THE EXTENT PERMITTED BY APPLICABLE LAW IN YOUR JURISDICTION. 
+
+7.	Third Party Materials
+All third party materials found on this SDK, including without limitation, artwork, graphics, game demos and patches, are the sole and exclusive property of such third parties. Imagination makes no representations or warranties about the accuracy, usability or validity of any third party materials, and disclaims all liabilities in connection with such third party materials.
+
+8.	Term
+This Agreement is effective until terminated.  Imagination has the right to terminate this Agreement immediately if you fail to comply with any term of this Agreement.  You may terminate this Agreement by destroying or returning to Imagination all copies of the SDK in your possession.
+
+9.	Governing Law 
+This Agreement is governed by and shall be construed in accordance with English law and each party agrees to submit to the exclusive jurisdiction of the courts of England. 
+
+
+APPENDIX 1: ATTRIBUTION REQUIREMENTS 
+
+If source code is released as it is, the Copyright notice should be kept in a visible position.
+If object code is bundled with a product, all branding should be kept as it was originally, and the following acknowledgement should be displayed clearly in any associated documentation or other collateral in printed or electronic form distributed with the product incorporating the SDK component: "This product includes components of the PowerVR SDK from Imagination Technologies Limited"
+If source code is used to compile a product,  the following acknowledgement should be displayed clearly in any associated documentation or other collateral in printed or electronic form distributed with the product incorporating the SDK component: "This product includes components of the PowerVR SDK from Imagination Technologies Limited" 
+
+
+APPENDIX 2: FEES
+
+LICENCE FEES: 
+nil
+ROYALTY FEES: 
+nil
+SUPPORT AND MAINTENANCE TERMS AND FEES: 
+nil
\ No newline at end of file
diff --git a/third_party/PowerVR_SDK/Shell/API/KEGL/PVRShellAPI.cpp b/third_party/PowerVR_SDK/Shell/API/KEGL/PVRShellAPI.cpp
new file mode 100644
index 0000000..6a0878e
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/API/KEGL/PVRShellAPI.cpp
@@ -0,0 +1,1009 @@
+/******************************************************************************
+
+ @File         KEGL/PVRShellAPI.cpp
+
+ @Title        KEGL/PVRShellAPI
+
+ @Version      
+
+ @Copyright    Copyright (c) Imagination Technologies Limited.
+
+ @Platform     Independent
+
+ @Description  Makes programming for 3D APIs easier by wrapping surface
+               initialization, Texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "PVRShell.h"
+#include "PVRShellAPI.h"
+#include "PVRShellOS.h"
+#include "PVRShellImpl.h"
+
+// No Doxygen for CPP files, due to documentation duplication
+/// @cond NO_DOXYGEN
+
+#ifndef EGL_CONTEXT_LOST_IMG
+/*! Extended error code EGL_CONTEXT_LOST_IMG generated when power management event has occurred. */
+#define EGL_CONTEXT_LOST_IMG		0x300E
+#endif
+
+#ifndef EGL_CONTEXT_PRIORITY_LEVEL_IMG
+/*! An extensions added to the list of attributes for the context to give it a priority hint */
+#define EGL_CONTEXT_PRIORITY_LEVEL_IMG		0x3100
+/*! Request the context is created with high priority */
+#define EGL_CONTEXT_PRIORITY_HIGH_IMG		0x3101
+/*! Request the context is created with medium priority */
+#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG		0x3102
+/*! Request the context is created with low priority */
+#define EGL_CONTEXT_PRIORITY_LOW_IMG		0x3103
+#endif
+
+/*****************************************************************************
+	Declarations
+*****************************************************************************/
+static bool PVRShellIsExtensionSupported(EGLDisplay dpy, const char *extension);
+
+#if defined GL_ES_VERSION_2_0 && !defined EGL_VERSION_1_3
+#error OpenGL ES 2 requires egl.h version 1.3 or higher
+#endif
+
+/****************************************************************************
+** Class: PVRShellInitAPI
+****************************************************************************/
+
+/*****************************************************************************
+* Function Name  : ActivatePreferences
+* Description    : Activates the user set preferences (like v-sync)
+*****************************************************************************/
+void PVRShellInit::ApiActivatePreferences()
+{
+
+#ifdef EGL_VERSION_1_1
+	eglSwapInterval(m_EGLDisplay, m_pShell->m_pShellData->nSwapInterval);
+#endif
+}
+
+/*****************************************************************************
+* Function Name  : ApiInitAPI
+* Returns        : true for success
+* Description    : Initialise the 3D API
+*****************************************************************************/
+bool PVRShellInit::ApiInitAPI()
+{
+	int					bDone;
+
+	m_NDT = (EGLNativeDisplayType)OsGetNativeDisplayType();
+	m_NPT = (EGLNativePixmapType) OsGetNativePixmapType();
+	m_NWT = (EGLNativeWindowType) OsGetNativeWindowType();
+
+	m_EGLContext = 0;
+
+	do
+	{
+		bDone = true;
+
+		m_EGLDisplay = eglGetDisplay(m_NDT);
+
+		if(m_EGLDisplay == EGL_NO_DISPLAY)
+		{
+#if defined(BUILD_OGLES2) || defined(BUILD_OGLES3)
+			m_EGLDisplay = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);
+#else
+			m_EGLDisplay = eglGetDisplay((NativeDisplayType)EGL_DEFAULT_DISPLAY);
+#endif
+		}
+
+		if(!eglInitialize(m_EGLDisplay, &m_MajorVersion, &m_MinorVersion))
+		{
+			m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to initialise EGL\n");
+			m_pShell->PVRShellOutputDebug("PVRShell: EGL Error (%s)\n", StringFrom_eglGetError());
+			return false;
+		}
+
+		m_pShell->PVRShellOutputDebug("PVRShell: EGL %d.%d initialized\n", m_MajorVersion, m_MinorVersion);
+
+		// Check Extension availability after EGL initialization
+		if (m_MajorVersion > 1 || (m_MajorVersion == 1 && m_MinorVersion >= 1))
+		{
+			m_bPowerManagementSupported = true;
+		}
+		else
+		{
+			m_bPowerManagementSupported = PVRShellIsExtensionSupported(m_EGLDisplay,"EGL_IMG_power_management");
+		}
+
+		do
+		{
+#if defined(BUILD_OGL)
+			if(!eglBindAPI(EGL_OPENGL_API))
+			{
+				m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to bind OpenGL API\n");
+				return false;
+			}
+#else
+#if defined EGL_VERSION_1_3 && defined GL_ES_VERSION_2_0
+			if(!eglBindAPI(EGL_OPENGL_ES_API))
+			{
+				m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to bind OpenGL ES API\n");
+				return false;
+			}
+#endif
+#endif
+			// Find an EGL config
+			m_EGLConfig = SelectEGLConfiguration(m_pShell->m_pShellData);
+			eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_CONFIG_ID, &m_iConfig);
+
+			// Destroy the context if we already created one
+			if (m_EGLContext)
+			{
+				eglDestroyContext(m_EGLDisplay, m_EGLContext);
+			}
+
+			// Attempt to create a context
+			EGLint ai32ContextAttribs[48];
+			int	i = 0;
+
+#if defined(BUILD_OGLES3)
+			ai32ContextAttribs[i++] = EGL_CONTEXT_CLIENT_VERSION;
+			ai32ContextAttribs[i++] = 3;
+#else
+#if defined(EGL_VERSION_1_3) && defined(GL_ES_VERSION_2_0)
+			ai32ContextAttribs[i++] = EGL_CONTEXT_CLIENT_VERSION;
+			ai32ContextAttribs[i++] = 2;
+#endif
+#endif
+
+#if defined(BUILD_OGL)
+			//Attempt to create an OpenGL 3.2 context.
+			if (PVRShellIsExtensionSupported(m_EGLDisplay, "EGL_KHR_create_context"))
+			{
+				ai32ContextAttribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR;
+				ai32ContextAttribs[i++] = 3;
+				ai32ContextAttribs[i++] = EGL_CONTEXT_MINOR_VERSION_KHR;
+				ai32ContextAttribs[i++] = 2;
+				ai32ContextAttribs[i++] = EGL_CONTEXT_FLAGS_KHR;
+				ai32ContextAttribs[i++] = EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
+				ai32ContextAttribs[i++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR;
+				ai32ContextAttribs[i++] = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
+			}
+#endif
+
+#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3)
+			if(PVRShellIsExtensionSupported(m_EGLDisplay,"EGL_IMG_context_priority"))
+			{
+				ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_LEVEL_IMG;
+				switch(m_pShell->PVRShellGet(prefPriority))
+				{
+					case 0: ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_LOW_IMG; break;
+					case 1: ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_MEDIUM_IMG; break;
+					default:ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_HIGH_IMG; break;
+				}
+			}
+#endif
+			ai32ContextAttribs[i] = EGL_NONE;
+
+			if (m_EGLContext == EGL_NO_CONTEXT)
+			{
+				m_EGLContext = eglCreateContext(m_EGLDisplay, m_EGLConfig, NULL, ai32ContextAttribs);
+			}
+
+			if(m_EGLContext == EGL_NO_CONTEXT)
+			{
+				if(m_iRequestedConfig > 0)
+				{
+					// We failed to create a context
+					m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to create a context\n");
+					return false;
+				}
+				else if(m_pShell->m_pShellData->bNeedPbuffer)
+				{
+					// Disable P-buffer and try again
+					m_pShell->m_pShellData->bNeedPbuffer = false;
+				}
+				else if(m_pShell->m_pShellData->bNeedStencilBuffer)
+				{
+                    // Disable Stencil Buffer and try again
+					m_pShell->m_pShellData->bNeedStencilBuffer = false;
+				}
+				else if(m_pShell->m_pShellData->nAASamples > 0)
+				{
+					// Still failing, reduce the AA samples and try again
+					--m_pShell->m_pShellData->nAASamples;
+				}
+				else
+				{
+					m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to create a context\n");
+					return false;
+				}
+			}
+		} while(m_EGLContext == EGL_NO_CONTEXT);
+
+#if defined(__QNXNTO__)
+		int format = SCREEN_FORMAT_RGBX8888;
+	    if(screen_set_window_property_iv((_screen_window*) m_NWT, SCREEN_PROPERTY_FORMAT, &format))
+	    {
+	    	m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to set window property SCREEN_PROPERTY_FORMAT\n");
+	    	return false;
+	    }
+
+#if defined(BUILD_OGLES2)
+	    int usage = SCREEN_USAGE_OPENGL_ES2;
+#else
+#if defined(BUILD_OGLES)
+	    int usage = SCREEN_USAGE_OPENGL_ES1;
+#endif
+#endif
+	    if(screen_set_window_property_iv((_screen_window*) m_NWT, SCREEN_PROPERTY_USAGE, &usage))
+	    {
+	    	m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to set window property SCREEN_PROPERTY_USAGE\n");
+	    	return false;
+	    }
+
+	    if(screen_create_window_buffers((_screen_window*) m_NWT, 2))
+	    {
+	    	m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to create window buffers\n");
+	    	return false;
+	    }
+#endif
+		EGLint		attrib_list[16];
+		int	i = 0;
+#if defined(EGL_VERSION_1_2)
+		if(m_pShell->m_pShellData->bNeedAlphaFormatPre) // The default is EGL_ALPHA_FORMAT_NONPRE
+		{
+			attrib_list[i++] = EGL_ALPHA_FORMAT;
+			attrib_list[i++] = EGL_ALPHA_FORMAT_PRE;
+		}
+#endif
+		// Terminate the attribute list with EGL_NONE
+		attrib_list[i] = EGL_NONE;
+
+		if(m_pShell->m_pShellData->bNeedPixmap)
+		{
+			m_pShell->PVRShellOutputDebug("InitAPI() Using pixmaps, about to create egl surface\n");
+			m_EGLWindow = eglCreatePixmapSurface(m_EGLDisplay, m_EGLConfig, m_NPT, attrib_list);
+		}
+		else
+		{
+#if defined(ANDROID)
+			EGLint visualID;
+		    eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_NATIVE_VISUAL_ID, &visualID);
+
+		    // Change the format of our window to match our config
+    		ANativeWindow_setBuffersGeometry(m_NWT, 0, 0, visualID);
+#endif
+			m_EGLWindow = eglCreateWindowSurface(m_EGLDisplay, m_EGLConfig, m_NWT, attrib_list);
+
+            // If we have failed to create a surface then try using Null
+			if(m_EGLWindow == EGL_NO_SURFACE)
+			{
+				m_EGLWindow = eglCreateWindowSurface(m_EGLDisplay, m_EGLConfig, NULL, attrib_list);
+			}
+		}
+
+		if (m_EGLWindow == EGL_NO_SURFACE)
+		{
+			m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to create surface\n");
+			return false;
+		}
+
+		if (!eglMakeCurrent(m_EGLDisplay, m_EGLWindow, m_EGLWindow, m_EGLContext))
+		{
+#ifdef EGL_VERSION_1_3
+			if((eglGetError() == EGL_CONTEXT_LOST))
+#else
+			if((eglGetError() == EGL_CONTEXT_LOST_IMG) && m_bPowerManagementSupported)
+#endif
+			{
+				bDone = false;
+			}
+			else
+			{
+				m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to make context current\n");
+				return false;
+			}
+		}
+	} while(!bDone);
+
+	/*
+	 	Get correct screen width and height and
+		save them into
+		m_pShell->m_pShellData->nShellDimX and
+		m_pShell->m_pShellData->nShellDimY
+	*/
+	eglQuerySurface(m_EGLDisplay, m_EGLWindow,
+			EGL_WIDTH,  (EGLint*)&m_pShell->m_pShellData->nShellDimX
+		);
+	eglQuerySurface(m_EGLDisplay, m_EGLWindow,
+			EGL_HEIGHT, (EGLint*)&m_pShell->m_pShellData->nShellDimY
+		);
+
+#if defined(ANDROID)
+	glViewport(0, 0, m_pShell->m_pShellData->nShellDimX, m_pShell->m_pShellData->nShellDimY);
+#endif
+	/*
+		Done - activate requested features
+	*/
+
+#if defined(BUILD_OGLES) || defined(BUILD_OGLES2)
+	//Get the discardframebufferEXT function.
+	{
+		//Get the gl extension string
+		const char* strExtensions = (const char*)glGetString(GL_EXTENSIONS);
+
+		//Get the length of the string we're searching for
+		const size_t strLength = strlen("GL_EXT_discard_framebuffer");
+
+		//Get the string position
+		const char* position = strstr(strExtensions,"GL_EXT_discard_framebuffer");
+
+		//Loop through until we find the actual extension, avoiding substrings.
+		while (position!=NULL && position[strLength]!='\0' && position[strLength]!=' ')
+		{
+			position = strstr(position+strLength,"GL_EXT_discard_framebuffer");
+		}
+
+		//Initialise the extension if it's found.
+		if (position != NULL)
+		{
+			glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)eglGetProcAddress("glDiscardFramebufferEXT");
+		}
+		else
+		{
+			glDiscardFramebufferEXT = NULL;
+		}
+	}
+#endif
+	ApiActivatePreferences();
+	return true;
+}
+
+/*!***********************************************************************
+@Function		OutputAPIInfo
+@description	When prefOutputInfo is set to true this function outputs
+				various pieces of API dependent information via
+				PVRShellOutputDebug.
+*************************************************************************/
+void PVRShellInit::OutputAPIInfo()
+{
+	// Output API dependent information
+	if(m_pShell->PVRShellGet(prefOutputInfo))
+	{
+		EGLint i32Values[5];
+
+		m_pShell->PVRShellOutputDebug("\n");
+
+		m_pShell->PVRShellOutputDebug("GL:\n");
+		m_pShell->PVRShellOutputDebug("  Vendor:   %s\n", (char*) glGetString(GL_VENDOR));
+		m_pShell->PVRShellOutputDebug("  Renderer: %s\n", (char*) glGetString(GL_RENDERER));
+		m_pShell->PVRShellOutputDebug("  Version:  %s\n", (char*) glGetString(GL_VERSION));
+		m_pShell->PVRShellOutputDebug("  Extensions:  ");
+
+#if defined(BUILD_OGL)
+		//Get the glGetString process.
+		typedef const GLubyte* (KHRONOS_APIENTRY * PFNGLGETSTRINGIPROC)(GLenum name, GLuint index);
+		PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC)eglGetProcAddress("glGetStringi");
+
+		//If we've successfully got the new way to query the string, then go ahead and use this.
+		if (glGetStringi)
+		{
+#ifndef GL_NUM_EXTENSIONS
+#define GL_NUM_EXTENSIONS                 0x821D
+#endif
+			GLint numExtensions;
+			glGetIntegerv(GL_NUM_EXTENSIONS,&numExtensions);
+
+			for (GLint i=0; i<numExtensions; ++i)
+			{
+				m_pShell->PVRShellOutputDebug((const char*)glGetStringi(GL_EXTENSIONS,i));
+				m_pShell->PVRShellOutputDebug(" ");
+			}
+		}
+#else
+		m_pShell->PVRShellOutputDebug("%s\n", (char*) glGetString(GL_EXTENSIONS));
+#endif
+
+		m_pShell->PVRShellOutputDebug("\n");
+
+		m_pShell->PVRShellOutputDebug("\n");
+		m_pShell->PVRShellOutputDebug("EGL:\n");
+		m_pShell->PVRShellOutputDebug("  Vendor:   %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_VENDOR));
+		m_pShell->PVRShellOutputDebug("  Version:  %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_VERSION));
+		m_pShell->PVRShellOutputDebug("  Extensions:  %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_EXTENSIONS));
+
+		if(eglQueryContext(m_EGLDisplay, m_EGLContext, EGL_CONTEXT_PRIORITY_LEVEL_IMG, &i32Values[0]))
+		{
+			switch(i32Values[0])
+			{
+				case EGL_CONTEXT_PRIORITY_HIGH_IMG:   m_pShell->PVRShellOutputDebug("  Context priority: High\n");  break;
+				case EGL_CONTEXT_PRIORITY_MEDIUM_IMG: m_pShell->PVRShellOutputDebug("  Context priority: Medium\n");break;
+				case EGL_CONTEXT_PRIORITY_LOW_IMG:    m_pShell->PVRShellOutputDebug("  Context priority: Low\n");   break;
+				default: m_pShell->PVRShellOutputDebug("  Context priority: Unrecognised.\n"); break;
+			}
+		}
+		else
+		{
+			eglGetError(); // Clear error
+			m_pShell->PVRShellOutputDebug("  Context priority: Unsupported\n");
+		}
+
+#ifdef EGL_VERSION_1_2
+		m_pShell->PVRShellOutputDebug("  Client APIs:  %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_CLIENT_APIS));
+#endif
+
+		m_pShell->PVRShellOutputDebug("\n");
+		m_pShell->PVRShellOutputDebug("Window Width:  %i\n" , m_pShell->PVRShellGet(prefWidth));
+		m_pShell->PVRShellOutputDebug("Window Height: %i\n" , m_pShell->PVRShellGet(prefHeight));
+		m_pShell->PVRShellOutputDebug("Is Rotated: %s\n", m_pShell->PVRShellGet(prefIsRotated) ? "Yes" : "No");
+		m_pShell->PVRShellOutputDebug("\n");
+
+		// EGLSurface details
+		m_pShell->PVRShellOutputDebug("EGL Surface:\n");
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_CONFIG_ID , &i32Values[0]);
+		m_pShell->PVRShellOutputDebug("  Config ID:      %i\n", i32Values[0]);
+
+		// Colour buffer
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_BUFFER_SIZE , &i32Values[0]);
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_RED_SIZE    , &i32Values[1]);
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_GREEN_SIZE  , &i32Values[2]);
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_BLUE_SIZE   , &i32Values[3]);
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_ALPHA_SIZE  , &i32Values[4]);
+		m_pShell->PVRShellOutputDebug("  Colour Buffer:  %i bits (R%i G%i B%i A%i)\n", i32Values[0],i32Values[1],i32Values[2],i32Values[3],i32Values[4]);
+
+		// Depth buffer
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_DEPTH_SIZE , &i32Values[0]);
+		m_pShell->PVRShellOutputDebug("  Depth Buffer:   %i bits\n", i32Values[0]);
+
+		// Stencil Buffer
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_STENCIL_SIZE , &i32Values[0]);
+		m_pShell->PVRShellOutputDebug("  Stencil Buffer: %i bits\n", i32Values[0]);
+
+		// EGL surface bits support
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_SURFACE_TYPE , &i32Values[0]);
+		m_pShell->PVRShellOutputDebug("  Surface type:   %s%s%s\n",	i32Values[0] & EGL_WINDOW_BIT  ? "WINDOW " : "",
+																		i32Values[1] & EGL_PBUFFER_BIT ? "PBUFFER " : "",
+																		i32Values[2] & EGL_PIXMAP_BIT  ? "PIXMAP " : "");
+		// EGL renderable type
+#ifdef EGL_VERSION_1_2
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_RENDERABLE_TYPE , &i32Values[0]);
+		m_pShell->PVRShellOutputDebug("  Renderable type: %s%s%s%s\n", i32Values[0] & EGL_OPENVG_BIT ? "OPENVG " : "",
+															i32Values[0] & EGL_OPENGL_ES_BIT ? "OPENGL_ES " : "",
+#ifdef EGL_OPENGL_BIT
+															i32Values[0] & EGL_OPENGL_BIT ? "OPENGL " :
+#endif
+															"",
+															i32Values[0] & EGL_OPENGL_ES2_BIT ? "OPENGL_ES2 " : "");
+#endif
+
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_SAMPLE_BUFFERS , &i32Values[0]);
+		eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_SAMPLES , &i32Values[1]);
+		m_pShell->PVRShellOutputDebug("  Sample buffer No.: %i\n", i32Values[0]);
+		m_pShell->PVRShellOutputDebug("  Samples per pixel: %i\n", i32Values[1]);
+	}
+}
+
+/*!***********************************************************************
+ @Function		ApiReleaseAPI
+ @description	Releases all resources allocated by the API.
+*************************************************************************/
+void PVRShellInit::ApiReleaseAPI()
+{
+	eglSwapBuffers(m_EGLDisplay, m_EGLWindow);
+	eglMakeCurrent(m_EGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ 	eglDestroyContext(m_EGLDisplay, m_EGLContext);
+	eglDestroySurface(m_EGLDisplay, m_EGLWindow);
+   	eglTerminate(m_EGLDisplay);
+}
+
+/*******************************************************************************
+ * Function Name  : SelectEGLConfiguration
+ * Inputs		  : pData
+ * Returns        : EGLConfig
+ * Description    : Find the config to use for EGL initialisation
+ *******************************************************************************/
+EGLConfig PVRShellInitAPI::SelectEGLConfiguration(const PVRShellData * const pData)
+{
+    EGLint		num_config;
+    EGLint		conflist[32];
+	EGLConfig	conf = (EGLConfig) 0;
+    int			i = 0;
+
+	// Specific config ID requested?
+	if (m_iRequestedConfig > 0)
+	{
+		conflist[i++] = EGL_CONFIG_ID;
+		conflist[i++] = m_iRequestedConfig;
+		conflist[i++] = EGL_NONE;
+		if(!eglChooseConfig(m_EGLDisplay, conflist, &conf, 1, &num_config) || num_config != 1)
+		{
+			return 0;
+		}
+		return conf;
+	}
+
+	// Select default configuration
+#if defined(ANDROID)
+	if(pData->nColorBPP == 32)
+	{
+		conflist[i++] = EGL_RED_SIZE;
+		conflist[i++] = 8;
+		conflist[i++] = EGL_GREEN_SIZE;
+		conflist[i++] = 8;
+		conflist[i++] = EGL_BLUE_SIZE;
+		conflist[i++] = 8;
+		conflist[i++] = EGL_ALPHA_SIZE;
+		conflist[i++] = 8;
+	}
+	else
+	{
+		conflist[i++] = EGL_RED_SIZE;
+		conflist[i++] = 5;
+		conflist[i++] = EGL_GREEN_SIZE;
+		conflist[i++] = 6;
+		conflist[i++] = EGL_BLUE_SIZE;
+		conflist[i++] = 5;
+		conflist[i++] = EGL_ALPHA_SIZE;
+		conflist[i++] = 0;
+	}
+#else
+	conflist[i++] = EGL_BUFFER_SIZE;
+	conflist[i++] = pData->nColorBPP;
+#endif
+
+	if(pData->bNeedZbuffer || pData->nDepthBPP > 0)
+	{
+		conflist[i++] = EGL_DEPTH_SIZE;
+		conflist[i++] = (pData->nDepthBPP > 0) ? pData->nDepthBPP : 16;
+	}
+
+	if(pData->bNeedStencilBuffer)
+	{
+		conflist[i++] = EGL_STENCIL_SIZE;
+		conflist[i++] = 8;
+	}
+
+	conflist[i++] = EGL_SURFACE_TYPE;
+	conflist[i] = EGL_WINDOW_BIT;
+
+	if(pData->bNeedPbuffer)
+	{
+		conflist[i] |= EGL_PBUFFER_BIT;
+	}
+
+	if(pData->bNeedPixmap)
+	{
+		conflist[i] |= EGL_PIXMAP_BIT;
+	}
+
+	++i;
+
+#if defined(BUILD_OGL)
+	conflist[i++] = EGL_RENDERABLE_TYPE;
+	conflist[i++] = EGL_OPENGL_BIT;
+#elif defined(EGL_VERSION_1_3) && defined(GL_ES_VERSION_2_0)
+	conflist[i++] = EGL_RENDERABLE_TYPE;
+	conflist[i++] = EGL_OPENGL_ES2_BIT;
+#endif
+
+	// Append number of number of samples depending on AA samples value set
+	if(pData->nAASamples > 0)
+	{
+		conflist[i++] = EGL_SAMPLE_BUFFERS;
+		conflist[i++] = 1;
+		conflist[i++] = EGL_SAMPLES;
+		conflist[i++] = pData->nAASamples;
+	}
+	else
+	{
+		conflist[i++] = EGL_SAMPLE_BUFFERS;
+		conflist[i++] = 0;
+	}
+
+#if defined(EWS) || defined(__QNXNTO__)
+	if(m_NWT != NULL)
+	{
+		EGLint r,g,b,a, value;
+		EGLint i32Total_num_configs, j;
+		EGLConfig	*pConfigs;
+
+		// Some platforms require an egl config to have the same pixel format as the native window because
+		// pixel format conversion is prohibited.
+#if defined(EWS)
+		int format = EWS_PIXEL_FORMAT_RGB_565;
+		r = 5; g = 6; b = 5; a = 0;
+#else
+		r = g = b = a = 8;
+#endif
+
+		conflist[i++] = EGL_RED_SIZE;
+		conflist[i++] = r;
+
+		conflist[i++] = EGL_GREEN_SIZE;
+		conflist[i++] = g;
+
+		conflist[i++] = EGL_BLUE_SIZE;
+		conflist[i++] = b;
+
+		conflist[i++] = EGL_ALPHA_SIZE;
+		conflist[i++] = a;
+
+		// Terminate the list with EGL_NONE
+		conflist[i++] = EGL_NONE;
+
+		// Find out how many configs there are in total that match our criteria
+		if(!eglChooseConfig(m_EGLDisplay, conflist, NULL, 0, &i32Total_num_configs) || i32Total_num_configs == 0)
+			return 0;
+
+		// Allocate an array large enough to store all the possible configs that may be returned
+		pConfigs = new EGLConfig[i32Total_num_configs];
+
+		if(!pConfigs)
+			return 0;
+
+		// Get all the configs that match our criteria
+		if(!eglChooseConfig(m_EGLDisplay, conflist, pConfigs, i32Total_num_configs, &num_config))
+		{
+			delete[] pConfigs;
+			return 0;
+		}
+
+		// Go through the returned configs and try and find a suitable match
+		for(j = 0; j < num_config; ++j)
+		{
+#if defined(__QNXNTO__)
+			if((eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_RED_SIZE,   &value) && value == r)
+			&& (eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_GREEN_SIZE, &value) && value == g)
+			&& (eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_BLUE_SIZE,  &value) && value == b)
+			&& (eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_ALPHA_SIZE, &value) && value == a))
+			{
+				conf = pConfigs[j];
+				break;
+			}
+#else
+#if defined (EWS)
+			eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_NATIVE_VISUAL_ID, &value);
+			if (value == format)
+			{
+				conf = pConfigs[j];
+				break;
+			}
+#endif
+#endif
+		}
+
+		// Tidy up
+		delete[] pConfigs;
+	}
+	else
+#endif
+	{
+		// Terminate the list with EGL_NONE
+		conflist[i++] = EGL_NONE;
+
+		// Return null config if config is not found
+		if(!eglChooseConfig(m_EGLDisplay, conflist, &conf, 1, &num_config) || num_config != 1)
+		{
+			return 0;
+		}
+	}
+
+	// Return config index
+	return conf;
+}
+
+/*******************************************************************************
+ * Function Name  : StringFrom_eglGetError
+ * Returns        : A string
+ * Description    : Returns a string representation of an egl error
+ *******************************************************************************/
+const char *PVRShellInitAPI::StringFrom_eglGetError() const
+{
+	EGLint nErr = eglGetError();
+
+	switch(nErr)
+	{
+		case EGL_SUCCESS:
+			return "EGL_SUCCESS";
+		case EGL_BAD_DISPLAY:
+			return "EGL_BAD_DISPLAY";
+		case EGL_NOT_INITIALIZED:
+			return "EGL_NOT_INITIALIZED";
+		case EGL_BAD_ACCESS:
+			return "EGL_BAD_ACCESS";
+		case EGL_BAD_ALLOC:
+			return "EGL_BAD_ALLOC";
+		case EGL_BAD_ATTRIBUTE:
+			return "EGL_BAD_ATTRIBUTE";
+		case EGL_BAD_CONFIG:
+			return "EGL_BAD_CONFIG";
+		case EGL_BAD_CONTEXT:
+			return "EGL_BAD_CONTEXT";
+		case EGL_BAD_CURRENT_SURFACE:
+			return "EGL_BAD_CURRENT_SURFACE";
+		case EGL_BAD_MATCH:
+			return "EGL_BAD_MATCH";
+		case EGL_BAD_NATIVE_PIXMAP:
+			return "EGL_BAD_NATIVE_PIXMAP";
+		case EGL_BAD_NATIVE_WINDOW:
+			return "EGL_BAD_NATIVE_WINDOW";
+		case EGL_BAD_PARAMETER:
+			return "EGL_BAD_PARAMETER";
+		case EGL_BAD_SURFACE:
+			return "EGL_BAD_SURFACE";
+		default:
+			return "unknown";
+	}
+}
+
+/*!***********************************************************************
+@Function		ApiScreenCaptureBuffer
+@Input			Width Width of the region to capture
+@Input			Height Height of the region to capture
+@Input			pBuf A buffer to put the screen capture into
+@description	API-specific function to store the current content of the
+				FrameBuffer into the memory allocated by the user.
+*************************************************************************/
+bool PVRShellInit::ApiScreenCaptureBuffer(int Width,int Height,unsigned char *pBuf)
+{
+	unsigned char	*pLines2;
+	int				i, j;
+	bool			bRet = true;
+
+	/* Allocate memory for line */
+	pLines2 = (unsigned char *)calloc(4 * Width * Height, sizeof(unsigned char));
+	if (!pLines2) return false;
+
+	while (glGetError());
+	/* Read line from frame buffer */
+	glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pLines2);
+
+	if(glGetError())
+	{
+		bRet = false;
+	}
+	else
+	{
+		/* Convert RGB to BGR in line */
+		for (j = 0, i = 0; j < 4 * Width * Height; j += 4, i += 3)
+		{
+			pBuf[i] = pLines2[j+2];
+			pBuf[i+1] = pLines2[j+1];
+			pBuf[i+2] = pLines2[j];
+		}
+	}
+
+	free(pLines2);
+	return bRet;
+}
+
+/*!***********************************************************************
+ @Function		ApiRenderComplete
+ @description	Perform API operations required after a frame has finished (e.g., flipping).
+*************************************************************************/
+void PVRShellInit::ApiRenderComplete()
+{
+
+#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3)
+	//Discard the framebuffer if set.
+#if !defined(BUILD_OGLES3)
+	if (glDiscardFramebufferEXT)
+#endif
+	{
+		const GLint numAttachments=3;
+		GLenum attachments[numAttachments];
+		GLint currentAttachment=0;
+		if (m_pShell->PVRShellGet(prefDiscardColor))
+		{
+			attachments[currentAttachment] = GL_COLOR_EXT;
+			currentAttachment++;
+		}
+		if (m_pShell->PVRShellGet(prefDiscardDepth))
+		{
+			attachments[currentAttachment] = GL_DEPTH_EXT;
+			currentAttachment++;
+		}
+		if (m_pShell->PVRShellGet(prefDiscardStencil))
+		{
+			attachments[currentAttachment] = GL_STENCIL_EXT;
+			currentAttachment++;
+		}
+		//Assuming some attachments have been chosen, discard/invalidate them.
+		if (currentAttachment!=0)
+		{
+#if defined(BUILD_OGLES)
+			glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, currentAttachment, attachments);
+#elif defined(BUILD_OGLES2)
+			glDiscardFramebufferEXT(GL_FRAMEBUFFER, currentAttachment, attachments);
+#elif defined(BUILD_OGLES3)
+			glInvalidateFramebuffer(GL_FRAMEBUFFER, currentAttachment, attachments);
+#endif
+		}
+	}
+#endif
+
+	bool bRes;
+
+	if(m_pShell->m_pShellData->bNeedPixmap)
+	{
+		/*
+			"Clients rendering to single buffered surfaces (e.g. pixmap surfaces)
+			should call eglWaitGL before accessing the native pixmap from the client."
+		*/
+		eglWaitGL();
+
+		// Pixmap support: Copy the rendered pixmap to the display
+		if(m_pShell->m_pShellData->bNeedPixmapDisableCopy)
+		{
+			bRes = true;
+		}
+		else
+		{
+			bRes = OsPixmapCopy();
+		}
+	}
+	else
+	{
+		if(m_pShell->m_pShellData->bNoShellSwapBuffer)
+			return;
+
+		bRes = (eglSwapBuffers (m_EGLDisplay, m_EGLWindow) == EGL_TRUE);
+	}
+
+	if(!bRes)
+	{
+		// check for context loss
+#ifdef EGL_VERSION_1_3
+		if(eglGetError() == EGL_CONTEXT_LOST)
+#else
+		if((eglGetError() == EGL_CONTEXT_LOST_IMG) && m_bPowerManagementSupported)
+#endif
+		{
+			m_pShell->ReleaseView();
+
+			OsDoReleaseAPI();
+			if(ApiInitAPI())
+			{
+				m_pShell->InitView();
+			}
+		}
+		else
+		{
+			if(m_pShell->m_pShellData->bNeedPixmap)
+				m_pShell->PVRShellOutputDebug("failed to copy pixmap\n");
+			else
+				m_pShell->PVRShellOutputDebug("eglSwapBuffers failed\n");
+		}
+	}
+}
+
+/*!***********************************************************************
+ @Function		ApiSet
+ @Input			prefName	Name of value to set
+ @Modified		i32Value	Value to set it to
+ @description	Set parameters which are specific to the API.
+*************************************************************************/
+bool PVRShellInit::ApiSet(const prefNameIntEnum prefName, const int i32Value)
+{
+	switch(prefName)
+	{
+#ifdef EGL_VERSION_1_1
+	case prefSwapInterval:
+		m_pShell->m_pShellData->nSwapInterval = i32Value;
+		return true;
+#endif
+#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3)
+	case prefPriority:
+		m_pShell->m_pShellData->nPriority = i32Value;
+		return true;
+#endif
+	case prefRequestedConfig:
+		m_iRequestedConfig = (EGLint) i32Value;
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/*!***********************************************************************
+ @Function		ApiGet
+ @Input			prefName	Name of value to get
+ @Modified		pn A pointer set to the value asked for
+ @description	Get parameters which are specific to the API.
+*************************************************************************/
+bool PVRShellInit::ApiGet(const prefNameIntEnum prefName, int *pn)
+{
+	switch(prefName)
+	{
+		case prefEGLMajorVersion:
+			*pn = (int) m_MajorVersion;
+			return true;
+
+		case prefEGLMinorVersion:
+			*pn = (int) m_MinorVersion;
+			return true;
+
+		case prefRequestedConfig:
+			*pn = (int) m_iRequestedConfig;
+			return true;
+
+		case prefConfig:
+			*pn = (int) m_iConfig;
+			return true;
+
+		default:
+			return false;
+	}
+}
+
+/*!***********************************************************************
+ @Function		ApiGet
+ @Input			prefName	Name of value to get
+ @Modified		pp A pointer set to the value asked for
+ @description	Get parameters which are specific to the API.
+*************************************************************************/
+bool PVRShellInit::ApiGet(const prefNamePtrEnum prefName, void **pp)
+{
+		switch(prefName)
+		{
+		case prefEGLDisplay:
+			*pp = (void*)m_EGLDisplay;
+			return true;
+		case prefEGLSurface:
+			*pp = (void*)m_EGLWindow;
+			return true;
+		default:
+			return false;
+		}
+}
+
+/****************************************************************************
+** Local code
+****************************************************************************/
+
+// The recommended technique for querying OpenGL extensions;
+// adapted from http://opengl.org/resources/features/OGLextensions/
+static bool PVRShellIsExtensionSupported(EGLDisplay dpy, const char *extension)
+{
+	// The recommended technique for querying EGL extensions matches OpenGLES;
+	// from http://opengl.org/resources/features/OGLextensions/
+    const char *extensions = NULL;
+    const char *start;
+    char *terminator;
+
+    /* Extension names should not have spaces. */
+    char* where = (char *) strchr(extension, ' ');
+    if (where || *extension == '\0')
+        return 0;
+
+    extensions = eglQueryString(dpy, EGL_EXTENSIONS);
+	if(!extensions)
+		return false;
+
+    /* 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 = (char *) 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;
+}
+
+/// @endcond
+
+/*****************************************************************************
+ End of file (PVRShellAPI.cpp)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/API/KEGL/PVRShellAPI.h b/third_party/PowerVR_SDK/Shell/API/KEGL/PVRShellAPI.h
new file mode 100644
index 0000000..e132f38
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/API/KEGL/PVRShellAPI.h
@@ -0,0 +1,92 @@
+/*!****************************************************************************
+
+ @file         KEGL/PVRShellAPI.h
+ @ingroup      API_KEGL 
+ @copyright    Copyright (c) Imagination Technologies Limited.
+ @brief        3D API context management for KEGL.
+ @details      Makes programming for 3D APIs easier by wrapping surface
+               initialization, Texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+
+#ifndef __PVRSHELLAPI_H_
+#define __PVRSHELLAPI_H_
+
+/****************************************************************************
+** 3D API header files
+****************************************************************************/
+#if defined(BUILD_OGLES2)
+	#include <GLES2/gl2.h>
+	#include <GLES2/gl2ext.h>
+	#include <EGL/egl.h>
+	#include <EGL/eglext.h>
+#elif defined(BUILD_OGLES3)
+	#include <GLES3/gl3.h>
+	#include <GLES2/gl2ext.h>
+	#include <GLES3/gl3ext.h>
+	#include <EGL/egl.h>
+	#include <EGL/eglext.h>
+#elif defined(BUILD_OGL)
+#define SUPPORT_OPENGL
+#if defined(_WIN32)
+	#include <windows.h>
+#endif
+	#include <GL/gl.h>
+	#include <EGL/egl.h>
+	#include <EGL/eglext.h>
+#else
+	#include <EGL/egl.h>
+	#include <EGL/eglext.h>
+	#include <GLES/gl.h>
+	#include <GLES/glext.h>
+	#include <GLES/glplatform.h>
+#endif
+
+/*!***************************************************************************
+ @addtogroup API_KEGL 
+ @brief      KEGL API
+ @{
+****************************************************************************/
+
+/*!***************************************************************************
+ @class PVRShellInitAPI
+ @brief Initialisation interface with specific API.
+****************************************************************************/
+class PVRShellInitAPI
+{
+public:
+	EGLDisplay	m_EGLDisplay;
+	EGLSurface	m_EGLWindow;
+	EGLContext	m_EGLContext;
+	EGLConfig	m_EGLConfig;
+	EGLint		m_MajorVersion, m_MinorVersion;
+	bool		m_bPowerManagementSupported;
+	EGLint		m_iRequestedConfig;
+	EGLint		m_iConfig;
+
+	EGLNativeDisplayType m_NDT;
+	EGLNativePixmapType  m_NPT;
+	EGLNativeWindowType  m_NWT;
+
+
+public:
+	PVRShellInitAPI() : m_bPowerManagementSupported(false), m_iRequestedConfig(0), m_iConfig(0) {}
+	EGLConfig SelectEGLConfiguration(const PVRShellData * const pData);
+	const char *StringFrom_eglGetError() const;
+
+#if defined(BUILD_OGLES) || defined(BUILD_OGLES2)
+protected:
+	typedef void (GL_APIENTRY * PFNGLDISCARDFRAMEBUFFEREXT)(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+	PFNGLDISCARDFRAMEBUFFEREXT			glDiscardFramebufferEXT;
+#endif
+
+};
+
+/*! @} */
+
+#endif // __PVRSHELLAPI_H_
+
+/*****************************************************************************
+ End of file (PVRShellAPI.h)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/OS/LinuxX11/PVRShellOS.cpp b/third_party/PowerVR_SDK/Shell/OS/LinuxX11/PVRShellOS.cpp
new file mode 100644
index 0000000..f9a03b7
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/OS/LinuxX11/PVRShellOS.cpp
@@ -0,0 +1,755 @@
+/******************************************************************************
+
+ @File         LinuxX11/PVRShellOS.cpp
+
+ @Title        LinuxX11/PVRShellOS
+
+ @Version      
+
+ @Copyright    Copyright (c) Imagination Technologies Limited.
+
+ @Platform     X11
+
+ @Description  Makes programming for 3D APIs easier by wrapping window creation
+               and other functions for use by a demo.
+
+******************************************************************************/
+
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "PVRShell.h"
+#include "PVRShellAPI.h"
+#include "PVRShellOS.h"
+#include "PVRShellImpl.h"
+
+// No Doxygen for CPP files, due to documentation duplication
+/// @cond NO_DOXYGEN
+
+/*!***************************************************************************
+	Defines
+*****************************************************************************/
+
+/*****************************************************************************
+	Declarations
+*****************************************************************************/
+static Bool WaitForMapNotify( Display *d, XEvent *e, char *arg );
+
+/*!***************************************************************************
+	Class: PVRShellInit
+*****************************************************************************/
+
+/*!***********************************************************************
+@Function		PVRShellOutputDebug
+@Input			format			printf style format followed by arguments it requires
+@Description	Writes the resultant string to the debug output (e.g. using
+				printf(), OutputDebugString(), ...). Check the SDK release notes for
+				details on how the string is output.
+*************************************************************************/
+void PVRShell::PVRShellOutputDebug(char const * const format, ...) const
+{
+	if(!format)
+		return;
+
+	va_list arg;
+	char	buf[1024];
+
+	va_start(arg, format);
+	vsnprintf(buf, 1024, format, arg);
+	va_end(arg);
+
+	// Passes the data to a platform dependant function
+	m_pShellInit->OsDisplayDebugString(buf);
+}
+
+/*!***********************************************************************
+ @Function		OsInit
+ @description	Initialisation for OS-specific code.
+*************************************************************************/
+void PVRShellInit::OsInit()
+{
+	XInitThreads();
+
+    // set values to negative to mark that these are default values
+    m_pShell->m_pShellData->nShellDimX = -240;
+    m_pShell->m_pShellData->nShellDimY = -320;
+
+	m_X11Display = NULL;
+	m_X11Visual = NULL;
+
+	// Pixmap support: init variables to 0
+	m_X11Pixmap = BadValue;
+
+	/*
+		Construct the binary path for GetReadPath() and GetWritePath()
+	*/
+	// Get PID (Process ID)
+	pid_t ourPid = getpid();
+	char *pszExePath, pszSrcLink[64];
+	int len = 64;
+	int res;
+
+	sprintf(pszSrcLink, "/proc/%d/exe", ourPid);
+	pszExePath = 0;
+
+	do
+	{
+		len *= 2;
+		delete[] pszExePath;
+		pszExePath = new char[len];
+		res = readlink(pszSrcLink, pszExePath, len);
+
+		if(res < 0)
+		{
+			m_pShell->PVRShellOutputDebug("Warning Readlink %s failed. The application name, read path and write path have not been set.\n", pszExePath);
+			break;
+		}
+	} while(res >= len);
+
+	if(res >= 0)
+	{
+		pszExePath[res] = '\0'; // Null-terminate readlink's result
+		SetReadPath(pszExePath);
+		SetWritePath(pszExePath);
+		SetAppName(pszExePath);
+	}
+
+	delete[] pszExePath;
+
+	m_u32ButtonState = 0;
+
+	gettimeofday(&m_StartTime,NULL);
+}
+
+/*!***********************************************************************
+ @Function		OsInitOS
+ @description	Saves instance handle and creates main window
+				In this function, we save the instance handle in a global variable and
+				create and display the main program window.
+*************************************************************************/
+bool PVRShellInit::OsInitOS()
+{
+	m_X11Display = XOpenDisplay( NULL );
+
+	if(!m_X11Display)
+	{
+		m_pShell->PVRShellOutputDebug( "Unable to open X display\n");
+		return false;
+	}
+
+	m_X11Screen = XDefaultScreen( m_X11Display );
+
+    /*
+    	If there is a full screen request then
+        set the window size to the display size.
+        If there is no full screen request then reduce window size while keeping
+		the same aspect by dividing the dims by two until it fits inside the display area.
+        If the position has not changed from its default value, set it to the middle of the screen.
+    */
+
+    int display_width  = XDisplayWidth(m_X11Display,m_X11Screen);
+    int display_height = XDisplayHeight(m_X11Display,m_X11Screen);
+
+    if(m_pShell->m_pShellData->bFullScreen)
+    {
+        // For OGL we do real fullscreen for others API set a window of fullscreen size
+        if(m_pShell->m_pShellData->nShellDimX < 0) {
+            m_pShell->m_pShellData->nShellDimX = display_width;
+        }
+        if(m_pShell->m_pShellData->nShellDimY < 0) {
+            m_pShell->m_pShellData->nShellDimY = display_height;
+        }
+    }
+    else
+    {
+		if(m_pShell->m_pShellData->nShellDimX < 0)
+		    m_pShell->m_pShellData->nShellDimX = (display_width > display_height) ? 800 : 600;
+
+		if(m_pShell->m_pShellData->nShellDimY < 0)
+		    m_pShell->m_pShellData->nShellDimY = (display_width > display_height) ? 600 : 800;
+
+        if(m_pShell->m_pShellData->nShellDimX > display_width)
+            m_pShell->m_pShellData->nShellDimX = display_width;
+
+        if(m_pShell->m_pShellData->nShellDimY > display_height)
+            m_pShell->m_pShellData->nShellDimY = display_height;
+    }
+
+	// Create the window
+	if(!OpenX11Window(*m_pShell))
+	{
+		m_pShell->PVRShellOutputDebug( "Unable to open X11 window\n" );
+		return false;
+	}
+
+	// Pixmap support: create the pixmap
+	if(m_pShell->m_pShellData->bNeedPixmap)
+	{
+		int depth = DefaultDepth(m_X11Display, m_X11Screen);
+		m_X11Pixmap = XCreatePixmap(m_X11Display,m_X11Window,m_pShell->m_pShellData->nShellDimX,m_pShell->m_pShellData->nShellDimY,depth);
+		m_X11GC	  = XCreateGC(m_X11Display,m_X11Window,0,0);
+	}
+
+	return true;
+}
+
+/*!***********************************************************************
+ @Function		OsReleaseOS
+ @description	Destroys main window
+*************************************************************************/
+void PVRShellInit::OsReleaseOS()
+{
+	XCloseDisplay( m_X11Display );
+}
+
+/*!***********************************************************************
+ @Function		OsExit
+ @description	Destroys main window
+*************************************************************************/
+void PVRShellInit::OsExit()
+{
+	// Show the exit message to the user
+	m_pShell->PVRShellOutputDebug((const char*)m_pShell->PVRShellGet(prefExitMessage));
+}
+
+/*!***********************************************************************
+ @Function		OsDoInitAPI
+ @Return		true on success
+ @description	Perform API initialisation and bring up window / fullscreen
+*************************************************************************/
+bool PVRShellInit::OsDoInitAPI()
+{
+	if(!ApiInitAPI())
+	{
+		return false;
+	}
+
+	// No problem occured
+	return true;
+}
+
+/*!***********************************************************************
+ @Function		OsDoReleaseAPI
+ @description	Clean up after we're done
+*************************************************************************/
+void PVRShellInit::OsDoReleaseAPI()
+{
+	ApiReleaseAPI();
+
+	if(m_pShell->m_pShellData->bNeedPixmap)
+	{
+		// Pixmap support: free the pixmap
+		XFreePixmap(m_X11Display,m_X11Pixmap);
+		XFreeGC(m_X11Display,m_X11GC);
+	}
+
+	CloseX11Window();
+}
+
+/*!***********************************************************************
+ @Function		OsRenderComplete
+ @Returns		false when the app should quit
+ @description	Main message loop / render loop
+*************************************************************************/
+void PVRShellInit::OsRenderComplete()
+{
+	int		numMessages;
+	XEvent	event;
+	char*		atoms;
+
+	// Are there messages waiting, maybe this should be a while loop
+	numMessages = XPending( m_X11Display );
+	for( int i = 0; i < numMessages; i++ )
+	{
+		XNextEvent( m_X11Display, &event );
+
+		switch( event.type )
+		{
+			case ClientMessage:
+				atoms = XGetAtomName(m_X11Display, event.xclient.message_type);
+				if (*atoms == *"WM_PROTOCOLS")
+				{
+					gShellDone = true;
+				}
+				XFree(atoms);
+				break;
+
+			case ButtonRelease:
+			{
+				XButtonEvent *button_event = ((XButtonEvent *) &event);
+				switch( button_event->button )
+				{
+					case 1 : 
+					{
+						m_u32ButtonState &= ~1;
+
+						// Set the current pointer location
+						float vec2PointerLocation[2];
+						vec2PointerLocation[0] = (float)button_event->x / (float)m_pShell->m_pShellData->nShellDimX;
+						vec2PointerLocation[1] = (float)button_event->y / (float)m_pShell->m_pShellData->nShellDimY;
+						TouchEnded(vec2PointerLocation);
+					}
+					break;
+					case 2 : m_u32ButtonState &= ~4; break;
+					case 3 : m_u32ButtonState &= ~2; break;
+					default : break;
+				}
+				break;
+			}
+        	case ButtonPress:
+			{
+				XButtonEvent *button_event = ((XButtonEvent *) &event);
+				switch( button_event->button )
+				{
+					case 1 : 
+					{
+						m_u32ButtonState |= 1;
+
+						// Set the current pointer location
+						float vec2PointerLocation[2];
+						vec2PointerLocation[0] = (float)button_event->x / (float)m_pShell->m_pShellData->nShellDimX;
+						vec2PointerLocation[1] = (float)button_event->y / (float)m_pShell->m_pShellData->nShellDimY;
+						TouchBegan(vec2PointerLocation);						
+					}
+					break;
+					case 2 : m_u32ButtonState |= 4; break;
+					case 3 : m_u32ButtonState |= 2; break;
+					default : break;
+				}
+        		break;
+			}
+			case MotionNotify:
+			{
+				XMotionEvent *motion_event = ((XMotionEvent *) &event);
+
+				// Set the current pointer location
+				float vec2PointerLocation[2];
+				vec2PointerLocation[0] = (float)motion_event->x / (float)m_pShell->m_pShellData->nShellDimX;
+				vec2PointerLocation[1] = (float)motion_event->y / (float)m_pShell->m_pShellData->nShellDimY;
+				TouchMoved(vec2PointerLocation);	
+				break;
+			}
+			// should SDK handle these?
+			case MapNotify:
+        	case UnmapNotify:
+        		break;
+
+			case KeyPress:
+			{
+				XKeyEvent *key_event = ((XKeyEvent *) &event);
+
+				switch(key_event->keycode)
+				{
+					case 9:	 	nLastKeyPressed = PVRShellKeyNameQUIT;	break; 			// Esc
+					case 95:	nLastKeyPressed = PVRShellKeyNameScreenshot;	break; 	// F11
+					case 36:	nLastKeyPressed = PVRShellKeyNameSELECT;	break; 		// Enter
+					case 10:	nLastKeyPressed = PVRShellKeyNameACTION1;	break; 		// number 1
+					case 11:	nLastKeyPressed = PVRShellKeyNameACTION2;	break; 		// number 2
+					case 98:
+					case 111:	nLastKeyPressed = m_eKeyMapUP;	break;
+					case 104:
+					case 116:	nLastKeyPressed = m_eKeyMapDOWN;	break;
+					case 100:
+					case 113:	nLastKeyPressed = m_eKeyMapLEFT;	break;
+					case 102:
+					case 114: 	nLastKeyPressed = m_eKeyMapRIGHT;	break;
+					default:
+						break;
+				}
+			}
+			break;
+
+			case KeyRelease:
+			{
+//				char buf[10];
+//				XLookupString(&event.xkey,buf,10,NULL,NULL);
+//				charsPressed[ (int) *buf ] = 0;
+			}
+			break;
+
+			default:
+				break;
+		}
+	}
+}
+
+/*!***********************************************************************
+ @Function		OsPixmapCopy
+ @Return		true if the copy succeeded
+ @description	When using pixmaps, copy the render to the display
+*************************************************************************/
+bool PVRShellInit::OsPixmapCopy()
+{
+	XCopyArea(m_X11Display,m_X11Pixmap,m_X11Window,m_X11GC,0,0,m_pShell->m_pShellData->nShellDimX,m_pShell->m_pShellData->nShellDimY,0,0);
+	return true;
+}
+
+/*!***********************************************************************
+ @Function		OsGetNativeDisplayType
+ @Return		The 'NativeDisplayType' for EGL
+ @description	Called from InitAPI() to get the NativeDisplayType
+*************************************************************************/
+void *PVRShellInit::OsGetNativeDisplayType()
+{
+	return m_X11Display;
+}
+
+/*!***********************************************************************
+ @Function		OsGetNativePixmapType
+ @Return		The 'NativePixmapType' for EGL
+ @description	Called from InitAPI() to get the NativePixmapType
+*************************************************************************/
+void *PVRShellInit::OsGetNativePixmapType()
+{
+	// Pixmap support: return the pixmap
+	return (void*)m_X11Pixmap;
+}
+
+/*!***********************************************************************
+ @Function		OsGetNativeWindowType
+ @Return		The 'NativeWindowType' for EGL
+ @description	Called from InitAPI() to get the NativeWindowType
+*************************************************************************/
+void *PVRShellInit::OsGetNativeWindowType()
+{
+	return (void*)m_X11Window;
+}
+
+/*!***********************************************************************
+ @Function		OsGet
+ @Input			prefName	Name of value to get
+ @Modified		pn A pointer set to the value asked for
+ @Returns		true on success
+ @Description	Retrieves OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsGet(const prefNameIntEnum prefName, int *pn)
+{
+	switch( prefName )
+	{
+	case prefButtonState:
+		*pn = m_u32ButtonState;
+		return true;
+	default:
+		return false;
+	};
+
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsGet
+ @Input			prefName	Name of value to get
+ @Modified		pp A pointer set to the value asked for
+ @Returns		true on success
+ @Description	Retrieves OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsGet(const prefNamePtrEnum prefName, void **pp)
+{
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsSet
+ @Input			prefName				Name of preference to set to value
+ @Input			value					Value
+ @Return		true for success
+ @Description	Sets OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsSet(const prefNameBoolEnum prefName, const bool value)
+{
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsSet
+ @Input			prefName	Name of value to set
+ @Input			i32Value 	The value to set our named value to
+ @Returns		true on success
+ @Description	Sets OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsSet(const prefNameIntEnum prefName, const int i32Value)
+{
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsDisplayDebugString
+ @Input			str		string to output
+ @Description	Prints a debug string
+*************************************************************************/
+void PVRShellInit::OsDisplayDebugString(char const * const str)
+{
+	fprintf(stderr, "%s", str);
+}
+
+/*!***********************************************************************
+ @Function		OsGetTime
+ @Return		An incrementing time value measured in milliseconds
+ @Description	Returns an incrementing time value measured in milliseconds
+*************************************************************************/
+unsigned long PVRShellInit::OsGetTime()
+{
+	timeval tv;
+	gettimeofday(&tv,NULL);
+
+	if(tv.tv_sec < m_StartTime.tv_sec)
+		m_StartTime.tv_sec = 0;
+
+	unsigned long sec = tv.tv_sec - m_StartTime.tv_sec;
+	return (unsigned long)((sec*(unsigned long)1000) + (tv.tv_usec/1000.0));
+}
+
+/*****************************************************************************
+ Class: PVRShellInitOS
+*****************************************************************************/
+
+/*!***********************************************************************
+ @Function		OpenX11Window
+ @Return		true on success
+ @Description	Opens an X11 window. This must be called after
+				SelectEGLConfiguration() for gEglConfig to be valid
+*************************************************************************/
+int PVRShellInitOS::OpenX11Window(const PVRShell &shell)
+{
+    XSetWindowAttributes	WinAttibutes;
+    XSizeHints				sh;
+    XEvent					event;
+    unsigned long			mask;
+
+#ifdef BUILD_OGL
+    XF86VidModeModeInfo **modes;       // modes of display
+    int numModes;                      // number of modes of display
+    int chosenMode;
+    int edimx,edimy;                   //established width and height of the chosen modeline
+    int i;
+#endif
+
+	int depth = DefaultDepth(m_X11Display, m_X11Screen);
+	m_X11Visual = new XVisualInfo;
+	XMatchVisualInfo( m_X11Display, m_X11Screen, depth, TrueColor, m_X11Visual);
+
+    if( !m_X11Visual )
+    {
+    	shell.PVRShellOutputDebug( "Unable to acquire visual" );
+    	return false;
+    }
+
+    m_X11ColorMap = XCreateColormap( m_X11Display, RootWindow(m_X11Display, m_X11Screen), m_X11Visual->visual, AllocNone );
+
+#ifdef BUILD_OGL
+    m_i32OriginalModeDotClock = XF86VidModeBadClock;
+    if(shell.m_pShellData->bFullScreen)
+    {
+        // Get mode lines to see if there is requested modeline
+        XF86VidModeGetAllModeLines(m_X11Display, m_X11Screen, &numModes, &modes);
+
+        // look for mode with requested resolution
+        chosenMode = -1;
+        i=0;
+        while((chosenMode == -1)&&(i<numModes))
+        {
+            if ((modes[i]->hdisplay == shell.m_pShellData->nShellDimX) && (modes[i]->vdisplay == shell.m_pShellData->nShellDimY))
+            {
+                chosenMode = i;
+            }
+            ++i;
+        }
+
+        // If there is no requested resolution among modelines then terminate
+        if(chosenMode == -1)
+        {
+            shell.PVRShellOutputDebug( "Chosen resolution for full screen mode does not match any modeline available.\n" );
+            return false;
+        }
+
+        // save desktop-resolution before switching modes
+        XF86VidModeGetModeLine(m_X11Display,m_X11Screen, &m_i32OriginalModeDotClock, &m_OriginalMode );
+
+        XF86VidModeSwitchToMode(m_X11Display, m_X11Screen, modes[chosenMode]);
+        XF86VidModeSetViewPort(m_X11Display, m_X11Screen, 0, 0);
+        edimx = modes[chosenMode]->hdisplay;
+        edimy = modes[chosenMode]->vdisplay;
+        printf("Fullscreen Resolution %dx%d (chosen mode = %d)\n", edimx, edimy,chosenMode);
+        XFree(modes);
+
+		WinAttibutes.colormap = m_X11ColorMap;
+		WinAttibutes.background_pixel = 0xFFFFFFFF;
+		WinAttibutes.border_pixel = 0;
+        WinAttibutes.override_redirect = true;
+
+		// add to these for handling other events
+		WinAttibutes.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | Button1MotionMask | KeyPressMask | KeyReleaseMask;
+
+        // The diffrence is that we want to ignore influence of window manager for our fullscreen window
+        mask = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap | CWOverrideRedirect;
+
+        m_X11Window = XCreateWindow( m_X11Display, RootWindow(m_X11Display, m_X11Screen), 0, 0, edimx, edimy, 0,
+                                    CopyFromParent, InputOutput, CopyFromParent, mask, &WinAttibutes);
+
+        // keeping the pointer of mouse and keyboard in window to prevent from scrolling the virtual screen
+        XWarpPointer(m_X11Display, None ,m_X11Window, 0, 0, 0, 0, 0, 0);
+
+        // Map and then wait till mapped, grabbing should be after mapping the window
+        XMapWindow( m_X11Display, m_X11Window );
+        XGrabKeyboard(m_X11Display, m_X11Window, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+        XGrabPointer(m_X11Display, m_X11Window, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, m_X11Window, None, CurrentTime);
+        XIfEvent( m_X11Display, &event, WaitForMapNotify, (char*)m_X11Window );
+
+    }
+    else
+#endif
+    {
+        // For OGLES we assume that chaning of video mode is not available (freedesktop does not allow to do it)
+        // so if requested resolution differs from the display dims then we quit
+        #ifndef BUILD_OGL
+        int display_width  = XDisplayWidth(m_X11Display,m_X11Screen);
+        int display_height = XDisplayHeight(m_X11Display,m_X11Screen);
+        if((shell.m_pShellData->bFullScreen)&&((shell.m_pShellData->nShellDimX != display_width)||(shell.m_pShellData->nShellDimY != display_height)) ) {
+            shell.PVRShellOutputDebug( "Chosen resolution for full screen mode does not match available modeline.\n" );
+            return false;
+        }
+        #endif
+
+
+		WinAttibutes.colormap = m_X11ColorMap;
+		WinAttibutes.background_pixel = 0xFFFFFFFF;
+		WinAttibutes.border_pixel = 0;
+
+		// add to these for handling other events
+		WinAttibutes.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | Button1MotionMask | KeyPressMask | KeyReleaseMask;
+
+		// The attribute mask
+        mask = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap ;
+
+        m_X11Window = XCreateWindow(  m_X11Display, 						// Display
+									RootWindow(m_X11Display, m_X11Screen), 	// Parent
+									shell.m_pShellData->nShellPosX, 	// X position of window
+									shell.m_pShellData->nShellPosY,		// Y position of window
+									shell.m_pShellData->nShellDimX,		// Window width
+									shell.m_pShellData->nShellDimY,		// Window height
+									0,									// Border width
+									CopyFromParent, 					// Depth (taken from parent)
+									InputOutput, 						// Window class
+									CopyFromParent, 					// Visual type (taken from parent)
+									mask, 								// Attributes mask
+									&WinAttibutes);						// Attributes
+
+		// Set the window position
+        sh.flags = USPosition;
+        sh.x = shell.m_pShellData->nShellPosX;
+        sh.y = shell.m_pShellData->nShellPosY;
+        XSetStandardProperties( m_X11Display, m_X11Window, shell.m_pShellData->pszAppName, shell.m_pShellData->pszAppName, None, 0, 0, &sh );
+
+        // Map and then wait till mapped
+        XMapWindow( m_X11Display, m_X11Window );
+        XIfEvent( m_X11Display, &event, WaitForMapNotify, (char*)m_X11Window );
+
+        // An attempt to hide a border for fullscreen on non OGL apis (OGLES,OGLES2)
+        if(shell.m_pShellData->bFullScreen)
+        {
+			XEvent xev;
+			Atom wmState = XInternAtom(m_X11Display, "_NET_WM_STATE", False);
+			Atom wmStateFullscreen = XInternAtom(m_X11Display, "_NET_WM_STATE_FULLSCREEN", False);
+
+			memset(&xev, 0, sizeof(XEvent));
+			xev.type = ClientMessage;
+			xev.xclient.window = m_X11Window;
+			xev.xclient.message_type = wmState;
+			xev.xclient.format = 32;
+			xev.xclient.data.l[0] = 1;
+			xev.xclient.data.l[1] = wmStateFullscreen;
+			xev.xclient.data.l[2] = 0;
+			XSendEvent(m_X11Display, RootWindow(m_X11Display, m_X11Screen), False, SubstructureNotifyMask, &xev);
+        }
+
+        Atom wmDelete = XInternAtom(m_X11Display, "WM_DELETE_WINDOW", True);
+        XSetWMProtocols(m_X11Display, m_X11Window, &wmDelete, 1);
+        XSetWMColormapWindows( m_X11Display, m_X11Window, &m_X11Window, 1 );
+    }
+
+    XFlush( m_X11Display );
+
+    return true;
+}
+
+/*!***********************************************************************
+ @Function		CloseX11Window
+ @Return		void
+ @Description	destroy the instance of a window, and release all relevent memory
+*************************************************************************/
+void PVRShellInitOS::CloseX11Window()
+{
+    // revert introductional resolution (full screen case, bad clock is default value meaning that good was not acquired)
+#ifdef BUILD_OGL
+    XF86VidModeModeInfo tmpmi;
+
+    if(m_i32OriginalModeDotClock != XF86VidModeBadClock)
+    {
+        // revert desktop-resolution (stored previously) before exiting
+        tmpmi.dotclock = m_i32OriginalModeDotClock;
+        tmpmi.c_private = m_OriginalMode.c_private;
+        tmpmi.flags = m_OriginalMode.flags;
+        tmpmi.hdisplay = m_OriginalMode.hdisplay;
+        tmpmi.hskew = m_OriginalMode.hskew;
+        tmpmi.hsyncend = m_OriginalMode.hsyncend;
+        tmpmi.hsyncstart = m_OriginalMode.hsyncstart;
+        tmpmi.htotal = m_OriginalMode.htotal;
+        tmpmi.privsize = m_OriginalMode.privsize;
+        tmpmi.vdisplay = m_OriginalMode.vdisplay;
+        tmpmi.vsyncend = m_OriginalMode.vsyncend;
+        tmpmi.vsyncstart = m_OriginalMode.vsyncstart;
+        tmpmi.vtotal = m_OriginalMode.vtotal;
+
+        XF86VidModeSwitchToMode(m_X11Display,m_X11Screen,&tmpmi);
+    }
+#endif
+
+	XDestroyWindow( m_X11Display, m_X11Window );
+    XFreeColormap( m_X11Display, m_X11ColorMap );
+
+	if(m_X11Visual)
+		delete m_X11Visual;
+}
+
+/*****************************************************************************
+ Global code
+*****************************************************************************/
+
+static Bool WaitForMapNotify( Display *d, XEvent *e, char *arg )
+{
+	return (e->type == MapNotify) && (e->xmap.window == (Window)arg);
+}
+
+/*!***************************************************************************
+@function		main
+@input			argc	count of args from OS
+@input			argv	array of args from OS
+@returns		result code to OS
+@description	Main function of the program
+*****************************************************************************/
+int main(int argc, char **argv)
+{
+	PVRShellInit init;
+
+	// Initialise the demo, process the command line, create the OS initialiser.
+	if(!init.Init())
+		return EXIT_ERR_CODE;
+
+	init.CommandLine((argc-1),&argv[1]);
+
+	// Initialise/run/shutdown
+	while(init.Run());
+
+	return EXIT_NOERR_CODE;
+}
+
+/// @endcond
+
+/*****************************************************************************
+ End of file (PVRShellOS.cpp)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/OS/LinuxX11/PVRShellOS.h b/third_party/PowerVR_SDK/Shell/OS/LinuxX11/PVRShellOS.h
new file mode 100644
index 0000000..0217433
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/OS/LinuxX11/PVRShellOS.h
@@ -0,0 +1,77 @@
+/*!****************************************************************************
+
+ @file         LinuxX11/PVRShellOS.h
+ @ingroup      OS_LinuxX11
+ @copyright    Copyright (c) Imagination Technologies Limited.
+ @brief        Initialization for the shell for LinuxX11.
+ @details      Makes programming for 3D APIs easier by wrapping surface
+               initialization, Texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+#ifndef _PVRSHELLOS_
+#define _PVRSHELLOS_
+
+#include "X11/Xlib.h"
+#include "X11/Xutil.h"
+#ifdef BUILD_OGL
+#include "X11/extensions/xf86vmode.h"
+#endif
+
+#define PVRSHELL_DIR_SYM	'/'
+#define _stricmp strcasecmp
+
+/*!
+ @addtogroup OS_LinuxX11 
+ @brief      LinuxX11 OS
+ @details    The following table illustrates how key codes are mapped in LinuxX11:
+             <table>
+             <tr><th> Key code    </th><th> nLastKeyPressed (PVRShell) </th></tr>
+             <tr><td> Esc	      </td><td> PVRShellKeyNameQUIT	       </td></tr>
+             <tr><td> F11	      </td><td> PVRShellKeyNameScreenshot  </td></tr>
+             <tr><td> Enter	      </td><td> PVRShellKeyNameSELECT 	   </td></tr>
+             <tr><td> '1'	      </td><td> PVRShellKeyNameACTION1	   </td></tr>
+             <tr><td> '2'	      </td><td> PVRShellKeyNameACTION2     </td></tr>
+             <tr><td> Up arrow    </td><td> m_eKeyMapUP		           </td></tr>
+             <tr><td> Down arrow  </td><td> m_eKeyMapDOWN 		       </td></tr>
+             <tr><td> Left arrow  </td><td> m_eKeyMapLEFT 		       </td></tr>
+             <tr><td> Right arrow </td><td> m_eKeyMapRIGHT		       </td></tr>
+             </table>
+ @{
+*/
+
+/*!***************************************************************************
+ @class PVRShellInitOS
+ @brief Interface with specific Operative System.
+*****************************************************************************/
+class PVRShellInitOS
+{
+public:
+	Display*     m_X11Display;
+	long         m_X11Screen;
+	XVisualInfo* m_X11Visual;
+	Colormap     m_X11ColorMap;
+	Window       m_X11Window;
+	timeval 	 m_StartTime;
+#ifdef BUILD_OGL
+    XF86VidModeModeLine m_OriginalMode;  // modeline that was active at the starting point of this aplication
+    int         m_i32OriginalModeDotClock;
+#endif
+
+	// Pixmap support: variables for the pixmap
+	Pixmap		m_X11Pixmap;
+	GC			m_X11GC;
+
+	unsigned int m_u32ButtonState; // 1 = left, 2 = right, 4 = middle
+
+public:
+	int OpenX11Window(const PVRShell &shell);
+	void CloseX11Window();
+};
+
+/*! @} */
+
+#endif /* _PVRSHELLOS_ */
+/*****************************************************************************
+ End of file (PVRShellOS.h)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/OS/Windows/PVRShellOS.cpp b/third_party/PowerVR_SDK/Shell/OS/Windows/PVRShellOS.cpp
new file mode 100644
index 0000000..31ab9fa
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/OS/Windows/PVRShellOS.cpp
@@ -0,0 +1,805 @@
+/******************************************************************************
+
+ @File         PVRShellOS.cpp
+
+ @Title        Windows/PVRShellOS
+
+ @Version      
+
+ @Copyright    Copyright (c) Imagination Technologies Limited.
+
+ @Platform     WinCE/Windows
+
+ @Description  Makes programming for 3D APIs easier by wrapping window creation
+               and other functions for use by a demo.
+
+******************************************************************************/
+
+/****************************************************************************
+ ** INCLUDES                                                               **
+ ****************************************************************************/
+#include <windows.h>
+#include <TCHAR.H>
+#include <stdio.h>
+
+#include "PVRShell.h"
+#include "PVRShellAPI.h"
+#include "PVRShellOS.h"
+#include "PVRShellImpl.h"
+
+// No Doxygen for CPP files, due to documentation duplication
+/// @cond NO_DOXYGEN
+
+#if !(WINVER >= 0x0500)
+	#define COMPILE_MULTIMON_STUBS
+	#include <multimon.h>
+#endif
+
+/****************************************************************************
+	Defines
+*****************************************************************************/
+/*! The class name for the window */
+#define WINDOW_CLASS _T("PVRShellClass")
+
+/*! Maximum size to create string array for determining the read/write paths */
+#define DIR_BUFFER_LEN	(10240)
+
+/*! X dimension of the window that is created */
+#define SHELL_DISPLAY_DIM_X	800
+/*! Y dimension of the window that is created */
+#define SHELL_DISPLAY_DIM_Y	600
+
+/*****************************************************************************
+	Declarations
+*****************************************************************************/
+LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
+
+/*!***************************************************************************
+	Class: PVRShellInit
+*****************************************************************************/
+
+/*!***********************************************************************
+@Function		PVRShellOutputDebug
+@Input			format			printf style format followed by arguments it requires
+@Description	Writes the resultant string to the debug output (e.g. using
+				printf(), OutputDebugString(), ...). Check the SDK release notes for
+				details on how the string is output.
+*************************************************************************/
+void PVRShell::PVRShellOutputDebug(char const * const format, ...) const
+{
+	va_list arg;
+	char	buf[1024];
+
+	va_start(arg, format);
+	vsnprintf(buf, 1024, format, arg);
+	va_end(arg);
+
+	// Passes the data to a platform dependant function
+	m_pShellInit->OsDisplayDebugString(buf);
+}
+
+/*!***********************************************************************
+ @Function		OsInit
+ @description	Initialisation for OS-specific code.
+*************************************************************************/
+void PVRShellInit::OsInit()
+{
+	m_hAccelTable = 0;
+
+	m_pShell->m_pShellData->nShellDimX = SHELL_DISPLAY_DIM_X;
+	m_pShell->m_pShellData->nShellDimY = SHELL_DISPLAY_DIM_Y;
+
+	m_hDC = 0;
+	m_hWnd = 0;
+
+	// Pixmap support: init variables to 0
+	m_hBmPixmap = 0;
+	m_hBmPixmapOld = 0;
+	m_hDcPixmap = 0;
+
+	/*
+		Construct the binary path for GetReadPath() and GetWritePath()
+	*/
+	{
+		/* Allocate memory for strings and return 0 if allocation failed */
+		TCHAR* exeNameTCHAR = new TCHAR[DIR_BUFFER_LEN];
+		char* exeName = new char[DIR_BUFFER_LEN];
+		if(exeNameTCHAR && exeName)
+		{
+			DWORD retSize;
+
+			/*
+				Get the data path and a default application name
+			*/
+
+			// Get full path of executable
+			retSize = GetModuleFileName(NULL, exeNameTCHAR, DIR_BUFFER_LEN);
+
+			if (DIR_BUFFER_LEN > (int)retSize)
+			{
+				/* Get string length in char */
+				retSize = (DWORD)_tcslen(exeNameTCHAR);
+
+				/* Convert TChar to char */
+				for (DWORD i = 0; i <= retSize; i++)
+				{
+					exeName[i] = (char)exeNameTCHAR[i];
+				}
+
+				SetAppName(exeName);
+				SetReadPath(exeName);
+				SetWritePath(exeName);
+			}
+		}
+
+		delete [] exeName;
+		delete [] exeNameTCHAR;
+	}
+
+	m_u32ButtonState = 0;	// clear mouse button state at startup
+}
+
+/*!***********************************************************************
+ @Function		OsInitOS
+ @description	Saves instance handle and creates main window
+				In this function, we save the instance handle in a global variable and
+				create and display the main program window.
+*************************************************************************/
+bool PVRShellInit::OsInitOS()
+{
+	MONITORINFO sMInfo;
+	TCHAR		*appName;
+	RECT		winRect;
+	POINT		p;
+
+	MyRegisterClass();
+
+	/*
+		Build the window title
+	*/
+	{
+		const char		*pszName, *pszSeparator, *pszVersion;
+		size_t			len;
+		unsigned int	out, in;
+
+		pszName			= (const char*)m_pShell->PVRShellGet(prefAppName);
+		pszSeparator	= STR_WNDTITLE;
+		pszVersion		= (const char*)m_pShell->PVRShellGet(prefVersion);
+
+		len = strlen(pszName)+strlen(pszSeparator)+strlen(pszVersion)+1;
+		appName = new TCHAR[len];
+
+		for(out = 0; (appName[out] = pszName[out]) != 0; ++out);
+		for(in = 0; (appName[out] = pszSeparator[in]) != 0; ++in, ++out);
+		for(in = 0; (appName[out] = pszVersion[in]) != 0; ++in, ++out);
+		_ASSERT(out == len-1);
+	}
+
+	/*
+		Retrieve the monitor information.
+
+		MonitorFromWindow() doesn't work, because the window hasn't been
+		created yet.
+	*/
+	{
+		HMONITOR	hMonitor;
+		BOOL		bRet;
+
+		p.x			= m_pShell->m_pShellData->nShellPosX;
+		p.y			= m_pShell->m_pShellData->nShellPosY;
+		hMonitor	= MonitorFromPoint(p, MONITOR_DEFAULTTOPRIMARY);
+		sMInfo.cbSize = sizeof(sMInfo);
+		bRet = GetMonitorInfo(hMonitor, &sMInfo);
+		_ASSERT(bRet);
+	}
+
+	/*
+		Reduce the window size until it fits on screen
+	*/
+	while(
+		(m_pShell->m_pShellData->nShellDimX > (sMInfo.rcMonitor.right - sMInfo.rcMonitor.left)) ||
+		(m_pShell->m_pShellData->nShellDimY > (sMInfo.rcMonitor.bottom - sMInfo.rcMonitor.top)))
+	{
+		m_pShell->m_pShellData->nShellDimX >>= 1;
+		m_pShell->m_pShellData->nShellDimY >>= 1;
+	}
+
+
+	/*
+		Create the window
+	*/
+
+	if(m_pShell->m_pShellData->bFullScreen)
+	{
+		m_hWnd = CreateWindow(WINDOW_CLASS, appName, WS_VISIBLE | WS_SYSMENU,CW_USEDEFAULT, CW_USEDEFAULT, m_pShell->m_pShellData->nShellDimX, m_pShell->m_pShellData->nShellDimY,
+				NULL, NULL, m_hInstance, this);
+
+		SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) &~ WS_CAPTION);
+		SetWindowPos(m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
+	}
+	else
+	{
+		int x, y;
+
+		SetRect(&winRect,
+			m_pShell->m_pShellData->nShellPosX,
+			m_pShell->m_pShellData->nShellPosY,
+			m_pShell->m_pShellData->nShellPosX+m_pShell->m_pShellData->nShellDimX,
+			m_pShell->m_pShellData->nShellPosY+m_pShell->m_pShellData->nShellDimY);
+		AdjustWindowRectEx(&winRect, WS_CAPTION|WS_SYSMENU, false, 0);
+
+		x = m_pShell->m_pShellData->nShellPosX - winRect.left;
+		winRect.left += x;
+		winRect.right += x;
+
+		y = m_pShell->m_pShellData->nShellPosY - winRect.top;
+		winRect.top += y;
+		winRect.bottom += y;
+
+		if(m_pShell->m_pShellData->bShellPosWasDefault)
+		{
+			x = CW_USEDEFAULT;
+			y = CW_USEDEFAULT;
+		}
+		else
+		{
+			x = winRect.left;
+			y = winRect.top;
+		}
+
+		m_hWnd = CreateWindow(WINDOW_CLASS, appName, WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
+			x, y, winRect.right-winRect.left, winRect.bottom-winRect.top, NULL, NULL, m_hInstance, this);
+
+	}
+
+	if(!m_hWnd)
+		return false;
+
+	if(m_pShell->m_pShellData->bFullScreen)
+	{
+		m_pShell->m_pShellData->nShellDimX = sMInfo.rcMonitor.right;
+		m_pShell->m_pShellData->nShellDimY = sMInfo.rcMonitor.bottom;
+		SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,m_pShell->m_pShellData->nShellDimX,m_pShell->m_pShellData->nShellDimY,0);
+	}
+
+	m_hDC = GetDC(m_hWnd);
+	ShowWindow(m_hWnd, m_nCmdShow);
+	UpdateWindow(m_hWnd);
+
+	delete [] appName;
+	return true;
+}
+
+/*!***********************************************************************
+ @Function		OsReleaseOS
+ @description	Destroys main window
+*************************************************************************/
+void PVRShellInit::OsReleaseOS()
+{
+	ReleaseDC(m_hWnd, m_hDC);
+	DestroyWindow(m_hWnd);
+}
+
+/*!***********************************************************************
+ @Function		OsExit
+ @description	Destroys main window
+*************************************************************************/
+void PVRShellInit::OsExit()
+{
+	const char	*szText;
+
+	/*
+		Show the exit message to the user
+	*/
+	szText		= (const char*)m_pShell->PVRShellGet(prefExitMessage);
+
+	int			i, nT, nC;
+	const char	*szCaption;
+	TCHAR		*tzText, *tzCaption;
+
+	szCaption	= (const char*)m_pShell->PVRShellGet(prefAppName);
+
+	if(!szText || !szCaption)
+		return;
+
+	nT = (int)strlen(szText) + 1;
+	nC = (int)strlen(szCaption) + 1;
+
+	tzText = (TCHAR*)malloc(nT * sizeof(*tzText));
+	tzCaption = (TCHAR*)malloc(nC * sizeof(*tzCaption));
+
+	for(i = 0; (tzText[i] = szText[i]) != 0; ++i);
+	for(i = 0; (tzCaption[i] = szCaption[i]) != 0; ++i);
+
+	MessageBox(NULL, tzText, tzCaption, MB_OK | MB_ICONINFORMATION | MB_SETFOREGROUND);
+
+	FREE(tzText);
+	FREE(tzCaption);
+}
+
+/*!***********************************************************************
+ @Function		OsDoInitAPI
+ @Return		true on success
+ @description	Perform API initialisation and bring up window / fullscreen
+*************************************************************************/
+bool PVRShellInit::OsDoInitAPI()
+{
+
+	// Pixmap support: create the pixmap
+	if(m_pShell->m_pShellData->bNeedPixmap)
+	{
+		m_hDcPixmap = CreateCompatibleDC(m_hDC);
+		m_hBmPixmap = CreateCompatibleBitmap(m_hDC, 640, 480);
+	}
+
+	if(!ApiInitAPI())
+	{
+		return false;
+	}
+
+	// Pixmap support: select the pixmap into a device context (DC) ready for blitting
+	if(m_pShell->m_pShellData->bNeedPixmap)
+	{
+		m_hBmPixmapOld = (HBITMAP)SelectObject(m_hDcPixmap, m_hBmPixmap);
+	}
+
+	SetForegroundWindow(m_hWnd);
+
+	/* No problem occured */
+	return true;
+}
+
+/*!***********************************************************************
+ @Function		OsDoReleaseAPI
+ @description	Clean up after we're done
+*************************************************************************/
+void PVRShellInit::OsDoReleaseAPI()
+{
+	ApiReleaseAPI();
+
+	if(m_pShell->m_pShellData->bNeedPixmap)
+	{
+		// Pixmap support: free the pixmap
+		SelectObject(m_hDcPixmap, m_hBmPixmapOld);
+		DeleteDC(m_hDcPixmap);
+		DeleteObject(m_hBmPixmap);
+	}
+}
+
+/*!***********************************************************************
+ @Function		OsRenderComplete
+ @Returns		false when the app should quit
+ @description	Main message loop / render loop
+*************************************************************************/
+void PVRShellInit::OsRenderComplete()
+{
+	MSG		msg;
+
+	/*
+		Process the message queue
+	*/
+	while(PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE))
+	{
+		if (!TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))
+		{
+			TranslateMessage(&msg);
+			DispatchMessage(&msg);
+		}
+	}
+
+}
+
+/*!***********************************************************************
+ @Function		OsPixmapCopy
+ @Return		true if the copy succeeded
+ @description	When using pixmaps, copy the render to the display
+*************************************************************************/
+bool PVRShellInit::OsPixmapCopy()
+{
+	return (BitBlt(m_hDC, 0, 0, 640, 480, m_hDcPixmap, 0, 0, SRCCOPY) == TRUE);
+}
+
+/*!***********************************************************************
+ @Function		OsGetNativeDisplayType
+ @Return		The 'NativeDisplayType' for EGL
+ @description	Called from InitAPI() to get the NativeDisplayType
+*************************************************************************/
+void *PVRShellInit::OsGetNativeDisplayType()
+{
+	return m_hDC;
+}
+
+/*!***********************************************************************
+ @Function		OsGetNativePixmapType
+ @Return		The 'NativePixmapType' for EGL
+ @description	Called from InitAPI() to get the NativePixmapType
+*************************************************************************/
+void *PVRShellInit::OsGetNativePixmapType()
+{
+	// Pixmap support: return the pixmap
+	return m_hBmPixmap;
+}
+
+/*!***********************************************************************
+ @Function		OsGetNativeWindowType
+ @Return		The 'NativeWindowType' for EGL
+ @description	Called from InitAPI() to get the NativeWindowType
+*************************************************************************/
+void *PVRShellInit::OsGetNativeWindowType()
+{
+	return m_hWnd;
+}
+
+/*!***********************************************************************
+ @Function		OsGet
+ @Input			prefName	Name of value to get
+ @Modified		pn A pointer set to the value asked for
+ @Returns		true on success
+ @Description	Retrieves OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsGet(const prefNameIntEnum prefName, int *pn)
+{
+	switch(prefName)
+	{
+	case prefButtonState:
+		*pn = m_u32ButtonState;
+		return true;
+	};
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsSet
+ @Input			prefName				Name of preference to set to value
+ @Input			value					Value
+ @Return		true for success
+ @Description	Sets OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsSet(const prefNameBoolEnum prefName, const bool value)
+{
+	switch(prefName)
+	{
+	case prefShowCursor:
+		ShowCursor(value ? TRUE : FALSE);
+		return true;
+	}
+
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsSet
+ @Input			prefName	Name of value to set
+ @Input			i32Value 	The value to set our named value to
+ @Returns		true on success
+ @Description	Sets OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsSet(const prefNameIntEnum prefName, const int i32Value)
+{
+	PVRSHELL_UNREFERENCED_PARAMETER(prefName);
+	PVRSHELL_UNREFERENCED_PARAMETER(i32Value);
+	return false;
+}
+
+/*!***********************************************************************
+ @Function		OsGet
+ @Input			prefName	Name of value to get
+ @Modified		pp A pointer set to the value asked for
+ @Returns		true on success
+ @Description	Retrieves OS-specific data
+*************************************************************************/
+bool PVRShellInit::OsGet(const prefNamePtrEnum prefName, void **pp)
+{
+	switch(prefName)
+	{
+	case prefHINSTANCE:
+		*pp = m_hInstance;
+		return true;
+	default:
+		return false;
+	}
+}
+
+/*!***********************************************************************
+ @Function		OsDisplayDebugString
+ @Input			str		string to output
+ @Description	Prints a debug string
+*************************************************************************/
+void PVRShellInit::OsDisplayDebugString(char const * const str)
+{
+	if(str)
+	{
+#if defined(UNICODE)
+		wchar_t	strc[1024];
+		int		i;
+
+		for(i = 0; (str[i] != '\0') && (i < (sizeof(strc) / sizeof(*strc))); ++i)
+		{
+			strc[i] = (wchar_t)str[i];
+		}
+
+		strc[i] = '\0';
+
+		OutputDebugString(strc);
+#else
+		OutputDebugString(str);
+#endif
+	}
+}
+
+/*!***********************************************************************
+ @Function		OsGetTime
+ @Return		An incrementing time value measured in milliseconds
+ @Description	Returns an incrementing time value measured in milliseconds
+*************************************************************************/
+unsigned long PVRShellInit::OsGetTime()
+{
+	return (unsigned long)GetTickCount();
+}
+
+/*****************************************************************************
+ Class: PVRShellInitOS
+*****************************************************************************/
+
+/*!******************************************************************************************
+@function		MyRegisterClass()
+@description	Registers the window class.
+				This function and its usage is only necessary if you want this code
+				to be compatible with Win32 systems prior to the 'RegisterClassEx'
+				function that was added to Windows 95. It is important to call this function
+				so that the application will get 'well formed' small icons associated
+				with it.
+**********************************************************************************************/
+ATOM PVRShellInitOS::MyRegisterClass()
+{
+	WNDCLASS wc;
+
+    wc.style			= CS_HREDRAW | CS_VREDRAW;
+	wc.lpfnWndProc		= (WNDPROC)WndProc;
+    wc.cbClsExtra		= 0;
+    wc.cbWndExtra		= 0;
+    wc.hInstance		= m_hInstance;
+    wc.hIcon			= LoadIcon(m_hInstance, _T("ICON"));
+    wc.hCursor			= 0;
+    wc.lpszMenuName		= 0;
+	wc.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
+    wc.lpszClassName	= WINDOW_CLASS;
+
+	return RegisterClass(&wc);
+}
+
+/*****************************************************************************
+ Global code
+*****************************************************************************/
+void doButtonDown(HWND hWnd, PVRShellInit *pData, EPVRShellButtonState eButton, LPARAM lParam)
+{
+	RECT rcWinDimensions;
+	GetClientRect(hWnd,&rcWinDimensions);
+	float vec2TouchPosition[2] = { (float)(short)LOWORD(lParam)/(float)(rcWinDimensions.right), (float)(short)HIWORD(lParam)/(float)(rcWinDimensions.bottom) };
+	pData->TouchBegan(vec2TouchPosition);
+	SetCapture(hWnd);	// must be within window so capture
+	pData->m_u32ButtonState |= eButton;
+}
+
+bool doButtonUp(HWND hWnd, PVRShellInit *pData, EPVRShellButtonState eButton, LPARAM lParam)
+{
+	RECT rcWinDimensions;
+	GetClientRect(hWnd,&rcWinDimensions);
+	float vec2TouchPosition[2] = { (float)(short)LOWORD(lParam)/(float)(rcWinDimensions.right), (float)(short)HIWORD(lParam)/(float)(rcWinDimensions.bottom) };
+	pData->TouchEnded(vec2TouchPosition);
+	pData->m_u32ButtonState &= (~eButton);
+
+	if(vec2TouchPosition[0] < 0.f || vec2TouchPosition[0] > 1.f || vec2TouchPosition[1] < 0.f || vec2TouchPosition[1] > 1.f)
+	{	// pointer has left window
+		if(pData->m_u32ButtonState==0)
+		{	// only release capture if mouse buttons have been released
+			ReleaseCapture();
+		}
+
+		return false;
+	}
+	return true;
+}
+
+/*!***************************************************************************
+@function		WndProc
+@input			hWnd		Handle to the window
+@input			message		Specifies the message
+@input			wParam		Additional message information
+@input			lParam		Additional message information
+@returns		result code to OS
+@description	Processes messages for the main window.
+*****************************************************************************/
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+	PVRShellInit *pData = (PVRShellInit*) GetWindowLongPtr(hWnd, GWLP_USERDATA);
+
+	switch (message)
+	{
+	case WM_CREATE:
+		{
+			CREATESTRUCT	*pCreate = (CREATESTRUCT*)lParam;
+			SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pCreate->lpCreateParams);
+			break;
+		}
+	case WM_PAINT:
+		break;
+	case WM_DESTROY:
+		return 0;
+	case WM_CLOSE:
+		pData->gShellDone = true;
+		return 0;
+	case WM_QUIT:
+		return 0;
+	case WM_MOVE:
+		pData->m_pShell->PVRShellSet(prefPositionX, (int)LOWORD(lParam));
+		pData->m_pShell->PVRShellSet(prefPositionY, (int)HIWORD(lParam)); 
+		break;
+	case WM_LBUTTONDOWN:
+		{
+			doButtonDown(hWnd,pData,ePVRShellButtonLeft,lParam);
+			break;
+		}
+	case WM_LBUTTONUP:
+		{
+			if(!doButtonUp(hWnd,pData,ePVRShellButtonLeft,lParam))
+				return false;
+		break;
+		}
+	case WM_RBUTTONDOWN:
+		{
+			doButtonDown(hWnd,pData,ePVRShellButtonRight,lParam);
+			break;
+		}
+	case WM_RBUTTONUP:
+		{
+			if(!doButtonUp(hWnd,pData,ePVRShellButtonRight,lParam))
+				return false;
+			break;
+		}
+	case WM_MBUTTONDOWN:
+		{
+			doButtonDown(hWnd,pData,ePVRShellButtonMiddle,lParam);
+			break;
+		}
+	case WM_MBUTTONUP:
+		{
+			if(!doButtonUp(hWnd,pData,ePVRShellButtonMiddle,lParam))
+				return false;
+			break;
+		}
+	case WM_MOUSEMOVE:
+		{
+			RECT rcWinDimensions;
+			GetClientRect(hWnd,&rcWinDimensions);
+			float vec2TouchPosition[2] = { (float)(short)LOWORD(lParam)/(float)(rcWinDimensions.right), (float)(short)HIWORD(lParam)/(float)(rcWinDimensions.bottom) };
+			
+			if(vec2TouchPosition[0] < 0.f || vec2TouchPosition[0] > 1.f || vec2TouchPosition[1] < 0.f || vec2TouchPosition[1] > 1.f)
+			{	
+				// pointer has left window
+				if(pData->m_u32ButtonState==0)
+				{	// only release capture if mouse buttons have been released
+					ReleaseCapture();
+				}
+
+				pData->TouchEnded(vec2TouchPosition);
+				return false;
+			}
+			else
+			{	// pointer is inside window
+				pData->TouchMoved(vec2TouchPosition);
+			}
+			break;
+		}
+	case WM_SETFOCUS:
+		pData->m_bHaveFocus = true;
+		return 0;
+	case WM_KILLFOCUS:
+		pData->m_bHaveFocus = false;
+		return 0;
+	case WM_KEYDOWN:
+	{
+		switch(wParam)
+		{
+		case VK_ESCAPE:
+		case 0xC1:
+			pData->KeyPressed(PVRShellKeyNameQUIT);
+			break;
+		case VK_UP:
+		case 0x35:
+			pData->KeyPressed(pData->m_eKeyMapUP);
+			break;
+		case VK_DOWN:
+		case 0x30:
+			pData->KeyPressed(pData->m_eKeyMapDOWN);
+			break;
+		case VK_LEFT:
+		case 0x37:
+			pData->KeyPressed(pData->m_eKeyMapLEFT);
+			break;
+		case VK_RIGHT:
+		case 0x39:
+			pData->KeyPressed(pData->m_eKeyMapRIGHT);
+			break;
+		case VK_SPACE:
+		case 0x38:
+			pData->KeyPressed(PVRShellKeyNameSELECT);
+			break;
+		case '1':
+		case 0x34:
+			pData->KeyPressed(PVRShellKeyNameACTION1);
+			break;
+		case '2':
+		case 0x36:
+			pData->KeyPressed(PVRShellKeyNameACTION2);
+			break;
+		case VK_F11:
+		case 0xC2:
+			pData->KeyPressed(PVRShellKeyNameScreenshot);
+			break;
+		}
+	}
+	default:
+		break;
+	}
+
+	return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+/*!***************************************************************************
+@function		WinMain
+@input			hInstance		Application instance from OS
+@input			hPrevInstance	Always NULL
+@input			lpCmdLine		command line from OS
+@input			nCmdShow		Specifies how the window is to be shown
+@returns		result code to OS
+@description	Main function of the program
+*****************************************************************************/
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, TCHAR *lpCmdLine, int nCmdShow)
+{
+	size_t			i;
+	char			*pszCmdLine;
+	PVRShellInit	init;
+
+	PVRSHELL_UNREFERENCED_PARAMETER(hPrevInstance);
+
+#if defined(_WIN32)
+	// Enable memory-leak reports
+	_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
+#endif
+
+	// Get a char-array command line as the input may be UNICODE
+	i = _tcslen(lpCmdLine) + 1;
+	pszCmdLine = new char[i];
+
+	while(i)
+	{
+		--i;
+		pszCmdLine[i] = (char)lpCmdLine[i];
+	}
+
+	//	Init the demo, process the command line, create the OS initialiser.
+	if(!init.Init())
+	{
+		delete[] pszCmdLine;
+		return EXIT_ERR_CODE;
+	}
+
+	init.CommandLine(pszCmdLine);
+	init.m_hInstance = hInstance;
+	init.m_nCmdShow = nCmdShow;
+
+	//	Initialise/run/shutdown
+	while(init.Run());
+
+	delete[] pszCmdLine;
+
+	return EXIT_NOERR_CODE;
+}
+
+/// @endcond
+
+/*****************************************************************************
+ End of file (PVRShellOS.cpp)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/OS/Windows/PVRShellOS.h b/third_party/PowerVR_SDK/Shell/OS/Windows/PVRShellOS.h
new file mode 100644
index 0000000..6268b99
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/OS/Windows/PVRShellOS.h
@@ -0,0 +1,77 @@
+/*!****************************************************************************
+
+ @file         Windows/PVRShellOS.h
+ @ingroup      OS_Windows
+ @copyright    Copyright (c) Imagination Technologies Limited.
+ @brief        Initialization for the shell for the Windows OS.
+ @details      Makes programming for 3D APIs easier by wrapping surface
+               initialization, Texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+#ifndef _PVRSHELLOS_
+#define _PVRSHELLOS_
+
+#include <windows.h>
+
+// The following defines are for Windows PC platforms only
+#if defined(_WIN32)
+// Enable the following 2 lines for memory leak checking - also see WinMain()
+#define _CRTDBG_MAP_ALLOC
+#include <crtdbg.h>
+#endif
+
+#define PVRSHELL_DIR_SYM	'\\'
+#define vsnprintf _vsnprintf
+
+/*!
+ @addtogroup OS_Windows 
+ @brief      Windows OS
+ @details    The following table illustrates how key codes are mapped in Windows:
+             <table>
+             <tr><th> Key code </th><th> KeyPressed (PVRShell)     </th></tr>
+             <tr><td> ESCAPE   </td><td> PVRShellKeyNameQUIT	   </td></tr>
+             <tr><td> UP       </td><td> m_eKeyMapUP	           </td></tr>
+             <tr><td> DOWN     </td><td> m_eKeyMapDOWN	           </td></tr>
+             <tr><td> LEFT     </td><td> m_eKeyMapLEFT             </td></tr>
+             <tr><td> RIGHT    </td><td> m_eKeyMapRIGHT            </td></tr>
+             <tr><td> SPACE    </td><td> PVRShellKeyNameSELECT     </td></tr>
+             <tr><td> '1'      </td><td> PVRShellKeyNameACTION1    </td></tr>
+             <tr><td> '2'      </td><td> PVRShellKeyNameACTION2    </td></tr>
+             <tr><td> F11      </td><td> PVRShellKeyNameScreenshot </td></tr>
+             </table>
+ @{
+*/
+
+/*!***************************************************************************
+ @class PVRShellInitOS
+ @brief Interface with specific Operating System.
+*****************************************************************************/
+class PVRShellInitOS
+{
+public:
+	HDC			m_hDC;
+	HWND		m_hWnd;
+
+	// Pixmap support: variables for the pixmap
+	HBITMAP		m_hBmPixmap, m_hBmPixmapOld;
+	HDC			m_hDcPixmap;
+
+	HACCEL		m_hAccelTable;
+	HINSTANCE	m_hInstance;
+	int			m_nCmdShow;
+
+	bool		m_bHaveFocus;
+
+	unsigned int	m_u32ButtonState;
+
+public:
+	ATOM MyRegisterClass();
+};
+
+/*! @} */
+
+#endif /* _PVRSHELLOS_ */
+/*****************************************************************************
+ End of file (PVRShellOS.h)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/PVRShell.cpp b/third_party/PowerVR_SDK/Shell/PVRShell.cpp
new file mode 100644
index 0000000..d29b625
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/PVRShell.cpp
@@ -0,0 +1,1777 @@
+/******************************************************************************
+
+ @file         Shell/PVRShell.cpp
+ @copyright    Copyright (c) Imagination Technologies Limited.
+ @brief        Makes programming for 3D APIs easier by wrapping surface
+               initialization, Texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <math.h>
+
+#include "PVRShell.h"
+#include "PVRShellOS.h"
+#include "PVRShellAPI.h"
+#include "PVRShellImpl.h"
+
+/*! This file simply defines a version string. It can be commented out. */
+#include "sdkver.h"
+#ifndef PVRSDK_VERSION
+#define PVRSDK_VERSION "n.nn.nn.nnnn"
+#endif
+
+/*! Define to automatically stop the app after x frames. If negative, run forever. */
+#ifndef PVRSHELL_QUIT_AFTER_FRAME
+#define PVRSHELL_QUIT_AFTER_FRAME -1
+#endif
+
+/*! Define to automatically stop the app after x amount of seconds. If negative, run forever. */
+#ifndef PVRSHELL_QUIT_AFTER_TIME
+#define PVRSHELL_QUIT_AFTER_TIME -1
+#endif
+
+/*! Define for the screen shot file name. */
+#define PVRSHELL_SCREENSHOT_NAME	"PVRShell"
+
+#if defined(_WIN32)
+#define snprintf _snprintf
+#endif
+
+// No Doxygen for CPP files, due to documentation duplication
+/// @cond NO_DOXYGEN
+
+// Define DISABLE_SWIPE_MAPPING to disable the PVRShell's simple mapping of swipes to key commands.
+//#define DISABLE_SWIPE_MAPPING 1
+/*****************************************************************************
+** Prototypes
+*****************************************************************************/
+static bool StringCopy(char *&pszStr, const char * const pszSrc);
+
+/****************************************************************************
+** Class: PVRShell
+****************************************************************************/
+
+/*!***********************************************************************
+ @brief		Constructor
+*************************************************************************/
+PVRShell::PVRShell()
+{
+	m_pShellInit = NULL;
+	m_pShellData = new PVRShellData;
+
+	m_pShellData->nShellPosX=0;
+	m_pShellData->nShellPosY=0;
+
+	m_pShellData->bFullScreen = false;	// note this may be overridden by some OS versions of PVRShell
+
+	m_pShellData->nAASamples= 0;
+	m_pShellData->nColorBPP = 0;
+	m_pShellData->nDepthBPP = 0;
+
+	m_pShellData->nDieAfterFrames = PVRSHELL_QUIT_AFTER_FRAME;
+	m_pShellData->fDieAfterTime = PVRSHELL_QUIT_AFTER_TIME;
+
+	m_pShellData->bNeedPbuffer = false;
+	m_pShellData->bNeedPixmap = false;
+	m_pShellData->bNeedPixmapDisableCopy = false;
+	m_pShellData->bNeedZbuffer = true;
+	m_pShellData->bLockableBackBuffer = false;
+	m_pShellData->bSoftwareRender = false;
+	m_pShellData->bNeedStencilBuffer = false;
+
+	m_pShellData->bNeedAlphaFormatPre = false;
+	m_pShellData->bUsingPowerSaving = true;
+	m_pShellData->bOutputInfo = false;
+	m_pShellData->bNoShellSwapBuffer = false;
+
+	m_pShellData->pszAppName = 0;
+	m_pShellData->pszExitMessage = 0;
+
+	m_pShellData->nSwapInterval = 1;
+	m_pShellData->nInitRepeats = 0;
+
+	m_pShellData->nCaptureFrameStart = -1;
+	m_pShellData->nCaptureFrameStop  = -1;
+	m_pShellData->nCaptureFrameScale = 1;
+
+	m_pShellData->nPriority = 2;
+
+	m_pShellData->bForceFrameTime = false;
+	m_pShellData->nFrameTime = 33;
+
+	// Internal Data
+	m_pShellData->bShellPosWasDefault = true;
+	m_pShellData->nShellCurFrameNum = 0;
+#ifdef PVRSHELL_FPS_OUTPUT
+	m_pShellData->bOutputFPS = false;
+#endif
+	m_pShellData->bDiscardFrameColor=false;
+	m_pShellData->bDiscardFrameDepth=true;
+	m_pShellData->bDiscardFrameStencil=true;
+}
+
+/*!***********************************************************************
+ @brief		Destructor
+*************************************************************************/
+PVRShell::~PVRShell()
+{
+	delete m_pShellData;
+	m_pShellData = NULL;
+}
+
+// Allow user to set preferences from within InitApplication
+
+/*!***********************************************************************
+ @brief     This function is used to pass preferences to the PVRShell.
+            If used, this function must be called from InitApplication().
+ @param[in] prefName    Name of preference to set to value
+ @param[in] value       Value
+ @return    true for success
+*************************************************************************/
+
+bool PVRShell::PVRShellSet(const prefNameBoolEnum prefName, const bool value)
+{
+	switch(prefName)
+	{
+	case prefFullScreen:
+		m_pShellData->bFullScreen = value;
+		return true;
+
+	case prefPBufferContext:
+		m_pShellData->bNeedPbuffer = value;
+		return true;
+
+	case prefPixmapContext:
+		m_pShellData->bNeedPixmap = value;
+		return true;
+
+	case prefPixmapDisableCopy:
+		m_pShellData->bNeedPixmapDisableCopy = value;
+		return true;
+
+	case prefZbufferContext:
+		m_pShellData->bNeedZbuffer = value;
+		return true;
+
+	case prefLockableBackBuffer:
+		m_pShellData->bLockableBackBuffer = value;
+		return true;
+
+	case prefSoftwareRendering:
+		m_pShellData->bSoftwareRender = value;
+		return true;
+
+	case prefStencilBufferContext:
+		m_pShellData->bNeedStencilBuffer = value;
+		return true;
+
+	case prefAlphaFormatPre:
+		m_pShellData->bNeedAlphaFormatPre = value;
+		return true;
+
+	case prefPowerSaving:
+		m_pShellData->bUsingPowerSaving = value;
+		return true;
+
+	case prefOutputInfo:
+		m_pShellData->bOutputInfo = value;
+		return true;
+
+	case prefNoShellSwapBuffer:
+		m_pShellData->bNoShellSwapBuffer = value;
+		return true;
+
+	case prefForceFrameTime:
+		m_pShellData->bForceFrameTime = value;
+		return true;
+
+#ifdef PVRSHELL_FPS_OUTPUT
+	case prefOutputFPS:
+		m_pShellData->bOutputFPS = value;
+		return true;
+#endif
+
+	case prefDiscardColor: 
+		m_pShellData->bDiscardFrameColor = value;
+		return true;
+	case prefDiscardDepth: 
+		m_pShellData->bDiscardFrameDepth = value;
+		return true;
+	case prefDiscardStencil: 
+		m_pShellData->bDiscardFrameStencil = value;
+		return true;
+	default:
+		return m_pShellInit->OsSet(prefName, value);
+	}
+}
+
+/*!***********************************************************************
+ @brief      This function is used to get parameters from the PVRShell.
+             It can be called from anywhere in the program.
+ @param[in]  prefName    Name of preference to set to value
+ @return     The requested value.
+*************************************************************************/
+
+bool PVRShell::PVRShellGet(const prefNameBoolEnum prefName) const
+{
+	switch(prefName)
+	{
+	case prefFullScreen:	return m_pShellData->bFullScreen;
+	case prefIsRotated:	return (m_pShellData->nShellDimY > m_pShellData->nShellDimX);
+	case prefPBufferContext:	return m_pShellData->bNeedPbuffer;
+	case prefPixmapContext:	return m_pShellData->bNeedPixmap;
+	case prefPixmapDisableCopy:	return m_pShellData->bNeedPixmapDisableCopy;
+	case prefZbufferContext:	return m_pShellData->bNeedZbuffer;
+	case prefLockableBackBuffer:	return m_pShellData->bLockableBackBuffer;
+	case prefSoftwareRendering:	return m_pShellData->bSoftwareRender;
+	case prefNoShellSwapBuffer: return m_pShellData->bNoShellSwapBuffer;
+	case prefStencilBufferContext:	return m_pShellData->bNeedStencilBuffer;
+	case prefAlphaFormatPre: return m_pShellData->bNeedAlphaFormatPre;
+	case prefPowerSaving: return m_pShellData->bUsingPowerSaving;
+	case prefOutputInfo:	return m_pShellData->bOutputInfo;
+	case prefForceFrameTime: return m_pShellData->bForceFrameTime;
+#ifdef PVRSHELL_FPS_OUTPUT
+	case prefOutputFPS: return m_pShellData->bOutputFPS;
+#endif
+	case prefDiscardColor: return m_pShellData->bDiscardFrameColor;
+	case prefDiscardDepth: return m_pShellData->bDiscardFrameDepth;
+	case prefDiscardStencil: return m_pShellData->bDiscardFrameStencil;
+	default:	return false;
+	}
+}
+
+/*!***********************************************************************
+ @brief     This function is used to pass preferences to the PVRShell.
+            If used, this function must be called from InitApplication().
+ @param[in] prefName    Name of preference to set to value
+ @param[in] value       Value
+ @return    true for success
+*************************************************************************/
+
+bool PVRShell::PVRShellSet(const prefNameFloatEnum prefName, const float value)
+{
+	switch(prefName)
+	{
+	case prefQuitAfterTime:
+		m_pShellData->fDieAfterTime = value;
+		return true;
+
+	default:
+		break;
+	}
+	return false;
+}
+
+/*!***********************************************************************
+ @brief      This function is used to get parameters from the PVRShell.
+             It can be called from anywhere in the program.
+ @param[in]  prefName    Name of preference to set to value
+ @return     The requested value.
+*************************************************************************/
+float PVRShell::PVRShellGet(const prefNameFloatEnum prefName) const
+{
+	switch(prefName)
+	{
+	case prefQuitAfterTime:	return m_pShellData->fDieAfterTime;
+	default:	return -1;
+	}
+}
+
+/*!***********************************************************************
+ @brief     This function is used to pass preferences to the PVRShell.
+            If used, this function must be called from InitApplication().
+ @param[in] prefName    Name of preference to set to value
+ @param[in] value       Value
+ @return    true for success
+*************************************************************************/
+bool PVRShell::PVRShellSet(const prefNameIntEnum prefName, const int value)
+{
+	switch(prefName)
+	{
+	case prefWidth:
+		if(value > 0)
+		{
+			m_pShellData->nShellDimX = value;
+			return true;
+		}
+		return false;
+
+	case prefHeight:
+		if(value > 0)
+		{
+			m_pShellData->nShellDimY = value;
+			return true;
+		}
+		return false;
+
+	case prefPositionX:
+		m_pShellData->bShellPosWasDefault = false;
+		m_pShellData->nShellPosX = value;
+		return true;
+
+	case prefPositionY:
+		m_pShellData->bShellPosWasDefault = false;
+		m_pShellData->nShellPosY = value;
+		return true;
+
+	case prefQuitAfterFrame:
+		m_pShellData->nDieAfterFrames = value;
+		return true;
+
+	case prefInitRepeats:
+		m_pShellData->nInitRepeats = value;
+		return true;
+
+	case prefAASamples:
+		if(value >= 0)
+		{
+			m_pShellData->nAASamples = value;
+			return true;
+		}
+		return false;
+
+	case prefColorBPP:
+		if(value >= 0)
+		{
+			m_pShellData->nColorBPP = value;
+			return true;
+		}
+		return false;
+
+	case prefDepthBPP:
+		if(value >= 0)
+		{
+			m_pShellData->nDepthBPP = value;
+			return true;
+		}
+		return false;
+
+	case prefRotateKeys:
+		{
+			switch((PVRShellKeyRotate)value)
+			{
+			case PVRShellKeyRotateNone:
+				m_pShellInit->m_eKeyMapUP = PVRShellKeyNameUP;
+				m_pShellInit->m_eKeyMapLEFT = PVRShellKeyNameLEFT;
+				m_pShellInit->m_eKeyMapDOWN = PVRShellKeyNameDOWN;
+				m_pShellInit->m_eKeyMapRIGHT = PVRShellKeyNameRIGHT;
+				break;
+			case PVRShellKeyRotate90:
+				m_pShellInit->m_eKeyMapUP = PVRShellKeyNameLEFT;
+				m_pShellInit->m_eKeyMapLEFT = PVRShellKeyNameDOWN;
+				m_pShellInit->m_eKeyMapDOWN = PVRShellKeyNameRIGHT;
+				m_pShellInit->m_eKeyMapRIGHT = PVRShellKeyNameUP;
+				break;
+			case PVRShellKeyRotate180:
+				m_pShellInit->m_eKeyMapUP = PVRShellKeyNameDOWN;
+				m_pShellInit->m_eKeyMapLEFT = PVRShellKeyNameRIGHT;
+				m_pShellInit->m_eKeyMapDOWN = PVRShellKeyNameUP;
+				m_pShellInit->m_eKeyMapRIGHT = PVRShellKeyNameLEFT;
+				break;
+			case PVRShellKeyRotate270:
+				m_pShellInit->m_eKeyMapUP = PVRShellKeyNameRIGHT;
+				m_pShellInit->m_eKeyMapLEFT = PVRShellKeyNameUP;
+				m_pShellInit->m_eKeyMapDOWN = PVRShellKeyNameLEFT;
+				m_pShellInit->m_eKeyMapRIGHT = PVRShellKeyNameDOWN;
+				break;
+			default:
+				return false;
+			}
+		}
+			return true;
+	case prefCaptureFrameStart:
+		m_pShellData->nCaptureFrameStart = value;
+		return true;
+	case prefCaptureFrameStop:
+		m_pShellData->nCaptureFrameStop  = value;
+		return true;
+	case prefCaptureFrameScale:
+		m_pShellData->nCaptureFrameScale  = value;
+		return true;
+	case prefFrameTimeValue:
+		m_pShellData->nFrameTime = value;
+		return true;
+	default:
+		{
+			if(m_pShellInit->ApiSet(prefName, value))
+				return true;
+
+			return m_pShellInit->OsSet(prefName, value);
+		}
+	}
+}
+
+/*!***********************************************************************
+ @brief      This function is used to get parameters from the PVRShell.
+             It can be called from anywhere in the program.
+ @param[in]  prefName    Name of preference to set to value
+ @return     The requested value.
+*************************************************************************/
+int PVRShell::PVRShellGet(const prefNameIntEnum prefName) const
+{
+	switch(prefName)
+	{
+	case prefWidth:	return m_pShellData->nShellDimX;
+	case prefHeight:	return m_pShellData->nShellDimY;
+	case prefPositionX:	return m_pShellData->nShellPosX;
+	case prefPositionY:	return m_pShellData->nShellPosY;
+	case prefQuitAfterFrame:	return m_pShellData->nDieAfterFrames;
+	case prefSwapInterval:	return m_pShellData->nSwapInterval;
+	case prefInitRepeats:	return m_pShellData->nInitRepeats;
+	case prefAASamples:	return m_pShellData->nAASamples;
+	case prefCommandLineOptNum:	return m_pShellInit->m_CommandLine.m_nOptLen;
+	case prefColorBPP: return m_pShellData->nColorBPP;
+	case prefDepthBPP: return m_pShellData->nDepthBPP;
+	case prefCaptureFrameStart: return m_pShellData->nCaptureFrameStart;
+	case prefCaptureFrameStop: return m_pShellData->nCaptureFrameStop;
+	case prefCaptureFrameScale: return m_pShellData->nCaptureFrameScale;
+	case prefFrameTimeValue: return m_pShellData->nFrameTime;
+	case prefPriority: return m_pShellData->nPriority;
+	default:
+		{
+			int n;
+
+			if(m_pShellInit->ApiGet(prefName, &n))
+				return n;
+			if(m_pShellInit->OsGet(prefName, &n))
+				return n;
+			return -1;
+		}
+	}
+}
+
+/*!***********************************************************************
+ @brief     This function is used to pass preferences to the PVRShell.
+            If used, this function must be called from InitApplication().
+ @param[in] prefName    Name of preference to set to value
+ @param[in] value       Value
+ @return    true for success
+*************************************************************************/
+bool PVRShell::PVRShellSet(const prefNamePtrEnum prefName, const void * const ptrValue)
+{
+    PVRSHELL_UNREFERENCED_PARAMETER(prefName);
+    PVRSHELL_UNREFERENCED_PARAMETER(ptrValue);
+	return false;
+}
+
+/*!***********************************************************************
+ @brief      This function is used to get parameters from the PVRShell.
+             It can be called from anywhere in the program.
+ @param[in]  prefName    Name of preference to set to value
+ @return     The requested value.
+*************************************************************************/
+void *PVRShell::PVRShellGet(const prefNamePtrEnum prefName) const
+{
+	switch(prefName)
+	{
+	case prefNativeWindowType:	return m_pShellInit->OsGetNativeWindowType();
+	case prefPointerLocation:
+		if (m_pShellInit->m_bTouching)
+			return m_pShellInit->m_vec2PointerLocation;
+	break;
+	default:
+		{
+			void *p;
+
+			if(m_pShellInit->ApiGet(prefName, &p))
+				return p;
+			if(m_pShellInit->OsGet(prefName, &p))
+				return p;
+		}
+	}
+	return NULL;
+}
+
+/*!***********************************************************************
+ @brief     This function is used to pass preferences to the PVRShell.
+            If used, this function must be called from InitApplication().
+ @param[in] prefName    Name of preference to set to value
+ @param[in] value       Value
+ @return    true for success
+*************************************************************************/
+bool PVRShell::PVRShellSet(const prefNameConstPtrEnum prefName, const void * const ptrValue)
+{
+	switch(prefName)
+	{
+	case prefAppName:
+		StringCopy(m_pShellData->pszAppName, (char*)ptrValue);
+		return true;
+	case prefExitMessage:
+		StringCopy(m_pShellData->pszExitMessage, (char*)ptrValue);
+		PVRShellOutputDebug("Exit message has been set to: \"%s\".\n", ptrValue);
+		return true;
+	default:
+		break;
+	}
+	return false;
+}
+
+/*!***********************************************************************
+ @brief      This function is used to get parameters from the PVRShell.
+             It can be called from anywhere in the program.
+ @param[in]  prefName    Name of preference to set to value
+ @return     The requested value.
+*************************************************************************/
+const void *PVRShell::PVRShellGet(const prefNameConstPtrEnum prefName) const
+{
+	switch(prefName)
+	{
+	case prefAppName:
+		return m_pShellData->pszAppName;
+	case prefExitMessage:
+		return m_pShellData->pszExitMessage;
+	case prefReadPath:
+		return m_pShellInit->GetReadPath();
+	case prefWritePath:
+		return m_pShellInit->GetWritePath();
+	case prefCommandLine:
+		return m_pShellInit->m_CommandLine.m_psOrig;
+	case prefCommandLineOpts:
+		return m_pShellInit->m_CommandLine.m_pOpt;
+	case prefVersion:
+		return PVRSDK_VERSION;
+	default:
+		return 0;
+	}
+}
+
+/*!***********************************************************************
+ @brief	     It will be stored as 24-bit per pixel, 8-bit per chanel RGB. 
+             The memory should be freed with free() when no longer needed.
+ @param[in]	 Width		size of image to capture (relative to 0,0)
+ @param[in]	 Height		size of image to capture (relative to 0,0)
+ @param[out] pLines		receives a pointer to an area of memory containing the screen buffer.
+ @return	 true for success
+*************************************************************************/
+bool PVRShell::PVRShellScreenCaptureBuffer(const int Width, const int Height, unsigned char **pLines)
+{
+	/* Allocate memory for line */
+	*pLines=(unsigned char *)calloc(Width*Height*3, sizeof(unsigned char));
+	if (!(*pLines)) return false;
+
+	return m_pShellInit->ApiScreenCaptureBuffer(Width, Height, *pLines);
+}
+
+/*!***********************************************************************
+ @brief 	Writes out the image data to a BMP file with basename fname.
+ @details   The file written will be fname suffixed with a number to make the file unique.
+            For example, if fname is "abc", this function will attempt
+            to save to "abc0000.bmp"; if that file already exists, it
+            will try "abc0001.bmp", repeating until a new filename is
+            found. The final filename used is returned in ofname.
+ @param[in]	 fname		base of file to save screen to
+ @param[in]	 Width		size of image to capture (relative to 0,0)
+ @param[in]	 Height		size of image to capture (relative to 0,0)
+ @param[in]  pLines		image data to write out (24bpp, 8-bit per channel RGB)
+ @param[in]  ui32PixelReplicate    expand pixels through replication (1 = no scale)
+ @param[out] ofname		If non-NULL, receives the filename actually used
+ @return	 true for success
+*************************************************************************/
+int PVRShell::PVRShellScreenSave(
+	const char			* const fname,
+	const int			Width,
+	const int			Height,
+	const unsigned char	* const pLines,
+	const unsigned int	ui32PixelReplicate,
+	char				* const ofname)
+{
+	char *pszFileName;
+
+	/*
+		Choose a filename
+	*/
+	{
+		FILE		*file = 0;
+		const char	*pszWritePath;
+		int			nScreenshotCount;
+
+		pszWritePath = (const char*)PVRShellGet(prefWritePath);
+
+		size_t	nFileNameSize = strlen(pszWritePath) + 200;
+		pszFileName = (char*)malloc(nFileNameSize);
+
+		/* Look for the first file name that doesn't already exist */
+		for(nScreenshotCount = 0; nScreenshotCount < 10000; ++nScreenshotCount)
+		{
+			snprintf(pszFileName, nFileNameSize, "%s%s%04d.bmp", pszWritePath, fname, nScreenshotCount);
+
+			file = fopen(pszFileName,"r");
+			if(!file)
+				break;
+			fclose(file);
+		}
+
+		/* If all files already exist, replace the first one */
+		if (nScreenshotCount==10000)
+		{
+			snprintf(pszFileName, nFileNameSize, "%s%s0000.bmp", pszWritePath, fname);
+			PVRShellOutputDebug("PVRShell: *WARNING* : Overwriting %s\n", pszFileName);
+		}
+
+		if(ofname)	// requested the output file name
+		{
+			strcpy(ofname, pszFileName);
+		}
+	}
+
+	const int err = PVRShellWriteBMPFile(pszFileName, Width, Height, pLines, ui32PixelReplicate);
+	FREE(pszFileName);
+	if (err)
+	{
+		return 10*err+1;
+	}
+	else
+	{
+		// No problem occurred
+		return 0;
+	}
+}
+
+/*!***********************************************************************
+ @brief       Swaps the bytes in pBytes from little to big endian (or vice versa)
+ @param[in]	  pBytes     The bytes to swap
+ @param[in]	  i32ByteNo  The number of bytes to swap
+*************************************************************************/
+inline void PVRShellByteSwap(unsigned char* pBytes, int i32ByteNo)
+{
+	int i = 0, j = i32ByteNo - 1;
+
+	while(i < j)
+	{
+		unsigned char cTmp = pBytes[i];
+		pBytes[i] = pBytes[j];
+		pBytes[j] = cTmp;
+
+		++i;
+		--j;
+	}
+}
+
+/*!***********************************************************************
+ @brief	        Writes out the image data to a BMP file with name fname.
+ @param[in]		pszFilename		file to save screen to
+ @param[in]		ui32Width		the width of the data
+ @param[in]		ui32Height		the height of the data
+ @param[in]		pImageData		image data to write out (24bpp, 8-bit per channel RGB)
+ @return		0 on success
+*************************************************************************/
+int PVRShell::PVRShellWriteBMPFile(
+	const char			* const pszFilename,
+	const unsigned int	ui32Width,
+	const unsigned int	ui32Height,
+	const void			* const pImageData,
+	const unsigned int	ui32PixelReplicate)
+{
+#define ByteSwap(x) PVRShellByteSwap((unsigned char*) &x, sizeof(x))
+
+	const int		i32BMPHeaderSize = 14; /* The size of a BMP header */
+	const int		i32BMPInfoSize   = 40; /* The size of a BMP info header */
+	int				Result = 1;
+	FILE*			fpDumpfile = 0;
+
+	fpDumpfile = fopen(pszFilename, "wb");
+
+	if (fpDumpfile != 0)
+	{
+		const short int word = 0x0001;
+		const char * const byte = (char*) &word;
+		bool bLittleEndian = byte[0] ? true : false;
+
+		unsigned int i32OutBytesPerLine = ui32Width * 3 * ui32PixelReplicate;
+		unsigned int i32OutAlign = 0;
+
+		// round up to a dword boundary
+		if(i32OutBytesPerLine & 3)
+		{
+			i32OutBytesPerLine |= 3;
+			++i32OutBytesPerLine;
+			i32OutAlign = i32OutBytesPerLine - ui32Width * 3 * ui32PixelReplicate;
+		}
+
+		unsigned char *pData = (unsigned char*) pImageData;
+
+		{
+			int ui32RealSize = i32OutBytesPerLine * ui32Height * ui32PixelReplicate;
+
+			// BMP Header
+			unsigned short  bfType = 0x4D42;
+			unsigned int   bfSize = i32BMPHeaderSize + i32BMPInfoSize + ui32RealSize;
+			unsigned short  bfReserved1 = 0;
+			unsigned short  bfReserved2 = 0;
+			unsigned int   bfOffBits = i32BMPHeaderSize + i32BMPInfoSize;
+
+			// BMP Info Header
+			unsigned int  biSize = i32BMPInfoSize;
+			unsigned int  biWidth = ui32Width * ui32PixelReplicate;
+			unsigned int  biHeight = ui32Height * ui32PixelReplicate;
+			unsigned short biPlanes = 1;
+			unsigned short biBitCount = 24;
+			unsigned int  biCompression = 0L;
+			unsigned int  biSizeImage = ui32RealSize;
+			unsigned int  biXPelsPerMeter = 0;
+			unsigned int  biYPelsPerMeter = 0;
+			unsigned int  biClrUsed = 0;
+			unsigned int  biClrImportant = 0;
+
+			if(!bLittleEndian)
+			{
+				for(unsigned int i = 0; i < ui32Width * ui32Height; ++i)
+					PVRShellByteSwap(pData + (3 * i), 3);
+
+				ByteSwap(bfType);
+				ByteSwap(bfSize);
+				ByteSwap(bfOffBits);
+				ByteSwap(biSize);
+				ByteSwap(biWidth);
+				ByteSwap(biHeight);
+				ByteSwap(biPlanes);
+				ByteSwap(biBitCount);
+				ByteSwap(biCompression);
+				ByteSwap(biSizeImage);
+			}
+
+			// Write Header.
+			fwrite(&bfType		, 1, sizeof(bfType)		, fpDumpfile);
+			fwrite(&bfSize		, 1, sizeof(bfSize)		, fpDumpfile);
+			fwrite(&bfReserved1	, 1, sizeof(bfReserved1), fpDumpfile);
+			fwrite(&bfReserved2	, 1, sizeof(bfReserved2), fpDumpfile);
+			fwrite(&bfOffBits	, 1, sizeof(bfOffBits)	, fpDumpfile);
+
+			// Write info header.
+			fwrite(&biSize			, 1, sizeof(biSize)			, fpDumpfile);
+			fwrite(&biWidth			, 1, sizeof(biWidth)		, fpDumpfile);
+			fwrite(&biHeight		, 1, sizeof(biHeight)		, fpDumpfile);
+			fwrite(&biPlanes		, 1, sizeof(biPlanes)		, fpDumpfile);
+			fwrite(&biBitCount		, 1, sizeof(biBitCount)		, fpDumpfile);
+			fwrite(&biCompression	, 1, sizeof(biCompression)	, fpDumpfile);
+			fwrite(&biSizeImage		, 1, sizeof(biSizeImage)	, fpDumpfile);
+			fwrite(&biXPelsPerMeter	, 1, sizeof(biXPelsPerMeter), fpDumpfile);
+			fwrite(&biYPelsPerMeter	, 1, sizeof(biYPelsPerMeter), fpDumpfile);
+			fwrite(&biClrUsed		, 1, sizeof(biClrUsed)		, fpDumpfile);
+			fwrite(&biClrImportant	, 1, sizeof(biClrImportant)	, fpDumpfile);
+		}
+
+		// Write image.
+		for(unsigned int nY = 0; nY < ui32Height; ++nY)
+		{
+			const unsigned char * pRow = &pData[3 * ui32Width * nY];
+			for(unsigned int nRepY = 0; nRepY < ui32PixelReplicate; ++nRepY)
+			{
+				for(unsigned int nX = 0; nX < ui32Width; ++nX)
+				{
+					const unsigned char * pPixel = &pRow[3 * nX];
+					for(unsigned int nRepX = 0; nRepX < ui32PixelReplicate; ++nRepX)
+					{
+						fwrite(pPixel, 1, 3, fpDumpfile);
+					}
+				}
+
+				fwrite("\0\0\0\0", i32OutAlign, 1, fpDumpfile);
+			}
+		}
+
+		// Last but not least close the file.
+		fclose(fpDumpfile);
+
+		Result = 0;
+	}
+	else
+	{
+		PVRShellOutputDebug("PVRShell: Failed to open \"%s\" for writing screen dump.\n", pszFilename);
+	}
+
+	return Result;
+}
+
+/*!***********************************************************************
+ @brief	    The number itself should be considered meaningless; an
+            application should use this function to determine how much
+            time has passed between two points (e.g. between each
+            frame).
+ @return	A value which increments once per millisecond.
+*************************************************************************/
+unsigned long PVRShell::PVRShellGetTime()
+{
+	if(m_pShellData->bForceFrameTime)
+	{
+		// Return a "time" value based on the current frame number
+		return (unsigned long) m_pShellData->nShellCurFrameNum * m_pShellData->nFrameTime;
+	}
+	else
+	{
+		// Read timer from a platform dependant function
+		return m_pShellInit->OsGetTime();
+	}
+}
+
+/*!***********************************************************************
+ @brief	    Check if a key was pressed. The keys on various devices
+            are mapped to the PVRShell-supported keys (listed in @a PVRShellKeyName) in
+            a platform-dependent manner, since most platforms have different input
+            devices. Check the <a href="modules.html">Modules page</a> for your OS
+            for details on how the enum values map to your device's key code input.
+ @param[in]	key		Code of the key to test
+ @return	true if key was pressed
+*************************************************************************/
+bool PVRShell::PVRShellIsKeyPressed(const PVRShellKeyName key)
+{
+	if(!m_pShellInit)
+		return false;
+
+	return m_pShellInit->DoIsKeyPressed(key);
+}
+
+// class PVRShellCommandLine
+
+/*!***********************************************************************
+ @brief		Constructor
+*************************************************************************/
+PVRShellCommandLine::PVRShellCommandLine()
+{
+	memset(this, 0, sizeof(*this));
+}
+
+/*!***********************************************************************
+@brief		Destructor
+*************************************************************************/
+PVRShellCommandLine::~PVRShellCommandLine()
+{
+	delete [] m_psOrig;
+	delete [] m_psSplit;
+	FREE(m_pOpt);
+}
+
+/*!***********************************************************************
+ @brief	    Set command-line options to pStr
+ @param[in]	pStr   Input string
+*************************************************************************/
+void PVRShellCommandLine::Set(const char *pStr)
+{
+	delete [] m_psOrig;
+	m_psOrig = 0;
+
+	if(pStr)
+	{
+		size_t len = strlen(pStr)+1;
+		m_psOrig = new char[len];
+		strcpy(m_psOrig, pStr);
+	}
+}
+
+/*!***********************************************************************
+ @brief	    Prepend command-line options to m_psOrig
+ @param[in]	pStr Input string
+*************************************************************************/
+void PVRShellCommandLine::Prefix(const char *pStr)
+{
+	if(!m_psOrig)
+		Set(pStr);
+	else if(!pStr)
+		return;
+	else
+	{
+		char *pstmp = m_psOrig;
+		size_t lenA = strlen(pStr);
+		size_t TotalLen = lenA + 1 + strlen(m_psOrig);
+
+		m_psOrig = new char[TotalLen + 1];
+
+		strcpy(m_psOrig, pStr);
+		m_psOrig[lenA] = ' ';
+		strcpy(m_psOrig + lenA + 1, pstmp);
+		m_psOrig[TotalLen] = '\0';
+
+		delete[] pstmp;
+	}
+}
+
+/*!***********************************************************************
+ @brief	    Prepend command-line options to m_psOrig from a file
+ @param[in]	pFileName   Input string
+*************************************************************************/
+bool PVRShellCommandLine::PrefixFromFile(const char *pFileName)
+{
+	char* nl;
+	FILE *pFile = fopen(pFileName, "rb");
+
+	if(pFile)
+	{
+		// Get the file size
+		fseek(pFile, 0, SEEK_END);
+		long m_Size = ftell(pFile) + 2;
+		fseek(pFile, 0, SEEK_SET);
+
+		char *pFullFile = new char[m_Size];
+
+		if(pFullFile)
+		{
+			size_t offset = 0;
+			while(fgets(pFullFile + offset, (int) (m_Size - offset), pFile))
+			{
+				offset = strlen(pFullFile);
+
+				// Replace new lines with spaces
+				nl = strrchr(pFullFile, '\r');
+				if(nl) *nl = ' ';
+
+				nl = strrchr(pFullFile, '\n');
+				if(nl) *nl = ' ';
+			}
+
+			pFullFile[offset] = '\0';
+			Prefix(pFullFile);
+
+			delete[] pFullFile;
+			fclose(pFile);
+			return true;
+		}
+
+		fclose(pFile);
+	}
+
+	return false;
+}
+
+/*!***********************************************************************
+ @brief	  Parse m_psOrig for command-line options and store them in m_pOpt
+*************************************************************************/
+void PVRShellCommandLine::Parse()
+{
+	size_t		len;
+	int			nIn, nOut;
+	bool		bInQuotes;
+	SCmdLineOpt	opt;
+
+	if(!m_psOrig)
+		return;
+
+	// Delete/free up any options we may have parsed recently
+	delete [] m_psSplit;
+	FREE(m_pOpt);
+
+	// Take a copy to be edited
+	len = strlen(m_psOrig) + 1;
+	m_psSplit = new char[len];
+
+	// Break the command line into options
+	bInQuotes = false;
+	opt.pArg = NULL;
+	opt.pVal = NULL;
+	nIn = -1;
+	nOut = 0;
+
+	do
+	{
+		++nIn;
+		if(m_psOrig[nIn] == '"')
+		{
+			bInQuotes = !bInQuotes;
+		}
+		else
+		{
+			if(bInQuotes && m_psOrig[nIn] != 0)
+			{
+				if(!opt.pArg)
+					opt.pArg = &m_psSplit[nOut];
+
+				m_psSplit[nOut++] = m_psOrig[nIn];
+			}
+			else
+			{
+				switch(m_psOrig[nIn])
+				{
+				case '=':
+					m_psSplit[nOut++] = 0;
+					opt.pVal = &m_psSplit[nOut];
+					break;
+
+				case ' ':
+				case '\t':
+				case '\0':
+					m_psSplit[nOut++] = 0;
+					if(opt.pArg || opt.pVal)
+					{
+						// Increase list length if necessary
+						if(m_nOptLen == m_nOptMax)
+							m_nOptMax = m_nOptMax * 2 + 1;
+						SCmdLineOpt* pTmp = (SCmdLineOpt*)realloc(m_pOpt, m_nOptMax * sizeof(*m_pOpt));
+						if(!pTmp)
+						{
+							FREE(m_pOpt);
+							return;
+						}
+
+						m_pOpt = pTmp;
+
+						// Add option to list
+						m_pOpt[m_nOptLen++] = opt;
+						opt.pArg = NULL;
+						opt.pVal = NULL;
+					}
+					break;
+
+				default:
+					if(!opt.pArg)
+						opt.pArg = &m_psSplit[nOut];
+
+					m_psSplit[nOut++] = m_psOrig[nIn];
+					break;
+				}
+			}
+		}
+	} while(m_psOrig[nIn]);
+}
+
+/*!***********************************************************************
+ @brief	      Apply the command-line options to shell
+ @param[in]	  shell
+*************************************************************************/
+void PVRShellCommandLine::Apply(PVRShell &shell)
+{
+	int i;
+	const char *arg, *val;
+
+	for(i = 0; i < m_nOptLen; ++i)
+	{
+		arg = m_pOpt[i].pArg;
+		val = m_pOpt[i].pVal;
+
+		if(!arg)
+			continue;
+
+		if(val)
+		{
+			if(_stricmp(arg, "-width") == 0)
+			{
+				shell.PVRShellSet(prefWidth, atoi(val));
+			}
+			else if(_stricmp(arg, "-height") == 0)
+			{
+				shell.PVRShellSet(prefHeight, atoi(val));
+			}
+			else if(_stricmp(arg, "-aasamples") == 0)
+			{
+				shell.PVRShellSet(prefAASamples, atoi(val));
+			}
+			else if(_stricmp(arg, "-fullscreen") == 0)
+			{
+				shell.PVRShellSet(prefFullScreen, (atoi(val) != 0));
+			}
+			else if(_stricmp(arg, "-sw") == 0)
+			{
+				shell.PVRShellSet(prefSoftwareRendering, (atoi(val) != 0));
+			}
+			else if(_stricmp(arg, "-quitafterframe") == 0 || _stricmp(arg, "-qaf") == 0)
+			{
+				shell.PVRShellSet(prefQuitAfterFrame, atoi(val));
+			}
+			else if(_stricmp(arg, "-quitaftertime") == 0 || _stricmp(arg, "-qat") == 0)
+			{
+				shell.PVRShellSet(prefQuitAfterTime, (float)atof(val));
+			}
+			else if(_stricmp(arg, "-posx") == 0)
+			{
+				shell.PVRShellSet(prefPositionX, atoi(val));
+			}
+			else if(_stricmp(arg, "-posy") == 0)
+			{
+				shell.PVRShellSet(prefPositionY, atoi(val));
+			}
+			else if(_stricmp(arg, "-vsync") == 0)
+			{
+				shell.PVRShellSet(prefSwapInterval, atoi(val));
+			}
+			else if(_stricmp(arg, "-powersaving") == 0 || _stricmp(arg, "-ps") == 0)
+			{
+				shell.PVRShellSet(prefPowerSaving, (atoi(val) != 0));
+			}
+			else if(_stricmp(arg, "-colourbpp") == 0 || _stricmp(arg, "-colorbpp") == 0 ||_stricmp(arg, "-cbpp") == 0)
+			{
+				shell.PVRShellSet(prefColorBPP, atoi(val));
+			}
+			else if(_stricmp(arg, "-depthbpp") == 0 || _stricmp(arg, "-dbpp") == 0)
+			{
+				shell.PVRShellSet(prefDepthBPP, atoi(val));
+			}
+			else if(_stricmp(arg, "-rotatekeys") == 0)
+			{
+				shell.PVRShellSet(prefRotateKeys, atoi(val));
+			}
+			else if(_stricmp(arg, "-c") == 0)
+			{
+				const char* pDash = strchr(val, '-');
+
+				shell.PVRShellSet(prefCaptureFrameStart, atoi(val));
+
+				if(!pDash)
+					shell.PVRShellSet(prefCaptureFrameStop, atoi(val));
+				else
+					shell.PVRShellSet(prefCaptureFrameStop, atoi(pDash + 1));
+			}
+			else if(_stricmp(arg, "-screenshotscale") == 0)
+			{
+				shell.PVRShellSet(prefCaptureFrameScale, atoi(val));
+			}
+			else if(_stricmp(arg, "-priority") == 0)
+			{
+				shell.PVRShellSet(prefPriority, atoi(val));
+			}
+			else if(_stricmp(arg, "-config") == 0)
+			{
+				shell.PVRShellSet(prefRequestedConfig, atoi(val));
+			}
+			else if(_stricmp(arg, "-display") == 0)
+			{
+				shell.PVRShellSet(prefNativeDisplay, atoi(val));
+			}
+			else if(_stricmp(arg, "-forceframetime") == 0 || _stricmp(arg, "-fft") == 0)
+			{
+				shell.PVRShellSet(prefForceFrameTime, true);
+				shell.PVRShellSet(prefFrameTimeValue, atoi(val));
+			}
+			else if(_stricmp(arg, "-discardframeall") == 0)
+			{
+				shell.PVRShellSet(prefDiscardColor, (atoi(val) != 0));
+				shell.PVRShellSet(prefDiscardDepth, (atoi(val) != 0));
+				shell.PVRShellSet(prefDiscardStencil, (atoi(val) != 0));
+			}
+			else if(_stricmp(arg, "-discardframecolor") == 0 || _stricmp(arg, "-discardframecolour") == 0)
+			{
+				shell.PVRShellSet(prefDiscardColor, (atoi(val) != 0));
+			}
+			else if(_stricmp(arg, "-discardframedepth") == 0)
+			{
+				shell.PVRShellSet(prefDiscardDepth, (atoi(val) != 0));
+			}
+			else if(_stricmp(arg, "-discardframestencil") == 0)
+			{
+				shell.PVRShellSet(prefDiscardStencil, (atoi(val) != 0));
+			}
+		}
+		else
+		{
+			if(_stricmp(arg, "-version") == 0)
+			{
+				shell.PVRShellOutputDebug("Version: \"%s\"\n", shell.PVRShellGet(prefVersion));
+			}
+#ifdef PVRSHELL_FPS_OUTPUT
+			else if(_stricmp(arg, "-fps") == 0)
+			{
+				shell.PVRShellSet(prefOutputFPS, true);
+			}
+#endif
+			else if(_stricmp(arg, "-info") == 0)
+			{
+				shell.PVRShellSet(prefOutputInfo, true);
+			}
+			else if(_stricmp(arg, "-forceframetime") == 0 || _stricmp(arg, "-fft") == 0)
+			{
+				shell.PVRShellSet(prefForceFrameTime, true);
+			}
+		}
+	}
+}
+
+// @Class  PVRShellInit
+
+/*!***********************************************************************
+ @brief	Constructor
+*************************************************************************/
+PVRShellInit::PVRShellInit()
+{
+	memset(this, 0, sizeof(*this));
+}
+
+/*!***********************************************************************
+ @brief	Destructor
+*************************************************************************/
+PVRShellInit::~PVRShellInit()
+{
+	Deinit();
+
+	delete [] m_pReadPath;
+	m_pReadPath = NULL;
+
+	delete [] m_pWritePath;
+	m_pWritePath = NULL;
+}
+
+/*!***********************************************************************
+ @brief	     PVRShell deinitialisation.
+ @param[in]	 Shell
+*************************************************************************/
+void PVRShellInit::Deinit()
+{
+	if(m_pShell)
+	{
+		// Is the App currently running?
+		if(m_eState > ePVRShellInitApp && m_eState < ePVRShellExit)
+		{
+			// If so force it to go through the exit procedure
+			if(m_eState < ePVRShellReleaseView)
+				m_eState = ePVRShellReleaseView;
+
+			// Class the App as done
+			gShellDone = true;
+
+			// Run through the exiting states
+            while(Run()){};
+		}
+
+		delete m_pShell;
+		m_pShell = 0;
+	}
+}
+
+/*!***********************************************************************
+ @brief	    PVRShell Initialisation.
+ @Function	Init
+ @param[in]	Shell
+ @return	True on success and false on failure
+*************************************************************************/
+bool PVRShellInit::Init()
+{
+	Deinit();
+
+	m_pShell = NewDemo();
+
+	if(!m_pShell)
+		return false;
+
+	m_pShell->m_pShellInit	= this;
+
+	// set default direction key mappings
+	m_eKeyMapDOWN = PVRShellKeyNameDOWN;
+	m_eKeyMapLEFT = PVRShellKeyNameLEFT;
+	m_eKeyMapUP = PVRShellKeyNameUP;
+	m_eKeyMapRIGHT = PVRShellKeyNameRIGHT;
+	nLastKeyPressed = PVRShellKeyNameNull;
+
+	OsInit();
+
+	gShellDone = false;
+	m_eState = ePVRShellInitApp;
+	return true;
+}
+
+/*!***********************************************************************
+ @brief	    Receives the command-line from the application.
+ @param[in]	str A string containing the command-line
+*************************************************************************/
+void PVRShellInit::CommandLine(const char *str)
+{
+	m_CommandLine.Set(str);
+}
+
+/*!***********************************************************************
+ @brief	    Receives the command-line from the application.
+ @param[in]  argc Number of strings in argv
+ @param[in]  argv An array of strings
+*************************************************************************/
+void PVRShellInit::CommandLine(int argc, char **argv)
+{
+	size_t	tot, len;
+	char	*buf;
+	int		i;
+
+	tot = 0;
+	for(i = 0; i < argc; ++i)
+		tot += strlen(argv[i]);
+
+	if(!tot)
+	{
+		CommandLine((char*) "");
+		return;
+	}
+
+	// Add room for spaces and the \0
+	tot += argc;
+
+	buf = new char[tot];
+	tot = 0;
+	for(i = 0; i < argc; ++i)
+	{
+		len = strlen(argv[i]);
+		strncpy(&buf[tot], argv[i], len);
+		tot += len;
+		buf[tot++] = ' ';
+	}
+	buf[tot-1] = 0;
+
+	CommandLine(buf);
+
+	delete [] buf;
+}
+
+/*!***********************************************************************
+ @brief	    Return 'true' if the specific key has been pressed.
+ @param[in]	key   The key we're querying for
+*************************************************************************/
+bool PVRShellInit::DoIsKeyPressed(const PVRShellKeyName key)
+{
+	if(key == nLastKeyPressed)
+	{
+		nLastKeyPressed = PVRShellKeyNameNull;
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+/*!***********************************************************************
+ @brief	     Used by the OS-specific code to tell the Shell that a key has been pressed.
+ @param[in]  nKey The key that has been pressed
+*************************************************************************/
+void PVRShellInit::KeyPressed(PVRShellKeyName nKey)
+{
+	nLastKeyPressed = nKey;
+}
+
+/*!***********************************************************************
+ @brief	     Used by the OS-specific code to tell the Shell that a touch has began at a location.
+ @param[in]	 vec2Location   The position of a click/touch on the screen when it first touches
+*************************************************************************/
+void PVRShellInit::TouchBegan(const float vec2Location[2])
+{
+	m_bTouching = true;
+	m_vec2PointerLocationStart[0] = m_vec2PointerLocation[0] = vec2Location[0];
+	m_vec2PointerLocationStart[1] = m_vec2PointerLocation[1] = vec2Location[1];
+}
+
+/*!***********************************************************************
+ @brief	     Used by the OS-specific code to tell the Shell that a touch has began at a location.
+ @param[in]	 vec2Location The position of the pointer/touch pressed on the screen
+*************************************************************************/
+void PVRShellInit::TouchMoved(const float vec2Location[2])
+{
+	if(m_bTouching)
+	{
+		m_vec2PointerLocation[0] = vec2Location[0];
+		m_vec2PointerLocation[1] = vec2Location[1];
+	}
+}
+
+/*!***********************************************************************
+ @brief	    Used by the OS-specific code to tell the Shell that the current touch has ended at a location.
+ @param[in] vec2Location The position of the pointer/touch on the screen when it is released
+*************************************************************************/
+void PVRShellInit::TouchEnded(const float vec2Location[2])
+{
+	if(m_bTouching)
+	{
+		m_bTouching = false;
+		m_vec2PointerLocationEnd[0] = m_vec2PointerLocation[0] = vec2Location[0];
+		m_vec2PointerLocationEnd[1] = m_vec2PointerLocation[1] = vec2Location[1];
+
+#if !defined(DISABLE_SWIPE_MAPPING)
+		float fX = m_vec2PointerLocationEnd[0] - m_vec2PointerLocationStart[0];
+		float fY = m_vec2PointerLocationEnd[1] - m_vec2PointerLocationStart[1];
+		float fTmp = fX * fX + fY * fY;
+
+		if(fTmp > 0.005f)
+		{
+			fTmp = 1.0f / sqrt(fTmp);
+			fY *= fTmp;
+			float fAngle = acos(fY);
+
+			const float pi = 3.1415f;
+			const float pi_half = pi * 0.5f;
+			const float error = 0.25f;
+
+			if(fAngle < error)
+				KeyPressed(m_eKeyMapDOWN);
+			else if(fAngle > (pi - error))
+				KeyPressed(m_eKeyMapUP);
+			else if(fAngle > (pi_half - error) && fAngle < (pi_half + error))
+				KeyPressed((fX < 0) ? m_eKeyMapLEFT : m_eKeyMapRIGHT);
+		}
+		else if(fTmp < 0.09f)
+		{
+			if (m_vec2PointerLocationEnd[0] <= 0.3f) // Left half of the screen
+				KeyPressed(PVRShellKeyNameACTION1);
+			else if (m_vec2PointerLocationEnd[0] >= 0.7f) // Right half of the screen
+				KeyPressed(PVRShellKeyNameACTION2);
+		}
+#endif
+	}
+}
+
+/*!***********************************************************************
+ @brief	  Used by the OS-specific code to tell the Shell where to read external files from
+ @return  A path the application is capable of reading from
+*************************************************************************/
+const char* PVRShellInit::GetReadPath() const
+{
+	return m_pReadPath;
+}
+
+/*!***********************************************************************
+ @brief	   Used by the OS-specific code to tell the Shell where to write to
+ @return   A path the applications is capable of writing to
+*************************************************************************/
+const char* PVRShellInit::GetWritePath() const
+{
+	return m_pWritePath;
+}
+
+/*!****************************************************************************
+ @brief     Sets the default app name (to be displayed by the OS)
+ @param[in]	str   The application name
+*******************************************************************************/
+void PVRShellInit::SetAppName(const char * const str)
+{
+	const char *pName = strrchr(str, PVRSHELL_DIR_SYM);
+
+	if(pName)
+	{
+		++pName;
+	}
+	else
+	{
+		pName = str;
+	}
+	m_pShell->PVRShellSet(prefAppName, pName);
+}
+
+/*!***********************************************************************
+ @brief	     Set the path to where the application expects to read from.
+ @param[in]  str   The read path
+*************************************************************************/
+void PVRShellInit::SetReadPath(const char * const str)
+{
+	m_pReadPath = new char[strlen(str)+1];
+
+	if(m_pReadPath)
+	{
+		strcpy(m_pReadPath, str);
+		char* lastSlash = strrchr(m_pReadPath, PVRSHELL_DIR_SYM);
+
+		if(lastSlash)
+			lastSlash[1] = 0;
+	}
+}
+
+/*!***********************************************************************
+ @brief     Set the path to where the application expects to write to.
+ @param[in] str   The write path
+*************************************************************************/
+void PVRShellInit::SetWritePath(const char * const str)
+{
+	m_pWritePath = new char[strlen(str)+1];
+
+	if(m_pWritePath)
+	{
+		strcpy(m_pWritePath, str);
+		char* lastSlash = strrchr(m_pWritePath, PVRSHELL_DIR_SYM);
+
+		if(lastSlash)
+			lastSlash[1] = 0;
+	}
+}
+
+#ifdef PVRSHELL_FPS_OUTPUT
+/*****************************************************************************
+ @fn       FpsUpdate
+ @brief    Calculates a value for frames-per-second (FPS). 
+ @details  This is only compiled in to the application if PVRSHELL_FPS_OUTPUT is defined.
+*****************************************************************************/
+void PVRShellInit::FpsUpdate()
+{
+	unsigned int ui32TimeDelta, ui32Time;
+
+	ui32Time = m_pShell->PVRShellGetTime();
+	++m_i32FpsFrameCnt;
+	ui32TimeDelta = ui32Time - m_i32FpsTimePrev;
+
+	if(ui32TimeDelta >= 1000)
+	{
+		float fFPS = 1000.0f * (float) m_i32FpsFrameCnt / (float) ui32TimeDelta;
+
+		m_pShell->PVRShellOutputDebug("PVRShell: frame %d, FPS %.1f.\n",
+			m_pShell->m_pShellData->nShellCurFrameNum, fFPS);
+
+		m_i32FpsFrameCnt = 0;
+		m_i32FpsTimePrev = ui32Time;
+	}
+}
+#endif
+
+/*****************************************************************************
+ @brief    Main message loop / render loop
+ @return   false when the app should quit
+*****************************************************************************/
+bool PVRShellInit::Run()
+{
+	static unsigned long StartTime = 0;
+
+	switch(m_eState)
+	{
+	case ePVRShellInitApp:
+		{
+			// Make sure the shell isn't done
+			gShellDone = false;
+
+			// Prepend command-line options from PVRShellCL.txt
+			const char * const pCL = "PVRShellCL.txt";
+			const char *pPath = (const char*) m_pShell->PVRShellGet(prefReadPath);
+			size_t nSize = strlen(pPath) + strlen(pCL) + 1;
+			char *pString = new char[nSize];
+
+			if(pString)
+			{
+				snprintf(pString, nSize, "%s%s", pPath, pCL);
+
+				if(!m_CommandLine.PrefixFromFile(pString))
+				{
+					delete[] pString;
+					pPath = (const char*) m_pShell->PVRShellGet(prefWritePath);
+					nSize = strlen(pPath) + strlen(pCL) + 1;
+					pString = new char[nSize];
+
+					snprintf(pString, nSize, "%s%s", pPath, pCL);
+
+					if(m_CommandLine.PrefixFromFile(pString))
+						m_pShell->PVRShellOutputDebug("Loaded command-line options from %s.\n", pString);
+				}
+				else
+					m_pShell->PVRShellOutputDebug("Loaded command-line options from %s.\n", pString);
+
+				delete[] pString;
+			}
+
+			// Parse the command-line
+			m_CommandLine.Parse();
+
+#if defined(_DEBUG)
+			m_pShell->PVRShellOutputDebug("PVRShell command line: %d/%d\n", m_CommandLine.m_nOptLen, m_CommandLine.m_nOptMax);
+			for(int i = 0; i < m_CommandLine.m_nOptLen; ++i)
+			{
+				m_pShell->PVRShellOutputDebug("CL %d: \"%s\"\t= \"%s\".\n", i,
+					m_CommandLine.m_pOpt[i].pArg ? m_CommandLine.m_pOpt[i].pArg : "",
+					m_CommandLine.m_pOpt[i].pVal ? m_CommandLine.m_pOpt[i].pVal : "");
+			}
+#endif
+			// Call InitApplication
+			if(!m_pShell->InitApplication())
+			{
+				m_eState = ePVRShellExit;
+				return true;
+			}
+
+			m_eState = ePVRShellInitInstance;
+			return true;
+		}
+	case ePVRShellInitInstance:
+		{
+			m_CommandLine.Apply(*m_pShell);
+
+			// Output non-api specific data if required
+			OutputInfo();
+
+			// Perform OS initialisation
+			if(!OsInitOS())
+			{
+				m_pShell->PVRShellOutputDebug("InitOS failed!\n");
+				m_eState = ePVRShellQuitApp;
+				return true;
+			}
+
+			// Initialize the 3D API
+			if(!OsDoInitAPI())
+			{
+				m_pShell->PVRShellOutputDebug("InitAPI failed!\n");
+				m_eState = ePVRShellReleaseOS;
+				gShellDone = true;
+				return true;
+			}
+
+			// Output api specific data if required
+			OutputAPIInfo();
+
+			// Initialise the app
+			if(!m_pShell->InitView())
+			{
+				m_pShell->PVRShellOutputDebug("InitView failed!\n");
+				m_eState = ePVRShellReleaseAPI;
+				gShellDone = true;
+				return true;
+			}
+
+			if(StartTime==0)
+			{
+				StartTime = OsGetTime();
+			}
+
+			m_eState = ePVRShellRender;
+			return true;
+		}
+	case ePVRShellRender:
+		{
+			// Main message loop:
+			if(!m_pShell->RenderScene())
+				break;
+
+			ApiRenderComplete();
+			OsRenderComplete();
+
+#ifdef PVRSHELL_FPS_OUTPUT
+			if(m_pShell->m_pShellData->bOutputFPS)
+				FpsUpdate();
+#endif
+			int nCurrentFrame = m_pShell->m_pShellData->nShellCurFrameNum;
+
+			if(DoIsKeyPressed(PVRShellKeyNameScreenshot) || (nCurrentFrame >= m_pShell->m_pShellData->nCaptureFrameStart && nCurrentFrame <= m_pShell->m_pShellData->nCaptureFrameStop))
+			{
+				unsigned char *pBuf;
+				const int nWidth = m_pShell->PVRShellGet(prefWidth);
+				const int nHeight = m_pShell->PVRShellGet(prefHeight);
+				if(m_pShell->PVRShellScreenCaptureBuffer(nWidth, nHeight, &pBuf))
+				{
+					if(m_pShell->PVRShellScreenSave(PVRSHELL_SCREENSHOT_NAME, nWidth, nHeight, pBuf, m_pShell->m_pShellData->nCaptureFrameScale) != 0)
+					{
+						m_pShell->PVRShellSet(prefExitMessage, "Screen-shot save failed.\n");
+					}
+				}
+				else
+				{
+					m_pShell->PVRShellSet(prefExitMessage, "Screen capture failed.\n");
+				}
+				FREE(pBuf);
+			}
+
+			if(DoIsKeyPressed(PVRShellKeyNameQUIT))
+				gShellDone = true;
+
+			if(gShellDone)
+				break;
+
+			/* Quit if maximum number of allowed frames is reached */
+			if((m_pShell->m_pShellData->nDieAfterFrames>=0) && (nCurrentFrame >= m_pShell->m_pShellData->nDieAfterFrames))
+				break;
+
+			/* Quit if maximum time is reached */
+			if((m_pShell->m_pShellData->fDieAfterTime>=0.0f) && (((OsGetTime()-StartTime)*0.001f) >= m_pShell->m_pShellData->fDieAfterTime))
+				break;
+
+			m_pShell->m_pShellData->nShellCurFrameNum++;
+			return true;
+		}
+
+	case ePVRShellReleaseView:
+		m_pShell->ReleaseView();
+
+	case ePVRShellReleaseAPI:
+		OsDoReleaseAPI();
+
+	case ePVRShellReleaseOS:
+		OsReleaseOS();
+
+		if(!gShellDone && m_pShell->m_pShellData->nInitRepeats)
+		{
+			--m_pShell->m_pShellData->nInitRepeats;
+			m_eState = ePVRShellInitInstance;
+			return true;
+		}
+
+		m_eState = ePVRShellQuitApp;
+		return true;
+
+	case ePVRShellQuitApp:
+		// Final app tidy-up
+		m_pShell->QuitApplication();
+		m_eState = ePVRShellExit;
+
+	case ePVRShellExit:
+		OsExit();
+		StringCopy(m_pShell->m_pShellData->pszAppName, 0);
+		StringCopy(m_pShell->m_pShellData->pszExitMessage, 0);
+		return false;
+	}
+
+	m_eState = (EPVRShellState)(m_eState + 1);
+	return true;
+}
+
+/*!***********************************************************************
+@brief	When prefOutputInfo is set to true this function outputs
+        various pieces of non-API dependent information via
+        PVRShellOutputDebug.
+*************************************************************************/
+void PVRShellInit::OutputInfo()
+{
+	if(m_pShell->PVRShellGet(prefOutputInfo))
+	{
+		m_pShell->PVRShellOutputDebug("\n");
+		m_pShell->PVRShellOutputDebug("App name: %s\n"     , m_pShell->PVRShellGet(prefAppName));
+		m_pShell->PVRShellOutputDebug("SDK version: %s\n"  , m_pShell->PVRShellGet(prefVersion));
+		m_pShell->PVRShellOutputDebug("\n");
+		m_pShell->PVRShellOutputDebug("Read path:  %s\n"    , m_pShell->PVRShellGet(prefReadPath));
+		m_pShell->PVRShellOutputDebug("Write path: %s\n"   , m_pShell->PVRShellGet(prefWritePath));
+		m_pShell->PVRShellOutputDebug("\n");
+		m_pShell->PVRShellOutputDebug("Command-line: %s\n" , m_pShell->PVRShellGet(prefCommandLine));
+		m_pShell->PVRShellOutputDebug("\n");
+		m_pShell->PVRShellOutputDebug("Power saving: %s\n" , m_pShell->PVRShellGet(prefPowerSaving) ? "On" : "Off");
+		m_pShell->PVRShellOutputDebug("AA Samples requested: %i\n", m_pShell->PVRShellGet(prefAASamples));
+		m_pShell->PVRShellOutputDebug("Fullscreen: %s\n", m_pShell->PVRShellGet(prefFullScreen) ? "Yes" : "No");
+		m_pShell->PVRShellOutputDebug("PBuffer requested: %s\n", m_pShell->PVRShellGet(prefPBufferContext) ? "Yes" : "No");
+		m_pShell->PVRShellOutputDebug("ZBuffer requested: %s\n", m_pShell->PVRShellGet(prefZbufferContext) ? "Yes" : "No");
+		m_pShell->PVRShellOutputDebug("Stencil buffer requested: %s\n", m_pShell->PVRShellGet(prefStencilBufferContext) ? "Yes" : "No");
+
+		if(m_pShell->PVRShellGet(prefColorBPP) > 0)
+			m_pShell->PVRShellOutputDebug("Colour buffer size requested: %i\n", m_pShell->PVRShellGet(prefColorBPP));
+		if(m_pShell->PVRShellGet(prefDepthBPP) > 0)
+			m_pShell->PVRShellOutputDebug("Depth buffer size requested: %i\n", m_pShell->PVRShellGet(prefDepthBPP));
+
+		m_pShell->PVRShellOutputDebug("Software rendering requested: %s\n", m_pShell->PVRShellGet(prefSoftwareRendering) ? "Yes" : "No");
+		m_pShell->PVRShellOutputDebug("Swap Interval requested: %i\n", m_pShell->PVRShellGet(prefSwapInterval));
+
+		if(m_pShell->PVRShellGet(prefInitRepeats) > 0)
+			m_pShell->PVRShellOutputDebug("No of Init repeats: %i\n", m_pShell->PVRShellGet(prefInitRepeats));
+
+		if(m_pShell->PVRShellGet(prefQuitAfterFrame) != -1)
+			m_pShell->PVRShellOutputDebug("Quit after frame:   %i\n", m_pShell->PVRShellGet(prefQuitAfterFrame));
+
+		if(m_pShell->PVRShellGet(prefQuitAfterTime)  != -1.0f)
+			m_pShell->PVRShellOutputDebug("Quit after time:    %f\n", m_pShell->PVRShellGet(prefQuitAfterTime));
+	}
+}
+
+/****************************************************************************
+** Local code
+****************************************************************************/
+/*!***********************************************************************
+ @brief	      This function copies pszSrc into pszStr.
+ @param[out]  pszStr   The string to copy pszSrc into
+ @param[in]	  pszSrc   The source string to copy
+*************************************************************************/
+static bool StringCopy(char *&pszStr, const char * const pszSrc)
+{
+	size_t len;
+
+	FREE(pszStr);
+
+	if(!pszSrc)
+		return true;
+
+	len = strlen(pszSrc)+1;
+	pszStr = (char*)malloc(len);
+	if(!pszStr)
+		return false;
+
+	strcpy(pszStr, pszSrc);
+	return true;
+}
+
+/// @endcond 
+//NO_DOXYGEN
+
+/*****************************************************************************
+End of file (PVRShell.cpp)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/PVRShell.h b/third_party/PowerVR_SDK/Shell/PVRShell.h
new file mode 100644
index 0000000..886fd3e
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/PVRShell.h
@@ -0,0 +1,667 @@
+/*!****************************************************************************
+
+ @file       Shell/PVRShell.h
+ @copyright  Copyright (c) Imagination Technologies Limited.
+ @brief      Makes programming for 3D APIs easier by wrapping surface
+             initialization, Texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+
+#ifndef __PVRSHELL_H_
+#define __PVRSHELL_H_
+
+/*****************************************************************************/
+/*! @mainpage PVRShell
+******************************************************************************
+
+ @tableofcontents 
+ 
+ @section overview Overview
+ *****************************
+
+ PVRShell is a C++ class used to make programming for PowerVR platforms easier and more portable.
+ PVRShell takes care of all API and OS initialisation for the user and handles adapters, devices, screen/windows modes,
+ resolution, buffering, depth-buffer, viewport creation & clearing, etc...
+
+ PVRShell consists of 3 files: PVRShell.cpp, PVRShellOS.cpp and PVRShellAPI.cpp.
+
+ PVRShellOS.cpp and PVRShellAPI.cpp are supplied per platform and contain all the code to initialise the specific
+ API (OpenGL ES, Direct3D Mobile, etc.) and the OS (Windows, Linux, WinCE, etc.).
+ PVRShell.cpp is where the common code resides and it interacts with the user application through an abstraction layer.
+
+ A new application must link to these three files and must create a class that will inherit the PVRShell class.
+ This class will provide five virtual functions to interface with the user.
+
+ The user also needs to register his application class through the NewDemo function:
+
+ @code
+ class MyApplication: public PVRShell
+ {
+ public:
+     virtual bool InitApplication();
+     virtual bool InitView();
+     virtual bool ReleaseView();
+     virtual bool QuitApplication();
+     virtual bool RenderScene();
+ };
+
+ PVRShell* NewDemo()
+ {
+     return new MyApplication();
+ }
+ @endcode
+ 
+
+ @section interface Interface
+ ******************************
+
+ There are two functions for initialisation, two functions to release allocated resources and a render function:
+
+ InitApplication() will be called by PVRShell once per run, before the graphic context is created.
+ It is used to initialise variables that are not dependant on the rendering context (e.g. external modules, loading user data, etc.).
+ QuitApplication() will be called by PVRShell once per run, just before exiting the program.
+ If the graphic context is lost, QuitApplication() will not be called.
+
+ InitView() will be called by PVRShell upon creation or change in the rendering context.
+ It is used to initialise variables that are dependant on the rendering context (e.g. textures, vertex buffers, etc.).
+ ReleaseView() will be called by PVRShell before changing to a new rendering context or
+ when finalising the application (before calling QuitApplication).
+
+ RenderScene() is the main rendering loop function of the program. This function must return FALSE when the user wants to terminate the application.
+ PVRShell will call this function every frame and will manage relevant OS events.
+
+ There are other PVRShell functions which allow the user to set his/her preferences and get data back from the devices:
+
+ PVRShellSet() and PVRShellGet() are used to pass data to and from PVRShell. PVRShellSet() is recommended to be used
+ in InitApplication() so the user preferences are applied at the API initialisation.
+ There is a definition of these functions per type of data passed or returned. Please check the prefNameBoolEnum, prefNameFloatEnum,
+ prefNameIntEnum, prefNamePtrEnum and prefNameConstPtrEnum enumerations for a full list of the data available.
+
+ This is an example:
+
+ @code
+ bool MyApplication::InitApplication()
+ {
+     PVRShellSet (prefFullScreen, true);
+ }
+
+ bool MyApplication::RenderScene()
+ {
+     int dwCurrentWidth = PVRShellGet (prefHeight);
+     int dwCurrentHeight = PVRShellGet (prefWidth);
+
+     return true;
+ }
+ @endcode
+
+ 
+ @section helper Helper functions
+ *************************************
+
+ The user input is abstracted with the PVRShellIsKeyPressed() function. It will not work in all devices, but we have tried to map the most
+ relevant keys when possible. See PVRShellKeyName enumeration for the list of keys supported. This function will return true or false depending on
+ the specified key being pressed.
+
+ There are a few other helper functions supplied by PVRShell as well. These functions allow you to read the timer, to output debug information and to
+ save a screen-shot of the current frame:
+
+ PVRShellGetTime() returns time in milliseconds.
+
+ PVRShellOutputDebug() will write a debug string (same format as printf) to the platform debug output.
+
+ PVRShellScreenCaptureBuffer() and  PVRShellWriteBMPFile() will be used to save the current frame as a BMP file. PVRShellScreenCaptureBuffer()
+ receives a pointer to an area of memory containing the screen buffer. The memory should be freed with free() when not needed any longer.
+
+ Example of screenshot:
+
+ @code
+ bool MyApplication::RenderScene()
+ {
+     [...]
+
+     unsigned char *pLines;
+
+     PVRShellScreenCaptureBuffer(PVRShellGet (prefWidth), PVRShellGet (prefHeight), &pLines);
+
+     PVRShellScreenSave("myfile", pLines, NULL);
+
+     free (pLines);
+
+     return true;
+ }
+ @endcode
+
+ 
+ @section cmd Command-line
+ *************************************
+
+ Across all platforms, PVRShell takes a set of command-line arguments which allow things like the position and size of the demo
+ to be controlled. The list below shows these options.
+
+ \b -width=N   Sets the horizontal viewport width to N.
+
+ \b -height=N   Sets the vertical viewport height to N.
+
+ \b -posx=N   Sets the x coordinate of the viewport.
+
+ \b -posy=N   Sets the y coordinate of the viewport.
+
+ \b -aasamples=N   Sets the number of samples to use for full screen anti-aliasing. e.g 0, 2, 4, 8
+
+ \b -fullscreen=N   Enable/Disable fullscreen mode. N can be: 0=Windowed 1=Fullscreen.
+
+ \b -qat=N   Quits after N seconds.
+
+ \b -qaf=N   Quits after N frames.
+
+ \b -powersaving=N Where available enable/disable power saving. N can be: 0=Disable power saving 1=Enable power saving.
+
+ \b -vsync=N Where available modify the apps vsync parameters.
+
+ \b -version Output the SDK version to the debug output.
+
+ \b -info Output setup information (e.g. window width) to the debug output.
+
+ \b -rotatekeys=N Sets the orientation of the keyboard input. N can be: 0-3, 0 is no rotation.
+
+ \b -c=N Save a single screenshot or a range. e.g. -c=1-10, -c=14.
+
+ \b -priority=N EGL only. Sets the priority of the EGL context.
+
+ \b -colourbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_BUFFER_SIZE.
+
+ \b -depthbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_DEPTH_SIZE.
+
+ \b -config=N EGL only. Force the shell to use the EGL config with ID N.
+
+ \b -forceframetime=N Alter the behaviour of PVRShellGetTime so its returned value is frame based (N denotes how many ms a frame should pretend to last). You can also use the shortened version of -fft and the command can be used without N being defined, e.g. just -forceframetime. This option is provided to aid in debugging time-based applications.
+
+ Example:
+ @code
+     Demo -width=160 -height=120 -qaf=300
+ @endcode
+
+ @section APIsOSs APIs and Operating Systems
+ *****************************
+ For information specific to each 3D API and Operating System, see the list of supported APIs and OSs on the <a href="modules.html">Modules</a> page.
+ 
+******************************************************************************/
+// Uncomment to enable the -fps command-line option
+// #define PVRSHELL_FPS_OUTPUT
+
+/*****************************************************************************
+** Includes
+*****************************************************************************/
+#include <stdlib.h>
+
+#define EXIT_NOERR_CODE 0
+#define EXIT_ERR_CODE (!EXIT_NOERR_CODE)
+
+// avoid warning about unused parameter
+#define PVRSHELL_UNREFERENCED_PARAMETER(x) ((void) x)
+
+// Keyboard mapping. //
+ 
+/*!***********************************************************************
+ @enum PVRShellKeyName
+ @brief Key name.
+ ************************************************************************/ 
+enum PVRShellKeyName
+{
+    PVRShellKeyNameNull,        /*!< Null key value */
+    PVRShellKeyNameQUIT,        /*!< QUIT key value */
+    PVRShellKeyNameSELECT,      /*!< SELECT key value */
+    PVRShellKeyNameACTION1,     /*!< ACTION1 key value */
+    PVRShellKeyNameACTION2,     /*!< ACTION2 key value */
+    PVRShellKeyNameUP,          /*!< UP key */
+    PVRShellKeyNameDOWN,        /*!< DOWN key */
+    PVRShellKeyNameLEFT,        /*!< LEFT key */
+    PVRShellKeyNameRIGHT,       /*!< RIGHT key */
+    PVRShellKeyNameScreenshot   /*!< SCREENSHOT key */
+};
+
+/*!***********************************************************************
+ @enum PVRShellKeyRotate
+ @brief Key rotate.
+ ************************************************************************/ 
+enum PVRShellKeyRotate
+{
+    PVRShellKeyRotateNone=0,    /*!< Rotate key none = 0. */ 
+    PVRShellKeyRotate90,        /*!< Rotate key 90 */
+    PVRShellKeyRotate180,       /*!< Rotate key 180 */
+    PVRShellKeyRotate270        /*!< Rotate key 270 */
+};
+
+//  Pointer button mapping. //
+ 
+/*!***********************************************************************
+ @enum EPVRShellButtonState
+ @brief Pointer button mapping.
+ ************************************************************************/ 
+enum EPVRShellButtonState
+{
+    ePVRShellButtonLeft = 0x1,  /*!< Left button */
+    ePVRShellButtonRight = 0x2, /*!< Right button */
+    ePVRShellButtonMiddle = 0x4 /*!< Middle button */
+};
+
+/*!***********************************************************************
+ @enum prefNameBoolEnum
+ @brief Boolean Shell preferences.
+ ************************************************************************/
+enum prefNameBoolEnum
+{
+    prefFullScreen,             /*!< Set to: 1 for full-screen rendering; 0 for windowed */
+    prefIsRotated,              /*!< Query this to learn whether screen is rotated */
+    prefPBufferContext,         /*!< 1 if you need pbuffer support (default is pbuffer not needed) */
+    prefPixmapContext,          /*!< 1 to use a pixmap as a render-target (default off) */
+    prefPixmapDisableCopy,      /*!< 1 to disable the copy if pixmaps are used */
+    prefZbufferContext,         /*!< 1 if you wish to have zbuffer support (default to on) */
+    prefLockableBackBuffer,     /*!< DX9 only: true to use D3DPRESENTFLAG_LOCKABLE_BACKBUFFER (default: false) */
+    prefSoftwareRendering,      /*!< 1 to select software rendering (default: off, i.e. use hardware) */
+    prefStencilBufferContext,   /*!< 1 if you wish to have stencil support (default: off) */
+    prefAlphaFormatPre,         /*!< EGL only: 1 to create the EGL surface with EGL_ALPHA_FORMAT_PRE (default: 0) */
+    prefPowerSaving,            /*!< If true then the app will go into powersaving mode (if available) when not in use. */
+#ifdef PVRSHELL_FPS_OUTPUT
+    prefOutputFPS,              /*!< If true then the FPS are output using PVRShellOutputdebug */
+#endif
+    prefOutputInfo,             /*!< If true then the app will output helpful information such as colour buffer format via PVRShellOutputDebug. */
+    prefNoShellSwapBuffer,      /*!< EGL: If true then the shell won't call eglswapbuffers at the end of each frame. */
+    prefShowCursor,             /*!< Set to: 1 to show the cursor; 0 to hide it. */
+    prefForceFrameTime,         /*!< If true will alter PVRShellGetTime behaviour to be frame based. This is for debugging purposes. */
+    prefDiscardColor,           /*!< GLES: Whether or not to discard color data at the end of a render, to save bandwidth. Requires specific functionality. (default: false) */
+    prefDiscardDepth,           /*!< GLES: Whether or not to discard depth data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */
+    prefDiscardStencil          /*!< GLES: Whether or not to discard stencil data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */
+};
+
+/*!***********************************************************************
+ @enum prefNameFloatEnum
+ @brief Float Shell preferences.
+ ************************************************************************/
+enum prefNameFloatEnum
+{
+    prefQuitAfterTime           /*!< Shell will quit after this number of seconds (-1 to disable) */
+};
+
+/*!***********************************************************************
+ @enum prefNameIntEnum
+ @brief Integer Shell preferences.
+ ************************************************************************/
+enum prefNameIntEnum
+{
+    prefEGLMajorVersion,    /*!< EGL: returns the major version as returned by eglInitialize() */
+    prefEGLMinorVersion,    /*!< EGL: returns the minor version as returned by eglInitialize() */
+    prefWidth,              /*!< Width of render target */
+    prefHeight,             /*!< Height of render target */
+    prefPositionX,          /*!< X position of the window */
+    prefPositionY,          /*!< Y position of the window */
+    prefQuitAfterFrame,     /*!< Shell will quit after this number of frames (-1 to disable) */
+    prefSwapInterval,       /*!< 0 to preventing waiting for monitor vertical syncs */
+    prefInitRepeats,        /*!< Number of times to reinitialise (if >0 when app returns false from RenderScene(), shell will ReleaseView(), InitView() then re-enter RenderScene() loop). Decrements on each initialisation. */
+    prefAASamples,          /*!< Set to: 0 to disable full-screen anti-aliasing; 2 for 2x; 4 for 4x; 8 for 8x. */
+    prefCommandLineOptNum,  /*!< Returns the length of the array returned by prefCommandLineOpts */
+    prefColorBPP,           /*!< Allows you to specify a desired color buffer size e.g. 16, 32. */
+    prefDepthBPP,           /*!< Allows you to specify a desired depth buffer size e.g. 16, 24. */
+    prefRotateKeys,         /*!< Allows you to specify and retrieve how the keyboard input is transformed */
+    prefButtonState,        /*!< pointer button state */
+    prefCaptureFrameStart,  /*!< The frame to start capturing screenshots from */
+    prefCaptureFrameStop,   /*!< The frame to stop capturing screenshots at */
+    prefCaptureFrameScale,  /*!< Pixel-replicate saved screenshots this many times; default 1 for no scale */
+    prefPriority,           /*!< EGL: If supported will set the egl context priority; 0 for low, 1 for med and 2 for high. */
+    prefConfig,             /*!< EGL: Get the chosen EGL config. */
+    prefRequestedConfig,    /*!< EGL: Force the shell to use a particular EGL config. */
+    prefNativeDisplay,      /*!< EGL: Allows you to specify the native display to use if the device has more that one. */
+    prefFrameTimeValue      /*!< An integer value to say how long you wish one frame to last for (in ms) when force frame time is enabled. */
+};
+
+/*!***********************************************************************
+ @enum prefNamePtrEnum
+ @brief Pointers/Handlers Shell preferences.
+ ************************************************************************/
+enum prefNamePtrEnum
+{
+    prefD3DDevice,          /*!< D3D: returns the device pointer */
+    prefEGLDisplay,         /*!< EGL: returns the EGLDisplay */
+    prefEGLSurface,         /*!< EGL: returns the EGLSurface */
+    prefHINSTANCE,          /*!< Windows: returns the application instance handle */
+    prefNativeWindowType,   /*!< Returns the window handle */
+    prefAccelerometer,      /*!< Accelerometer values */
+    prefPointerLocation,    /*!< Mouse pointer/touch location values */
+    prefPVR2DContext,       /*!< PVR2D: returns the PVR2D context */
+    prefLoadFileFunc,       /*!< A pointer to a function that can be used to load external files on platforms that don't allow the use of fopen.
+                                 The ptr returned is of the type PFNLoadFileFunc defined below. */
+    prefReleaseFileFunc,        /*!< A pointer to a function that is used to release any data allocated by the load file function.
+                                 The ptr returned is of the type PFNReleaseFileFunc defined below. */
+    prefAndroidNativeActivity /*!< Android: A pointer to the ANativeActivity struct for the application. Your application will need to include android_native_app_glue.h to cast the pointer to ANativeActivity. */
+};
+
+/*!***********************************************************************
+ @typedef PFNLoadFileFunc
+ @brief The LoadFileFunc function pointer template.
+ ************************************************************************/
+typedef void* (*PFNLoadFileFunc)(const char*, char** pData, size_t &size);
+
+/*!***********************************************************************
+ @typedef PFNReleaseFileFunc
+ @brief The ReleaseFileFunc function pointer template.
+ ************************************************************************/
+typedef bool (*PFNReleaseFileFunc)(void* handle);
+
+/*!***********************************************************************
+ @enum prefNameConstPtrEnum
+ @brief Constant pointers Shell preferences.
+ ************************************************************************/
+enum prefNameConstPtrEnum
+{
+    prefAppName,            /*!< ptrValue is char* */
+    prefReadPath,           /*!< ptrValue is char*; will include a trailing slash */
+    prefWritePath,          /*!< ptrValue is char*; will include a trailing slash */
+    prefCommandLine,        /*!< used to retrieve the entire application command line */
+    prefCommandLineOpts,    /*!< ptrValue is SCmdLineOpt*; retrieves an array of arg/value pairs (parsed from the command line) */
+    prefExitMessage,        /*!< ptrValue is char*; gives the shell a message to show on exit, typically an error */
+    prefVersion             /*!< ptrValue is char* */
+};
+
+/*!**************************************************************************
+ @struct PVRShellData
+ @brief  PVRShell implementation Prototypes and definitions
+*****************************************************************************/
+struct PVRShellData;
+
+/*!***************************************************************************
+ @class PVRShellInit
+ *****************************************************************************/
+class PVRShellInit;
+
+/*!***********************************************************************
+ @struct SCmdLineOpt
+ @brief  Stores a variable name/value pair for an individual command-line option.
+ ************************************************************************/
+struct SCmdLineOpt
+{
+    const char *pArg, *pVal;
+};
+
+/*!***************************************************************************
+ @class    PVRShell
+ @brief    Inherited by the application; responsible for abstracting the OS and API.
+ @details  PVRShell is the main Shell class that an application uses. An
+           application should supply a class which inherits PVRShell and supplies
+           implementations of the virtual functions of PVRShell (InitApplication(),
+           QuitApplication(), InitView(), ReleaseView(), RenderScene()). Default stub
+           functions are supplied; this means that an application is not
+           required to supply a particular function if it does not need to do anything
+           in it.
+           The other, non-virtual, functions of PVRShell are utility functions that the
+           application may call.
+ *****************************************************************************/
+class PVRShell
+{
+private:
+    friend class PVRShellInitOS;
+    friend class PVRShellInit;
+
+    PVRShellData    *m_pShellData;
+    PVRShellInit    *m_pShellInit;
+
+public:
+    /*!***********************************************************************
+    @brief      Constructor
+    *************************************************************************/
+    PVRShell();
+
+    /*!***********************************************************************
+    @brief      Destructor
+    *************************************************************************/
+    virtual ~PVRShell();
+
+    /*
+        PVRShell functions that the application should implement.
+    */
+
+    /*!***********************************************************************
+    @brief      Initialise the application.
+    @details    This function can be overloaded by the application. It
+                will be called by PVRShell once, only at the beginning of
+                the PVRShell WinMain()/main() function. This function
+                enables the user to perform any initialisation before the
+                render API is initialised. From this function the user can
+                call PVRShellSet() to change default values, e.g.
+                requesting a particular resolution or device setting.
+    @return     true for success, false to exit the application
+    *************************************************************************/
+    virtual bool InitApplication() { return true; };
+
+    /*!***********************************************************************
+    @brief      Quit the application.
+    @details    This function can be overloaded by the application. It
+                will be called by PVRShell just before finishing the
+                program. It enables the application to release any
+                memory/resources acquired in InitApplication().
+    @return     true for success, false to exit the application
+    *************************************************************************/
+    virtual bool QuitApplication() { return true; };
+
+    /*!***********************************************************************
+    @brief      Initialise the view.
+    @details    This function can be overloaded by the application. It
+                will be called by PVRShell after the OS and rendering API
+                are initialised, before entering the RenderScene() loop.
+                It is called any time the rendering API is initialised,
+                i.e. once at the beginning, and possibly again if the
+                resolution changes, or a power management even occurs, or
+                if the app requests a re-initialisation.
+                The application should check here the configuration of
+                the rendering API; it is possible that requests made in
+                InitApplication() were not successful.
+                Since everything is initialised when this function is
+                called, you can load textures and perform rendering API functions.
+    @return     true for success, false to exit the application
+    *************************************************************************/
+    virtual bool InitView() { return true; };
+
+    /*!***********************************************************************
+     @brief     Release the view.
+     @details   This function can be overloaded by the application. It
+                will be called after the RenderScene() loop, before
+                shutting down the render API. It enables the application
+                to release any memory/resources acquired in InitView().
+     @return    true for success, false to exit the application
+    *************************************************************************/
+    virtual bool ReleaseView() {  return true; };
+
+    /*!***********************************************************************
+     @brief     Render the scene
+     @details   This function can be overloaded by the application.
+                It is main application function in which you have to do your own rendering.  Will be
+                called repeatedly until the application exits.
+     @return    true for success, false to exit the application
+    *************************************************************************/
+    virtual bool RenderScene() { return true; };
+
+    /*
+        PVRShell functions available for the application to use.
+    */
+
+    /*!***********************************************************************
+     @brief     This function is used to pass preferences to the PVRShell.
+                If used, this function must be called from InitApplication().
+     @param[in] prefName  Name of preference to set to value
+     @param[in] value     Value
+     @return    true for success
+    *************************************************************************/
+    bool PVRShellSet(const prefNameBoolEnum prefName, const bool value);
+
+    /*!***********************************************************************
+     @brief     This function is used to pass preferences to the PVRShell.
+                If used, this function must be called from InitApplication().
+     @param[in] prefName    Name of preference to set to value
+     @param[in] value       Value
+     @return    true for success
+    *************************************************************************/
+    bool PVRShellSet(const prefNameFloatEnum prefName, const float value);
+
+    /*!***********************************************************************
+     @brief     This function is used to pass preferences to the PVRShell.
+                If used, this function must be called from InitApplication().
+     @param[in] prefName    Name of preference to set to value
+     @param[in] value       Value
+     @return    true for success
+    *************************************************************************/
+    bool PVRShellSet(const prefNameIntEnum prefName, const int value);
+
+    /*!***********************************************************************
+     @brief     This function is used to pass preferences to the PVRShell.
+                If used, this funciton must be called from InitApplication().
+     @param[in] prefName    Name of preference to set to value
+     @param[in] ptrValue    Value
+     @return    true for success
+    *************************************************************************/
+    bool PVRShellSet(const prefNamePtrEnum prefName, const void * const ptrValue);
+
+    /*!***********************************************************************
+     @brief     This function is used to pass preferences to the PVRShell.
+                If used, this function must be called from InitApplication().
+     @param[in] prefName    Name of preference to set to value
+     @param[in] ptrValue    Value
+     @return    true for success
+    *************************************************************************/
+    bool PVRShellSet(const prefNameConstPtrEnum prefName, const void * const ptrValue);
+
+    /*!***********************************************************************
+     @brief     This function is used to get parameters from the PVRShell.
+                It can be called from anywhere in the program.
+     @param[in] prefName    Name of preference to set to value
+     @return    The requested value.
+    *************************************************************************/
+    bool PVRShellGet(const prefNameBoolEnum prefName) const;
+
+    /*!***********************************************************************
+    @brief      This function is used to get parameters from the PVRShell.
+                It can be called from anywhere in the program.
+    @param[in]  prefName    Name of preference to set to value
+    @return     The requested value.
+    *************************************************************************/
+    float PVRShellGet(const prefNameFloatEnum prefName) const;
+
+    /*!***********************************************************************
+    @brief      This function is used to get parameters from the PVRShell.
+                It can be called from anywhere in the program.
+    @param[in]  prefName    Name of preference to set to value
+    @return     The requested value.
+    *************************************************************************/
+    int PVRShellGet(const prefNameIntEnum prefName) const;
+
+    /*!***********************************************************************
+    @brief      This function is used to get parameters from the PVRShell.
+                It can be called from anywhere in the program.
+    @param[in]  prefName    Name of preference to set to value
+    @return     The requested value.
+    *************************************************************************/
+    void *PVRShellGet(const prefNamePtrEnum prefName) const;
+
+    /*!***********************************************************************
+    @brief      This function is used to get parameters from the PVRShell
+                It can be called from anywhere in the program.
+    @param[in]  prefName    Name of preference to set to value
+    @return     The requested value.
+    *************************************************************************/
+    const void *PVRShellGet(const prefNameConstPtrEnum prefName) const;
+
+    /*!***********************************************************************
+     @brief      It will be stored as 24-bit per pixel, 8-bit per chanel RGB. 
+                 The memory should be freed using the free() function when no longer needed.
+     @param[in]  Width   size of image to capture (relative to 0,0)
+     @param[in]  Height  size of image to capture (relative to 0,0)
+     @param[out] pLines  receives a pointer to an area of memory containing the screen buffer.
+     @return     true for success
+    *************************************************************************/
+    bool PVRShellScreenCaptureBuffer(const int Width, const int Height, unsigned char **pLines);
+
+    /*!***********************************************************************
+    @brief      Writes out the image data to a BMP file with basename fname.
+    @details    The file written will be fname suffixed with a
+                number to make the file unique.
+                For example, if fname is "abc", this function will attempt
+                to save to "abc0000.bmp"; if that file already exists, it
+                will try "abc0001.bmp", repeating until a new filename is
+                found. The final filename used is returned in ofname.
+    @param[in]  fname               base of file to save screen to
+    @param[in]  Width               size of image
+    @param[in]  Height              size of image
+    @param[in]  pLines              image data to write out (24bpp, 8-bit per channel RGB)
+    @param[in]  ui32PixelReplicate  expand pixels through replication (1 = no scale)
+    @param[out] ofname              If non-NULL, receives the filename actually used
+    @return     true for success
+    *************************************************************************/
+    int PVRShellScreenSave(
+        const char          * const fname,
+        const int           Width,
+        const int           Height,
+        const unsigned char * const pLines,
+        const unsigned int  ui32PixelReplicate = 1,
+        char                * const ofname = NULL);
+
+    /*!***********************************************************************
+     @brief     Writes out the image data to a BMP file with name fname.
+     @param[in] pszFilename     file to save screen to
+     @param[in] ui32Width       the width of the data
+     @param[in] ui32Height      the height of the data
+     @param[in] pImageData      image data to write out (24bpp, 8-bit per channel RGB)
+     @param[in] ui32PixelReplicate  expand pixels through replication (1 = no scale)
+     @return    0 on success
+    *************************************************************************/
+    int PVRShellWriteBMPFile(
+        const char          * const pszFilename,
+        const unsigned int  ui32Width,
+        const unsigned int  ui32Height,
+        const void          * const pImageData,
+        const unsigned int  ui32PixelReplicate = 1);
+
+    /*!***********************************************************************
+    @brief     Writes the resultant string to the debug output (e.g. using
+               printf(), OutputDebugString(), ...). Check the SDK release notes for
+               details on how the string is output.
+    @param[in] format       printf style format followed by arguments it requires
+    *************************************************************************/
+    void PVRShellOutputDebug(char const * const format, ...) const;
+
+    /*!***********************************************************************
+    @brief      The number itself should be considered meaningless; an
+                application should use this function to determine how much
+                time has passed between two points (e.g. between each frame).
+    @return     A value which increments once per millisecond.
+    *************************************************************************/
+    unsigned long PVRShellGetTime();
+
+    /*!***********************************************************************
+    @brief      Check if a key was pressed. 
+    @details    The keys on various devices
+                are mapped to the PVRShell-supported keys (listed in @a PVRShellKeyName) in
+                a platform-dependent manner, since most platforms have different input
+                devices. Check the <a href="modules.html">Modules page</a> for your OS
+                for details on how the enum values map to your device's key code input.
+    @param[in]  key     Code of the key to test
+    @return     true if key was pressed
+    *************************************************************************/
+    bool PVRShellIsKeyPressed(const PVRShellKeyName key);
+};
+
+/****************************************************************************
+** Declarations for functions that the scene file must supply
+****************************************************************************/
+
+/*!***************************************************************************
+ @brief     This function must be implemented by the user of the shell.
+ @details   The user should return its PVRShell object defining the
+            behaviour of the application.
+ @return    The demo supplied by the user
+*****************************************************************************/
+PVRShell* NewDemo();
+
+#endif /* __PVRSHELL_H_ */
+
+/*****************************************************************************
+ End of file (PVRShell.h)
+*****************************************************************************/
+
diff --git a/third_party/PowerVR_SDK/Shell/PVRShellImpl.h b/third_party/PowerVR_SDK/Shell/PVRShellImpl.h
new file mode 100644
index 0000000..ef7a50c
--- /dev/null
+++ b/third_party/PowerVR_SDK/Shell/PVRShellImpl.h
@@ -0,0 +1,484 @@
+/*!****************************************************************************
+
+ @file       Shell/PVRShellImpl.h
+ @copyright  Copyright (c) Imagination Technologies Limited.
+ @brief      Makes programming for 3D APIs easier by wrapping surface
+             initialization, texture allocation and other functions for use by a demo.
+
+******************************************************************************/
+
+#ifndef __PVRSHELLIMPL_H_
+#define __PVRSHELLIMPL_H_
+
+/*****************************************************************************
+** Build options
+*****************************************************************************/
+
+
+/*****************************************************************************
+** Macros
+*****************************************************************************/
+#define FREE(X) { if(X) { free(X); (X)=0; } }
+
+#ifndef _ASSERT
+#define _ASSERT(X) /**/
+#endif
+
+/*****************************************************************************
+** Defines
+*****************************************************************************/
+#define STR_WNDTITLE (" - Build ")
+
+/*!***************************************************************************
+ @struct PVRShellData
+ @brief Holds PVRShell internal data.
+*****************************************************************************/
+struct PVRShellData
+{
+    // Shell Interface Data
+    char        *pszAppName;                /*!< Application name string. */
+    char        *pszExitMessage;            /*!< Exit message string. */
+    int         nShellDimX;                 /*!< Width in pixels. */
+    int         nShellDimY;                 /*!< Height in pixels. */
+    int         nShellPosX;                 /*!< X position of the window. */
+    int         nShellPosY;                 /*!< Y position of the window. */
+    bool        bFullScreen;                /*!< Fullscreen boolean. */
+    bool        bLandscape;                 /*!< Landscape orientation boolean. false = portrait orientation. */
+    bool        bNeedPbuffer;               /*!< True if pixel buffer is needed. */
+    bool        bNeedZbuffer;               /*!< True if Z buffer is needed. */
+    bool        bNeedStencilBuffer;         /*!< True if stencil buffer is needed. */
+    bool        bNeedPixmap;                /*!< True if pixmap is needed. */
+    bool        bNeedPixmapDisableCopy;     /*!< Disables copy if true, because pixmaps are used. */
+    bool        bLockableBackBuffer;        /*!< DX9 only. Enable the use of D3DPRESENTFLAG_LOCKABLE_BACKBUFFER. */
+    bool        bSoftwareRender;            /*!< Enable the use of software rendering. */
+    bool        bNeedAlphaFormatPre;        /*!< EGL only: If true, creates the EGL surface with EGL_ALPHA_FORMAT_PRE. */
+    bool        bUsingPowerSaving;          /*!< Use power saving mode when device is not in use. */
+    bool        bOutputInfo;                /*!< Enable information to be output via PVRShellOutputDebug. For example, 
+                                                 the depth of the colour surface created, extenstions supported and 
+                                                 dimensions of the surface created. */
+    bool        bNoShellSwapBuffer;         /*!< Disable eglswapbuffers at the end of each frame. */
+    int         nSwapInterval;              /*!< Interval to wait for monitor vertical sync. */
+    int         nInitRepeats;               /*!< Number of times to reinitialise. */
+    int         nDieAfterFrames;            /*!< Set shell to quit after this number of frames (-1 to disable) */
+    float       fDieAfterTime;              /*!< Set shell to quit after this number of seconds (-1 to disable). */
+    int         nAASamples;                 /*!< Number of anti-aliasing samples to have. 0 disables anti-aliasing. */
+    int         nColorBPP;                  /*!< Color buffer size. */
+    int         nDepthBPP;                  /*!< Depth buffer size. */
+    int         nCaptureFrameStart;         /*!< The frame to start capturing screenshots from. */
+    int         nCaptureFrameStop;          /*!< The frame to stop capturing screenshots from. */
+    int         nCaptureFrameScale;         /*!< Save screenshots scale factor. 1 for no scaling. */
+    int         nPriority;                  /*!< EGL: If supported sets the egl context priority; 
+                                                 0 for low, 1 for med and 2 for high. */
+    bool        bForceFrameTime;            /*!< Overrides PVRShellGetTime to force specified frame time. May cause
+                                                 problems if PVRShellGetTime is called multiple times in a frame. */
+    int         nFrameTime;                 /*!< How long for each frame time to last (in ms). */
+    bool        bDiscardFrameColor;         /*!< Discard color data at the end of a render. */
+    bool        bDiscardFrameDepth;         /*!< Discard depth data at the end of a render. */
+    bool        bDiscardFrameStencil;       /*!< Discard stencil data at the end of a render. */
+
+    // Internal Data
+    bool        bShellPosWasDefault;        /*!< Internal. Default position for the shell was used. */
+    int         nShellCurFrameNum;          /*!< Internal. Current frame number. */
+#ifdef PVRSHELL_FPS_OUTPUT
+    bool        bOutputFPS;                 /*!< Output frames per second. */
+#endif
+};
+
+/*!***************************************************************************
+ @class PVRShellCommandLine
+ @brief Command-line interpreter
+*****************************************************************************/
+class PVRShellCommandLine
+{
+public:
+	char		*m_psOrig, *m_psSplit;
+	SCmdLineOpt	*m_pOpt;
+	int			m_nOptLen, m_nOptMax;
+
+public:
+	/*!***********************************************************************
+	@brief		Constructor
+	*************************************************************************/
+	PVRShellCommandLine();
+
+	/*!***********************************************************************
+	@brief      Destructor
+	*************************************************************************/
+	~PVRShellCommandLine();
+
+	/*!***********************************************************************
+	@brief	    Set command-line options to pStr
+	@param[in]  pStr Input string
+	*************************************************************************/
+	void Set(const char *pStr);
+
+	/*!***********************************************************************
+	@brief	    Prepend command-line options to m_psOrig
+	@param[in]  pStr Input string
+	*************************************************************************/
+	void Prefix(const char *pStr);
+
+	/*!***********************************************************************
+	@brief      Prepend command-line options to m_psOrig from a file
+	@param[in]  pFileName Input string
+	*************************************************************************/
+	bool PrefixFromFile(const char *pFileName);
+
+	/*!***********************************************************************
+	@brief      Parse m_psOrig for command-line options and store them in m_pOpt
+	*************************************************************************/
+	void Parse();
+
+	/*!***********************************************************************
+	@brief      Apply the command-line options to shell
+	@param[in]  shell
+	*************************************************************************/
+	void Apply(PVRShell &shell);
+};
+
+/*!****************************************************************************
+ @enum  EPVRShellState
+ @brief Current Shell state
+*****************************************************************************/
+enum EPVRShellState {
+	ePVRShellInitApp,		/*!< Initialise app */
+	ePVRShellInitInstance,	/*!< Initialise instance */
+	ePVRShellRender,		/*!< Render */
+	ePVRShellReleaseView,	/*!< Release View */
+	ePVRShellReleaseAPI,	/*!< Release API */
+	ePVRShellReleaseOS,		/*!< Release Operating System */
+	ePVRShellQuitApp,		/*!< Quit App */
+	ePVRShellExit		    /*!< Exit */
+};
+
+/*!***************************************************************************
+ @class  PVRShellInit
+ @brief  The PVRShell initialisation class
+ ****************************************************************************/
+class PVRShellInit : public PVRShellInitAPI, public PVRShellInitOS
+{
+public:
+	friend class PVRShell;
+	friend class PVRShellInitOS;
+	friend class PVRShellInitAPI;
+
+	PVRShell			*m_pShell;		/*!< Our PVRShell class */
+	PVRShellCommandLine	m_CommandLine;	/*!< Our Command-line class */
+
+	bool		gShellDone;				/*!< Indicates that the application has finished */
+	EPVRShellState	m_eState;			/*!< Current PVRShell state */
+
+	// Key handling
+	PVRShellKeyName	nLastKeyPressed;	/*!< Holds the last key pressed */
+	PVRShellKeyName m_eKeyMapLEFT;		/*!< Holds the value to be returned when PVRShellKeyNameLEFT is requested */
+	PVRShellKeyName m_eKeyMapUP;		/*!< Holds the value to be returned when PVRShellKeyNameUP is requested */
+	PVRShellKeyName m_eKeyMapRIGHT;		/*!< Holds the value to be returned when PVRShellKeyNameRIGHT is requested */
+	PVRShellKeyName m_eKeyMapDOWN;		/*!< Holds the value to be returned when PVRShellKeyNameDOWN is requested */
+
+	// Read and Write path
+	char	*m_pReadPath;				/*!<Holds the path where the application will read the data from */
+	char	*m_pWritePath;				/*!<Holds the path where the application will write the data to */
+
+#ifdef PVRSHELL_FPS_OUTPUT
+	// Frames per second (FPS)
+	int		m_i32FpsFrameCnt, m_i32FpsTimePrev;
+#endif
+
+public:
+
+protected:
+	float m_vec2PointerLocation[2];
+	float m_vec2PointerLocationStart[2];
+	float m_vec2PointerLocationEnd[2];
+
+	// Touch handling
+	bool m_bTouching;
+
+public:
+    /*!***********************************************************************
+	@brief     Constructor
+	*************************************************************************/
+	PVRShellInit();
+
+	/*!***********************************************************************
+	@brief     Destructor
+	*************************************************************************/
+	~PVRShellInit();
+
+	/*!***********************************************************************
+	@brief     PVRShell Initialisation.
+	@return    True on success and false on failure
+	*************************************************************************/
+	bool Init();
+
+	/*!***********************************************************************
+	@brief     PVRShell Deinitialisation.
+	*************************************************************************/
+	void Deinit();
+
+	/*!***********************************************************************
+	@param[in] str   A string containing the command-line
+	@brief     Receives the command-line from the application.
+	*************************************************************************/
+	void CommandLine(const char *str);
+
+	/*!***********************************************************************
+	@brief     Receives the command-line from the application.
+	@param[in] argc   Number of strings in argv
+	@param[in] argv   An array of strings
+	*************************************************************************/
+	void CommandLine(int argc, char **argv);
+
+	/*!***********************************************************************
+	@brief     Return 'true' if the specific key has been pressed.
+	@param[in] key The key we're querying for
+	*************************************************************************/
+	bool DoIsKeyPressed(const PVRShellKeyName key);
+
+	/*!***********************************************************************
+	@param[in] key   The key that has been pressed
+	@brief     Used by the OS-specific code to tell the Shell that a key has been pressed.
+	*************************************************************************/
+	void KeyPressed(PVRShellKeyName key);
+
+	/*!***********************************************************************
+	@brief     Used by the OS-specific code to tell the Shell that a touch has began at a location.
+	@param[in] vec2Location   The position of a click/touch on the screen when it first touches.
+	*************************************************************************/
+	void TouchBegan(const float vec2Location[2]);
+	
+	/*!***********************************************************************
+	@brief     Used by the OS-specific code to tell the Shell that a touch has began at a location.
+	@param[in] vec2Location The position of the pointer/touch pressed on the screen.
+	*************************************************************************/
+	void TouchMoved(const float vec2Location[2]);
+	
+	/*!***********************************************************************
+	@brief     Used by the OS-specific code to tell the Shell that the current touch has ended at a location.
+	@param[in] vec2Location   The position of the pointer/touch on the screen when it is released.
+	*************************************************************************/
+	void TouchEnded(const float vec2Location[2]);
+
+	/*!***********************************************************************
+	@brief     Used by the OS-specific code to tell the Shell where to read external files from.
+	@return    A path the application is capable of reading from.
+	*************************************************************************/
+	const char	*GetReadPath() const;
+
+	/*!***********************************************************************
+	@brief     Used by the OS-specific code to tell the Shell where to write to.
+	@return    A path the applications is capable of writing to
+	*************************************************************************/
+	const char	*GetWritePath() const;
+
+	/*!******************************************************************************
+	@brief     Sets the default app name (to be displayed by the OS)
+	@param[in] str The application name
+	*******************************************************************************/
+	void SetAppName(const char * const str);
+
+	/*!***********************************************************************
+	@brief     Set the path to where the application expects to read from.
+	@param[in] str The read path
+	*************************************************************************/
+	void SetReadPath(const char * const str);
+
+	/*!***********************************************************************
+	@brief     Set the path to where the application expects to write to.
+	@param[in] str The write path
+	*************************************************************************/
+	void SetWritePath(const char * const str);
+
+	/*!***********************************************************************
+	@brief     Called from the OS-specific code to perform the render.
+	           When this function fails the application will quit.
+	*************************************************************************/
+	bool Run();
+
+	/*!***********************************************************************
+	@brief     When prefOutputInfo is set to true this function outputs
+			   various pieces of non-API dependent information via
+			   PVRShellOutputDebug.
+	*************************************************************************/
+	void OutputInfo();
+
+	/*!***********************************************************************
+	@brief     When prefOutputInfo is set to true this function outputs
+			   various pieces of API dependent information via
+			   PVRShellOutputDebug.
+	*************************************************************************/
+	void OutputAPIInfo();
+
+#ifdef PVRSHELL_FPS_OUTPUT
+	/*!****************************************************************************
+	@brief     Calculates a value for frames-per-second (FPS).
+	*****************************************************************************/
+	void FpsUpdate();
+#endif
+
+	/*
+		OS functionality
+	*/
+
+	/*!***********************************************************************
+	@brief     Initialisation for OS-specific code.
+	*************************************************************************/
+	void		OsInit();
+
+	/*!***********************************************************************
+	@brief     Saves instance handle and creates main window
+			   In this function, we save the instance handle in a global variable and
+			   create and display the main program window.
+	*************************************************************************/
+	bool		OsInitOS();
+
+	/*!***********************************************************************
+	@brief     Destroys main window
+	*************************************************************************/
+	void		OsReleaseOS();
+
+	/*!***********************************************************************
+	@brief     Destroys main window
+	*************************************************************************/
+	void		OsExit();
+
+	/*!***********************************************************************
+	@brief     Perform API initialization and bring up window / fullscreen
+	*************************************************************************/
+	bool		OsDoInitAPI();
+
+	/*!***********************************************************************
+	@brief     Clean up after we're done
+	*************************************************************************/
+	void		OsDoReleaseAPI();
+
+	/*!***********************************************************************
+	@brief     Main message loop / render loop
+	*************************************************************************/
+	void		OsRenderComplete();
+
+	/*!***********************************************************************
+	@brief     When using pixmaps, copy the render to the display
+	*************************************************************************/
+	bool		OsPixmapCopy();
+
+	/*!***********************************************************************
+	@brief     Called from InitAPI() to get the NativeDisplayType
+	*************************************************************************/
+	void		*OsGetNativeDisplayType();
+
+	/*!***********************************************************************
+	@brief     Called from InitAPI() to get the NativePixmapType
+	*************************************************************************/
+	void		*OsGetNativePixmapType();
+
+	/*!***********************************************************************
+	@brief 	   Called from InitAPI() to get the NativeWindowType
+	*************************************************************************/
+	void		*OsGetNativeWindowType();
+
+	/*!***********************************************************************
+	@brief    	Retrieves OS-specific data
+	@param[in]  prefName	Name of preference to get
+	@param[out] pn   A pointer set to the preference.
+	@return 	true on success
+	*************************************************************************/
+	bool		OsGet(const prefNameIntEnum prefName, int *pn);
+
+	/*!***********************************************************************
+	@brief      Retrieves OS-specific data
+	@param[in]  prefName	Name of value to get
+	@param[out]	pp A pointer set to the value asked for
+	@return 	true on success
+	*************************************************************************/
+	bool		OsGet(const prefNamePtrEnum prefName, void **pp);
+
+	/*!***********************************************************************
+	@brief     Sets OS-specific data
+	@param[in] prefName		Name of preference to set to value
+	@param[in] value		Value
+	@return	   true for success
+	*************************************************************************/
+	bool		OsSet(const prefNameBoolEnum prefName, const bool value);
+
+	/*!***********************************************************************
+	@brief     Sets OS-specific data
+	@param[in] prefName	Name of value to set
+	@param[in] i32Value 	The value to set our named value to
+	@return    true on success
+	*************************************************************************/
+	bool		OsSet(const prefNameIntEnum prefName, const int i32Value);
+
+	/*!***********************************************************************
+	@brief     Prints a debug string
+	@param[in] str The debug string to display
+	*************************************************************************/
+	void OsDisplayDebugString(char const * const str);
+
+	/*!***********************************************************************
+	@brief     Gets the time in milliseconds
+	*************************************************************************/
+	unsigned long OsGetTime();
+
+	/*
+		API functionality
+	*/
+	/*!***********************************************************************
+	@brief     Initialisation for API-specific code.
+	*************************************************************************/
+	bool ApiInitAPI();
+
+	/*!***********************************************************************
+	@brief     Releases all resources allocated by the API.
+	*************************************************************************/
+	void ApiReleaseAPI();
+
+	/*!***********************************************************************
+	@brief      API-specific function to store the current content of the
+				FrameBuffer into the memory allocated by the user.
+	@param[in] 	Width  Width of the region to capture
+	@param[in] 	Height Height of the region to capture
+	@param[out]	pBuf   A buffer to put the screen capture into
+	@return     true on success
+	*************************************************************************/
+	bool ApiScreenCaptureBuffer(int Width,int Height,unsigned char *pBuf);
+
+	/*!***********************************************************************
+	@brief    	Perform API operations required after a frame has finished (e.g., flipping).
+	*************************************************************************/
+	void ApiRenderComplete();
+
+	/*!***********************************************************************
+	@brief    	Set preferences which are specific to the API.
+	@param[in] 	prefName	Name of preference to set
+	@param[out]	i32Value	Value to set it to
+	*************************************************************************/
+	bool ApiSet(const prefNameIntEnum prefName, const int i32Value);
+
+	/*!***********************************************************************
+	@brief    	Get parameters which are specific to the API.
+	@param[in]  prefName	Name of value to get
+	@param[out] pn   A pointer set to the value asked for
+	*************************************************************************/
+	bool ApiGet(const prefNameIntEnum prefName, int *pn);
+
+    /*!***********************************************************************
+	@brief    	 Get parameters which are specific to the API.
+	@param[in]  prefName	Name of value to get
+	@param[out] pp   A pointer set to the value asked for
+	*************************************************************************/
+	bool ApiGet(const prefNamePtrEnum prefName, void **pp);
+    
+    
+	/*!***********************************************************************
+	@brief     Run specific API code to perform the operations requested in preferences.
+	*************************************************************************/
+	void ApiActivatePreferences();
+};
+
+#endif /* __PVRSHELLIMPL_H_ */
+
+/*****************************************************************************
+ End of file (PVRShellImpl.h)
+*****************************************************************************/
+
