[iortcw] 289/497: SP: Fix Raspberry Pi build to work with SDL2

Simon McVittie smcv at debian.org
Fri Sep 8 10:37:09 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to annotated tag 1.42d
in repository iortcw.

commit 89db06edf2b628edf17e0e5a4968bb744c9e280c
Author: M4N4T4RMS at gmail.com <M4N4T4RMS at gmail.com@e65d2741-a53d-b2dc-ae96-bb75fa5e4c4a>
Date:   Wed Feb 11 23:29:42 2015 +0000

    SP: Fix Raspberry Pi build to work with SDL2
---
 SP/Makefile                      |   31 +-
 SP/README_RASPBERRYPI            |   33 +
 SP/README_VC                     |   14 -
 SP/code/client/cl_cin.c          |   11 +
 SP/code/es/es_gamma.c            |   34 -
 SP/code/es/es_glimp.c            |  547 ---------------
 SP/code/es/es_input.c            |  346 ----------
 SP/code/es/es_snd.c              |   76 ---
 SP/code/es/etc1encode.c          | 1129 ------------------------------
 SP/code/game/g_main.c            |    6 +-
 SP/code/qcommon/q_shared.h       |    5 -
 SP/code/renderer/qgl.h           | 1404 +++++++++++++++++++-------------------
 SP/code/renderer/tr_animation.c  |    6 +-
 SP/code/renderer/tr_backend.c    |  153 ++---
 SP/code/renderer/tr_bloom.c      |   26 +
 SP/code/renderer/tr_cmds.c       |   14 +-
 SP/code/renderer/tr_image.c      |  275 ++++++--
 SP/code/renderer/tr_init.c       |   34 +-
 SP/code/renderer/tr_local.h      |    9 +-
 SP/code/renderer/tr_main.c       |   25 +-
 SP/code/renderer/tr_shade.c      |   97 +--
 SP/code/renderer/tr_shadows.c    |   89 ++-
 SP/code/renderer/tr_sky.c        |  123 ++--
 SP/code/renderer/tr_surface.c    |   84 ++-
 SP/code/sdl/sdl_glimp.c          |   49 ++
 SP/code/splines/q_splineshared.h |    5 -
 SP/code/sys/sys_loadlib.h        |   16 -
 SP/code/sys/sys_main.c           |   18 -
 SP/make-raspberrypi.sh           |    8 +-
 29 files changed, 1412 insertions(+), 3255 deletions(-)

diff --git a/SP/Makefile b/SP/Makefile
index f3c99fd..50a17f6 100644
--- a/SP/Makefile
+++ b/SP/Makefile
@@ -36,7 +36,7 @@ ifndef BUILD_BASEGAME
   BUILD_BASEGAME =
 endif
 ifndef BUILD_RENDERER_REND2
-  BUILD_RENDERER_REND2 = 
+  BUILD_RENDERER_REND2 =
 endif
 ifndef BUILD_ARCHIVE
   BUILD_ARCHIVE = 0
@@ -259,6 +259,10 @@ ifndef USE_OPENGLES
 USE_OPENGLES=0
 endif
 
+ifndef RASPBERRY_PI
+RASPBERRY_PI=0
+endif
+
 
 #############################################################################
 
@@ -415,13 +419,22 @@ ifneq (,$(findstring "$(PLATFORM)", "linux" "gnu_kfreebsd" "kfreebsd-gnu"))
   LIBS=-ldl -lm
 
   ifeq ($(USE_OPENGLES),1)
-    CLIENT_LIBS=-lSDL2
-    RENDERER_LIBS =-lSDL2 -lvchostif -lvcfiled_check -lbcm_host -lkhrn_static -lvchiq_arm -lopenmaxil -lEGL -lGLESv2 -lvcos
-    SERVER_LIBS=-lbcm_host -lvchiq_arm -lvcos
+    ifeq ($(RASPBERRY_PI),1)
+      BASE_CFLAGS += -DUSE_OPENGLES
+      LDFLAGS += -L/opt/vc/lib
+      CLIENT_LIBS = $(SDL_LIBS) -lbcm_host
+      RENDERER_LIBS = $(SDL_LIBS) -lEGL -lGLESv1_CM -lbcm_host
+      SERVER_LIBS= -lbcm_host
+    else
+      BASE_CFLAGS += -DUSE_OPENGLES
+      CLIENT_LIBS = $(SDL_LIBS)
+      RENDERER_LIBS = $(SDL_LIBS) -lEGL -lGLESv1_CM
+      SERVER_LIBS =
+    endif
   else
-    CLIENT_LIBS=$(SDL_LIBS)
+    CLIENT_LIBS = $(SDL_LIBS)
     RENDERER_LIBS = $(SDL_LIBS) -lGL
-    SERVER_LIBS=
+    SERVER_LIBS =
   endif
 
   ifeq ($(USE_OPENAL),1)
@@ -1783,14 +1796,8 @@ ifeq ($(USE_BLOOM),1)
   Q3ROBJ += $(B)/renderer/tr_bloom.o 
 endif
 
-ifeq ($(USE_OPENGLES),1)
-  Q3ROBJ += $(B)/renderer/es_gamma.o 
-  Q3ROBJ += $(B)/renderer/es_glimp.o
-  Q3ROBJ += $(B)/renderer/etc1encode.o
-else
   Q3ROBJ += $(B)/renderer/sdl_gamma.o
   Q3ROBJ += $(B)/renderer/sdl_glimp.o
-endif
 
 ifneq ($(USE_RENDERER_DLOPEN), 0)
   Q3ROBJ += \
diff --git a/SP/README_RASPBERRYPI b/SP/README_RASPBERRYPI
new file mode 100644
index 0000000..e599716
--- /dev/null
+++ b/SP/README_RASPBERRYPI
@@ -0,0 +1,33 @@
+To run iortcw on the Raspberry Pi requires SDL2.
+
+SDL2 will need to be built in a particular way to have hardware accelerated
+graphics.
+
+Download the SDL2 source code (2.0.3 at the time of this writing) from:
+
+http://libsdl.org/release/SDL2-2.0.3.tar.gz
+
+You will need to install the libudev development files for mouse support.
+On the Raspbian distro, this is done by running the command:
+
+sudo apt-get install libudev-dev
+
+You will also need to disable x11 (software rendering) and opengl (not supported
+on the Raspberry Pi.)
+
+Unpack the SDL source and go into the source tree and issue the command:
+
+./configure --disable-video-x11 --disable-video-opengl
+
+After that has completed, type:
+make
+
+If build completes successfully, type:
+sudo make install
+
+
+At this point you can go into the iortcw source tree and type:
+./make-raspberry-pi.sh
+
+Output binaries will be located in the 'build' directory, which you can copy
+into your RTCW install directory.
diff --git a/SP/README_VC b/SP/README_VC
deleted file mode 100644
index 825bb13..0000000
--- a/SP/README_VC
+++ /dev/null
@@ -1,14 +0,0 @@
-All BCM2835-specific modifications are enclosed by one of
-
-VCMODS_MISC - small miscellaneous changes
-VCMODS_OPENGLES - remove desktop GL dependencies
-VCMODS_DEPTH - remove depth buffer clears
-VCMODS_REPLACETRIG - replace sin with sinf etc
-VCMODS_NOSDL - remove SDL dependencies
-
-Build-Depends:
- libcurl4-gnutls-dev libjpeg8-dev libopenal-dev libsdl1.2-dev libspeexdsp-dev libvorbis-dev
-
-Run:
-./make-raspberrypi.sh
-
diff --git a/SP/code/client/cl_cin.c b/SP/code/client/cl_cin.c
index f4a985e..653f1f9 100644
--- a/SP/code/client/cl_cin.c
+++ b/SP/code/client/cl_cin.c
@@ -611,11 +611,18 @@ static unsigned short yuv_to_rgb( long y, long u, long v ) {
 *
 ******************************************************************************/
 static unsigned int yuv_to_rgb24( long y, long u, long v ) {
+#ifdef USE_OPENGLES
+	long a,r,g,b,YY = (long)( ROQ_YY_tab[( y )]);
+#else
 	long r,g,b,YY = (long)( ROQ_YY_tab[( y )] );
+#endif
 
 	r = ( YY + ROQ_VR_tab[v] ) >> 6;
 	g = ( YY + ROQ_UG_tab[u] + ROQ_VG_tab[v] ) >> 6;
 	b = ( YY + ROQ_UB_tab[u] ) >> 6;
+#ifdef USE_OPENGLES
+	a = 255;
+#endif
 
 	if ( r < 0 ) {
 		r = 0;
@@ -636,7 +643,11 @@ static unsigned int yuv_to_rgb24( long y, long u, long v ) {
 		b = 255;
 	}
 
+#ifdef USE_OPENGLES
+	return LittleLong( ( r ) | ( g << 8 ) | ( b << 16 ) | ( 255 << 24 ) | ( a << 24 ) );
+#else
 	return LittleLong( ( r ) | ( g << 8 ) | ( b << 16 ) | ( 255 << 24 ) );
+#endif
 }
 
 /******************************************************************************
diff --git a/SP/code/es/es_gamma.c b/SP/code/es/es_gamma.c
deleted file mode 100644
index a5b86f5..0000000
--- a/SP/code/es/es_gamma.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-
-This file is part of Quake III Arena source code.
-
-Quake III Arena source code is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Quake III Arena source code is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Quake III Arena source code; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-===========================================================================
-*/
-
-#include "../renderer/tr_local.h"
-#include "../qcommon/qcommon.h"
-
-/*
-=================
-GLimp_SetGamma
-=================
-*/
-void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] )
-{
-}
-
diff --git a/SP/code/es/es_glimp.c b/SP/code/es/es_glimp.c
deleted file mode 100644
index 87b164b..0000000
--- a/SP/code/es/es_glimp.c
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-
-This file is part of Quake III Arena source code.
-
-Quake III Arena source code is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Quake III Arena source code is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Quake III Arena source code; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-===========================================================================
-*/
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#ifndef VCMODS_NOSDL
-#ifdef USE_LOCAL_HEADERS
-#  include "SDL.h"
-#else
-#  include <SDL.h>
-#endif
-#endif
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#include "../renderer/tr_local.h"
-#include "../client/client.h"
-#include "../sys/sys_local.h"
-
-typedef enum
-{
-   RSERR_OK,
-
-   RSERR_INVALID_FULLSCREEN,
-   RSERR_INVALID_MODE,
-
-   RSERR_UNKNOWN
-} rserr_t;
-
-SDL_Window *SDL_window = NULL;
-static SDL_GLContext *SDL_glContext = NULL;
-
-void (* qglLockArraysEXT) (GLint first, GLsizei count) = NULL;
-void (* qglUnlockArraysEXT) (void) = NULL;
-
-extern void etc1_compress_tex_image(
-   GLenum target,
-   GLint level,
-   GLenum internalformat,
-   GLsizei width,
-   GLsizei height,
-   GLint border,
-   GLenum format,
-   GLenum type,
-   const GLvoid *pixels);
-
-static int isopaque(GLint width, GLint height, const GLvoid *pixels)
-{
-   unsigned char const *cpixels = (unsigned char const *)pixels;
-
-   int i;
-
-   for (i = 0; i < width * height; i++) {
-      if (cpixels[i*4+3] != 0xff)
-         return 0;
-   }
-
-   return 1;
-}
-
-void rgba4444_convert_tex_image(
-   GLenum target,
-   GLint level,
-   GLenum internalformat,
-   GLsizei width,
-   GLsizei height,
-   GLint border,
-   GLenum format,
-   GLenum type,
-   const GLvoid *pixels)
-{
-   unsigned char const *cpixels = (unsigned char const *)pixels;
-
-   unsigned short *rgba4444data = malloc(2 * width * height);
-
-   int i;
-
-   for (i = 0; i < width * height; i++) {
-      unsigned char r,g,b,a;
-
-      r = cpixels[4*i]>>4;
-      g = cpixels[4*i+1]>>4;
-      b = cpixels[4*i+2]>>4;
-      a = cpixels[4*i+3]>>4;
-
-      rgba4444data[i] = r << 12 | g << 8 | b << 4 | a;
-   }
-
-   glTexImage2D(target, level, format, width, height,border,format,GL_UNSIGNED_SHORT_4_4_4_4,rgba4444data);
-
-   free(rgba4444data);
-}
-
-void myglTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
-   static int opaque = 0;
-
-   if (format == GL_RGB && type == GL_UNSIGNED_BYTE) {
-      assert(level == 0);
-      opaque = 1;
-
-      etc1_compress_tex_image(target, level, format, width, height, border, format, type, pixels);
-   } else if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
-      if (level == 0)
-         opaque = isopaque(width, height, pixels);
-
-      if (opaque)
-         etc1_compress_tex_image(target, level, format, width, height, border, format, type, pixels);
-      else
-         rgba4444_convert_tex_image(target, level, format, width, height, border, format, type, pixels);
-   } else
-      assert(0);
-}
-
-static int firstclear = 1;
-
-void myglClear(GLbitfield mask)
-{
-   if (firstclear) {
-      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-      firstclear = 0;
-   }
-}
-
-/* TODO any other functions that need modifying for stereo? eg glReadPixels? */
-
-static GLenum draw_buffer = GL_BACK;
-static struct rect_t {
-   GLint x, y;
-   GLsizei w, h;
-} viewport = {0, 0, -1, -1}, scissor = {0, 0, -1, -1};
-
-static void fix_rect(struct rect_t *r)
-{
-   if (r->w == -1) { r->w = glConfig.vidWidth; }
-   if (r->h == -1) { r->h = glConfig.vidHeight; }
-}
-
-static void fudge_rect(struct rect_t *out, const struct rect_t *in,
-   int xshift, int xoffset)
-{
-   out->x = xoffset + (in->x >> xshift);
-   out->y = in->y;
-   out->w = (xoffset + ((in->x + in->w) >> xshift)) - out->x;
-   out->h = in->h;
-}
-
-static void update_viewport_and_scissor(void)
-{
-   int xshift = 0, xoffset = 0;
-   struct rect_t r;
-
-   switch (draw_buffer) {
-   case GL_BACK_LEFT:
-      xshift = 1;
-      break;
-   case GL_BACK_RIGHT:
-      xshift = 1;
-      xoffset = glConfig.vidWidth >> 1;
-      break;
-   }
-
-   fix_rect(&viewport);
-   fudge_rect(&r, &viewport, xshift, xoffset);
-   glViewport(r.x, r.y, r.w, r.h);
-
-   fix_rect(&scissor);
-   fudge_rect(&r, &scissor, xshift, xoffset);
-   glScissor(r.x, r.y, r.w, r.h);
-}
-
-void myglDrawBuffer(GLenum mode)
-{
-   draw_buffer = mode;
-   update_viewport_and_scissor();
-}
-
-void myglViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   viewport.x = x;
-   viewport.y = y;
-   viewport.w = width;
-   viewport.h = height;
-   update_viewport_and_scissor();
-}
-
-void myglScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   scissor.x = x;
-   scissor.y = y;
-   scissor.w = width;
-   scissor.h = height;
-   update_viewport_and_scissor();
-}
-
-/*
-===============
-GLimp_Shutdown
-===============
-*/
-void GLimp_Shutdown( void )
-{
-}
-
-/*
-===============
-GLimp_LogComment
-===============
-*/
-void GLimp_LogComment( char *comment )
-{
-}
-
-/*
-===============
-GLimp_Minimize
-
-Minimize the game so that user is back at the desktop
-===============
-*/
-void GLimp_Minimize(void)
-{
-}
-
-/*
-===============
-GLimp_StartDriverAndSetMode
-===============
-*/
-
-static EGLDisplay   g_EGLDisplay;
-static EGLConfig    g_EGLConfig;
-static EGLContext   g_EGLContext;
-static EGLSurface   g_EGLWindowSurface;
-
-static qboolean GLimp_StartDriverAndSetMode( int mode, qboolean fullscreen, NativeWindowType hWnd )
-{
-   /* TODO cleanup on failure... */
-
-   /* EGL Setup */
-   const EGLint s_configAttribs[] =
-   {
-      EGL_RED_SIZE,       5,
-      EGL_GREEN_SIZE,     6,
-      EGL_BLUE_SIZE,      5,
-      EGL_ALPHA_SIZE,     0,
-      EGL_DEPTH_SIZE,     16,
-      EGL_STENCIL_SIZE,   0,
-      EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
-      EGL_SAMPLE_BUFFERS, 1,
-      EGL_NONE
-   };
-
-   EGLint numConfigs;
-   EGLint majorVersion;
-   EGLint minorVersion;
-
-#ifndef VCMODS_NOSDL
-   if (!SDL_WasInit(SDL_INIT_VIDEO))
-   {
-      const char *driverName;
-
-      if (SDL_Init(SDL_INIT_VIDEO) == -1)
-      {
-         ri.Printf( PRINT_ALL, "SDL_Init( SDL_INIT_VIDEO ) FAILED (%s)\n",
-               SDL_GetError());
-         return qfalse;
-      }
-
-      driverName = SDL_GetCurrentVideoDriver( );
-      ri.Printf( PRINT_ALL, "SDL using driver \"%s\"\n", driverName );
-      Cvar_Set( "r_sdlDriver", driverName );
-
-      if( SDL_GL_MakeCurrent( SDL_window, SDL_glContext ) < 0 ) {
-	 ri.Printf( PRINT_DEVELOPER, "SDL_GL_MakeCurrent failed: %s\n", SDL_GetError( ) );
-         return qfalse;
-      }
-   }
-#endif
-
-   g_EGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-   if (g_EGLDisplay == EGL_NO_DISPLAY) {
-      ri.Printf(PRINT_ALL, "eglGetDisplay() failed\n");
-      return qfalse;
-   }
-
-   if (!eglInitialize(g_EGLDisplay, &majorVersion, &minorVersion)) {
-      ri.Printf(PRINT_ALL, "eglInitialize() failed\n");
-      return qfalse;
-   }
-   if (!eglSaneChooseConfigBRCM(g_EGLDisplay, s_configAttribs, &g_EGLConfig, 1, &numConfigs)) {
-      ri.Printf(PRINT_ALL, "eglSaneChooseConfigBRCM() failed\n");
-      return qfalse;
-   }
-   if (numConfigs == 0) {
-      ri.Printf(PRINT_ALL, "Couldn't find suitable config!\n");
-      return qfalse;
-   }
-
-   {
-      EGLint r, g, b, a, depth, stencil, samples, sample_buffers;
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_RED_SIZE, &r);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_GREEN_SIZE, &g);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_BLUE_SIZE, &b);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_ALPHA_SIZE, &a);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_DEPTH_SIZE, &depth);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_STENCIL_SIZE, &stencil);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_SAMPLES, &samples);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_SAMPLE_BUFFERS, &sample_buffers);
-      ri.Printf(PRINT_ALL, "Chose EGL config %d: r=%d,g=%d,b=%d,a=%d, "
-         "depth=%d,stencil=%d, samples=%d,sample_buffers=%d\n",
-         (int)g_EGLConfig, r, g, b, a, depth, stencil, samples, sample_buffers);
-   }
-
-   g_EGLContext = eglCreateContext(g_EGLDisplay, g_EGLConfig, NULL, NULL);
-   if (g_EGLContext == EGL_NO_CONTEXT) {
-      ri.Printf(PRINT_ALL, "eglCreateContext() failed\n");
-      return qfalse;
-   }
-
-   ri.Printf(PRINT_ALL, "Using native window %d\n", (int)hWnd);
-
-   g_EGLWindowSurface = eglCreateWindowSurface(g_EGLDisplay, g_EGLConfig, hWnd, NULL);
-   if (g_EGLWindowSurface == EGL_NO_SURFACE) {
-      ri.Printf(PRINT_ALL, "eglCreateWindowSurface() failed\n");
-      return qfalse;
-   }
-
-   eglMakeCurrent(g_EGLDisplay, g_EGLWindowSurface, g_EGLWindowSurface, g_EGLContext);
-
-   {
-      EGLint width, height, color, depth, stencil;
-      eglQuerySurface(g_EGLDisplay, g_EGLWindowSurface, EGL_WIDTH, &width);
-      eglQuerySurface(g_EGLDisplay, g_EGLWindowSurface, EGL_HEIGHT, &height);
-      ri.Printf(PRINT_ALL, "Window size: %dx%d\n", width, height);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_BUFFER_SIZE, &color);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_DEPTH_SIZE, &depth);
-      eglGetConfigAttrib(g_EGLDisplay, g_EGLConfig, EGL_STENCIL_SIZE, &stencil);
-      glConfig.vidWidth = width;
-      glConfig.vidHeight = height;
-      glConfig.colorBits = color;
-      glConfig.depthBits = depth;
-      glConfig.stencilBits = stencil;
-   }
-
-   if(r_stereoEnabled->integer)
-      glConfig.stereoEnabled = qtrue;
-   else
-      glConfig.stereoEnabled = qfalse;
-
-   return qtrue;
-}
-
-static qboolean GLimp_HaveExtension(const char *ext)
-{
-   return qfalse;
-}
-
-
-/*
-===============
-GLimp_InitExtensions
-===============
-*/
-static void GLimp_InitExtensions( void )
-{
-   if ( !r_allowExtensions->integer )
-   {
-      ri.Printf( PRINT_ALL, "* IGNORING OPENGL EXTENSIONS *\n" );
-      return;
-   }
-
-   ri.Printf( PRINT_ALL, "Initializing OpenGL extensions\n" );
-
-   glConfig.textureCompression = TC_NONE;
-
-   // GL_EXT_texture_compression_s3tc
-   if ( GLimp_HaveExtension( "GL_ARB_texture_compression" ) &&
-        GLimp_HaveExtension( "GL_EXT_texture_compression_s3tc" ) )
-   {
-      if ( r_ext_compressed_textures->value )
-      {
-         glConfig.textureCompression = TC_S3TC_ARB;
-         ri.Printf( PRINT_ALL, "...using GL_EXT_texture_compression_s3tc\n" );
-      }
-      else
-      {
-         ri.Printf( PRINT_ALL, "...ignoring GL_EXT_texture_compression_s3tc\n" );
-      }
-   }
-   else
-   {
-      ri.Printf( PRINT_ALL, "...GL_EXT_texture_compression_s3tc not found\n" );
-   }
-
-   // GL_S3_s3tc ... legacy extension before GL_EXT_texture_compression_s3tc.
-   if (glConfig.textureCompression == TC_NONE)
-   {
-      if ( GLimp_HaveExtension( "GL_S3_s3tc" ) )
-      {
-         if ( r_ext_compressed_textures->value )
-         {
-            glConfig.textureCompression = TC_S3TC;
-            ri.Printf( PRINT_ALL, "...using GL_S3_s3tc\n" );
-         }
-         else
-         {
-            ri.Printf( PRINT_ALL, "...ignoring GL_S3_s3tc\n" );
-         }
-      }
-      else
-      {
-         ri.Printf( PRINT_ALL, "...GL_S3_s3tc not found\n" );
-      }
-   }
-
-
-   // GL_EXT_texture_env_add
-   glConfig.textureEnvAddAvailable = qtrue;
-
-   textureFilterAnisotropic = qfalse;
-}
-
-/*
-===============
-GLimp_Init
-
-This routine is responsible for initializing the OS specific portions
-of OpenGL
-===============
-*/
-void GLimp_Init( void )
-{
-   qboolean success = qtrue;
-
-   Sys_GLimpInit( );
-
-   // create the window and set up the context
-   if( !GLimp_StartDriverAndSetMode( r_mode->integer, r_fullscreen->integer,
-      (NativeWindowType)ri.Cvar_Get("vc_wnd", "0", CVAR_LATCH)->integer))
-   {
-      success = qfalse;
-   }
-
-   if( !success )
-      ri.Error( ERR_FATAL, "GLimp_Init() - could not load OpenGL subsystem\n" );
-
-   // This values force the UI to disable driver selection
-   glConfig.driverType = GLDRV_ICD;
-   glConfig.hardwareType = GLHW_GENERIC;
-   glConfig.deviceSupportsGamma = qfalse;
-
-   // get our config strings
-   Q_strncpyz( glConfig.vendor_string, (char *) qglGetString (GL_VENDOR), sizeof( glConfig.vendor_string ) );
-   Q_strncpyz( glConfig.renderer_string, (char *) qglGetString (GL_RENDERER), sizeof( glConfig.renderer_string ) );
-   if (*glConfig.renderer_string && glConfig.renderer_string[strlen(glConfig.renderer_string) - 1] == '\n')
-      glConfig.renderer_string[strlen(glConfig.renderer_string) - 1] = 0;
-   Q_strncpyz( glConfig.version_string, (char *) qglGetString (GL_VERSION), sizeof( glConfig.version_string ) );
-   Q_strncpyz( glConfig.extensions_string, (char *) qglGetString (GL_EXTENSIONS), sizeof( glConfig.extensions_string ) );
-
-   // initialize extensions
-   GLimp_InitExtensions( );
-
-   ri.Cvar_Get( "r_availableModes", "", CVAR_ROM );
-
-   // This depends on SDL_INIT_VIDEO, hence having it here
-   IN_Init( SDL_window );
-}
-
-
-/*
-===============
-GLimp_EndFrame
-
-Responsible for doing a swapbuffers
-===============
-*/
-
-int last = 0;
-int mod = 0;
-
-void GLimp_EndFrame( void )
-{
-   eglSwapBuffers(g_EGLDisplay, g_EGLWindowSurface);
-   firstclear = 1;
-/*
-   if ((++mod & 31) == 0) {
-      DWORD time = GetCurrentTime();
-      char buf[64];
-
-      sprintf(buf, "%d\n", (time-last) / 32);
-      OutputDebugString(buf);
-
-      last = time;
-   }
-*/
-}
-
-
-
-// No SMP - stubs
-void GLimp_RenderThreadWrapper( void *arg )
-{
-}
-
-qboolean GLimp_SpawnRenderThread( void (*function)( void ) )
-{
-   ri.Printf( PRINT_WARNING, "ERROR: SMP support was disabled at compile time\n");
-   return qfalse;
-}
-
-void *GLimp_RendererSleep( void )
-{
-   return NULL;
-}
-
-void GLimp_FrontEndSleep( void )
-{
-}
-
-void GLimp_WakeRenderer( void *data )
-{
-}
-
diff --git a/SP/code/es/es_input.c b/SP/code/es/es_input.c
deleted file mode 100644
index 5b729b7..0000000
--- a/SP/code/es/es_input.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-
-This file is part of Quake III Arena source code.
-
-Quake III Arena source code is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Quake III Arena source code is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Quake III Arena source code; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-===========================================================================
-*/
-
-#include "../renderer/tr_local.h"
-#include "../client/client.h"
-#include "../sys/sys_local.h"
-
-// q3rev.cpp : Defines the entry point for the application.
-//
-
-#ifdef _WIN32
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/*
-===============
-IN_TranslateSDLToQ3Key
-===============
-*/
-static keyNum_t IN_TranslateWinToQ3Key( int vk )
-{
-	switch( vk )
-	{
-		case VK_LEFT:         return K_LEFTARROW;
-		case VK_RIGHT:        return K_RIGHTARROW;
-		case VK_DOWN:         return K_DOWNARROW;
-		case VK_UP:           return K_UPARROW;
-		case VK_RETURN:       return K_ENTER;
-      case VK_CONTROL:      
-         return K_CTRL;
-      case VK_SHIFT:
-         return K_SHIFT;
-      case VK_ESCAPE:
-         return K_ESCAPE;
-	}
-
-   if (vk >= 'A' && vk <= 'Z' || vk >= '0' && vk <= '9')
-      return vk;
-
-	return 0;
-}
-
-// Forward declarations of functions included in this code module:
-ATOM				MyRegisterClass(HINSTANCE hInstance);
-BOOL				InitInstance(HINSTANCE, int);
-
-LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
-
-
-//
-//  FUNCTION: MyRegisterClass()
-//
-//  PURPOSE: Registers the window class.
-//
-//  COMMENTS:
-//
-//    This function and its usage are 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 MyRegisterClass(HINSTANCE hInstance)
-{
-	WNDCLASSEX wcex;
-
-	wcex.cbSize = sizeof(WNDCLASSEX);
-
-	wcex.style			= CS_HREDRAW | CS_VREDRAW;
-	wcex.lpfnWndProc	= WndProc;
-	wcex.cbClsExtra		= 0;
-	wcex.cbWndExtra		= 0;
-	wcex.hInstance		= hInstance;
-	wcex.hIcon			= NULL;
-	wcex.hCursor		= NULL;
-	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
-	wcex.lpszMenuName	= NULL;
-	wcex.lpszClassName	= "Q3CLS";
-	wcex.hIconSm		= NULL;
-
-	return RegisterClassEx(&wcex);
-}
-
-//
-//   FUNCTION: InitInstance(HINSTANCE, int)
-//
-//   PURPOSE: Saves instance handle and creates main window
-//
-//   COMMENTS:
-//
-//        In this function, we save the instance handle in a global variable and
-//        create and display the main program window.
-//
-
-extern HINSTANCE g_hInstance;
-
-BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
-{
-   HWND hWnd;
-
-   hWnd = CreateWindow("Q3CLS", "Quake 3", WS_OVERLAPPEDWINDOW,
-      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
-
-   if (!hWnd)
-   {
-      return FALSE;
-   }
-
-   ShowWindow(hWnd, nCmdShow);
-   UpdateWindow(hWnd);
-
-   return TRUE;
-}
-
-//
-//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
-//
-//  PURPOSE:  Processes messages for the main window.
-//
-//  WM_COMMAND	- process the application menu
-//  WM_PAINT	- Paint the main window
-//  WM_DESTROY	- post a quit message and return
-//
-//
-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
-	int wmId, wmEvent;
-	PAINTSTRUCT ps;
-	HDC hdc;
-	const char *character = NULL;
-	keyNum_t key = 0;
-
-	switch (message)
-	{
-	case WM_COMMAND:
-		wmId    = LOWORD(wParam);
-		wmEvent = HIWORD(wParam);
-		// Parse the menu selections:
-		switch (wmId)
-		{
-		default:
-			return DefWindowProc(hWnd, message, wParam, lParam);
-		}
-		break;
-	case WM_KEYDOWN:
-		key = IN_TranslateWinToQ3Key( wParam );
-
-		if( key )
-			Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL );
-		break;
-	case WM_KEYUP:
-		key = IN_TranslateWinToQ3Key( wParam );
-
-		if( key )
-			Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL );
-		break;
-   case WM_CHAR:
-		Com_QueueEvent( 0, SE_CHAR, wParam, 0, 0, NULL );
-      break;
-	case WM_PAINT:
-		hdc = BeginPaint(hWnd, &ps);
-		// TODO: Add any drawing code here...
-		EndPaint(hWnd, &ps);
-		break;
-	case WM_DESTROY:
-		PostQuitMessage(0);
-		break;
-	default:
-		return DefWindowProc(hWnd, message, wParam, lParam);
-	}
-	return 0;
-}
-
-/*
-===============
-IN_ProcessEvents
-===============
-*/
-static void IN_ProcessEvents( void )
-{
-   MSG msg;
-
-   if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
-      if (!GetMessage(&msg, NULL, 0, 0))
-         Sys_Quit();
-
-      TranslateMessage(&msg);
-      DispatchMessage(&msg);
-   }
-}
-
-/*
-===============
-IN_Init
-===============
-*/
-void IN_Init( void )
-{
-	MyRegisterClass(g_hInstance);
-   InitInstance (g_hInstance, SW_SHOW);
-}
-
-#else
-
-#include <unistd.h>
-#include <termios.h>
-#include <stdio.h>
-#include <sys/select.h>
-
-#define NB_DISABLE 	0
-#define NB_ENABLE	1
-
-int kbhit( void )
-{
-	struct timeval tv;
-	fd_set fds;
-	tv.tv_sec = 0;
-	tv.tv_usec = 0;
-	FD_ZERO(&fds);
-	FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0
-	select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
-	return FD_ISSET(STDIN_FILENO, &fds);
-}
-
-void nonblock(int state)
-{
-	struct termios ttystate;
-
-	//get the terminal state
-	tcgetattr(STDIN_FILENO, &ttystate);
-
-	if (state==NB_ENABLE)
-	{
-		//turn off canonical mode
-		ttystate.c_lflag &= ~ICANON;
-		//minimum of number input read.
-		ttystate.c_cc[VMIN] = 1;
-	}
-	else if (state==NB_DISABLE)
-	{
-		//turn on canonical mode
-		ttystate.c_lflag |= ICANON;
-	}
-	//set the terminal attributes.
-	tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
-}
-
-/*
-===============
-IN_TranslateSDLToQ3Key
-===============
-*/
-static keyNum_t IN_TranslateCharToQ3Key( char c )
-{
-   switch (c) {
-   case ';':         return K_LEFTARROW;
-   case '#':         return K_RIGHTARROW;
-   case '\'':        return K_DOWNARROW;
-   case '[':         return K_UPARROW;
-   case ']':         return K_CONSOLE;
-   case 10:          return K_ENTER;
-   }
-
-   return c;
-}
-
-/*
-===============
-IN_ProcessEvents
-===============
-*/
-static void IN_ProcessEvents( void )
-{
-	while (kbhit()) {
-		char c = fgetc(stdin);
-
-		int key = IN_TranslateCharToQ3Key(c);
-
-		Com_QueueEvent( 0, SE_CHAR, c, 0, 0, NULL );
-
-		if( key ) {
-			Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL );
-			Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL );
-		}
-	}
-}
-
-/*
-===============
-IN_Init
-===============
-*/
-void IN_Init( void )
-{
-	nonblock(NB_ENABLE);
-}
-
-#endif
-
-/*
-===============
-IN_Frame
-===============
-*/
-void IN_Frame( void )
-{
-	IN_ProcessEvents( );
-}
-
-/*
-===============
-IN_Shutdown
-===============
-*/
-void IN_Shutdown( void )
-{
-}
-
-/*
-===============
-IN_Restart
-===============
-*/
-void IN_Restart( void )
-{
-}
diff --git a/SP/code/es/es_snd.c b/SP/code/es/es_snd.c
deleted file mode 100644
index f22ef87..0000000
--- a/SP/code/es/es_snd.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-
-This file is part of Quake III Arena source code.
-
-Quake III Arena source code is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Quake III Arena source code is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Quake III Arena source code; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-===========================================================================
-*/
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "../qcommon/q_shared.h"
-#include "../client/snd_local.h"
-
-/*
-===============
-SNDDMA_Init
-===============
-*/
-qboolean SNDDMA_Init(void)
-{
-	return qtrue;
-}
-
-/*
-===============
-SNDDMA_GetDMAPos
-===============
-*/
-int SNDDMA_GetDMAPos(void)
-{
-   return 0;
-}
-
-/*
-===============
-SNDDMA_Shutdown
-===============
-*/
-void SNDDMA_Shutdown(void)
-{
-}
-
-/*
-===============
-SNDDMA_Submit
-
-Send sound to device if buffer isn't really the dma buffer
-===============
-*/
-void SNDDMA_Submit(void)
-{
-}
-
-/*
-===============
-SNDDMA_BeginPainting
-===============
-*/
-void SNDDMA_BeginPainting (void)
-{
-}
diff --git a/SP/code/es/etc1encode.c b/SP/code/es/etc1encode.c
deleted file mode 100644
index d645d0d..0000000
--- a/SP/code/es/etc1encode.c
+++ /dev/null
@@ -1,1129 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <math.h>
-#include <float.h>
-#include <assert.h>
-#include "GLES/gl.h"
-#include "GLES/glext.h"
-
-#if !defined(max)
-#define max(a, b) ((a) < (b) ? (b) : (a))
-#define min(a, b) ((a) > (b) ? (b) : (a))
-#endif
-
-#define RED_TO_Y     0.299
-#define GREEN_TO_Y   0.587
-#define BLUE_TO_Y    0.114
-
-#define GREY_TO_Y    (RED_TO_Y + GREEN_TO_Y + BLUE_TO_Y)
-
-#define RED_VALUE    0.299
-#define GREEN_VALUE  0.587
-#define BLUE_VALUE   0.114
-
-#define SEARCH_RANGE 0
-#define Y_SEARCH_RANGE 0
-#define FULL_Y_SEARCH 0
-#define COMPARE_WITH_CLIPPING 0
-
-typedef struct
-{
-   float r, g, b, y;
-} fcolour_t;
-
-typedef struct
-{
-   int red, green, blue, table;
-} base_t;
-
-typedef struct
-{
-   union
-   {
-      struct
-      {
-         int red1, red2, green1, green2, blue1, blue2;
-      } norm;
-      struct
-      {
-         int red1, d_red, green1, d_green, blue1, d_blue;
-      } diff;
-   } colour;
-   int table1, table2;
-   short luma[16];
-   int diffbit, flipbit;
-} etc_block_t;
-
-typedef struct
-{
-   fcolour_t colour[2][4];
-   int red_av, green_av, blue_av;
-} block_detail_t;
-
-
-static fcolour_t adjtab[8][4];
-
-static int dsize;
-
-
-static int dropped, tested;
-static long long ldropped, ltested;
-
-typedef struct
-{
-   int r, g, b, grey;
-} rgbg_t;
-
-typedef struct
-{
-   rgbg_t base[2];
-   int table[2];
-   int flip, diff;
-   int score;
-} candidate_t;
-
-
-#define R_WEIGHT 19
-#define G_WEIGHT 37
-#define B_WEIGHT 7
-#define TOTAL_WEIGHT (R_WEIGHT + G_WEIGHT + B_WEIGHT)
-#define MAX_LUMA (TOTAL_WEIGHT * 255)
-
-static int bencn_diffable(rgbg_t const *c1, rgbg_t const *c2)
-{
-   int r1 = (c1->r * 31 + 128 * 8) / (255 * 8);
-   int g1 = (c1->g * 31 + 128 * 8) / (255 * 8);
-   int b1 = (c1->b * 31 + 128 * 8) / (255 * 8);
-   int r2 = (c2->r * 31 + 128 * 8) / (255 * 8);
-   int g2 = (c2->g * 31 + 128 * 8) / (255 * 8);
-   int b2 = (c2->b * 31 + 128 * 8) / (255 * 8);
-
-   return ((unsigned)((r2 - r1 + 4) | (g2 - g1 + 4) | (b2 - b1 + 4)) <= 7);
-}
-
-
-static void bencn_quantise(candidate_t *cand)
-{
-   int i;
-
-   if (cand->diff == 0)
-   {
-      for (i = 0; i < 2; i++)
-      {
-         cand->base[i].r = (cand->base[i].r * 15 + 128 * 8) / (255 * 8);
-         cand->base[i].g = (cand->base[i].g * 15 + 128 * 8) / (255 * 8);
-         cand->base[i].b = (cand->base[i].b * 15 + 128 * 8) / (255 * 8);
-
-         assert((unsigned)cand->base[i].r < 16);
-         assert((unsigned)cand->base[i].g < 16);
-         assert((unsigned)cand->base[i].b < 16);
-
-         cand->base[i].r = cand->base[i].r << 4 | cand->base[i].r >> 0;
-         cand->base[i].g = cand->base[i].g << 4 | cand->base[i].g >> 0;
-         cand->base[i].b = cand->base[i].b << 4 | cand->base[i].b >> 0;
-      }
-   }
-   else
-   {
-      for (i = 0; i < 2; i++)
-      {
-         cand->base[i].r = (cand->base[i].r * 31 + 128 * 8) / (255 * 8);
-         cand->base[i].g = (cand->base[i].g * 31 + 128 * 8) / (255 * 8);
-         cand->base[i].b = (cand->base[i].b * 31 + 128 * 8) / (255 * 8);
-
-         assert((unsigned)cand->base[i].r < 32);
-         assert((unsigned)cand->base[i].g < 32);
-         assert((unsigned)cand->base[i].b < 32);
-
-         cand->base[i].r = cand->base[i].r << 3 | cand->base[i].r >> 2;
-         cand->base[i].g = cand->base[i].g << 3 | cand->base[i].g >> 2;
-         cand->base[i].b = cand->base[i].b << 3 | cand->base[i].b >> 2;
-      }
-   }
-
-   for (i = 0; i < 2; i++)
-   {
-      assert((unsigned)cand->base[i].r < 256);
-      assert((unsigned)cand->base[i].g < 256);
-      assert((unsigned)cand->base[i].b < 256);
-      cand->base[i].grey = R_WEIGHT * cand->base[i].r + G_WEIGHT * cand->base[i].g + B_WEIGHT * cand->base[i].b;
-   }
-}
-
-static int bencn_score(int greymap[2][8], int tabs[2])
-{
-   static const int table[8][2] = { { 2, 8 }, { 5, 17 }, { 9, 29 }, { 13, 42 }, { 18, 60 }, { 24, 80 }, { 33, 106 }, { 47, 183 } };
-   int total = 0;
-   int i, j;
-
-   for (i = 0; i < 2; i++)
-   {
-      int bestfit = -1;
-      int bestscore = 1 << 30;
-
-      for (j = 0; j < 8; j++)
-      {
-         int little = table[j][0] * TOTAL_WEIGHT, big = table[j][1] * TOTAL_WEIGHT;
-         int score = 0;
-         int k;
-
-         for (k = 0; k < 8; k++)
-         {
-            int e1, e2, emin;
-
-            e1 = abs(greymap[i][k] - big);
-            e2 = abs(greymap[i][k] - little);
-            emin = min(e1, e2);
-            score += emin * emin >> 2;
-            if (score >= bestscore)
-               break;
-         }
-
-         if (score < bestscore)
-         {
-            bestfit = j;
-            bestscore = score;
-         }
-      }
-
-      assert(bestfit != -1);
-      tabs[i] = bestfit;
-      total += bestscore;
-   }
-
-   return total;
-}
-
-static int bencn_vertical_score(int greymap[4][4], int tabs[2], int left_luma, int right_luma)
-{
-   int newmap[2][8];
-   int i;
-
-   for (i = 0; i < 8; i++)
-   {
-      newmap[0][i] = abs(greymap[i >> 1][(i & 1) + 0] - left_luma);
-      newmap[1][i] = abs(greymap[i >> 1][(i & 1) + 2] - right_luma);
-   }
-
-   return bencn_score(newmap, tabs);
-}
-
-static int bencn_horizontal_score(int greymap[4][4], int tabs[2], int top_luma, int bottom_luma)
-{
-   int newmap[2][8];
-   int i;
-
-   for (i = 0; i < 8; i++)
-   {
-      newmap[0][i] = abs(greymap[(i & 1) + 0][i >> 1] - top_luma);
-      newmap[1][i] = abs(greymap[(i & 1) + 2][i >> 1] - bottom_luma);
-   }
-
-   return bencn_score(newmap, tabs);
-}
-
-
-static unsigned long long block_encode_new(unsigned char src[][3], int pitch)
-{
-   unsigned long low, high;
-   candidate_t horiz, vert, *winner;
-   int greymap[4][4];
-   int x, y;
-
-   {
-      rgbg_t totals[2][2] = { { { 0 } } };
-
-      for (y = 0; y < 4; y++)
-         for (x = 0; x < 4; x++)
-         {
-            unsigned char (*ptr)[3] = src + x + (y ^ 3) * pitch;
-            rgbg_t *tptr = &totals[y >> 1][x >> 1];
-            int r = ptr[0][0], g = ptr[0][1], b = ptr[0][2];
-            int grey = R_WEIGHT * r + G_WEIGHT * g + B_WEIGHT * b;
-
-            greymap[y][x] = grey;
-
-            tptr->r += r;
-            tptr->g += g;
-            tptr->b += b;
-            tptr->grey += grey;
-         }
-
-      vert.flip = 0;
-      for (x = 0; x < 2; x++)
-      {
-         vert.base[x].r    = totals[0][x].r    + totals[1][x].r;
-         vert.base[x].g    = totals[0][x].g    + totals[1][x].g;
-         vert.base[x].b    = totals[0][x].b    + totals[1][x].b;
-         vert.base[x].grey = totals[0][x].grey + totals[1][x].grey;
-      }
-      vert.diff = bencn_diffable(&vert.base[0], &vert.base[1]);
-      bencn_quantise(&vert);
-
-      horiz.flip = 1;
-      for (y = 0; y < 2; y++)
-      {
-         horiz.base[y].r    = totals[y][0].r    + totals[y][1].r;
-         horiz.base[y].g    = totals[y][0].g    + totals[y][1].g;
-         horiz.base[y].b    = totals[y][0].b    + totals[y][1].b;
-         horiz.base[y].grey = totals[y][0].grey + totals[y][1].grey;
-      }
-      horiz.diff = bencn_diffable(&horiz.base[0], &horiz.base[1]);
-      bencn_quantise(&horiz);
-
-      vert.score = bencn_vertical_score(greymap, vert.table, vert.base[0].grey, vert.base[1].grey);
-      horiz.score = bencn_horizontal_score(greymap, horiz.table, horiz.base[0].grey, horiz.base[1].grey);
-   }
-
-   winner = horiz.score < vert.score ? &horiz : |
-
-   low = 0;
-   high = 0;
-
-   {
-      static const int threshold[8] = { 5, 11, 19, 22, 39, 52, 69, 115 };
-      int base_grey[2][2];
-      int quadthresh[2][2];
-
-      if (winner->flip == 0)
-         for (x = 0; x < 2; x++)
-         {
-            base_grey [0][x] = base_grey[1][x] = winner->base[x].grey;
-            quadthresh[0][x] = quadthresh[1][x] = threshold[winner->table[x]] * TOTAL_WEIGHT;
-         }
-      else
-         for (y = 0; y < 2; y++)
-         {
-            base_grey [y][0] = base_grey[y][1] = winner->base[y].grey;
-            quadthresh[y][0] = quadthresh[y][1] = threshold[winner->table[y]] * TOTAL_WEIGHT;
-         }
-
-      for (y = 0; y < 4; y++)
-         for (x = 0; x < 4; x++)
-         {
-            int v = greymap[y][x] - base_grey[y >> 1][x >> 1];
-            int t = quadthresh[y >> 1][x >> 1];
-            int shift = x * 4 + y;
-
-            if (v < 0)
-               low |= 0x10000 << shift;
-            if (abs(v) > t)
-               low |= 0x1 << shift;
-         }
-   }
-
-   assert((unsigned)(winner->base[0].r | winner->base[0].g | winner->base[0].b) < 256);
-   assert((unsigned)(winner->base[1].r | winner->base[1].g | winner->base[1].b) < 256);
-
-   if (winner->diff)
-   {
-      int dr, dg, db;
-      dr = (winner->base[1].r >> 3) - (winner->base[0].r >> 3);
-      dg = (winner->base[1].g >> 3) - (winner->base[0].g >> 3);
-      db = (winner->base[1].b >> 3) - (winner->base[0].b >> 3);
-
-      assert((unsigned)(dr + 4) < 8);
-      assert((unsigned)(dg + 4) < 8);
-      assert((unsigned)(db + 4) < 8);
-
-      high |= (winner->base[0].r >> 3) << 27;
-      high |= (dr & 7)                 << 24;
-      high |= (winner->base[0].g >> 3) << 19;
-      high |= (dg & 7)                 << 16;
-      high |= (winner->base[0].b >> 3) << 11;
-      high |= (db & 7)                 << 8;
-   }
-   else
-   {
-      high |= (winner->base[0].r >> 4) << 28;
-      high |= (winner->base[1].r >> 4) << 24;
-      high |= (winner->base[0].g >> 4) << 20;
-      high |= (winner->base[1].g >> 4) << 16;
-      high |= (winner->base[0].b >> 4) << 12;
-      high |= (winner->base[1].b >> 4) << 8;
-   }
-
-   assert((unsigned)winner->table[0] < 8);
-   assert((unsigned)winner->table[1] < 8);
-
-   high |= winner->table[0] << 5;
-   high |= winner->table[1] << 2;
-
-   high |= winner->diff << 1;
-   high |= winner->flip << 0;
-
-   return (unsigned long long)high << 32 | low;
-}
-
-
-
-static unsigned long long pack_block(etc_block_t const *block)
-{
-   unsigned long low, high;
-   int x,y;
-
-   low = 0;
-      for (y = 0; y < 4; y++)
-         for (x = 0; x < 4; x++)
-         {
-            int shift = x * 4 + y;
-            int idx = x + y * 4;
-
-            assert((unsigned)block->luma[x + y * 4] < 4);
-            low |= (block->luma[idx]  & 1) << (shift + 0);
-            low |= (block->luma[idx] >> 1) << (shift + 16);
-         }
-
-   if (block->diffbit)
-   {
-      assert((unsigned)block->colour.diff.red1 < 256);
-      assert((unsigned)block->colour.diff.green1 < 256);
-      assert((unsigned)block->colour.diff.blue1 < 256);
-      assert((unsigned)(block->colour.diff.d_red + 32) < 64);
-      assert((unsigned)(block->colour.diff.d_green + 32) < 64);
-      assert((unsigned)(block->colour.diff.d_blue + 32) < 64);
-
-      high  = (block->colour.diff.red1 >> 3)          << 27;
-      high |= ((block->colour.diff.d_red >> 3) & 7)   << 24;
-      high |= (block->colour.diff.green1 >> 3)        << 19;
-      high |= ((block->colour.diff.d_green >> 3) & 7) << 16;
-      high |= (block->colour.diff.blue1 >> 3)         << 11;
-      high |= ((block->colour.diff.d_blue >> 3) & 7)  << 8;
-   }
-   else
-   {
-      assert((unsigned)block->colour.norm.red1 < 256);
-      assert((unsigned)block->colour.norm.green1 < 256);
-      assert((unsigned)block->colour.norm.blue1 < 256);
-      assert((unsigned)block->colour.norm.red2 < 256);
-      assert((unsigned)block->colour.norm.green2 < 256);
-      assert((unsigned)block->colour.norm.blue2 < 256);
-      high  = (block->colour.norm.red1 >> 4)   << 28;
-      high |= (block->colour.norm.red2 >> 4)   << 24;
-      high |= (block->colour.norm.green1 >> 4) << 20;
-      high |= (block->colour.norm.green2 >> 4) << 16;
-      high |= (block->colour.norm.blue1 >> 4)  << 12;
-      high |= (block->colour.norm.blue2 >> 4)  << 8;
-   }
-
-   high |= block->flipbit << 0;
-   high |= block->diffbit << 1;
-   high |= block->table1  << 5;
-   high |= block->table2  << 2;
-
-   /* Note that this code doesn't bother about endian, and a PPM-like file
-    * should be big endian rather than intel-native. */
-   return (unsigned long long)high << 32 | low;
-}
-
-
-
-#if 0
-#define sqdiff(a, b) (((a) - (b)) * ((a) - (b)))
-#define pixdiff(x, z) (sqdiff((x).r, (z).r) + sqdiff((x).g, (z).g) + sqdiff((x).b, (z).b))
-#define difftosum(x) (x)
-#else
-#define pixdiff(x, z) fabs((x).y - (z).y)
-#define difftosum(x) ((x) * (x))
-#endif
-
-#if COMPARE_WITH_CLIPPING
-static float inline evaluate(fcolour_t const colour[8], fcolour_t const *base, fcolour_t const table[4], float limit)
-{
-   int i, x;
-   float error = 0.0;
-
-   tested += 8;
-
-   for (x = 0; x < 8; x++)
-   {
-      fcolour_t pixel;
-      float delta, d2;
-
-      pixel.r = base->r + table[0].r;
-      pixel.g = base->g + table[0].g;
-      pixel.b = base->b + table[0].b;
-      pixel.y = base->y + table[0].y;
-      if (pixel.r < 0.0) pixel.r = 0.0;
-      else if (pixel.r > 255 * RED_VALUE) pixel.r = 255 * RED_VALUE;
-      if (pixel.g < 0.0) pixel.g = 0.0;
-      else if (pixel.g > 255 * GREEN_VALUE) pixel.g = 255 * GREEN_VALUE;
-      if (pixel.b < 0.0) pixel.b = 0.0;
-      else if (pixel.b > 255 * BLUE_VALUE) pixel.b = 255 * BLUE_VALUE;
-
-      delta = pixdiff(pixel, colour[x]);
-      for (i = 1; i < 4; i++)
-      {
-         pixel.r = base->r + table[i].r;
-         pixel.g = base->g + table[i].g;
-         pixel.b = base->b + table[i].b;
-         pixel.y = base->y + table[i].y;
-         if (pixel.r < 0.0) pixel.r = 0.0;
-         else if (pixel.r > 255 * RED_VALUE) pixel.r = 255 * RED_VALUE;
-         if (pixel.g < 0.0) pixel.g = 0.0;
-         else if (pixel.g > 255 * GREEN_VALUE) pixel.g = 255 * GREEN_VALUE;
-         if (pixel.b < 0.0) pixel.b = 0.0;
-         else if (pixel.b > 255 * BLUE_VALUE) pixel.b = 255 * BLUE_VALUE;
-
-         if ((d2 = pixdiff(pixel, colour[x])) < delta)
-            delta = d2;
-      }
-      error += difftosum(delta);
-
-      if (error >= limit)
-      {
-         dropped += 7 - x;
-         return error;
-      }
-   }
-
-   return error;
-}
-#else
-static float __inline evaluate(fcolour_t const colour[8], fcolour_t const *base, fcolour_t const table[4], float limit)
-{
-   int i, x;
-   float error = 0.0;
-
-   /* TODO: consider the benefits of clipping */
-
-   tested += 8;
-
-   for (x = 0; x < 8; x++)
-   {
-      fcolour_t pixel;
-      float delta, d2;
-
-      pixel.r = colour[x].r - base->r;
-      pixel.g = colour[x].g - base->g;
-      pixel.b = colour[x].b - base->b;
-      pixel.y = colour[x].y - base->y;
-
-      delta = pixdiff(pixel, table[0]);
-      for (i = 1; i < 4; i++)
-         if ((d2 = pixdiff(pixel, table[i])) < delta)
-            delta = d2;
-      error += difftosum(delta);
-
-      if (error >= limit)
-      {
-         dropped += 7 - x;
-         return error;
-      }
-   }
-
-   return error;
-}
-#endif
-
-static void produce(short out[8], fcolour_t const colour[8], base_t const *base)
-{
-   int i, x;
-   fcolour_t test;
-   fcolour_t const *table;
-
-   assert((unsigned)base->table < 8);
-   assert((base->red & (~255 | 7)) == 0);
-   assert((base->green & (~255 | 7)) == 0);
-   assert((base->blue & (~255 | 7)) == 0);
-
-   test.r = base->red * RED_VALUE;
-   test.g = base->green * GREEN_VALUE;
-   test.b = base->blue * BLUE_VALUE;
-   test.y = base->red * RED_TO_Y + base->green * GREEN_TO_Y + base->blue * BLUE_TO_Y;
-   table = adjtab[base->table];
-
-   for (x = 0; x < 8; x++)
-   {
-      fcolour_t pixel;
-      float delta, d2;
-
-      pixel.r = colour[x].r - test.r;
-      pixel.g = colour[x].g - test.g;
-      pixel.b = colour[x].b - test.b;
-      pixel.y = colour[x].y - test.y;
-
-      delta = pixdiff(pixel, table[0]);
-      out[x] = 0;
-      for (i = 1; i < 4; i++)
-         if ((d2 = pixdiff(pixel, table[i])) < delta)
-         {
-            delta = d2;
-            out[x] = i;
-         }
-   }
-}
-
-static float __inline evaluate_all(int *index, fcolour_t const colour[8], fcolour_t const *base, float limit)
-{
-   int i;
-   float error;
-
-   for (i = 0; i < 8; i++)
-   {
-      if ((error = evaluate(colour, base, adjtab[i], limit)) < limit)
-      {
-         limit = error;
-         *index = i;
-      }
-   }
-
-   return limit;
-}
-
-static float search_yrb(base_t *base, float limit, fcolour_t const colour[8], int step, int ymin, int ymax, int rmin, int rmax, int bmin, int bmax)
-{
-   int ro, bo, y;
-
-   rmin =  rmin & ~(step - 1);
-   rmax = (rmax + step - 1) & ~(step - 1);
-   bmin =  bmin & ~(step - 1);
-   bmax = (bmax + step - 1) & ~(step - 1);
-   ymin =  ymin & ~(step - 1);
-   ymax = (ymax + step - 1) & ~(step - 1);
-
-   for (ro = rmin; ro <= rmax; ro += step)
-   {
-      for (bo = bmin; bo <= bmax; bo += step)
-      {
-         for (y = ymin; y <= ymax; y += step)
-         {
-            int r = y + ro, g = y, b = y + bo;
-            fcolour_t test;
-            float error;
-
-            if ((unsigned)r > 255 || (unsigned)g > 255 || (unsigned)b > 255)
-               continue;
-
-            test.r = r * RED_VALUE;
-            test.g = g * GREEN_VALUE;
-            test.b = b * BLUE_VALUE;
-            test.y = r * RED_TO_Y + g * GREEN_TO_Y + b * BLUE_TO_Y;
-
-            if ((error = evaluate_all(&base->table, colour, &test, limit)) < limit)
-            {
-               base->red = r;
-               base->green = g;
-               base->blue = b;
-               limit = error;
-            }
-         }
-      }
-   }
-   return limit;
-}
-
-static float full_y_search(base_t *base, block_detail_t const *detail, int step, float limit)
-{
-   int red_off, blue_off;
-
-   red_off = detail->red_av - detail->green_av;
-   blue_off = detail->blue_av - detail->green_av;
-
-   /* initial guess to set a reasonable limit */
-   limit = search_yrb(base, limit, &detail->colour[0][0], step,
-               detail->green_av, detail->green_av,
-               red_off, red_off,
-               blue_off, blue_off);
-
-#if FULL_Y_SEARCH
-   limit = search_yrb(base, limit, &detail->colour[0][0], step,
-               0, 255,
-               red_off - SEARCH_RANGE * step, red_off + SEARCH_RANGE * step,
-               blue_off - SEARCH_RANGE * step, blue_off + SEARCH_RANGE * step);
-#else
-   limit = search_yrb(base, limit, &detail->colour[0][0], step,
-               detail->green_av - Y_SEARCH_RANGE * step, detail->green_av + Y_SEARCH_RANGE * step,
-               red_off - SEARCH_RANGE * step, red_off + SEARCH_RANGE * step,
-               blue_off - SEARCH_RANGE * step, blue_off + SEARCH_RANGE * step);
-#endif
-
-   return limit;
-}
-
-static float block_encode_abs(etc_block_t *block, block_detail_t const *detail, float limit)
-{
-   base_t base[2];
-   float error1, error2;
-
-   memset(block, 0, sizeof(*block));
-
-   error1 = full_y_search(&base[0], &detail[0], 16, limit);
-   error2 = full_y_search(&base[1], &detail[1], 16, limit);
-
-   if (error1 + error2 >= limit)
-      return error1 + error2;
-
-   block->flipbit = 1;
-   block->diffbit = 0;
-   block->colour.norm.red1 = base[0].red &= 0xF0;
-   block->colour.norm.red2 = base[1].red &= 0xF0;
-   block->colour.norm.green1 = base[0].green &= 0xF0;
-   block->colour.norm.green2 = base[1].green &= 0xF0;
-   block->colour.norm.blue1 = base[0].blue &= 0xF0;
-   block->colour.norm.blue2 = base[1].blue &= 0xF0;
-
-   block->table1 = base[0].table;
-   block->table2 = base[1].table;
-   produce(&block->luma[0], &detail[0].colour[0][0], &base[0]);
-   produce(&block->luma[8], &detail[1].colour[0][0], &base[1]);
-
-   return error1 + error2;
-}
-
-static float block_encode(etc_block_t *block, const block_detail_t detail[2], float limit)
-{
-   base_t base[2];
-   float error1, error2;
-
-   memset(block, 0, sizeof(*block));
-
-   error1 = full_y_search(&base[0], &detail[0], 8, limit);
-   error2 = full_y_search(&base[1], &detail[1], 8, limit);
-
-   if ((unsigned)((base[1].red - base[0].red + 32)
-                | (base[1].green - base[0].green + 32)
-                | (base[1].blue - base[0].blue + 32))
-            >= 64)
-   {
-      int red_av, green_av, blue_av;
-      int red_off, blue_off;
-
-      /* TODO: think harder about this case.  This is just some random guess at
-       * something that might come out reasonable, but it's certainly not a
-       * comprehensive search of all the good places to look.  It's also
-       * limited by the fact that it's using search_yrb() which has an
-       * inappropriate shape at the ends, and so the search space in the second
-       * call has unfortunate dead zones.
-       */
-
-      red_av = (detail[0].red_av + detail[1].red_av) >> 1;
-      green_av = (detail[0].green_av + detail[1].green_av) >> 1;
-      blue_av = (detail[0].blue_av + detail[1].blue_av) >> 1;
-
-      red_off = red_av - green_av;
-      blue_off = blue_av - green_av;
-
-      error1 = search_yrb(&base[0], limit, &detail[0].colour[0][0], 8,
-                  green_av - 3*8, green_av + 3*8,
-                  red_off - 8, red_off + 8,
-                  blue_off - 8, blue_off + 8);
-
-      red_off = base[0].red - base[0].green;
-      blue_off = base[0].blue - base[0].green;
-
-      error2 = search_yrb(&base[1], limit, &detail[1].colour[0][0], 8,
-                  base[0].green - 3*8, base[0].green + 2*8,
-                  red_off - 8, red_off + 8,
-                  blue_off - 8, blue_off + 8);
-
-      /* Having made our best guess, we try it out against absolute encoding.. */
-
-      if (error1 + error2 >= limit)
-         return block_encode_abs(block, detail, limit);
-      else
-      {
-         float error3;
-      
-         if ((error3 = block_encode_abs(block, detail, error1 + error2)) < error1 + error2)
-            return error3;
-      }
-   }
-
-   if (error1 + error2 >= limit)
-      return error1 + error2; /* don't even bother with the answer */
-
-   if ((unsigned)((base[1].red - base[0].red + 32)
-                | (base[1].green - base[0].green + 32)
-                | (base[1].blue - base[0].blue + 32))
-            >= 64)
-   {
-      assert(!"Failed to find approximate delta.");
-      return FLT_MAX;
-   }
-
-   block->flipbit = 1;
-   block->diffbit = 1;
-   block->table1 = base[0].table;
-   block->table2 = base[1].table;
-   block->colour.diff.red1 = base[0].red;
-   block->colour.diff.d_red = base[1].red - base[0].red;
-   block->colour.diff.green1 = base[0].green;
-   block->colour.diff.d_green = base[1].green - base[0].green;
-   block->colour.diff.blue1 = base[0].blue;
-   block->colour.diff.d_blue = base[1].blue - base[0].blue;
-
-   produce(&block->luma[0], &detail[0].colour[0][0], &base[0]);
-   produce(&block->luma[8], &detail[1].colour[0][0], &base[1]);
-
-   return error1 + error2;
-}
-
-static unsigned long long block_encode_search(etc_block_t *block, unsigned char src[][3], int pitch)
-{
-   etc_block_t tmp;
-   block_detail_t detail[2];
-   float tmp_score, block_score = FLT_MAX;
-   int x, y;
-
-   for (y = 0; y < 2; y++)
-      detail[y].red_av = detail[y].green_av = detail[y].blue_av = 0;
-   for (y = 3; y >= 0; y--)
-   {
-      for (x = 0; x < 4; x++)
-      {
-         int red = src[x][0], green = src[x][1], blue = src[x][2];
-         detail[y >> 1].colour[y & 1][x].r = red * RED_VALUE;
-         detail[y >> 1].colour[y & 1][x].g = green * GREEN_VALUE;
-         detail[y >> 1].colour[y & 1][x].b = blue * BLUE_VALUE;
-         detail[y >> 1].colour[y & 1][x].y = red * RED_TO_Y + green * GREEN_TO_Y + blue * BLUE_TO_Y;
-
-         detail[y >> 1].red_av += red;
-         detail[y >> 1].green_av += green;
-         detail[y >> 1].blue_av += blue;
-      }
-      src += pitch;
-   }
-   src -= 4 * pitch;
-   for (y = 0; y < 2; y++)
-   {
-      detail[y].red_av   = ((detail[y].red_av >> 3) + 4) & ~7;
-      detail[y].green_av = ((detail[y].green_av >> 3) + 4) & ~7;
-      detail[y].blue_av  = ((detail[y].blue_av >> 3) + 4) & ~7;
-      if (detail[y].red_av > (255 & ~7)) detail[y].red_av = (255 & ~7);
-      if (detail[y].green_av > (255 & ~7)) detail[y].green_av = (255 & ~7);
-      if (detail[y].blue_av > (255 & ~7)) detail[y].blue_av = (255 & ~7);
-   }
-
-   block_score = block_encode(block, detail, block_score);
-
-   /* transpose the data so we can re-use the same code to try a vertical block */
-   for (y = 0; y < 2; y++)
-      detail[y].red_av = detail[y].green_av = detail[y].blue_av = 0;
-   for (y = 0; y < 4; y++)
-   {
-      for (x = 0; x < 4; x++)
-      {
-         int red = src[x][0], green = src[x][1], blue = src[x][2];
-         detail[x >> 1].colour[x & 1][y].r = red * RED_VALUE;
-         detail[x >> 1].colour[x & 1][y].g = green * GREEN_VALUE;
-         detail[x >> 1].colour[x & 1][y].b = blue * BLUE_VALUE;
-         detail[x >> 1].colour[x & 1][y].y = red * RED_TO_Y + green * GREEN_TO_Y + blue * BLUE_TO_Y;
-
-         detail[x >> 1].red_av += red;
-         detail[x >> 1].green_av += green;
-         detail[x >> 1].blue_av += blue;
-      }
-      src += pitch;
-   }
-   for (y = 0; y < 2; y++)
-   {
-      detail[y].red_av   = ((detail[y].red_av >> 3) + 4) & ~7;
-      detail[y].green_av = ((detail[y].green_av >> 3) + 4) & ~7;
-      detail[y].blue_av  = ((detail[y].blue_av >> 3) + 4) & ~7;
-      if (detail[y].red_av > (255 & ~7)) detail[y].red_av = (255 & ~7);
-      if (detail[y].green_av > (255 & ~7)) detail[y].green_av = (255 & ~7);
-      if (detail[y].blue_av > (255 & ~7)) detail[y].blue_av = (255 & ~7);
-   }
-
-   tmp_score = block_encode(&tmp, detail, block_score);
-   tmp.flipbit = 0;
-   if (tmp_score < block_score)
-   {
-      *block = tmp;
-      block_score = tmp_score;
-   }
-
-   /* un-transpose the data if we transposed it above */
-   if (block->flipbit == 0)
-   {
-      for (y = 0; y < 4; y++)
-         for (x = y + 1; x < 4; x++)
-         {
-            int tmp;
-
-            tmp = block->luma[x + y * 4];
-            block->luma[x + y * 4] = block->luma[y + x * 4];
-            block->luma[y + x * 4] = tmp;
-         }
-      /* and un-vflip it, too... */
-      for (y = 0; y < 2; y++)
-      {
-         for (x = 0; x < 4; x++)
-         {
-            int tmp = block->luma[y * 4 + x];
-            block->luma[y * 4 + x] = block->luma[(y ^ 3) * 4 + x];
-            block->luma[(y ^ 3) * 4 + x] = tmp;
-         }
-      }
-   }
-
-   return pack_block(block);
-}
-
-
-#if 0
-static int get_block_offset(int x, int y, int pitch)
-{
-   int offset_row, offset_col, offset_min, offset;
-
-   /* re-hash things to match 32-bit t-format coordinates */
-   x >>= 2;
-   y >>= 2;
-   x <<= 1;
-   pitch <<= 1;
-
-   offset_row = ((y + 32) & ~63) * pitch;
-
-   offset_col = (x >> 4) * 512
-              + ((y >> 4) & 1) * 256;
-   offset_col ^= (y & 32) ? -512 : 0;
-   offset_col ^= (x << 4) & 256;
-
-   offset_min = ((y >> 2) & 3) * 64
-              + ((x >> 2) & 3) * 16
-              + (y & 3) * 4
-              + (x & 3) * 1;
-
-   offset = offset_row + offset_col + offset_min;
-
-   /* de-hash things back to 64-bit */
-   offset >>= 1;
-
-   if ((unsigned)offset >= dsize)
-   {
-      fprintf(stderr, "calculation went wrong: coord: (%d,%d), pitch: %d  offset: %d\n", x, y, pitch, offset);
-      return 0;
-   }
-
-   return offset;
-}
-
-
-static void STC_encode(unsigned long long *dest, int dpitch, unsigned char src[][3], int s_width, int s_height)
-{
-   int pitch = s_width;
-   etc_block_t tmp;
-   int x, y;
-
-   src += s_height * pitch;
-   pitch = -pitch;
-   src += pitch;
-
-   s_width &= ~3;
-   s_height &= ~3;
-
-   for (y = 0; y < s_height; y += 4)
-   {
-      for (x = 0; x < s_width; x += 4)
-      {
-         unsigned long long result = (x + x >= 0 * s_width) ? block_encode_new(src + x + y * pitch, pitch) : block_encode_search(&tmp, src + x + y * pitch, pitch);
-
-#if 0
-         if ((result & 0x0000000200000000ull) == 0)
-         {
-            result = 0;
-         }
-#endif
-
-         /* TODO: write this out in big-endian format. */
-         dest[get_block_offset(x, y, dpitch)] = result;
-      }
-
-      ldropped += dropped;
-      dropped = 0;
-      ltested += tested;
-      tested = 0;
-#if 0
-      if ((y & 15) == 12)
-      {
-         fprintf(stderr, "%d%% complete  early-out speedup: %.3f%%\r", 100 * y / s_height, 100.0 * ldropped / ltested);
-         fflush(stderr);
-      }
-#endif
-   }
-   fprintf(stderr, "100%% complete  early-out speedup: %.6f%%\n\n", 100.0 * ldropped / ltested);
-}
-#endif
-
-static void setup_adjtab(void)
-{
-   static const int tabvalues[8][2] =
-   {
-      {   2,   8 },
-      {   5,  17 },
-      {   9,  29 },
-      {  13,  42 },
-      {  18,  60 },
-      {  24,  80 },
-      {  33, 106 },
-      {  47, 183 }
-   };
-   int i;
-
-   for (i = 0; i < 8; i++)
-   {
-      int l = tabvalues[i][0], h = tabvalues[i][1];
-
-      adjtab[i][0].r = l * RED_VALUE;
-      adjtab[i][0].g = l * GREEN_VALUE;
-      adjtab[i][0].b = l * BLUE_VALUE;
-      adjtab[i][0].y = l * GREY_TO_Y;
-      adjtab[i][1].r = h * RED_VALUE;
-      adjtab[i][1].g = h * GREEN_VALUE;
-      adjtab[i][1].b = h * BLUE_VALUE;
-      adjtab[i][1].y = h * GREY_TO_Y;
-      adjtab[i][2].r = l * -RED_VALUE;
-      adjtab[i][2].g = l * -GREEN_VALUE;
-      adjtab[i][2].b = l * -BLUE_VALUE;
-      adjtab[i][2].y = l * -GREY_TO_Y;
-      adjtab[i][3].r = h * -RED_VALUE;
-      adjtab[i][3].g = h * -GREEN_VALUE;
-      adjtab[i][3].b = h * -BLUE_VALUE;
-      adjtab[i][3].y = h * -GREY_TO_Y;
-   }
-}
-
-#if 0
-int main(int argc, char *argv[])
-{
-   FILE *infile, *outfile;
-   unsigned char (*sbuf)[3];
-   unsigned long long *dbuf;
-   int version, width, height, maxval;
-   int dpitch, hpad;
-   int count;
-
-   setup_adjtab();
-
-   if ((infile = fopen(argv[1], "rb")) == NULL || fscanf(infile, "P%d %d %d %d", &version, &width, &height, &maxval) != 4 || fgetc(infile) != '\n')
-   {
-      fprintf(stderr, "Problem with input file '%s': %s\n", argv[1], strerror(errno));
-      exit(1);
-   }
-   if ((outfile = fopen(argv[2], "wb")) == NULL)
-   {
-      fprintf(stderr, "Problem with output file '%s': %s\n", argv[2], strerror(errno));
-      exit(1);
-   }
-
-   dpitch = ((width >> 2) + 15) & ~15;
-   hpad = ((height >> 2) + 31) & ~31;
-   dsize = dpitch * hpad;
-
-   if ((sbuf = malloc(width * height * sizeof(*sbuf))) == NULL || (dbuf = calloc(dpitch * hpad, sizeof(*dbuf))) == NULL)
-   {
-      fprintf(stderr, "allocation problem: %s\n", strerror(errno));
-      exit(1);
-   }
-
-   fprintf(outfile, "ETC1\n %4d %4d\n", width & ~3, height & ~3);
-
-   if ((count = fread(sbuf, sizeof(*sbuf), width * height, infile)) != width * height)
-   {
-      fprintf(stderr, "Problem reading input file: %s (got %d pixels, not %d)\n", strerror(errno), count, width * height);
-      exit(1);
-   }
-
-   fclose(infile);
-
-   STC_encode(dbuf, dpitch, sbuf, width, height);
-
-   if ((count = fwrite(dbuf, sizeof(*dbuf), dpitch * hpad, outfile)) != dpitch * hpad)
-   {
-      fprintf(stderr, "Problem writing output file: %s (wrote %d blocks, not %d)\n", strerror(errno), count, dpitch * hpad);
-      exit(1);
-   }
-
-   fclose(outfile);
-
-   return 0;
-}
-#endif
-
-void etc1_compress_tex_image(
-   GLenum target,
-   GLint level,
-   GLenum internalformat,
-   GLsizei width,
-   GLsizei height,
-   GLint border,
-   GLenum format,
-   GLenum type,
-   const GLvoid *pixels)
-{
-   int x0,x1,y0,y1;
-   int w0,h0;
-   unsigned char const *cpixels = (unsigned char const *)pixels;
-   unsigned char src[16][3];
-   size_t etc1size;
-   unsigned long long *etc1data;
-
-   w0 = (width + 3)/4;
-   h0 = (height + 3)/4;
-
-   etc1size = 8*w0*h0;
-   etc1data = malloc(etc1size);
-   assert(etc1data);
-
-   setup_adjtab();
-
-   for (y0 = 0; y0 < h0; y0++)
-   {
-      for (x0 = 0; x0 < w0; x0++)
-      {
-         unsigned long long etc1block;
-         int i;
-
-         /* Load 4x4 block */
-         for (y1 = 0; y1 < 4; y1++)
-         {
-            for (x1 = 0; x1 < 4; x1++)
-            {
-               unsigned char r,g,b;
-               int x = 4*x0+x1;
-               int y = 4*y0+y1;
-
-               if (format == GL_RGBA && type == GL_UNSIGNED_BYTE)
-               {
-                  r = cpixels[4*(width*y+x)];
-                  g = cpixels[4*(width*y+x)+1];
-                  b = cpixels[4*(width*y+x)+2];
-               }
-               else if (format == GL_RGB && type == GL_UNSIGNED_BYTE)
-               {
-                  r = cpixels[3*(width*y+x)];
-                  g = cpixels[3*(width*y+x)+1];
-                  b = cpixels[3*(width*y+x)+2];
-               }
-               else
-               {
-                  assert(0);    /* Cannot currently handle this texture format */
-               }
-               src[4*(3-y1)+x1][0] = r;
-               src[4*(3-y1)+x1][1] = g;
-               src[4*(3-y1)+x1][2] = b;
-            }
-         }
-         etc1block = block_encode_new(src/*((x0^y0)&1)?src3:src2*/, 4);
-         for (i = 0; i < 8; i++)
-         {
-            ((char*)etc1data)[8*(w0*y0 + x0) + i] = ((char*)&etc1block)[i^7];
-         }
-      }
-   }
-
-   glCompressedTexImage2D(
-      target,
-      level,
-      GL_ETC1_RGB8_OES,
-      width,
-      height,
-      0,
-      etc1size,
-      etc1data);
-
-   free(etc1data);
-}
diff --git a/SP/code/game/g_main.c b/SP/code/game/g_main.c
index 4e4c811..558bafb 100644
--- a/SP/code/game/g_main.c
+++ b/SP/code/game/g_main.c
@@ -169,10 +169,10 @@ cvarTable_t gameCvarTable[] = {
 	{ &g_soldierChargeTime, "g_soldierChargeTime", "20000", CVAR_SERVERINFO | CVAR_LATCH, 0, qfalse },
 // jpw
 
-#ifndef VCMODS_OPENGLES
-	{ &g_skipcutscenes, "g_skipcutscenes", "0", CVAR_ARCHIVE, 0, qtrue  },
-#else
+#ifdef USE_OPENGLES
 	{ &g_skipcutscenes, "g_skipcutscenes", "1", CVAR_ARCHIVE, 0, qtrue  },
+#else
+	{ &g_skipcutscenes, "g_skipcutscenes", "0", CVAR_ARCHIVE, 0, qtrue  },
 #endif
 	{ &g_playerStart, "g_playerStart", "0", CVAR_ROM, 0, qfalse  },
 
diff --git a/SP/code/qcommon/q_shared.h b/SP/code/qcommon/q_shared.h
index 6f20164..fd377a3 100644
--- a/SP/code/qcommon/q_shared.h
+++ b/SP/code/qcommon/q_shared.h
@@ -169,11 +169,6 @@ typedef int intptr_t;
 #include <ctype.h>
 #include <limits.h>
 
-#ifdef VCMODS_REPLACETRIG
-#define sin(f) sinf(f)
-#define cos(f) cosf(f)
-#endif
-
 #ifdef _MSC_VER
   #include <io.h>
 
diff --git a/SP/code/renderer/qgl.h b/SP/code/renderer/qgl.h
index cae6282..1f253ee 100644
--- a/SP/code/renderer/qgl.h
+++ b/SP/code/renderer/qgl.h
@@ -26,31 +26,46 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #ifndef __QGL_H__
 #define __QGL_H__
 
-#ifdef VCMODS_OPENGLES
-#include <GLES/gl.h>
-
-
-#define qglActiveTextureARB glActiveTexture
-#define qglClientActiveTextureARB glClientActiveTexture
-#define qglMultiTexCoord2fARB glMultiTexCoord2f
-
-extern void (* qglLockArraysEXT) (GLint first, GLsizei count);
-extern void (* qglUnlockArraysEXT) (void);
-
-extern void myglClear(GLbitfield mask);
-extern void myglTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-extern void myglDrawBuffer(GLenum mode);
-extern void myglViewport(GLint x, GLint y, GLsizei width, GLsizei height);
-extern void myglScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+#ifdef USE_OPENGLES
+#ifdef USE_LOCAL_HEADERS
+#	include "SDL_opengles.h"
+#	include "EGL/egl.h"
+#else
+#	include <SDL_opengles.h>
+#	include <EGL/egl.h>
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
 #else
 #ifdef USE_LOCAL_HEADERS
 #	include "SDL_opengl.h"
 #else
 #	include <SDL_opengl.h>
 #endif
+#endif
+
+extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture );
+extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture );
+extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t );
+
+extern void ( APIENTRY * qglLockArraysEXT )( GLint, GLint );
+extern void ( APIENTRY * qglUnlockArraysEXT )( void );
+
+#ifdef USE_OPENGLES
+#define GLdouble	GLfloat
+extern void myglMultiTexCoord2f( GLenum texture, GLfloat s, GLfloat t );
+#define GL_CLAMP     GL_CLAMP_TO_EDGE
+#define GL_TEXTURE0_ARB	GL_TEXTURE0
+#define GL_TEXTURE1_ARB	GL_TEXTURE1
+#define GL_TEXTURE2_ARB	GL_TEXTURE2
+#define GL_TEXTURE3_ARB	GL_TEXTURE3
+#endif
 
 //===========================================================================
 
+#ifndef USE_OPENGLES
+
 /*
 ** multitexture extension definitions
 */
@@ -95,6 +110,11 @@ typedef void ( APIENTRY * PFNGLPNTRIANGLESIATIPROC )( GLenum pname, GLint param
 typedef void ( APIENTRY * PFNGLPNTRIANGLESFATIPROC )( GLenum pname, GLfloat param );
 #endif
 
+//----(SA)	added
+extern void ( APIENTRY * qglPNTrianglesiATI )( GLenum pname, GLint param );
+extern void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
+//----(SA)	end
+
 // for NV fog distance
 #ifndef GL_NV_fog_distance
 #define GL_FOG_DISTANCE_MODE_NV           0x855A
@@ -119,172 +139,531 @@ typedef void ( APIENTRY * PFNGLPNTRIANGLESFATIPROC )( GLenum pname, GLfloat para
 #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
 #endif
 
-// extensions will be function pointers on all platforms
-
-extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t );
-extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture );
-extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture );
-
-extern void ( APIENTRY * qglLockArraysEXT )( GLint, GLint );
-extern void ( APIENTRY * qglUnlockArraysEXT )( void );
-
-//----(SA)	added
-extern void ( APIENTRY * qglPNTrianglesiATI )( GLenum pname, GLint param );
-extern void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
-//----(SA)	end
-
-// GL_EXT_draw_range_elements
-extern void     (APIENTRY * qglDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
-
-// rend2
+#endif // USE_OPENGLES
 
-// GL_EXT_multi_draw_arrays
-extern void (APIENTRY * qglMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
-extern void (APIENTRY * qglMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
+// extensions will be function pointers on all platforms
+//===========================================================================
 
-// GL_ARB_shading_language_100
-#ifndef GL_ARB_shading_language_100
-#define GL_ARB_shading_language_100
-#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#define qglAccum glAccum
+#define qglAlphaFunc glAlphaFunc
+#define qglAreTexturesResident glAreTexturesResident
+#define qglArrayElement glArrayElement
+#define qglBegin glBegin
+#define qglBindTexture glBindTexture
+#define qglBitmap glBitmap
+#define qglBlendFunc glBlendFunc
+#define qglCallList glCallList
+#define qglCallLists glCallLists
+#define qglClear glClear
+#define qglClearAccum glClearAccum
+#define qglClearColor glClearColor
+#ifdef USE_OPENGLES
+#define qglClearDepth glClearDepthf
+#else
+#define qglClearDepth glClearDepth
 #endif
-
-// GL_ARB_vertex_program
-extern void     (APIENTRY * qglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
-extern void     (APIENTRY * qglVertexAttrib4fvARB) (GLuint, const GLfloat *);
-extern void     (APIENTRY * qglVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized,
-														GLsizei stride, const GLvoid * pointer);
-extern void     (APIENTRY * qglEnableVertexAttribArrayARB) (GLuint index);
-extern void     (APIENTRY * qglDisableVertexAttribArrayARB) (GLuint index);
-
-// GL_ARB_vertex_buffer_object
-extern void     (APIENTRY * qglBindBufferARB) (GLenum target, GLuint buffer);
-extern void     (APIENTRY * qglDeleteBuffersARB) (GLsizei n, const GLuint * buffers);
-extern void     (APIENTRY * qglGenBuffersARB) (GLsizei n, GLuint * buffers);
-extern          GLboolean(APIENTRY * qglIsBufferARB) (GLuint buffer);
-extern void     (APIENTRY * qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
-extern void     (APIENTRY * qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);
-extern void     (APIENTRY * qglGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);
-extern void     (APIENTRY * qglGetBufferParameterivARB) (GLenum target, GLenum pname, GLint * params);
-extern void     (APIENTRY * qglGetBufferPointervARB) (GLenum target, GLenum pname, GLvoid * *params);
-
-// GL_ARB_shader_objects
-extern void     (APIENTRY * qglDeleteObjectARB) (GLhandleARB obj);
-extern          GLhandleARB(APIENTRY * qglGetHandleARB) (GLenum pname);
-extern void     (APIENTRY * qglDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj);
-extern          GLhandleARB(APIENTRY * qglCreateShaderObjectARB) (GLenum shaderType);
-extern void     (APIENTRY * qglShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB * *string,
-												 const GLint * length);
-extern void     (APIENTRY * qglCompileShaderARB) (GLhandleARB shaderObj);
-extern          GLhandleARB(APIENTRY * qglCreateProgramObjectARB) (void);
-extern void     (APIENTRY * qglAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj);
-extern void     (APIENTRY * qglLinkProgramARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglUseProgramObjectARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglValidateProgramARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglUniform1fARB) (GLint location, GLfloat v0);
-extern void     (APIENTRY * qglUniform2fARB) (GLint location, GLfloat v0, GLfloat v1);
-extern void     (APIENTRY * qglUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-extern void     (APIENTRY * qglUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern void     (APIENTRY * qglUniform1iARB) (GLint location, GLint v0);
-extern void     (APIENTRY * qglUniform2iARB) (GLint location, GLint v0, GLint v1);
-extern void     (APIENTRY * qglUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2);
-extern void     (APIENTRY * qglUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-extern void     (APIENTRY * qglUniform1fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform2fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform3fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform4fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform2ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniform3ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniform4ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat * params);
-extern void     (APIENTRY * qglGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint * params);
-extern void     (APIENTRY * qglGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
-extern void     (APIENTRY * qglGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count,
-													   GLhandleARB * obj);
-extern          GLint(APIENTRY * qglGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-extern void     (APIENTRY * qglGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxIndex, GLsizei * length,
-													 GLint * size, GLenum * type, GLcharARB * name);
-extern void     (APIENTRY * qglGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat * params);
-extern void     (APIENTRY * qglGetUniformivARB) (GLhandleARB programObj, GLint location, GLint * params);
-extern void     (APIENTRY * qglGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
-
-// GL_ARB_vertex_shader
-extern void     (APIENTRY * qglBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB * name);
-extern void     (APIENTRY * qglGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length,
-													GLint * size, GLenum * type, GLcharARB * name);
-extern          GLint(APIENTRY * qglGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-
-// GL_ARB_texture_compression
-extern void (APIENTRY * qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
-	GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
-	GLint border, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,
-	GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
-	GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, 
-	GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglGetCompressedTexImageARB)(GLenum target, GLint lod,
-	GLvoid *img);
-
-// GL_NVX_gpu_memory_info
-#ifndef GL_NVX_gpu_memory_info
-#define GL_NVX_gpu_memory_info
-#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX          0x9047
-#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX    0x9048
-#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX  0x9049
-#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX            0x904A
-#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX            0x904B
+#define qglClearIndex glClearIndex
+#define qglClearStencil glClearStencil
+#ifdef USE_OPENGLES
+#define qglClipPlane glClipPlanef
+#else
+#define qglClipPlane glClipPlane
 #endif
-
-// GL_ATI_meminfo
-#ifndef GL_ATI_meminfo
-#define GL_ATI_meminfo
-#define GL_VBO_FREE_MEMORY_ATI                    0x87FB
-#define GL_TEXTURE_FREE_MEMORY_ATI                0x87FC
-#define GL_RENDERBUFFER_FREE_MEMORY_ATI           0x87FD
+#define qglColor3b glColor3b
+#define qglColor3bv glColor3bv
+#define qglColor3d glColor3d
+#define qglColor3dv glColor3dv
+#ifdef USE_OPENGLES
+#define qglColor3f(r, g, b) glColor4f(r, g, b, 1.0f)
+#else
+#define qglColor3f glColor3f
 #endif
-
-// GL_ARB_texture_float
-#ifndef GL_ARB_texture_float
-#define GL_ARB_texture_float
-#define GL_TEXTURE_RED_TYPE_ARB             0x8C10
-#define GL_TEXTURE_GREEN_TYPE_ARB           0x8C11
-#define GL_TEXTURE_BLUE_TYPE_ARB            0x8C12
-#define GL_TEXTURE_ALPHA_TYPE_ARB           0x8C13
-#define GL_TEXTURE_LUMINANCE_TYPE_ARB       0x8C14
-#define GL_TEXTURE_INTENSITY_TYPE_ARB       0x8C15
-#define GL_TEXTURE_DEPTH_TYPE_ARB           0x8C16
-#define GL_UNSIGNED_NORMALIZED_ARB          0x8C17
-#define GL_RGBA32F_ARB                      0x8814
-#define GL_RGB32F_ARB                       0x8815
-#define GL_ALPHA32F_ARB                     0x8816
-#define GL_INTENSITY32F_ARB                 0x8817
-#define GL_LUMINANCE32F_ARB                 0x8818
-#define GL_LUMINANCE_ALPHA32F_ARB           0x8819
-#define GL_RGBA16F_ARB                      0x881A
-#define GL_RGB16F_ARB                       0x881B
-#define GL_ALPHA16F_ARB                     0x881C
-#define GL_INTENSITY16F_ARB                 0x881D
-#define GL_LUMINANCE16F_ARB                 0x881E
-#define GL_LUMINANCE_ALPHA16F_ARB           0x881F
+#define qglColor3fv glColor3fv
+#define qglColor3i glColor3i
+#define qglColor3iv glColor3iv
+#define qglColor3s glColor3s
+#define qglColor3sv glColor3sv
+#define qglColor3ub glColor3ub
+#define qglColor3ubv glColor3ubv
+#define qglColor3ui glColor3ui
+#define qglColor3uiv glColor3uiv
+#define qglColor3us glColor3us
+#define qglColor3usv glColor3usv
+#define qglColor4b glColor4b
+#define qglColor4bv glColor4bv
+#define qglColor4d glColor4d
+#define qglColor4dv glColor4dv
+#define qglColor4f glColor4f
+#define qglColor4fv glColor4fv
+#define qglColor4i glColor4i
+#define qglColor4iv glColor4iv
+#define qglColor4s glColor4s
+#define qglColor4sv glColor4sv
+#define qglColor4ub glColor4ub
+#ifdef USE_OPENGLES
+#define qglColor4ubv(a) glColor4ub((a)[0], (a)[1], (a)[2], (a)[3])
+#else
+#define qglColor4ubv glColor4ubv
 #endif
-
-#ifndef GL_ARB_half_float_pixel
-#define GL_ARB_half_float_pixel
-#define GL_HALF_FLOAT_ARB                   0x140B
+#define qglColor4ui glColor4ui
+#define qglColor4uiv glColor4uiv
+#define qglColor4us glColor4us
+#define qglColor4usv glColor4usv
+#define qglColorMask glColorMask
+#define qglColorMaterial glColorMaterial
+#define qglColorPointer glColorPointer
+#define qglCopyPixels glCopyPixels
+#define qglCopyTexImage1D glCopyTexImage1D
+#define qglCopyTexImage2D glCopyTexImage2D
+#define qglCopyTexSubImage1D glCopyTexSubImage1D
+#define qglCopyTexSubImage2D glCopyTexSubImage2D
+#define qglCullFace glCullFace
+#define qglDeleteLists glDeleteLists
+#define qglDeleteTextures glDeleteTextures
+#define qglDepthFunc glDepthFunc
+#define qglDepthMask glDepthMask
+#ifdef USE_OPENGLES
+#define qglDepthRange glDepthRangef
+#else
+#define qglDepthRange glDepthRange
 #endif
-
-// GL_EXT_framebuffer_object
-extern GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
-extern void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer);
-extern void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers);
-extern void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers);
+#define qglDisable glDisable
+#define qglDisableClientState glDisableClientState
+#define qglDrawArrays glDrawArrays
+#define qglDrawBuffer glDrawBuffer
+#define qglDrawElements glDrawElements
+#define qglDrawPixels glDrawPixels
+#define qglEdgeFlag glEdgeFlag
+#define qglEdgeFlagPointer glEdgeFlagPointer
+#define qglEdgeFlagv glEdgeFlagv
+#define qglEnable glEnable
+#define qglEnableClientState glEnableClientState
+#define qglEnd glEnd
+#define qglEndList glEndList
+#define qglEvalCoord1d glEvalCoord1d
+#define qglEvalCoord1dv glEvalCoord1dv
+#define qglEvalCoord1f glEvalCoord1f
+#define qglEvalCoord1fv glEvalCoord1fv
+#define qglEvalCoord2d glEvalCoord2d
+#define qglEvalCoord2dv glEvalCoord2dv
+#define qglEvalCoord2f glEvalCoord2f
+#define qglEvalCoord2fv glEvalCoord2fv
+#define qglEvalMesh1 glEvalMesh1
+#define qglEvalMesh2 glEvalMesh2
+#define qglEvalPoint1 glEvalPoint1
+#define qglEvalPoint2 glEvalPoint2
+#define qglFeedbackBuffer glFeedbackBuffer
+#define qglFinish glFinish
+#define qglFlush glFlush
+#define qglFogf glFogf
+#define qglFogfv glFogfv
+#ifdef USE_OPENGLES
+#define qglFogi  glFogf
+#else
+#define qglFogi glFogi
+#endif
+#define qglFogiv glFogiv
+#define qglFrontFace glFrontFace
+#ifdef USE_OPENGLES
+#define qglFrustum glFrustumf
+#else
+#define qglFrustum glFrustum
+#endif
+#define qglGenLists glGenLists
+#define qglGenTextures glGenTextures
+#define qglGetBooleanv glGetBooleanv
+#define qglGetClipPlane glGetClipPlane
+#define qglGetDoublev glGetDoublev
+#define qglGetError glGetError
+#define qglGetFloatv glGetFloatv
+#define qglGetIntegerv glGetIntegerv
+#define qglGetLightfv glGetLightfv
+#define qglGetLightiv glGetLightiv
+#define qglGetMapdv glGetMapdv
+#define qglGetMapfv glGetMapfv
+#define qglGetMapiv glGetMapiv
+#define qglGetMaterialfv glGetMaterialfv
+#define qglGetMaterialiv glGetMaterialiv
+#define qglGetPixelMapfv glGetPixelMapfv
+#define qglGetPixelMapuiv glGetPixelMapuiv
+#define qglGetPixelMapusv glGetPixelMapusv
+#define qglGetPointerv glGetPointerv
+#define qglGetPolygonStipple glGetPolygonStipple
+#define qglGetString glGetString
+#define qglGetTexGendv glGetTexGendv
+#define qglGetTexGenfv glGetTexGenfv
+#define qglGetTexGeniv glGetTexGeniv
+#define qglGetTexImage glGetTexImage
+#define qglGetTexLevelParameterfv glGetTexLevelParameterfv
+#define qglGetTexLevelParameteriv glGetTexLevelParameteriv
+#define qglGetTexParameterfv glGetTexParameterfv
+#define qglGetTexParameteriv glGetTexParameteriv
+#define qglHint glHint
+#define qglIndexMask glIndexMask
+#define qglIndexPointer glIndexPointer
+#define qglIndexd glIndexd
+#define qglIndexdv glIndexdv
+#define qglIndexf glIndexf
+#define qglIndexfv glIndexfv
+#define qglIndexi glIndexi
+#define qglIndexiv glIndexiv
+#define qglIndexs glIndexs
+#define qglIndexsv glIndexsv
+#define qglIndexub glIndexub
+#define qglIndexubv glIndexubv
+#define qglInitNames glInitNames
+#define qglInterleavedArrays glInterleavedArrays
+#define qglIsEnabled glIsEnabled
+#define qglIsList glIsList
+#define qglIsTexture glIsTexture
+#define qglLightModelf glLightModelf
+#define qglLightModelfv glLightModelfv
+#define qglLightModeli glLightModeli
+#define qglLightModeliv glLightModeliv
+#define qglLightf glLightf
+#define qglLightfv glLightfv
+#define qglLighti glLighti
+#define qglLightiv glLightiv
+#define qglLineStipple glLineStipple
+#define qglLineWidth glLineWidth
+#define qglListBase glListBase
+#define qglLoadIdentity glLoadIdentity
+#define qglLoadMatrixd glLoadMatrixd
+#define qglLoadMatrixf glLoadMatrixf
+#define qglLoadName glLoadName
+#define qglLogicOp glLogicOp
+#define qglMap1d glMap1d
+#define qglMap1f glMap1f
+#define qglMap2d glMap2d
+#define qglMap2f glMap2f
+#define qglMapGrid1d glMapGrid1d
+#define qglMapGrid1f glMapGrid1f
+#define qglMapGrid2d glMapGrid2d
+#define qglMapGrid2f glMapGrid2f
+#define qglMaterialf glMaterialf
+#define qglMaterialfv glMaterialfv
+#define qglMateriali glMateriali
+#define qglMaterialiv glMaterialiv
+#define qglMatrixMode glMatrixMode
+#define qglMultMatrixd glMultMatrixd
+#define qglMultMatrixf glMultMatrixf
+#define qglNewList glNewList
+#define qglNormal3b glNormal3b
+#define qglNormal3bv glNormal3bv
+#define qglNormal3d glNormal3d
+#define qglNormal3dv glNormal3dv
+#define qglNormal3f glNormal3f
+#define qglNormal3fv glNormal3fv
+#define qglNormal3i glNormal3i
+#define qglNormal3iv glNormal3iv
+#define qglNormal3s glNormal3s
+#define qglNormal3sv glNormal3sv
+#define qglNormalPointer glNormalPointer
+#ifdef USE_OPENGLES
+#define qglOrtho glOrthof
+#else
+#define qglOrtho glOrtho
+#endif
+#define qglPassThrough glPassThrough
+#define qglPixelMapfv glPixelMapfv
+#define qglPixelMapuiv glPixelMapuiv
+#define qglPixelMapusv glPixelMapusv
+#define qglPixelStoref glPixelStoref
+#define qglPixelStorei glPixelStorei
+#define qglPixelTransferf glPixelTransferf
+#define qglPixelTransferi glPixelTransferi
+#define qglPixelZoom glPixelZoom
+#define qglPointSize glPointSize
+#define qglPolygonMode glPolygonMode
+#define qglPolygonOffset glPolygonOffset
+#define qglPolygonStipple glPolygonStipple
+#define qglPopAttrib glPopAttrib
+#define qglPopClientAttrib glPopClientAttrib
+#define qglPopMatrix glPopMatrix
+#define qglPopName glPopName
+#define qglPrioritizeTextures glPrioritizeTextures
+#define qglPushAttrib glPushAttrib
+#define qglPushClientAttrib glPushClientAttrib
+#define qglPushMatrix glPushMatrix
+#define qglPushName glPushName
+#define qglRasterPos2d glRasterPos2d
+#define qglRasterPos2dv glRasterPos2dv
+#define qglRasterPos2f glRasterPos2f
+#define qglRasterPos2fv glRasterPos2fv
+#define qglRasterPos2i glRasterPos2i
+#define qglRasterPos2iv glRasterPos2iv
+#define qglRasterPos2s glRasterPos2s
+#define qglRasterPos2sv glRasterPos2sv
+#define qglRasterPos3d glRasterPos3d
+#define qglRasterPos3dv glRasterPos3dv
+#define qglRasterPos3f glRasterPos3f
+#define qglRasterPos3fv glRasterPos3fv
+#define qglRasterPos3i glRasterPos3i
+#define qglRasterPos3iv glRasterPos3iv
+#define qglRasterPos3s glRasterPos3s
+#define qglRasterPos3sv glRasterPos3sv
+#define qglRasterPos4d glRasterPos4d
+#define qglRasterPos4dv glRasterPos4dv
+#define qglRasterPos4f glRasterPos4f
+#define qglRasterPos4fv glRasterPos4fv
+#define qglRasterPos4i glRasterPos4i
+#define qglRasterPos4iv glRasterPos4iv
+#define qglRasterPos4s glRasterPos4s
+#define qglRasterPos4sv glRasterPos4sv
+#define qglReadBuffer glReadBuffer
+#define qglReadPixels glReadPixels
+#define qglRectd glRectd
+#define qglRectdv glRectdv
+#define qglRectf glRectf
+#define qglRectfv glRectfv
+#define qglRecti glRecti
+#define qglRectiv glRectiv
+#define qglRects glRects
+#define qglRectsv glRectsv
+#define qglRenderMode glRenderMode
+#define qglRotated glRotated
+#define qglRotatef glRotatef
+#define qglScaled glScaled
+#define qglScalef glScalef
+#define qglScissor glScissor
+#define qglSelectBuffer glSelectBuffer
+#define qglShadeModel glShadeModel
+#define qglStencilFunc glStencilFunc
+#define qglStencilMask glStencilMask
+#define qglStencilOp glStencilOp
+#define qglTexCoord1d glTexCoord1d
+#define qglTexCoord1dv glTexCoord1dv
+#define qglTexCoord1f glTexCoord1f
+#define qglTexCoord1fv glTexCoord1fv
+#define qglTexCoord1i glTexCoord1i
+#define qglTexCoord1iv glTexCoord1iv
+#define qglTexCoord1s glTexCoord1s
+#define qglTexCoord1sv glTexCoord1sv
+#define qglTexCoord2d glTexCoord2d
+#define qglTexCoord2dv glTexCoord2dv
+#define qglTexCoord2f glTexCoord2f
+#define qglTexCoord2fv glTexCoord2fv
+#define qglTexCoord2i glTexCoord2i
+#define qglTexCoord2iv glTexCoord2iv
+#define qglTexCoord2s glTexCoord2s
+#define qglTexCoord2sv glTexCoord2sv
+#define qglTexCoord3d glTexCoord3d
+#define qglTexCoord3dv glTexCoord3dv
+#define qglTexCoord3f glTexCoord3f
+#define qglTexCoord3fv glTexCoord3fv
+#define qglTexCoord3i glTexCoord3i
+#define qglTexCoord3iv glTexCoord3iv
+#define qglTexCoord3s glTexCoord3s
+#define qglTexCoord3sv glTexCoord3sv
+#define qglTexCoord4d glTexCoord4d
+#define qglTexCoord4dv glTexCoord4dv
+#define qglTexCoord4f glTexCoord4f
+#define qglTexCoord4fv glTexCoord4fv
+#define qglTexCoord4i glTexCoord4i
+#define qglTexCoord4iv glTexCoord4iv
+#define qglTexCoord4s glTexCoord4s
+#define qglTexCoord4sv glTexCoord4sv
+#define qglTexCoordPointer glTexCoordPointer
+#define qglTexEnvf glTexEnvf
+#define qglTexEnvfv glTexEnvfv
+#define qglTexEnvi glTexEnvi
+#define qglTexEnviv glTexEnviv
+#define qglTexGend glTexGend
+#define qglTexGendv glTexGendv
+#define qglTexGenf glTexGenf
+#define qglTexGenfv glTexGenfv
+#define qglTexGeni glTexGeni
+#define qglTexGeniv glTexGeniv
+#define qglTexImage1D glTexImage1D
+#define qglTexImage2D glTexImage2D
+#define qglTexParameterf glTexParameterf
+#define qglTexParameterfv glTexParameterfv
+#define qglTexParameteri glTexParameteri
+#define qglTexParameteriv glTexParameteriv
+#define qglTexSubImage1D glTexSubImage1D
+#define qglTexSubImage2D glTexSubImage2D
+#define qglTranslated glTranslated
+#define qglTranslatef glTranslatef
+#define qglVertex2d glVertex2d
+#define qglVertex2dv glVertex2dv
+#define qglVertex2f glVertex2f
+#define qglVertex2fv glVertex2fv
+#define qglVertex2i glVertex2i
+#define qglVertex2iv glVertex2iv
+#define qglVertex2s glVertex2s
+#define qglVertex2sv glVertex2sv
+#define qglVertex3d glVertex3d
+#define qglVertex3dv glVertex3dv
+#define qglVertex3f glVertex3f
+#define qglVertex3fv glVertex3fv
+#define qglVertex3i glVertex3i
+#define qglVertex3iv glVertex3iv
+#define qglVertex3s glVertex3s
+#define qglVertex3sv glVertex3sv
+#define qglVertex4d glVertex4d
+#define qglVertex4dv glVertex4dv
+#define qglVertex4f glVertex4f
+#define qglVertex4fv glVertex4fv
+#define qglVertex4i glVertex4i
+#define qglVertex4iv glVertex4iv
+#define qglVertex4s glVertex4s
+#define qglVertex4sv glVertex4sv
+#define qglVertexPointer glVertexPointer
+#define qglViewport glViewport
+
+// GL_EXT_draw_range_elements
+extern void     (APIENTRY * qglDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+
+// GL_EXT_multi_draw_arrays
+extern void (APIENTRY * qglMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+extern void (APIENTRY * qglMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
+
+#ifndef USE_OPENGLES
+// rend2
+
+// GL_ARB_shading_language_100
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#endif
+
+// GL_ARB_vertex_program
+extern void     (APIENTRY * qglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
+extern void     (APIENTRY * qglVertexAttrib4fvARB) (GLuint, const GLfloat *);
+extern void     (APIENTRY * qglVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized,
+														GLsizei stride, const GLvoid * pointer);
+extern void     (APIENTRY * qglEnableVertexAttribArrayARB) (GLuint index);
+extern void     (APIENTRY * qglDisableVertexAttribArrayARB) (GLuint index);
+
+// GL_ARB_vertex_buffer_object
+extern void     (APIENTRY * qglBindBufferARB) (GLenum target, GLuint buffer);
+extern void     (APIENTRY * qglDeleteBuffersARB) (GLsizei n, const GLuint * buffers);
+extern void     (APIENTRY * qglGenBuffersARB) (GLsizei n, GLuint * buffers);
+extern          GLboolean(APIENTRY * qglIsBufferARB) (GLuint buffer);
+extern void     (APIENTRY * qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
+extern void     (APIENTRY * qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);
+extern void     (APIENTRY * qglGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);
+extern void     (APIENTRY * qglGetBufferParameterivARB) (GLenum target, GLenum pname, GLint * params);
+extern void     (APIENTRY * qglGetBufferPointervARB) (GLenum target, GLenum pname, GLvoid * *params);
+
+// GL_ARB_shader_objects
+extern void     (APIENTRY * qglDeleteObjectARB) (GLhandleARB obj);
+extern          GLhandleARB(APIENTRY * qglGetHandleARB) (GLenum pname);
+extern void     (APIENTRY * qglDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj);
+extern          GLhandleARB(APIENTRY * qglCreateShaderObjectARB) (GLenum shaderType);
+extern void     (APIENTRY * qglShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB * *string,
+												 const GLint * length);
+extern void     (APIENTRY * qglCompileShaderARB) (GLhandleARB shaderObj);
+extern          GLhandleARB(APIENTRY * qglCreateProgramObjectARB) (void);
+extern void     (APIENTRY * qglAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj);
+extern void     (APIENTRY * qglLinkProgramARB) (GLhandleARB programObj);
+extern void     (APIENTRY * qglUseProgramObjectARB) (GLhandleARB programObj);
+extern void     (APIENTRY * qglValidateProgramARB) (GLhandleARB programObj);
+extern void     (APIENTRY * qglUniform1fARB) (GLint location, GLfloat v0);
+extern void     (APIENTRY * qglUniform2fARB) (GLint location, GLfloat v0, GLfloat v1);
+extern void     (APIENTRY * qglUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+extern void     (APIENTRY * qglUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+extern void     (APIENTRY * qglUniform1iARB) (GLint location, GLint v0);
+extern void     (APIENTRY * qglUniform2iARB) (GLint location, GLint v0, GLint v1);
+extern void     (APIENTRY * qglUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2);
+extern void     (APIENTRY * qglUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+extern void     (APIENTRY * qglUniform1fvARB) (GLint location, GLsizei count, const GLfloat * value);
+extern void     (APIENTRY * qglUniform2fvARB) (GLint location, GLsizei count, const GLfloat * value);
+extern void     (APIENTRY * qglUniform3fvARB) (GLint location, GLsizei count, const GLfloat * value);
+extern void     (APIENTRY * qglUniform4fvARB) (GLint location, GLsizei count, const GLfloat * value);
+extern void     (APIENTRY * qglUniform2ivARB) (GLint location, GLsizei count, const GLint * value);
+extern void     (APIENTRY * qglUniform3ivARB) (GLint location, GLsizei count, const GLint * value);
+extern void     (APIENTRY * qglUniform4ivARB) (GLint location, GLsizei count, const GLint * value);
+extern void     (APIENTRY * qglUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+extern void     (APIENTRY * qglUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+extern void     (APIENTRY * qglUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+extern void     (APIENTRY * qglGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat * params);
+extern void     (APIENTRY * qglGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint * params);
+extern void     (APIENTRY * qglGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
+extern void     (APIENTRY * qglGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count,
+													   GLhandleARB * obj);
+extern          GLint(APIENTRY * qglGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB * name);
+extern void     (APIENTRY * qglGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxIndex, GLsizei * length,
+													 GLint * size, GLenum * type, GLcharARB * name);
+extern void     (APIENTRY * qglGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat * params);
+extern void     (APIENTRY * qglGetUniformivARB) (GLhandleARB programObj, GLint location, GLint * params);
+extern void     (APIENTRY * qglGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
+
+// GL_ARB_vertex_shader
+extern void     (APIENTRY * qglBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB * name);
+extern void     (APIENTRY * qglGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length,
+													GLint * size, GLenum * type, GLcharARB * name);
+extern          GLint(APIENTRY * qglGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB * name);
+
+// GL_ARB_texture_compression
+extern void (APIENTRY * qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
+	GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+extern void (APIENTRY * qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
+	GLint border, GLsizei imageSize, const GLvoid *data);
+extern void (APIENTRY * qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,
+	GLsizei imageSize, const GLvoid *data);
+extern void (APIENTRY * qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
+	GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+extern void (APIENTRY * qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
+	GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+extern void (APIENTRY * qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, 
+	GLsizei imageSize, const GLvoid *data);
+extern void (APIENTRY * qglGetCompressedTexImageARB)(GLenum target, GLint lod,
+	GLvoid *img);
+
+// GL_NVX_gpu_memory_info
+#ifndef GL_NVX_gpu_memory_info
+#define GL_NVX_gpu_memory_info
+#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX          0x9047
+#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX    0x9048
+#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX  0x9049
+#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX            0x904A
+#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX            0x904B
+#endif
+
+// GL_ATI_meminfo
+#ifndef GL_ATI_meminfo
+#define GL_ATI_meminfo
+#define GL_VBO_FREE_MEMORY_ATI                    0x87FB
+#define GL_TEXTURE_FREE_MEMORY_ATI                0x87FC
+#define GL_RENDERBUFFER_FREE_MEMORY_ATI           0x87FD
+#endif
+
+// GL_ARB_texture_float
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float
+#define GL_TEXTURE_RED_TYPE_ARB             0x8C10
+#define GL_TEXTURE_GREEN_TYPE_ARB           0x8C11
+#define GL_TEXTURE_BLUE_TYPE_ARB            0x8C12
+#define GL_TEXTURE_ALPHA_TYPE_ARB           0x8C13
+#define GL_TEXTURE_LUMINANCE_TYPE_ARB       0x8C14
+#define GL_TEXTURE_INTENSITY_TYPE_ARB       0x8C15
+#define GL_TEXTURE_DEPTH_TYPE_ARB           0x8C16
+#define GL_UNSIGNED_NORMALIZED_ARB          0x8C17
+#define GL_RGBA32F_ARB                      0x8814
+#define GL_RGB32F_ARB                       0x8815
+#define GL_ALPHA32F_ARB                     0x8816
+#define GL_INTENSITY32F_ARB                 0x8817
+#define GL_LUMINANCE32F_ARB                 0x8818
+#define GL_LUMINANCE_ALPHA32F_ARB           0x8819
+#define GL_RGBA16F_ARB                      0x881A
+#define GL_RGB16F_ARB                       0x881B
+#define GL_ALPHA16F_ARB                     0x881C
+#define GL_INTENSITY16F_ARB                 0x881D
+#define GL_LUMINANCE16F_ARB                 0x881E
+#define GL_LUMINANCE_ALPHA16F_ARB           0x881F
+#endif
+
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel
+#define GL_HALF_FLOAT_ARB                   0x140B
+#endif
+
+// GL_EXT_framebuffer_object
+extern GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
+extern void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer);
+extern void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers);
+extern void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers);
 extern void (APIENTRY * qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
 extern void (APIENTRY * qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params);
 extern GLboolean (APIENTRY * qglIsFramebufferEXT)(GLuint framebuffer);
@@ -360,543 +739,172 @@ extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 
 // GL_EXT_packed_depth_stencil
 #ifndef GL_EXT_packed_depth_stencil
-#define GL_EXT_packed_depth_stencil
-#define GL_DEPTH_STENCIL_EXT                              0x84F9
-#define GL_UNSIGNED_INT_24_8_EXT                          0x84FA
-#define GL_DEPTH24_STENCIL8_EXT                           0x88F0
-#define GL_TEXTURE_STENCIL_SIZE_EXT                       0x88F1
-#endif
-
-// GL_ARB_occlusion_query
-extern void (APIENTRY * qglGenQueriesARB)(GLsizei n, GLuint *ids);
-extern void (APIENTRY * qglDeleteQueriesARB)(GLsizei n, const GLuint *ids);
-extern GLboolean (APIENTRY * qglIsQueryARB)(GLuint id);
-extern void (APIENTRY * qglBeginQueryARB)(GLenum target, GLuint id);
-extern void (APIENTRY * qglEndQueryARB)(GLenum target);
-extern void (APIENTRY * qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
-
-#ifndef GL_ARB_occlusion_query
-#define GL_ARB_occlusion_query
-#define GL_SAMPLES_PASSED_ARB                             0x8914
-#define GL_QUERY_COUNTER_BITS_ARB                         0x8864
-#define GL_CURRENT_QUERY_ARB                              0x8865
-#define GL_QUERY_RESULT_ARB                               0x8866
-#define GL_QUERY_RESULT_AVAILABLE_ARB                     0x8867
-#endif
-
-// GL_EXT_framebuffer_blit
-extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                            GLbitfield mask, GLenum filter);
-
-#ifndef GL_EXT_framebuffer_blit
-#define GL_EXT_framebuffer_blit
-#define GL_READ_FRAMEBUFFER_EXT                0x8CA8
-#define GL_DRAW_FRAMEBUFFER_EXT                0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_EXT        0x8CA6
-#define GL_READ_FRAMEBUFFER_BINDING_EXT        0x8CAA
-#endif
-
-// GL_EXT_framebuffer_multisample
-extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-#ifndef GL_EXT_framebuffer_multisample
-#define GL_EXT_framebuffer_multisample
-#define GL_RENDERBUFFER_SAMPLES_EXT                0x8CAB
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT  0x8D56
-#define GL_MAX_SAMPLES_EXT                         0x8D57
-#endif
-
-#ifndef GL_EXT_texture_sRGB
-#define GL_EXT_texture_sRGB
-#define GL_SRGB_EXT                                       0x8C40
-#define GL_SRGB8_EXT                                      0x8C41
-#define GL_SRGB_ALPHA_EXT                                 0x8C42
-#define GL_SRGB8_ALPHA8_EXT                               0x8C43
-#define GL_SLUMINANCE_ALPHA_EXT                           0x8C44
-#define GL_SLUMINANCE8_ALPHA8_EXT                         0x8C45
-#define GL_SLUMINANCE_EXT                                 0x8C46
-#define GL_SLUMINANCE8_EXT                                0x8C47
-#define GL_COMPRESSED_SRGB_EXT                            0x8C48
-#define GL_COMPRESSED_SRGB_ALPHA_EXT                      0x8C49
-#define GL_COMPRESSED_SLUMINANCE_EXT                      0x8C4A
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                0x8C4B
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                  0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT            0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT            0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT            0x8C4F
-#endif
-
-#ifndef GL_EXT_framebuffer_sRGB
-#define GL_EXT_framebuffer_sRGB
-#define GL_FRAMEBUFFER_SRGB_EXT                         0x8DB9
-#endif
-
-#ifndef GL_EXT_texture_compression_latc
-#define GL_EXT_texture_compression_latc
-#define GL_COMPRESSED_LUMINANCE_LATC1_EXT                 0x8C70
-#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT          0x8C71
-#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT           0x8C72
-#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT    0x8C73
-#endif
-
-#ifndef GL_ARB_texture_compression_bptc
-#define GL_ARB_texture_compression_bptc
-#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB                 0x8E8C
-#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB           0x8E8D
-#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB           0x8E8E
-#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB         0x8E8F
-#endif
-
-// GL_ARB_draw_buffers
-extern void (APIENTRY * qglDrawBuffersARB)(GLsizei n, const GLenum *bufs);
-#ifndef GL_ARB_draw_buffers
-#define GL_ARB_draw_buffers
-#define GL_MAX_DRAW_BUFFERS_ARB                    0x8824
-#define GL_DRAW_BUFFER0_ARB                        0x8825
-#define GL_DRAW_BUFFER1_ARB                        0x8826
-#define GL_DRAW_BUFFER2_ARB                        0x8827
-#define GL_DRAW_BUFFER3_ARB                        0x8828
-#define GL_DRAW_BUFFER4_ARB                        0x8829
-#define GL_DRAW_BUFFER5_ARB                        0x882A
-#define GL_DRAW_BUFFER6_ARB                        0x882B
-#define GL_DRAW_BUFFER7_ARB                        0x882C
-#define GL_DRAW_BUFFER8_ARB                        0x882D
-#define GL_DRAW_BUFFER9_ARB                        0x882E
-#define GL_DRAW_BUFFER10_ARB                       0x882F
-#define GL_DRAW_BUFFER11_ARB                       0x8830
-#define GL_DRAW_BUFFER12_ARB                       0x8831
-#define GL_DRAW_BUFFER13_ARB                       0x8832
-#define GL_DRAW_BUFFER14_ARB                       0x8833
-#define GL_DRAW_BUFFER15_ARB                       0x8834
-#endif
-
-#ifndef GL_ARB_depth_clamp
-#define GL_ARB_depth_clamp
-#define GL_DEPTH_CLAMP				      0x864F
-#endif
-
-#ifndef GL_ARB_seamless_cube_map
-#define GL_ARB_seamless_cube_map
-#define GL_TEXTURE_CUBE_MAP_SEAMLESS               0x884F
-#endif
-
-// GL_ARB_vertex_array_object
-extern void (APIENTRY * qglBindVertexArrayARB)(GLuint array);
-extern void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays);
-extern void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays);
-extern GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array);
-#ifndef GL_ARB_vertex_array_object
-#define GL_ARB_vertex_array_object
-#define GL_VERTEX_ARRAY_BINDING_ARB                0x85B5
-#endif
-
-#if defined(WIN32)
-// WGL_ARB_create_context
-#ifndef WGL_ARB_create_context
-#define WGL_CONTEXT_MAJOR_VERSION_ARB             0x2091
-#define WGL_CONTEXT_MINOR_VERSION_ARB             0x2092
-#define WGL_CONTEXT_LAYER_PLANE_ARB               0x2093
-#define WGL_CONTEXT_FLAGS_ARB                     0x2094
-#define WGL_CONTEXT_PROFILE_MASK_ARB              0x9126
-#define WGL_CONTEXT_DEBUG_BIT_ARB                 0x0001
-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB    0x0002
-#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB          0x00000001
-#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
-#define ERROR_INVALID_VERSION_ARB                 0x2095
-#define ERROR_INVALID_PROFILE_ARB                 0x2096
+#define GL_EXT_packed_depth_stencil
+#define GL_DEPTH_STENCIL_EXT                              0x84F9
+#define GL_UNSIGNED_INT_24_8_EXT                          0x84FA
+#define GL_DEPTH24_STENCIL8_EXT                           0x88F0
+#define GL_TEXTURE_STENCIL_SIZE_EXT                       0x88F1
 #endif
 
-extern          HGLRC(APIENTRY * qwglCreateContextAttribsARB) (HDC hdC, HGLRC hShareContext, const int *attribList);
-#endif
+// GL_ARB_occlusion_query
+extern void (APIENTRY * qglGenQueriesARB)(GLsizei n, GLuint *ids);
+extern void (APIENTRY * qglDeleteQueriesARB)(GLsizei n, const GLuint *ids);
+extern GLboolean (APIENTRY * qglIsQueryARB)(GLuint id);
+extern void (APIENTRY * qglBeginQueryARB)(GLenum target, GLuint id);
+extern void (APIENTRY * qglEndQueryARB)(GLenum target);
+extern void (APIENTRY * qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
+extern void (APIENTRY * qglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
+extern void (APIENTRY * qglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
 
-#if 0 //defined(__linux__)
-// GLX_ARB_create_context
-#ifndef GLX_ARB_create_context
-#define GLX_CONTEXT_DEBUG_BIT_ARB          0x00000001
-#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
-#define GLX_CONTEXT_MAJOR_VERSION_ARB      0x2091
-#define GLX_CONTEXT_MINOR_VERSION_ARB      0x2092
-#define GLX_CONTEXT_FLAGS_ARB              0x2094
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query
+#define GL_SAMPLES_PASSED_ARB                             0x8914
+#define GL_QUERY_COUNTER_BITS_ARB                         0x8864
+#define GL_CURRENT_QUERY_ARB                              0x8865
+#define GL_QUERY_RESULT_ARB                               0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB                     0x8867
 #endif
 
-extern GLXContext	(APIENTRY * qglXCreateContextAttribsARB) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
-#endif
+// GL_EXT_framebuffer_blit
+extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
+                            GLbitfield mask, GLenum filter);
 
+#ifndef GL_EXT_framebuffer_blit
+#define GL_EXT_framebuffer_blit
+#define GL_READ_FRAMEBUFFER_EXT                0x8CA8
+#define GL_DRAW_FRAMEBUFFER_EXT                0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT        0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_EXT        0x8CAA
 #endif
 
-//===========================================================================
+// GL_EXT_framebuffer_multisample
+extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples,
+	GLenum internalformat, GLsizei width, GLsizei height);
 
-#define qglAccum glAccum
-#define qglAlphaFunc glAlphaFunc
-#define qglAreTexturesResident glAreTexturesResident
-#define qglArrayElement glArrayElement
-#define qglBegin glBegin
-#define qglBindTexture glBindTexture
-#define qglBitmap glBitmap
-#define qglBlendFunc glBlendFunc
-#define qglCallList glCallList
-#define qglCallLists glCallLists
-#ifdef VCMODS_DEPTH
-#define qglClear myglClear
-#else
-#define qglClear glClear
-#endif
-#define qglClearAccum glClearAccum
-#define qglClearColor glClearColor
-#ifdef VCMODS_OPENGLES
-#define qglClearDepth glClearDepthf
-#else
-#define qglClearDepth glClearDepth
-#endif
-#define qglClearIndex glClearIndex
-#define qglClearStencil glClearStencil
-#ifdef VCMODS_OPENGLES
-#define qglClipPlane glClipPlanef
-#else
-#define qglClipPlane glClipPlane
-#endif
-#define qglColor3b glColor3b
-#define qglColor3bv glColor3bv
-#define qglColor3d glColor3d
-#define qglColor3dv glColor3dv
-#define qglColor3f glColor3f
-#define qglColor3fv glColor3fv
-#define qglColor3i glColor3i
-#define qglColor3iv glColor3iv
-#define qglColor3s glColor3s
-#define qglColor3sv glColor3sv
-#define qglColor3ub glColor3ub
-#define qglColor3ubv glColor3ubv
-#define qglColor3ui glColor3ui
-#define qglColor3uiv glColor3uiv
-#define qglColor3us glColor3us
-#define qglColor3usv glColor3usv
-#define qglColor4b glColor4b
-#define qglColor4bv glColor4bv
-#define qglColor4d glColor4d
-#define qglColor4dv glColor4dv
-#define qglColor4f glColor4f
-#define qglColor4fv glColor4fv
-#define qglColor4i glColor4i
-#define qglColor4iv glColor4iv
-#define qglColor4s glColor4s
-#define qglColor4sv glColor4sv
-#define qglColor4ub glColor4ub
-#define qglColor4ubv glColor4ubv
-#define qglColor4ui glColor4ui
-#define qglColor4uiv glColor4uiv
-#define qglColor4us glColor4us
-#define qglColor4usv glColor4usv
-#define qglColorMask glColorMask
-#define qglColorMaterial glColorMaterial
-#define qglColorPointer glColorPointer
-#define qglCopyPixels glCopyPixels
-#define qglCopyTexImage1D glCopyTexImage1D
-#define qglCopyTexImage2D glCopyTexImage2D
-#define qglCopyTexSubImage1D glCopyTexSubImage1D
-#define qglCopyTexSubImage2D glCopyTexSubImage2D
-#define qglCullFace glCullFace
-#define qglDeleteLists glDeleteLists
-#define qglDeleteTextures glDeleteTextures
-#define qglDepthFunc glDepthFunc
-#define qglDepthMask glDepthMask
-#ifdef VCMODS_OPENGLES
-#define qglDepthRange glDepthRangef
-#else
-#define qglDepthRange glDepthRange
-#endif
-#define qglDisable glDisable
-#define qglDisableClientState glDisableClientState
-#define qglDrawArrays glDrawArrays
-#ifdef VCMODS_OPENGLES
-#define qglDrawBuffer myglDrawBuffer
-#else
-#define qglDrawBuffer glDrawBuffer
+#ifndef GL_EXT_framebuffer_multisample
+#define GL_EXT_framebuffer_multisample
+#define GL_RENDERBUFFER_SAMPLES_EXT                0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT  0x8D56
+#define GL_MAX_SAMPLES_EXT                         0x8D57
 #endif
-#define qglDrawElements glDrawElements
-#define qglDrawPixels glDrawPixels
-#define qglEdgeFlag glEdgeFlag
-#define qglEdgeFlagPointer glEdgeFlagPointer
-#define qglEdgeFlagv glEdgeFlagv
-#define qglEnable glEnable
-#define qglEnableClientState glEnableClientState
-#define qglEnd glEnd
-#define qglEndList glEndList
-#define qglEvalCoord1d glEvalCoord1d
-#define qglEvalCoord1dv glEvalCoord1dv
-#define qglEvalCoord1f glEvalCoord1f
-#define qglEvalCoord1fv glEvalCoord1fv
-#define qglEvalCoord2d glEvalCoord2d
-#define qglEvalCoord2dv glEvalCoord2dv
-#define qglEvalCoord2f glEvalCoord2f
-#define qglEvalCoord2fv glEvalCoord2fv
-#define qglEvalMesh1 glEvalMesh1
-#define qglEvalMesh2 glEvalMesh2
-#define qglEvalPoint1 glEvalPoint1
-#define qglEvalPoint2 glEvalPoint2
-#define qglFeedbackBuffer glFeedbackBuffer
-#define qglFinish glFinish
-#define qglFlush glFlush
-#define qglFogf glFogf
-#define qglFogfv glFogfv
-#define qglFogi glFogi
-#define qglFogiv glFogiv
-#define qglFrontFace glFrontFace
-#define qglFrustum glFrustum
-#define qglGenLists glGenLists
-#define qglGenTextures glGenTextures
-#define qglGetBooleanv glGetBooleanv
-#define qglGetClipPlane glGetClipPlane
-#define qglGetDoublev glGetDoublev
-#define qglGetError glGetError
-#define qglGetFloatv glGetFloatv
-#define qglGetIntegerv glGetIntegerv
-#define qglGetLightfv glGetLightfv
-#define qglGetLightiv glGetLightiv
-#define qglGetMapdv glGetMapdv
-#define qglGetMapfv glGetMapfv
-#define qglGetMapiv glGetMapiv
-#define qglGetMaterialfv glGetMaterialfv
-#define qglGetMaterialiv glGetMaterialiv
-#define qglGetPixelMapfv glGetPixelMapfv
-#define qglGetPixelMapuiv glGetPixelMapuiv
-#define qglGetPixelMapusv glGetPixelMapusv
-#define qglGetPointerv glGetPointerv
-#define qglGetPolygonStipple glGetPolygonStipple
-#define qglGetString glGetString
-#define qglGetTexGendv glGetTexGendv
-#define qglGetTexGenfv glGetTexGenfv
-#define qglGetTexGeniv glGetTexGeniv
-#define qglGetTexImage glGetTexImage
-#define qglGetTexLevelParameterfv glGetTexLevelParameterfv
-#define qglGetTexLevelParameteriv glGetTexLevelParameteriv
-#define qglGetTexParameterfv glGetTexParameterfv
-#define qglGetTexParameteriv glGetTexParameteriv
-#define qglHint glHint
-#define qglIndexMask glIndexMask
-#define qglIndexPointer glIndexPointer
-#define qglIndexd glIndexd
-#define qglIndexdv glIndexdv
-#define qglIndexf glIndexf
-#define qglIndexfv glIndexfv
-#define qglIndexi glIndexi
-#define qglIndexiv glIndexiv
-#define qglIndexs glIndexs
-#define qglIndexsv glIndexsv
-#define qglIndexub glIndexub
-#define qglIndexubv glIndexubv
-#define qglInitNames glInitNames
-#define qglInterleavedArrays glInterleavedArrays
-#define qglIsEnabled glIsEnabled
-#define qglIsList glIsList
-#define qglIsTexture glIsTexture
-#define qglLightModelf glLightModelf
-#define qglLightModelfv glLightModelfv
-#define qglLightModeli glLightModeli
-#define qglLightModeliv glLightModeliv
-#define qglLightf glLightf
-#define qglLightfv glLightfv
-#define qglLighti glLighti
-#define qglLightiv glLightiv
-#define qglLineStipple glLineStipple
-#define qglLineWidth glLineWidth
-#define qglListBase glListBase
-#define qglLoadIdentity glLoadIdentity
-#define qglLoadMatrixd glLoadMatrixd
-#define qglLoadMatrixf glLoadMatrixf
-#define qglLoadName glLoadName
-#define qglLogicOp glLogicOp
-#define qglMap1d glMap1d
-#define qglMap1f glMap1f
-#define qglMap2d glMap2d
-#define qglMap2f glMap2f
-#define qglMapGrid1d glMapGrid1d
-#define qglMapGrid1f glMapGrid1f
-#define qglMapGrid2d glMapGrid2d
-#define qglMapGrid2f glMapGrid2f
-#define qglMaterialf glMaterialf
-#define qglMaterialfv glMaterialfv
-#define qglMateriali glMateriali
-#define qglMaterialiv glMaterialiv
-#define qglMatrixMode glMatrixMode
-#define qglMultMatrixd glMultMatrixd
-#define qglMultMatrixf glMultMatrixf
-#define qglNewList glNewList
-#define qglNormal3b glNormal3b
-#define qglNormal3bv glNormal3bv
-#define qglNormal3d glNormal3d
-#define qglNormal3dv glNormal3dv
-#define qglNormal3f glNormal3f
-#define qglNormal3fv glNormal3fv
-#define qglNormal3i glNormal3i
-#define qglNormal3iv glNormal3iv
-#define qglNormal3s glNormal3s
-#define qglNormal3sv glNormal3sv
-#define qglNormalPointer glNormalPointer
-#ifdef VCMODS_OPENGLES
-#define qglOrtho glOrthof
-#else
-#define qglOrtho glOrtho
+
+#ifndef GL_EXT_texture_sRGB
+#define GL_EXT_texture_sRGB
+#define GL_SRGB_EXT                                       0x8C40
+#define GL_SRGB8_EXT                                      0x8C41
+#define GL_SRGB_ALPHA_EXT                                 0x8C42
+#define GL_SRGB8_ALPHA8_EXT                               0x8C43
+#define GL_SLUMINANCE_ALPHA_EXT                           0x8C44
+#define GL_SLUMINANCE8_ALPHA8_EXT                         0x8C45
+#define GL_SLUMINANCE_EXT                                 0x8C46
+#define GL_SLUMINANCE8_EXT                                0x8C47
+#define GL_COMPRESSED_SRGB_EXT                            0x8C48
+#define GL_COMPRESSED_SRGB_ALPHA_EXT                      0x8C49
+#define GL_COMPRESSED_SLUMINANCE_EXT                      0x8C4A
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                0x8C4B
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                  0x8C4C
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT            0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT            0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT            0x8C4F
 #endif
-#define qglPassThrough glPassThrough
-#define qglPixelMapfv glPixelMapfv
-#define qglPixelMapuiv glPixelMapuiv
-#define qglPixelMapusv glPixelMapusv
-#define qglPixelStoref glPixelStoref
-#define qglPixelStorei glPixelStorei
-#define qglPixelTransferf glPixelTransferf
-#define qglPixelTransferi glPixelTransferi
-#define qglPixelZoom glPixelZoom
-#define qglPointSize glPointSize
-#define qglPolygonMode glPolygonMode
-#define qglPolygonOffset glPolygonOffset
-#define qglPolygonStipple glPolygonStipple
-#define qglPopAttrib glPopAttrib
-#define qglPopClientAttrib glPopClientAttrib
-#define qglPopMatrix glPopMatrix
-#define qglPopName glPopName
-#define qglPrioritizeTextures glPrioritizeTextures
-#define qglPushAttrib glPushAttrib
-#define qglPushClientAttrib glPushClientAttrib
-#define qglPushMatrix glPushMatrix
-#define qglPushName glPushName
-#define qglRasterPos2d glRasterPos2d
-#define qglRasterPos2dv glRasterPos2dv
-#define qglRasterPos2f glRasterPos2f
-#define qglRasterPos2fv glRasterPos2fv
-#define qglRasterPos2i glRasterPos2i
-#define qglRasterPos2iv glRasterPos2iv
-#define qglRasterPos2s glRasterPos2s
-#define qglRasterPos2sv glRasterPos2sv
-#define qglRasterPos3d glRasterPos3d
-#define qglRasterPos3dv glRasterPos3dv
-#define qglRasterPos3f glRasterPos3f
-#define qglRasterPos3fv glRasterPos3fv
-#define qglRasterPos3i glRasterPos3i
-#define qglRasterPos3iv glRasterPos3iv
-#define qglRasterPos3s glRasterPos3s
-#define qglRasterPos3sv glRasterPos3sv
-#define qglRasterPos4d glRasterPos4d
-#define qglRasterPos4dv glRasterPos4dv
-#define qglRasterPos4f glRasterPos4f
-#define qglRasterPos4fv glRasterPos4fv
-#define qglRasterPos4i glRasterPos4i
-#define qglRasterPos4iv glRasterPos4iv
-#define qglRasterPos4s glRasterPos4s
-#define qglRasterPos4sv glRasterPos4sv
-#define qglReadBuffer glReadBuffer
-#define qglReadPixels glReadPixels
-#define qglRectd glRectd
-#define qglRectdv glRectdv
-#define qglRectf glRectf
-#define qglRectfv glRectfv
-#define qglRecti glRecti
-#define qglRectiv glRectiv
-#define qglRects glRects
-#define qglRectsv glRectsv
-#define qglRenderMode glRenderMode
-#define qglRotated glRotated
-#define qglRotatef glRotatef
-#define qglScaled glScaled
-#define qglScalef glScalef
-#define qglScissor glScissor
-#define qglSelectBuffer glSelectBuffer
-#define qglShadeModel glShadeModel
-#define qglStencilFunc glStencilFunc
-#define qglStencilMask glStencilMask
-#define qglStencilOp glStencilOp
-#define qglTexCoord1d glTexCoord1d
-#define qglTexCoord1dv glTexCoord1dv
-#define qglTexCoord1f glTexCoord1f
-#define qglTexCoord1fv glTexCoord1fv
-#define qglTexCoord1i glTexCoord1i
-#define qglTexCoord1iv glTexCoord1iv
-#define qglTexCoord1s glTexCoord1s
-#define qglTexCoord1sv glTexCoord1sv
-#define qglTexCoord2d glTexCoord2d
-#define qglTexCoord2dv glTexCoord2dv
-#define qglTexCoord2f glTexCoord2f
-#define qglTexCoord2fv glTexCoord2fv
-#define qglTexCoord2i glTexCoord2i
-#define qglTexCoord2iv glTexCoord2iv
-#define qglTexCoord2s glTexCoord2s
-#define qglTexCoord2sv glTexCoord2sv
-#define qglTexCoord3d glTexCoord3d
-#define qglTexCoord3dv glTexCoord3dv
-#define qglTexCoord3f glTexCoord3f
-#define qglTexCoord3fv glTexCoord3fv
-#define qglTexCoord3i glTexCoord3i
-#define qglTexCoord3iv glTexCoord3iv
-#define qglTexCoord3s glTexCoord3s
-#define qglTexCoord3sv glTexCoord3sv
-#define qglTexCoord4d glTexCoord4d
-#define qglTexCoord4dv glTexCoord4dv
-#define qglTexCoord4f glTexCoord4f
-#define qglTexCoord4fv glTexCoord4fv
-#define qglTexCoord4i glTexCoord4i
-#define qglTexCoord4iv glTexCoord4iv
-#define qglTexCoord4s glTexCoord4s
-#define qglTexCoord4sv glTexCoord4sv
-#define qglTexCoordPointer glTexCoordPointer
-#define qglTexEnvf glTexEnvf
-#define qglTexEnvfv glTexEnvfv
-#define qglTexEnvi glTexEnvi
-#define qglTexEnviv glTexEnviv
-#define qglTexGend glTexGend
-#define qglTexGendv glTexGendv
-#define qglTexGenf glTexGenf
-#define qglTexGenfv glTexGenfv
-#define qglTexGeni glTexGeni
-#define qglTexGeniv glTexGeniv
-#define qglTexImage1D glTexImage1D
-#ifdef VCMODS_OPENGLES
-#define qglTexImage2D myglTexImage2D
-#else
-#define qglTexImage2D glTexImage2D
+
+#ifndef GL_EXT_framebuffer_sRGB
+#define GL_EXT_framebuffer_sRGB
+#define GL_FRAMEBUFFER_SRGB_EXT                         0x8DB9
+#endif
+
+#ifndef GL_EXT_texture_compression_latc
+#define GL_EXT_texture_compression_latc
+#define GL_COMPRESSED_LUMINANCE_LATC1_EXT                 0x8C70
+#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT          0x8C71
+#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT           0x8C72
+#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT    0x8C73
+#endif
+
+#ifndef GL_ARB_texture_compression_bptc
+#define GL_ARB_texture_compression_bptc
+#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB                 0x8E8C
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB           0x8E8D
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB           0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB         0x8E8F
+#endif
+
+// GL_ARB_draw_buffers
+extern void (APIENTRY * qglDrawBuffersARB)(GLsizei n, const GLenum *bufs);
+#ifndef GL_ARB_draw_buffers
+#define GL_ARB_draw_buffers
+#define GL_MAX_DRAW_BUFFERS_ARB                    0x8824
+#define GL_DRAW_BUFFER0_ARB                        0x8825
+#define GL_DRAW_BUFFER1_ARB                        0x8826
+#define GL_DRAW_BUFFER2_ARB                        0x8827
+#define GL_DRAW_BUFFER3_ARB                        0x8828
+#define GL_DRAW_BUFFER4_ARB                        0x8829
+#define GL_DRAW_BUFFER5_ARB                        0x882A
+#define GL_DRAW_BUFFER6_ARB                        0x882B
+#define GL_DRAW_BUFFER7_ARB                        0x882C
+#define GL_DRAW_BUFFER8_ARB                        0x882D
+#define GL_DRAW_BUFFER9_ARB                        0x882E
+#define GL_DRAW_BUFFER10_ARB                       0x882F
+#define GL_DRAW_BUFFER11_ARB                       0x8830
+#define GL_DRAW_BUFFER12_ARB                       0x8831
+#define GL_DRAW_BUFFER13_ARB                       0x8832
+#define GL_DRAW_BUFFER14_ARB                       0x8833
+#define GL_DRAW_BUFFER15_ARB                       0x8834
+#endif
+
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp
+#define GL_DEPTH_CLAMP				      0x864F
+#endif
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_ARB_seamless_cube_map
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS               0x884F
+#endif
+
+// GL_ARB_vertex_array_object
+extern void (APIENTRY * qglBindVertexArrayARB)(GLuint array);
+extern void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays);
+extern void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays);
+extern GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array);
+#ifndef GL_ARB_vertex_array_object
+#define GL_ARB_vertex_array_object
+#define GL_VERTEX_ARRAY_BINDING_ARB                0x85B5
+#endif
+
+#if defined(WIN32)
+// WGL_ARB_create_context
+#ifndef WGL_ARB_create_context
+#define WGL_CONTEXT_MAJOR_VERSION_ARB             0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB             0x2092
+#define WGL_CONTEXT_LAYER_PLANE_ARB               0x2093
+#define WGL_CONTEXT_FLAGS_ARB                     0x2094
+#define WGL_CONTEXT_PROFILE_MASK_ARB              0x9126
+#define WGL_CONTEXT_DEBUG_BIT_ARB                 0x0001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB    0x0002
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB          0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define ERROR_INVALID_VERSION_ARB                 0x2095
+#define ERROR_INVALID_PROFILE_ARB                 0x2096
+#endif
+
+extern          HGLRC(APIENTRY * qwglCreateContextAttribsARB) (HDC hdC, HGLRC hShareContext, const int *attribList);
 #endif
-#define qglTexParameterf glTexParameterf
-#define qglTexParameterfv glTexParameterfv
-#define qglTexParameteri glTexParameteri
-#define qglTexParameteriv glTexParameteriv
-#define qglTexSubImage1D glTexSubImage1D
-#define qglTexSubImage2D glTexSubImage2D
-#define qglTranslated glTranslated
-#define qglTranslatef glTranslatef
-#define qglVertex2d glVertex2d
-#define qglVertex2dv glVertex2dv
-#define qglVertex2f glVertex2f
-#define qglVertex2fv glVertex2fv
-#define qglVertex2i glVertex2i
-#define qglVertex2iv glVertex2iv
-#define qglVertex2s glVertex2s
-#define qglVertex2sv glVertex2sv
-#define qglVertex3d glVertex3d
-#define qglVertex3dv glVertex3dv
-#define qglVertex3f glVertex3f
-#define qglVertex3fv glVertex3fv
-#define qglVertex3i glVertex3i
-#define qglVertex3iv glVertex3iv
-#define qglVertex3s glVertex3s
-#define qglVertex3sv glVertex3sv
-#define qglVertex4d glVertex4d
-#define qglVertex4dv glVertex4dv
-#define qglVertex4f glVertex4f
-#define qglVertex4fv glVertex4fv
-#define qglVertex4i glVertex4i
-#define qglVertex4iv glVertex4iv
-#define qglVertex4s glVertex4s
-#define qglVertex4sv glVertex4sv
-#define qglVertexPointer glVertexPointer
-#define qglViewport glViewport
 
+#if 0 //defined(__linux__)
+// GLX_ARB_create_context
+#ifndef GLX_ARB_create_context
+#define GLX_CONTEXT_DEBUG_BIT_ARB          0x00000001
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_MAJOR_VERSION_ARB      0x2091
+#define GLX_CONTEXT_MINOR_VERSION_ARB      0x2092
+#define GLX_CONTEXT_FLAGS_ARB              0x2094
 #endif
 
-#ifdef VCMODS_OPENGLES
-#define GL_BACK_LEFT 0x402
-#define GL_BACK_RIGHT 0x403
+extern GLXContext	(APIENTRY * qglXCreateContextAttribsARB) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
 #endif
 
+#endif // USE_OPENGLES
+
+#endif // __QGL_H__
diff --git a/SP/code/renderer/tr_animation.c b/SP/code/renderer/tr_animation.c
index 91c3cd9..d1c2ef8 100644
--- a/SP/code/renderer/tr_animation.c
+++ b/SP/code/renderer/tr_animation.c
@@ -50,7 +50,7 @@ frame.
 static float frontlerp, backlerp;
 static float torsoFrontlerp, torsoBacklerp;
 static int *triangles, *pIndexes;
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 static int *boneRefs;
 #endif
 static int indexes;
@@ -1049,7 +1049,7 @@ RB_SurfaceAnim
 ==============
 */
 void RB_SurfaceAnim( mdsSurface_t *surface ) {
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	int i;
 #endif
 	int j, k;
@@ -1206,7 +1206,7 @@ void RB_SurfaceAnim( mdsSurface_t *surface ) {
 
 	DBG_SHOWTIME
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( r_bonesDebug->integer ) {
 		if ( r_bonesDebug->integer < 3 ) {
 			// DEBUG: show the bones as a stick figure with axis at each bone
diff --git a/SP/code/renderer/tr_backend.c b/SP/code/renderer/tr_backend.c
index a9ecbf2..0acb453 100644
--- a/SP/code/renderer/tr_backend.c
+++ b/SP/code/renderer/tr_backend.c
@@ -78,30 +78,14 @@ void GL_SelectTexture( int unit ) {
 	}
 
 	if ( unit == 0 ) {
-#ifdef VCMODS_OPENGLES
-		qglActiveTextureARB( GL_TEXTURE0);
-#else
 		qglActiveTextureARB( GL_TEXTURE0_ARB );
-#endif
 		GLimp_LogComment( "glActiveTextureARB( GL_TEXTURE0_ARB )\n" );
-#ifdef VCMODS_OPENGLES
-		qglClientActiveTextureARB( GL_TEXTURE0 );
-#else
 		qglClientActiveTextureARB( GL_TEXTURE0_ARB );
-#endif
 		GLimp_LogComment( "glClientActiveTextureARB( GL_TEXTURE0_ARB )\n" );
 	} else if ( unit == 1 )   {
-#ifdef VCMODS_OPENGLES
-		qglActiveTextureARB( GL_TEXTURE1);
-#else
 		qglActiveTextureARB( GL_TEXTURE1_ARB );
-#endif
 		GLimp_LogComment( "glActiveTextureARB( GL_TEXTURE1_ARB )\n" );
-#ifdef VCMODS_OPENGLES
-		qglClientActiveTextureARB( GL_TEXTURE1);
-#else
 		qglClientActiveTextureARB( GL_TEXTURE1_ARB );
-#endif
 		GLimp_LogComment( "glClientActiveTextureARB( GL_TEXTURE1_ARB )\n" );
 	} else {
 		ri.Error( ERR_DROP, "GL_SelectTexture: unit = %i", unit );
@@ -320,7 +304,7 @@ void GL_State( unsigned long stateBits ) {
 	// fill/line mode
 	//
 	if ( diff & GLS_POLYMODE_LINE ) {
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 		if ( stateBits & GLS_POLYMODE_LINE ) {
 			qglPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
 		} else
@@ -534,11 +518,7 @@ void RB_BeginDrawingView( void ) {
 
 
 	if ( clearBits ) {
-#ifdef VCMODS_DEPTH
-		qglClear( clearBits | GL_COLOR_BUFFER_BIT);
-#else
 		qglClear( clearBits );
-#endif
 	}
 
 //----(SA)	done
@@ -559,11 +539,7 @@ void RB_BeginDrawingView( void ) {
 	// clip to the plane of the portal
 	if ( backEnd.viewParms.isPortal ) {
 		float plane[4];
-#ifdef VCMODS_OPENGLES
-		float	plane2[4];
-#else
 		GLdouble plane2[4];
-#endif
 
 		plane[0] = backEnd.viewParms.portalPlane.normal[0];
 		plane[1] = backEnd.viewParms.portalPlane.normal[1];
@@ -1042,11 +1018,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
 					}
 
 					if(!oldDepthRange)
-#ifdef VCMODS_OPENGLES
-						qglDepthRange (0, 0.3f);
-#else
 						qglDepthRange (0, 0.3);
-#endif
 				}
 				else
 				{
@@ -1056,11 +1028,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
 						qglLoadMatrixf(backEnd.viewParms.projectionMatrix);
 						qglMatrixMode(GL_MODELVIEW);
 					}
-#ifdef VCMODS_OPENGLES
-					qglDepthRange (0, 1.0f);
-#else
 					qglDepthRange( 0, 1 );
-#endif
 				}
 
 				oldDepthRange = depthRange;
@@ -1103,11 +1071,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
 
 	qglLoadMatrixf( backEnd.viewParms.world.modelMatrix );
 	if ( depthRange ) {
-#ifdef VCMODS_OPENGLES
-		qglDepthRange (0, 1.0f);
-#else
 		qglDepthRange( 0, 1 );
-#endif
 	}
 
 	if (r_drawSun->integer) {
@@ -1144,11 +1108,7 @@ void    RB_SetGL2D( void ) {
 	qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight );
 	qglMatrixMode( GL_PROJECTION );
 	qglLoadIdentity();
-#ifdef VCMODS_OPENGLES
-	qglOrtho (0.0f, glConfig.vidWidth, glConfig.vidHeight, 0.0f, 0.0f, 1.0f);
-#else
 	qglOrtho( 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1 );
-#endif
 	qglMatrixMode( GL_MODELVIEW );
 	qglLoadIdentity();
 
@@ -1179,11 +1139,6 @@ Used for cinematics.
 void RE_StretchRaw( int x, int y, int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty ) {
 	int i, j;
 	int start, end;
-#ifdef VCMODS_OPENGLES
-	vec2_t		texcoords[4];
-	vec2_t		verts[4];
-	glIndex_t	indicies[6] = {0, 1, 2, 0, 3, 2};
-#endif
 
 	if ( !tr.registered ) {
 		return;
@@ -1217,10 +1172,8 @@ void RE_StretchRaw( int x, int y, int w, int h, int cols, int rows, const byte *
 	if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
 		tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
 		tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
-#ifdef VCMODS_OPENGLES
-      //don't do qglTexImage2D as this may end up doing a compressed image
-      //on which we are not allowed to do further sub images
-		glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
+#ifdef USE_OPENGLES
+		qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
 #else
 		qglTexImage2D( GL_TEXTURE_2D, 0, 3, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
 #endif
@@ -1243,27 +1196,33 @@ void RE_StretchRaw( int x, int y, int w, int h, int cols, int rows, const byte *
 
 	RB_SetGL2D();
 
-#ifdef VCMODS_OPENGLES
-	qglColor4f( tr.identityLight, tr.identityLight, tr.identityLight, 1.0f );
-
-	verts[0][0] = x;  verts[0][1] = y;
-	verts[1][0] = x+w;  verts[1][1] = y;
-	verts[2][0] = x+w;  verts[2][1] = y+h;
-	verts[3][0] = x;  verts[3][1] = y+h;
-	
-	texcoords[0][0] = 0.5f/cols;      texcoords[0][1] = 0.5f/rows;
-	texcoords[1][0] = (cols-0.5f)/cols;   texcoords[1][1] = 0.5f/rows;
-	texcoords[2][0] = (cols-0.5f)/cols;   texcoords[2][1] = (rows-0.5f)/rows;
-	texcoords[3][0] = 0.5f/cols;      texcoords[3][1] = (rows-0.5f)/rows;
-	
-	qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
-	qglTexCoordPointer( 2, GL_FLOAT, 0, texcoords );
-	qglVertexPointer  ( 2, GL_FLOAT, 0, verts );
-	qglDrawElements( GL_TRIANGLE_STRIP, 6, GL_INDEX_TYPE, indicies );
-	qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
-#else
 	qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
 
+#ifdef USE_OPENGLES
+	GLfloat tex[] = {
+	 0.5f / cols,  0.5f / rows,
+	 ( cols - 0.5f ) / cols ,  0.5f / rows,
+	 ( cols - 0.5f ) / cols, ( rows - 0.5f ) / rows,
+	 0.5f / cols, ( rows - 0.5f ) / rows };
+	GLfloat vtx[] = {
+	 x, y,
+	 x+w, y,
+	 x+w, y+h,
+	 x, y+h };
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (glcol)
+		qglDisableClientState(GL_COLOR_ARRAY);
+	if (!text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+	qglTexCoordPointer( 2, GL_FLOAT, 0, tex );
+	qglVertexPointer  ( 2, GL_FLOAT, 0, vtx );
+	qglDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
+	if (!text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (glcol)
+		qglEnableClientState(GL_COLOR_ARRAY);
+#else
 	qglBegin( GL_QUADS );
 	qglTexCoord2f( 0.5f / cols,  0.5f / rows );
 	qglVertex2f( x, y );
@@ -1286,7 +1245,7 @@ void RE_UploadCinematic( int w, int h, int cols, int rows, const byte *data, int
 	if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
 		tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
 		tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
-#ifdef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
 		qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
 #else
 		qglTexImage2D( GL_TEXTURE_2D, 0, 3, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
@@ -1521,7 +1480,9 @@ const void  *RB_DrawBuffer( const void *data ) {
 
 	cmd = (const drawBufferCommand_t *)data;
 
+#ifndef USE_OPENGLES
 	qglDrawBuffer( cmd->buffer );
+#endif
 
 	// clear screen for debugging
 	if ( r_clear->integer ) {
@@ -1547,11 +1508,6 @@ void RB_ShowImages( void ) {
 	image_t *image;
 	float x, y, w, h;
 	int start, end;
-#ifdef VCMODS_OPENGLES
-	vec2_t  texcoords[4] = { {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} };
-	vec2_t  verts[4];
-	glIndex_t indicies[6] = { 0, 1, 2, 0, 3, 2};
-#endif
 
 	if ( !backEnd.projection2D ) {
 		RB_SetGL2D();
@@ -1564,10 +1520,6 @@ void RB_ShowImages( void ) {
 
 	start = ri.Milliseconds();
 
-#ifdef VCMODS_OPENGLES
-	qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
-#endif
-
 	for ( i = 0 ; i < tr.numImages ; i++ ) {
 		image = tr.images[i];
 
@@ -1583,15 +1535,30 @@ void RB_ShowImages( void ) {
 			h *= image->uploadHeight / 512.0f;
 		}
 
-#ifdef VCMODS_OPENGLES
-		verts[0][0] = x;  verts[0][1] = y;
-		verts[1][0] = x+w;  verts[1][1] = y;
-		verts[2][0] = x+w;  verts[2][1] = y+h;
-		verts[3][0] = x;  verts[3][1] = y+h;
-		
-		qglTexCoordPointer( 2, GL_FLOAT, 0, texcoords );
-		qglVertexPointer  ( 2, GL_FLOAT, 0, verts );
-		qglDrawElements( GL_TRIANGLE_STRIP, 6, GL_INDEX_TYPE, indicies );
+#ifdef USE_OPENGLES
+		GLfloat tex[] = {
+		 0, 0, 
+		 1, 0,
+		 1, 1, 
+		 0, 1 };
+		GLfloat vtx[] = {
+		 x, y,
+		 x + w, y,
+		 x + w, y + h,
+		 x, y + h };
+		GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+		GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+		if (glcol)
+			qglDisableClientState(GL_COLOR_ARRAY);
+		if (!text)
+			qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+		qglTexCoordPointer( 2, GL_FLOAT, 0, tex );
+		qglVertexPointer  ( 2, GL_FLOAT, 0, vtx );
+		qglDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
+		if (glcol)
+			qglEnableClientState(GL_COLOR_ARRAY);
+		if (!text)
+			qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
 #else
 		GL_Bind( image );
 		qglBegin( GL_QUADS );
@@ -1607,10 +1574,6 @@ void RB_ShowImages( void ) {
 #endif
 	}
 
-#ifdef VCMODS_OPENGLES
-	qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
-#endif
-
 	qglFinish();
 
 	end = ri.Milliseconds();
@@ -1678,15 +1641,14 @@ const void  *RB_SwapBuffers( const void *data ) {
 
 	// we measure overdraw by reading back the stencil buffer and
 	// counting up the number of increments that have happened
+#ifndef USE_OPENGLES
 	if ( r_measureOverdraw->integer ) {
 		int i;
 		long sum = 0;
 		unsigned char *stencilReadback;
 
 		stencilReadback = ri.Hunk_AllocateTempMemory( glConfig.vidWidth * glConfig.vidHeight );
-#ifndef VCMODS_OPENGLES
 		qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilReadback );
-#endif
 
 		for ( i = 0; i < glConfig.vidWidth * glConfig.vidHeight; i++ ) {
 			sum += stencilReadback[i];
@@ -1695,12 +1657,11 @@ const void  *RB_SwapBuffers( const void *data ) {
 		backEnd.pc.c_overDraw += sum;
 		ri.Hunk_FreeTempMemory( stencilReadback );
 	}
+#endif
 
 
 	if ( !glState.finishCalled ) {
-#ifndef VCMODS_OPENGLES
 		qglFinish();
-#endif
 	}
 
 	GLimp_LogComment( "***************** RB_SwapBuffers *****************\n\n\n" );
diff --git a/SP/code/renderer/tr_bloom.c b/SP/code/renderer/tr_bloom.c
index a924f42..b285c78 100644
--- a/SP/code/renderer/tr_bloom.c
+++ b/SP/code/renderer/tr_bloom.c
@@ -99,6 +99,31 @@ static void ID_INLINE R_Bloom_Quad( int width, int height, float texX, float tex
 	texWidth += texX;
 	texHeight += texY;
 
+#ifdef USE_OPENGLES
+	GLfloat tex[] = {
+	 texX, texHeight,
+	 texX, texY,
+	 texWidth, texY,
+	 texWidth, texHeight };
+	GLfloat vtx[] = {
+	 x, y,
+	 x, height,
+	 width, height,
+	 width, y };
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (glcol)
+		qglDisableClientState(GL_COLOR_ARRAY);
+	if (!text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+	qglTexCoordPointer( 2, GL_FLOAT, 0, tex );
+	qglVertexPointer  ( 2, GL_FLOAT, 0, vtx );
+	qglDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
+	if (!text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (glcol)
+		qglEnableClientState(GL_COLOR_ARRAY);
+#else
 	qglBegin( GL_QUADS );							
 	qglTexCoord2f(	texX,						texHeight	);	
 	qglVertex2f(	x,							y	);
@@ -112,6 +137,7 @@ static void ID_INLINE R_Bloom_Quad( int width, int height, float texX, float tex
 	qglTexCoord2f(	texWidth,					texHeight	);	
 	qglVertex2f(	width,						y	);				
 	qglEnd ();
+#endif
 }
 
 
diff --git a/SP/code/renderer/tr_cmds.c b/SP/code/renderer/tr_cmds.c
index bcbcdf3..9b65950 100644
--- a/SP/code/renderer/tr_cmds.c
+++ b/SP/code/renderer/tr_cmds.c
@@ -316,7 +316,9 @@ for each RE_EndFrame
 */
 void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 	drawBufferCommand_t *cmd = NULL;
+#ifndef USE_OPENGLES
 	colorMaskCommand_t *colcmd = NULL;
+#endif
 
 	if ( !tr.registered ) {
 		return;
@@ -329,6 +331,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 	//
 	// do overdraw measurement
 	//
+#ifndef USE_OPENGLES
 	if ( r_measureOverdraw->integer ) {
 		if ( glConfig.stencilBits < 4 ) {
 			ri.Printf( PRINT_ALL, "Warning: not enough stencil bits to measure overdraw: %d\n", glConfig.stencilBits );
@@ -357,6 +360,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 		}
 		r_measureOverdraw->modified = qfalse;
 	}
+#endif
 
 	//
 	// texturemode stuff
@@ -371,7 +375,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 	// ATI stuff
 	//
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	// TRUFORM
 	if ( qglPNTrianglesiATI ) {
 
@@ -420,13 +424,11 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 			qglPNTrianglesiATI( GL_PN_TRIANGLES_NORMAL_MODE_ATI, glConfig.ATINormalMode );
 		}
 	}
-#endif
 
 	//
 	// NVidia stuff
 	//
 
-#ifndef VCMODS_OPENGLES
 	// fog control
 	if ( glConfig.NVFogAvailable && r_nv_fogdist_mode->modified ) {
 		r_nv_fogdist_mode->modified = qfalse;
@@ -464,6 +466,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 		}
 	}
 
+#ifndef USE_OPENGLES
 	if (glConfig.stereoEnabled) {
 		if( !(cmd = R_GetCommandBuffer(sizeof(*cmd))) )
 			return;
@@ -522,6 +525,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 			colcmd->commandId = RC_COLORMASK;
 		}
 		else
+#endif
 		{
 			if(stereoFrame != STEREO_CENTER)
 				ri.Error( ERR_FATAL, "RE_BeginFrame: Stereo is disabled, but stereoFrame was %i", stereoFrame );
@@ -534,6 +538,7 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 		{
 			cmd->commandId = RC_DRAW_BUFFER;
 
+#ifndef USE_OPENGLES
 			if(r_anaglyphMode->modified)
 			{
 				qglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
@@ -543,9 +548,12 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
 			if (!Q_stricmp(r_drawBuffer->string, "GL_FRONT"))
 				cmd->buffer = (int)GL_FRONT;
 			else
+#endif
 				cmd->buffer = (int)GL_BACK;
 		}
+#ifndef USE_OPENGLES
 	}
+#endif
 
 	tr.refdef.stereoFrame = stereoFrame;
 }
diff --git a/SP/code/renderer/tr_image.c b/SP/code/renderer/tr_image.c
index e7ca321..707c688 100644
--- a/SP/code/renderer/tr_image.c
+++ b/SP/code/renderer/tr_image.c
@@ -181,26 +181,7 @@ void R_ImageList_f( void ) {
 
 		switch(image->internalFormat)
 		{
-#ifdef VCMODS_OPENGLES
-			case 1:
-				ri.Printf( PRINT_ALL, "I    " );
-				break;
-			case 2:
-				ri.Printf( PRINT_ALL, "IA   " );
-				break;
-			case 3:
-				ri.Printf( PRINT_ALL, "RGB  " );
-				// 3 bytes per pixel?
-				estSize *= 3;
-				break;
-			case 4:
-				ri.Printf( PRINT_ALL, "RGBA " );
-				// 4 bytes per pixel
-				estSize *= 4;
-				break;
-			default:
-				ri.Printf( PRINT_ALL, "???? " );
-#else
+#ifndef USE_OPENGLES
 			case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
 				format = "sDXT1";
 				// 64 bits per 16 pixels, so 4 bits per pixel
@@ -236,33 +217,43 @@ void R_ImageList_f( void ) {
 				// same as DXT1?
 				estSize /= 2;
 				break;
+#endif
 			case GL_RGBA4:
+#ifndef USE_OPENGLES
 			case GL_RGBA8:
+#endif
 			case GL_RGBA:
 				format = "RGBA ";
 				// 4 bytes per pixel
 				estSize *= 4;
 				break;
+#ifndef USE_OPENGLES
 			case GL_LUMINANCE8:
 			case GL_LUMINANCE16:
+#endif
 			case GL_LUMINANCE:
 				format = "L    ";
 				// 1 byte per pixel?
 				break;
 			case GL_RGB5:
+#ifndef USE_OPENGLES
 			case GL_RGB8:
+#endif
 			case GL_RGB:
 				format = "RGB  ";
 				// 3 bytes per pixel?
 				estSize *= 3;
 				break;
+#ifndef USE_OPENGLES
 			case GL_LUMINANCE8_ALPHA8:
 			case GL_LUMINANCE16_ALPHA16:
+#endif
 			case GL_LUMINANCE_ALPHA:
 				format = "LA   ";
 				// 2 bytes per pixel?
 				estSize *= 2;
 				break;
+#ifndef USE_OPENGLES
 			case GL_SRGB_EXT:
 			case GL_SRGB8_EXT:
 				format = "sRGB ";
@@ -586,6 +577,7 @@ R_BlendOverTexture
 Apply a color blend over a set of pixels
 ==================
 */
+#ifndef USE_OPENGLES
 static void R_BlendOverTexture( byte *data, int pixelCount, byte blend[4] ) {
 	int i;
 	int inverseAlpha;
@@ -602,6 +594,7 @@ static void R_BlendOverTexture( byte *data, int pixelCount, byte blend[4] ) {
 		data[2] = ( data[2] * inverseAlpha + premult[2] ) >> 9;
 	}
 }
+#endif
 
 byte mipBlendColors[16][4] = {
 	{0,0,0,0},
@@ -623,6 +616,109 @@ byte mipBlendColors[16][4] = {
 };
 
 
+#ifdef USE_OPENGLES
+// helper function for GLES format conversions
+byte * gles_convertRGB(byte * data, int width, int height)
+{
+	byte * temp = (byte *) ri.Z_Malloc (width*height*3);
+	byte *src = data;
+	byte *dst = temp;
+	int i,j;
+	
+	for (i=0; i<width*height; i++) {
+		for (j=0; j<3; j++)
+			*(dst++) = *(src++);
+		src++;
+	}
+	
+	return temp;
+}
+byte *  gles_convertRGBA4(byte * data, int width, int height)
+{
+	byte * temp = (byte *) ri.Z_Malloc (width*height*2);
+	int i;
+	
+	unsigned int * input = ( unsigned int *)(data);
+	unsigned short* output = (unsigned short*)(temp);
+
+	for (i = 0; i < width*height; i++) {
+		unsigned int pixel = input[i];
+
+		// Unpack the source data as 8 bit values
+		unsigned int r = pixel & 0xff;
+		unsigned int g = (pixel >> 8) & 0xff;
+		unsigned int b = (pixel >> 16) & 0xff;
+		unsigned int a = (pixel >> 24) & 0xff;
+
+		// Convert to 4 bit vales
+		r >>= 4; g >>= 4; b >>= 4; a >>= 4;
+		output[i] = r << 12 | g << 8 | b << 4 | a;
+	}
+
+	return temp;
+}
+byte * gles_convertRGB5(byte * data, int width, int height)
+{
+	byte * temp = (byte *) ri.Z_Malloc (width*height*2);
+	int i;
+	
+	unsigned int * input = ( unsigned int *)(data);
+	unsigned short* output = (unsigned short*)(temp);
+
+	for (i = 0; i < width*height; i++) {
+		unsigned int pixel = input[i];
+
+		// Unpack the source data as 8 bit values
+		unsigned int r = pixel & 0xff;
+		unsigned int g = (pixel >> 8) & 0xff;
+		unsigned int b = (pixel >> 16) & 0xff;
+
+		// Convert to 4 bit vales
+		r >>= 3; g >>= 2; b >>= 3; 
+		output[i] = r << 11 | g << 5 | b;
+	}
+
+	return temp;
+}
+byte * gles_convertLuminance(byte * data, int width, int height)
+{
+	byte * temp = (byte *) ri.Z_Malloc (width*height);
+	int i;
+	
+	unsigned int * input = ( unsigned int *)(data);
+	byte* output = (byte*)(temp);
+
+	for (i = 0; i < width*height; i++) {
+		unsigned int pixel = input[i];
+
+		// Unpack the source data as 8 bit values
+		unsigned int r = pixel & 0xff;
+		output[i] = r;
+	}
+
+	return temp;
+}
+byte * gles_convertLuminanceAlpha(byte * data, int width, int height)
+{
+	byte * temp = (byte *) ri.Z_Malloc (width*height*2);
+	int i;
+	
+	unsigned int * input = ( unsigned int *)(data);
+	unsigned short* output = (unsigned short*)(temp);
+
+	for (i = 0; i < width*height; i++) {
+		unsigned int pixel = input[i];
+
+		// Unpack the source data as 8 bit values
+		unsigned int r = pixel & 0xff;
+		unsigned int a = (pixel >> 24) & 0xff;
+		output[i] = r | a<<8;
+	}
+
+	return temp;
+}
+#endif
+
 /*
 ===============
 Upload32
@@ -820,9 +916,7 @@ static void Upload32(   unsigned *data,
 
 			if(r_greyscale->integer)
 			{
-#ifdef VCMODS_OPENGLES
-				assert(r_texturebits->integer != 16 && r_texturebits->integer != 32);
-#else
+#ifndef USE_OPENGLES
 				if(r_texturebits->integer == 16)
 					internalFormat = GL_LUMINANCE8;
 				else if(r_texturebits->integer == 32)
@@ -833,32 +927,28 @@ static void Upload32(   unsigned *data,
 			}
 			else
 			{
-				if ( !noCompress && glConfig.textureCompression == TC_EXT_COMP_S3TC ) {
-#ifdef VCMODS_OPENGLES
-					assert(0);
-#else
+#ifndef USE_OPENGLES
+				if ( !noCompress && glConfig.textureCompression == TC_EXT_COMP_S3TC )
+				{
 					// TODO: which format is best for which textures?
 					internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
-#endif
-				} else if ( !noCompress && glConfig.textureCompression == TC_S3TC )   {
-#ifdef VCMODS_OPENGLES
-					assert(0);
-#else
+				}
+				else if ( !noCompress && glConfig.textureCompression == TC_S3TC )
+				{
 					internalFormat = GL_RGB4_S3TC;
+				}
+				else
 #endif
-				} else if ( r_texturebits->integer == 16 )   {
-#ifdef VCMODS_OPENGLES
-					assert(0);
-#else
+				if ( r_texturebits->integer == 16 )
+				{
 					internalFormat = GL_RGB5;
-#endif
-				} else if ( r_texturebits->integer == 32 )   {
-#ifdef VCMODS_OPENGLES
-					assert(0);
-#else
+				}
+#ifndef USE_OPENGLES
+				else if ( r_texturebits->integer == 32 )
+				{
 					internalFormat = GL_RGB8;
-#endif
 				}
+#endif
 				else
 				{
 					internalFormat = GL_RGB;
@@ -870,9 +960,7 @@ static void Upload32(   unsigned *data,
 
 			if(r_greyscale->integer)
 			{
-#ifdef VCMODS_OPENGLES
-				assert(r_texturebits->integer != 16 && r_texturebits->integer != 32);
-#else
+#ifndef USE_OPENGLES
 				if(r_texturebits->integer == 16)
 					internalFormat = GL_LUMINANCE8_ALPHA8;
 				else if(r_texturebits->integer == 32)
@@ -883,26 +971,24 @@ static void Upload32(   unsigned *data,
 			}
 			else
 			{
-				if ( !noCompress && glConfig.textureCompression == TC_EXT_COMP_S3TC ) {
-#ifdef VCMODS_OPENGLES
-					assert(0);
-#else
+#ifndef USE_OPENGLES
+				if ( !noCompress && glConfig.textureCompression == TC_EXT_COMP_S3TC )
+				{
 					// TODO: which format is best for which textures?
 					internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
+				}
+				else
 #endif
-				} else if ( r_texturebits->integer == 16 )   {
-#ifdef VCMODS_OPENGLES
-					assert(0);
-#else
+				if ( r_texturebits->integer == 16 )
+				{
 					internalFormat = GL_RGBA4;
-#endif
-				} else if ( r_texturebits->integer == 32 )   {
-#ifdef VCMODS_OPENGLES
-					internalFormat = GL_RGBA;
-#else
+				}
+#ifndef USE_OPENGLES
+				else if ( r_texturebits->integer == 32 )
+				{
 					internalFormat = GL_RGBA8;
-#endif
 				}
+#endif
 				else
 				{
 					internalFormat = GL_RGBA;
@@ -912,6 +998,72 @@ static void Upload32(   unsigned *data,
 	}
 
 	// copy or resample data as appropriate for first MIP level
+#ifdef USE_OPENGLES
+		if ( ( scaled_width == width ) && 
+			( scaled_height == height ) ) {
+			Com_Memcpy (scaledBuffer, data, width*height*4);
+		}
+		else
+		{
+			// use the normal mip-mapping function to go down from here
+			while ( width > scaled_width || height > scaled_height ) {
+				R_MipMap( (byte *)data, width, height );
+				width >>= 1;
+				height >>= 1;
+				if ( width < 1 ) {
+					width = 1;
+				}
+				if ( height < 1 ) {
+					height = 1;
+				}
+			}
+			Com_Memcpy( scaledBuffer, data, width * height * 4 );
+		}
+		R_LightScaleTexture (scaledBuffer, scaled_width, scaled_height, !mipmap );
+
+		glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, (mipmap)?GL_TRUE:GL_FALSE );
+
+		// and now, convert if needed and upload
+		// GLES doesn't do convertion itself, so we have to handle that
+		byte *temp;
+		switch ( internalFormat ) {
+		 case GL_RGB5:
+			temp = gles_convertRGB5((byte*)scaledBuffer, scaled_width, scaled_height);
+			qglTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, scaled_width, scaled_height, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, temp);
+			ri.Free(temp);
+			break;
+		 case GL_RGBA4:
+			temp = gles_convertRGBA4((byte*)scaledBuffer, width, height);
+			qglTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, temp);
+			ri.Free(temp);
+			break;
+		 case GL_RGB:
+			temp = gles_convertRGB((byte*)scaledBuffer, width, height);
+			qglTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, scaled_width, scaled_height, 0, GL_RGB, GL_UNSIGNED_BYTE, temp);
+			ri.Free(temp);
+			break;
+		 case GL_LUMINANCE:
+			temp = gles_convertLuminance((byte*)scaledBuffer, width, height);
+			qglTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, scaled_width, scaled_height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, temp);
+			ri.Free(temp);
+			break;
+		 case GL_LUMINANCE_ALPHA:
+			temp = gles_convertLuminanceAlpha((byte*)scaledBuffer, width, height);
+			qglTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, scaled_width, scaled_height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, temp);
+			ri.Free(temp);
+			break;
+		 default:
+			internalFormat = GL_RGBA;
+			qglTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, scaledBuffer);
+		}
+
+	*pUploadWidth = scaled_width;
+	*pUploadHeight = scaled_height;
+	*format = internalFormat;
+		
+	//	qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+	//	qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+#else
 	if ( ( scaled_width == width ) &&
 		 ( scaled_height == height ) ) {
 		if ( !mipmap ) {
@@ -974,22 +1126,19 @@ static void Upload32(   unsigned *data,
 		}
 	}
 done:
+#endif
 
 	if ( mipmap ) {
-#ifndef VCMODS_OPENGLES
 		if ( textureFilterAnisotropic )
 			qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
 					(GLint)Com_Clamp( 1, maxAnisotropy, r_ext_max_anisotropy->integer ) );
-#endif
 		qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min );
 		qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max );
 	}
 	else
 	{
-#ifndef VCMODS_OPENGLES
 		if ( textureFilterAnisotropic )
 			qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1 );
-#endif
 		qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
 		qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
 	}
diff --git a/SP/code/renderer/tr_init.c b/SP/code/renderer/tr_init.c
index 6f34ff6..e140796 100644
--- a/SP/code/renderer/tr_init.c
+++ b/SP/code/renderer/tr_init.c
@@ -213,11 +213,9 @@ int max_polys;
 cvar_t  *r_maxpolyverts;
 int max_polyverts;
 
-#ifndef VCMODS_OPENGLES
 //----(SA)	added
 void ( APIENTRY * qglPNTrianglesiATI )( GLenum pname, GLint param );
 void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
-#endif
 /*
 The tessellation level and normal generation mode are specified with:
 
@@ -465,9 +463,25 @@ byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *pa
 	// Allocate a few more bytes so that we can choose an alignment we like
 	buffer = ri.Hunk_AllocateTempMemory(padwidth * height + *offset + packAlign - 1);
 	
+#ifdef USE_OPENGLES
+	bufstart=buffer;
+	padwidth=linelen;
+	int p2width=1, p2height=1;
+	int xx, yy, aa;
+	while (p2width<glConfig.vidWidth) p2width*=2;
+	while (p2height<glConfig.vidHeight) p2height*=2;
+	byte *source = (byte*) ri.Z_Malloc( p2width * p2height * 4 );
+	qglReadPixels( 0, 0, p2width, p2height, GL_RGBA, GL_UNSIGNED_BYTE, source );
+	for (yy=y; yy<height; yy++)
+		for (xx=x; xx<width; xx++)
+			for (aa=0; aa<3; aa++)
+				buffer[yy*width*3+xx*3+aa]=source[(yy+y)*p2width*4+(xx+x)*4+aa];
+	ri.Free(source);
+#else
 	bufstart = PADP((intptr_t) buffer + *offset, packAlign);
 	qglReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, bufstart);
-	
+#endif	
+
 	*offset = bufstart - buffer;
 	*padlen = padwidth - linelen;
 	
@@ -949,7 +963,10 @@ void GL_SetDefaultState( void ) {
 	//
 	glState.glStateBits = GLS_DEPTHTEST_DISABLE | GLS_DEPTHMASK_TRUE;
 
-#ifndef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
+	glPixelStorei(GL_PACK_ALIGNMENT, 1);
+	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+#else
 	qglPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
 #endif
 	qglDepthMask( GL_TRUE );
@@ -958,7 +975,7 @@ void GL_SetDefaultState( void ) {
 	qglDisable( GL_CULL_FACE );
 	qglDisable( GL_BLEND );
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 //----(SA)	added.
 	// ATI pn_triangles
 	if ( qglPNTrianglesiATI ) {
@@ -984,7 +1001,6 @@ void GL_SetDefaultState( void ) {
 		// set when rendering
 //	   qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, glConfig.maxAnisotropy);
 	}
-
 //----(SA)	end
 #endif
 }
@@ -1085,7 +1101,6 @@ void GfxInfo_f( void ) {
 	ri.Printf( PRINT_ALL, "texenv add: %s\n", enablestrings[glConfig.textureEnvAddAvailable != 0] );
 	ri.Printf( PRINT_ALL, "compressed textures: %s\n", enablestrings[glConfig.textureCompression != TC_NONE] );
 
-#ifndef VCMODS_OPENGLES
 	ri.Printf( PRINT_ALL, "ATI truform: %s\n", enablestrings[qglPNTrianglesiATI != 0] );
 	if ( qglPNTrianglesiATI ) {
 //DAJ bogus at this point		ri.Printf( PRINT_ALL, "MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI: %d\n", glConfig.ATIMaxTruformTess );
@@ -1093,7 +1108,6 @@ void GfxInfo_f( void ) {
 		ri.Printf( PRINT_ALL, "Truform Point Mode: %s\n", r_ati_truform_pointmode->string );
 		ri.Printf( PRINT_ALL, "Truform Normal Mode: %s\n", r_ati_truform_normalmode->string );
 	}
-#endif
 
 	ri.Printf( PRINT_ALL, "NV distance fog: %s\n", enablestrings[glConfig.NVFogAvailable != 0] );
 	if ( glConfig.NVFogAvailable ) {
@@ -1262,11 +1276,7 @@ void R_Register( void ) {
 	r_bonesDebug = ri.Cvar_Get( "r_bonesDebug", "0", CVAR_CHEAT );
 
 	// Rafael - wolf fog
-#ifdef VCMODS_OPENGLES
-	r_wolffog = ri.Cvar_Get( "r_wolffog", "0", CVAR_CHEAT ); // JPW NERVE cheat protected per id request
-#else
 	r_wolffog = ri.Cvar_Get( "r_wolffog", "1", 0 );
-#endif
 	// done
 
 	r_nocurves = ri.Cvar_Get( "r_nocurves", "0", CVAR_CHEAT );
diff --git a/SP/code/renderer/tr_local.h b/SP/code/renderer/tr_local.h
index c263f44..1e8c068 100644
--- a/SP/code/renderer/tr_local.h
+++ b/SP/code/renderer/tr_local.h
@@ -38,7 +38,14 @@ If you have questions concerning this license or the applicable additional terms
 #include "qgl.h"
 #include "iqm.h"
 
-#ifdef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
+#ifdef USE_LOCAL_HEADERS
+#	include "GLES/glext.h"
+#else
+#	include <GLES/glext.h>
+#endif
+#define GL_RGBA4				0x8056
+#define GL_RGB5					0x8050
 #define GL_INDEX_TYPE		GL_UNSIGNED_SHORT
 typedef unsigned short glIndex_t;
 #else
diff --git a/SP/code/renderer/tr_main.c b/SP/code/renderer/tr_main.c
index 09ca893..6548c7a 100644
--- a/SP/code/renderer/tr_main.c
+++ b/SP/code/renderer/tr_main.c
@@ -93,11 +93,7 @@ void R_Fog( glfog_t *curfog ) {
 
 	R_FogOn();
 
-#ifdef VCMODS_OPENGLES
-	qglFogf( GL_FOG_MODE, curfog->mode );
-#else
 	qglFogi( GL_FOG_MODE, curfog->mode );
-#endif
 	qglFogfv( GL_FOG_COLOR, curfog->color );
 	qglFogf( GL_FOG_DENSITY, curfog->density );
 	qglHint( GL_FOG_HINT, curfog->hint );
@@ -119,8 +115,7 @@ void R_Fog( glfog_t *curfog ) {
 		}
 	}
 
-
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 //----(SA)	added
 	// NV fog mode
 	if ( glConfig.NVFogAvailable ) {
@@ -1663,31 +1658,45 @@ R_DebugPolygon
 ================
 */
 void R_DebugPolygon( int color, int numPoints, float *points ) {
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	int i;
+#endif
 
 	GL_State( GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
 
 	// draw solid shade
 
+#ifdef USE_OPENGLES
+	qglColor4f( color&1, (color>>1)&1, (color>>2)&1, 1.0f );
+	qglVertexPointer  ( 3, GL_FLOAT, 0, points );
+	qglDrawArrays( GL_TRIANGLE_FAN, 0, numPoints );
+#else
 	qglColor3f( color & 1, ( color >> 1 ) & 1, ( color >> 2 ) & 1 );
 	qglBegin( GL_POLYGON );
 	for ( i = 0 ; i < numPoints ; i++ ) {
 		qglVertex3fv( points + i * 3 );
 	}
 	qglEnd();
+#endif
 
 	// draw wireframe outline
+#ifndef USE_OPENGLES
 	GL_State( GLS_POLYMODE_LINE | GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
+#endif
 	qglDepthRange( 0, 0 );
+#ifdef USE_OPENGLES
+	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
+	qglVertexPointer  ( 3, GL_FLOAT, 0, points );
+	qglDrawArrays( GL_LINES, 0, numPoints );
+#else
 	qglColor3f( 1, 1, 1 );
 	qglBegin( GL_POLYGON );
 	for ( i = 0 ; i < numPoints ; i++ ) {
 		qglVertex3fv( points + i * 3 );
 	}
 	qglEnd();
-	qglDepthRange( 0, 1 );
 #endif
+	qglDepthRange( 0, 1 );
 }
 
 /*
diff --git a/SP/code/renderer/tr_shade.c b/SP/code/renderer/tr_shade.c
index 37de148..65afdba 100644
--- a/SP/code/renderer/tr_shade.c
+++ b/SP/code/renderer/tr_shade.c
@@ -47,7 +47,7 @@ R_ArrayElementDiscrete
 This is just for OpenGL conformance testing, it should never be the fastest
 ================
 */
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 static void APIENTRY R_ArrayElementDiscrete( GLint index ) {
 	qglColor4ubv( tess.svars.colors[ index ] );
 	if ( glState.currenttmu ) {
@@ -66,9 +66,19 @@ R_DrawStripElements
 
 ===================
 */
+#ifdef USE_OPENGLES
+#define MAX_INDEX 4096
+glIndex_t sindexes[MAX_INDEX];
+int num_sindexed;
+
+void AddIndexe(GLint idx) {
+	sindexes[num_sindexed++]=idx;
+}
+#endif
+
+#ifndef USE_OPENGLES
 static int c_vertexes;          // for seeing how long our average strips are
 static int c_begins;
-#ifndef VCMODS_OPENGLES
 static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void ( APIENTRY *element )( GLint ) ) {
 	int i;
 	int last[3] = { -1, -1, -1 };
@@ -157,7 +167,7 @@ static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void
 
 	qglEnd();
 }
-#endif
+#endif // USE_OPENGLES
 
 
 /*
@@ -170,11 +180,17 @@ without compiled vertex arrays.
 ==================
 */
 static void R_DrawElements( int numIndexes, const glIndex_t *indexes ) {
+#ifdef USE_OPENGLES
+	qglDrawElements( GL_TRIANGLES, 
+						numIndexes,
+						GL_INDEX_TYPE,
+						indexes );
+		return;
+#else
 	int primitives;
 
 	primitives = r_primitives->integer;
 
-#ifndef VCMODS_OPENGLES
 	// default is to use triangles if compiled vertex arrays are present
 	if ( primitives == 0 ) {
 		if ( qglLockArraysEXT ) {
@@ -184,14 +200,11 @@ static void R_DrawElements( int numIndexes, const glIndex_t *indexes ) {
 		}
 	}
 
-
 	if ( primitives == 2 ) {
-#endif
 		qglDrawElements( GL_TRIANGLES,
 						 numIndexes,
 						 GL_INDEX_TYPE,
 						 indexes );
-#ifndef VCMODS_OPENGLES
 		return;
 	}
 
@@ -271,11 +284,7 @@ Draws triangle outlines for debugging
 */
 static void DrawTris( shaderCommands_t *input ) {
 	GL_Bind( tr.whiteImage );
-#ifdef VCMODS_OPENGLES
-	qglColor4f (1.0f,1.0f,1.0f,1.0f);
-#else
 	qglColor3f( 1,1,1 );
-#endif
 
 	GL_State( GLS_POLYMODE_LINE | GLS_DEPTHMASK_TRUE );
 
@@ -293,7 +302,14 @@ static void DrawTris( shaderCommands_t *input ) {
 		GLimp_LogComment( "glLockArraysEXT\n" );
 	}
 
+#ifdef USE_OPENGLES
+	qglDrawElements( GL_LINE_STRIP, 
+					input->numIndexes,
+					GL_INDEX_TYPE,
+					input->indexes );
+#else
 	R_DrawElements( input->numIndexes, input->indexes );
+#endif
 
 	if ( qglUnlockArraysEXT ) {
 		qglUnlockArraysEXT();
@@ -313,43 +329,41 @@ Draws vertex normals for debugging
 static void DrawNormals( shaderCommands_t *input ) {
 	int i;
 	vec3_t temp;
-#ifdef VCMODS_OPENGLES
-	vec3_t	verts[2*SHADER_MAX_VERTEXES];
-	glIndex_t indicies[2*SHADER_MAX_VERTEXES];
-
-	for (i = 0 ; i < input->numVertexes ; i++) {
-		VectorCopy(input->xyz[i], verts[i*2]);
-		VectorMA (input->xyz[i], 2, input->normal[i], temp);
-		VectorCopy(temp, verts[(i*2)+1]);
-		indicies[(i*2)] = i*2;
-		indicies[(i*2)+1] = (i*2)+1;
-	}
-#endif
 
 	GL_Bind( tr.whiteImage );
-#ifdef VCMODS_OPENGLES
-	qglColor4f (1.0f,1.0f,1.0f,1.0f);
-#else
 	qglColor3f( 1,1,1 );
-#endif
 
 	if ( r_shownormals->integer == 1 ) {
 		qglDepthRange( 0, 0 );  // never occluded
 	}
 	GL_State( GLS_POLYMODE_LINE | GLS_DEPTHMASK_TRUE );
 
-#ifdef VCMODS_OPENGLES
-	qglVertexPointer(3, GL_FLOAT, 0, verts);
-	qglDrawElements( GL_LINES, i, GL_INDEX_TYPE, indicies );
+#ifdef USE_OPENGLES
+	vec3_t vtx[2];
+	//*TODO* save states for texture & color array
 #else
 	qglBegin( GL_LINES );
+#endif
 	for ( i = 0 ; i < input->numVertexes ; i++ ) {
+#ifndef USE_OPENGLES
 		qglVertex3fv( input->xyz[i] );
+#endif
 		VectorMA( input->xyz[i], 2, input->normal[i], temp );
+#ifdef USE_OPENGLES
+		memcpy(vtx, input->xyz[i], sizeof(GLfloat)*3);
+		memcpy(vtx+1, temp, sizeof(GLfloat)*3);
+		qglVertexPointer (3, GL_FLOAT, 16, vtx);
+		qglDrawArrays(GL_LINES, 0, 2);
+#else
 		qglVertex3fv( temp );
+#endif
 	}
+#ifdef USE_OPENGLES
+	//*TODO* restaure state for texture & color
+#else
 	qglEnd();
 #endif
+
 	qglDepthRange( 0, 1 );
 }
 
@@ -412,7 +426,7 @@ static void DrawMultitextured( shaderCommands_t *input, int stage ) {
 
 	// this is an ugly hack to work around a GeForce driver
 	// bug with multitexture and clip planes
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( backEnd.viewParms.isPortal ) {
 		qglPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
 	}
@@ -1449,12 +1463,6 @@ void RB_StageIteratorGeneric( void ) {
 	input = &tess;
 	shader = input->shader;
 
-#ifdef VCMODS_OPENGLES
-	// if ignoreglerrors is off, qglLockArraysEXT generates a GL error when you
-	// pass it 0 verts
-	if (input->numVertexes == 0 ) return;
-#endif
-
 	RB_DeformTessGeometry();
 
 	//
@@ -1469,7 +1477,7 @@ void RB_StageIteratorGeneric( void ) {
 	// set GL fog
 	SetIteratorFog();
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		// RF< so we can send the normals as an array
 		qglEnableClientState( GL_NORMAL_ARRAY );
@@ -1512,7 +1520,7 @@ void RB_StageIteratorGeneric( void ) {
 	// RF, send normals only if required
 	// This must be done first, since we can't change the arrays once they have been
 	// locked
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		qglNormalPointer( GL_FLOAT, 16, input->normal );
 	}
@@ -1571,13 +1579,12 @@ void RB_StageIteratorGeneric( void ) {
 	}
 
 	// turn truform back off
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		qglDisable( GL_PN_TRIANGLES_ATI );    // ATI PN-Triangles extension
 		qglDisableClientState( GL_NORMAL_ARRAY );
 	}
 #endif
-
 }
 
 
@@ -1621,7 +1628,7 @@ void RB_StageIteratorVertexLitTexture( void ) {
 	qglEnableClientState( GL_COLOR_ARRAY );
 	qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		qglEnable( GL_PN_TRIANGLES_ATI ); // ATI PN-Triangles extension
 		qglEnableClientState( GL_NORMAL_ARRAY );         // RF< so we can send the normals as an array
@@ -1668,7 +1675,7 @@ void RB_StageIteratorVertexLitTexture( void ) {
 		GLimp_LogComment( "glUnlockArraysEXT\n" );
 	}
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		qglDisable( GL_PN_TRIANGLES_ATI );    // ATI PN-Triangles extension
 	}
@@ -1707,7 +1714,7 @@ void RB_StageIteratorLightmappedMultitexture( void ) {
 	GL_State( GLS_DEFAULT );
 	qglVertexPointer( 3, GL_FLOAT, 16, input->xyz );
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		qglEnable( GL_PN_TRIANGLES_ATI ); // ATI PN-Triangles extension
 		qglNormalPointer( GL_FLOAT, 16, input->normal );
@@ -1797,7 +1804,7 @@ void RB_StageIteratorLightmappedMultitexture( void ) {
 		GLimp_LogComment( "glUnlockArraysEXT\n" );
 	}
 
-#ifndef VCMODS_OPENGLES
+#ifndef USE_OPENGLES
 	if ( qglPNTrianglesiATI && tess.ATI_tess ) {
 		qglDisable( GL_PN_TRIANGLES_ATI );    // ATI PN-Triangles extension
 	}
diff --git a/SP/code/renderer/tr_shadows.c b/SP/code/renderer/tr_shadows.c
index 43bf487..ef98933 100644
--- a/SP/code/renderer/tr_shadows.c
+++ b/SP/code/renderer/tr_shadows.c
@@ -53,6 +53,11 @@ static int numEdgeDefs[SHADER_MAX_VERTEXES];
 static int facing[SHADER_MAX_INDEXES / 3];
 static vec3_t shadowXyz[SHADER_MAX_VERTEXES];
 
+#ifdef USE_OPENGLES
+static unsigned short indexes[6*MAX_EDGE_DEFS*SHADER_MAX_VERTEXES];
+static int idx = 0;
+#endif
+
 void R_AddEdgeDef( int i1, int i2, int facing ) {
 	int c;
 
@@ -103,6 +108,9 @@ void R_RenderShadowEdges( void ) {
 	int i2;
 	int c_edges, c_rejected;
 	int hit[2];
+#ifdef USE_OPENGLES
+	idx = 0;
+#endif
 
 	// an edge is NOT a silhouette edge if its face doesn't face the light,
 	// or if it has a reverse paired edge that also faces the light.
@@ -132,15 +140,15 @@ void R_RenderShadowEdges( void ) {
 			// if it doesn't share the edge with another front facing
 			// triangle, it is a sil edge
 			if ( hit[ 1 ] == 0 ) {
-#ifdef VCMODS_OPENGLES
-				glIndex_t indicies[4];
-				indicies[0] = i;
-				indicies[1] = i+tess.numVertexes;
-				indicies[2] = i2;
-				indicies[3] = i2+tess.numVertexes;
-				
-				qglVertexPointer( 3, GL_FLOAT, 16, tess.xyz );
-				qglDrawElements( GL_TRIANGLE_STRIP, 4, GL_INDEX_TYPE, indicies );
+#ifdef USE_OPENGLES
+				// A single drawing call is better than many. So I prefer a singe TRIANGLES call than many TRAINGLE_STRIP call
+				// even if it seems less efficiant, it's faster on the PANDORA
+				indexes[idx++] = i;
+				indexes[idx++] = i + tess.numVertexes;
+				indexes[idx++] = i2;
+				indexes[idx++] = i2;
+				indexes[idx++] = i + tess.numVertexes;
+				indexes[idx++] = i2 + tess.numVertexes;
 #else
 				qglBegin( GL_TRIANGLE_STRIP );
 				qglVertex3fv( tess.xyz[ i ] );
@@ -155,6 +163,10 @@ void R_RenderShadowEdges( void ) {
 			}
 		}
 	}
+#ifdef USE_OPENGLES
+	qglDrawElements(GL_TRIANGLES, idx, GL_UNSIGNED_SHORT, indexes);
+#endif
+
 #endif
 }
 
@@ -226,11 +238,7 @@ void RB_ShadowTessEnd( void ) {
 
 	GL_Bind( tr.whiteImage );
 	GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
-#ifdef VCMODS_OPENGLES
-	qglColor4f( 0.2f, 0.2f, 0.2f, 1.0f );
-#else
 	qglColor3f( 0.2f, 0.2f, 0.2f );
-#endif
 
 	// don't write to the color buffer
 	qglGetBooleanv(GL_COLOR_WRITEMASK, rgba);
@@ -239,6 +247,16 @@ void RB_ShadowTessEnd( void ) {
 	qglEnable( GL_STENCIL_TEST );
 	qglStencilFunc( GL_ALWAYS, 1, 255 );
 
+#ifdef USE_OPENGLES
+	qglVertexPointer (3, GL_FLOAT, 16, tess.xyz);
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (glcol)
+		qglDisableClientState( GL_COLOR_ARRAY );
+#endif
+
 	GL_Cull( CT_BACK_SIDED );
 	qglStencilOp( GL_KEEP, GL_KEEP, GL_INCR );
 
@@ -247,8 +265,18 @@ void RB_ShadowTessEnd( void ) {
 	GL_Cull( CT_FRONT_SIDED );
 	qglStencilOp( GL_KEEP, GL_KEEP, GL_DECR );
 
+#ifdef USE_OPENGLES
+	qglDrawElements(GL_TRIANGLES, idx, GL_UNSIGNED_SHORT, indexes);
+#else
 	R_RenderShadowEdges();
+#endif
 
+#ifdef USE_OPENGLES
+	if (text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (glcol)
+		qglEnableClientState( GL_COLOR_ARRAY );
+#endif
 	// reenable writing to the color buffer
 	qglColorMask(rgba[0], rgba[1], rgba[2], rgba[3]);
 }
@@ -265,15 +293,6 @@ overlap and double darken.
 =================
 */
 void RB_ShadowFinish( void ) {
-#ifdef VCMODS_OPENGLES
-	vec3_t quad[4] = {
-		{-100.0f, 100.0f, -10.0},
-		{100.0f, 100.0f, -10.0f},
-		{100.0f, -100.0f, -10.0f},
-		{-100.0f, -100.0f, -10.0f}
-	};
-	glIndex_t indicies[6] = { 0, 1, 2, 0, 3, 2};
-#endif
 	if ( r_shadows->integer != 2 ) {
 		return;
 	}
@@ -290,19 +309,31 @@ void RB_ShadowFinish( void ) {
 
 	qglLoadIdentity();
 
-#ifdef VCMODS_OPENGLES
-	qglColor4f( 0.6f, 0.6f, 0.6f, 1.0f );
-#else
 	qglColor3f( 0.6f, 0.6f, 0.6f );
-#endif
 	GL_State( GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );
 
 //	qglColor3f( 1, 0, 0 );
 //	GL_State( GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
 
-#ifdef VCMODS_OPENGLES
-	qglVertexPointer ( 3, GL_FLOAT, 0, quad );
-	qglDrawElements ( GL_TRIANGLE_STRIP, 6, GL_INDEX_TYPE, indicies );
+#ifdef USE_OPENGLES
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (glcol)
+		qglDisableClientState( GL_COLOR_ARRAY );
+	GLfloat vtx[] = {
+	 -100,  100, -10,
+	  100,  100, -10,
+	  100, -100, -10,
+	 -100, -100, -10
+	};
+	qglVertexPointer  ( 3, GL_FLOAT, 0, vtx );
+	qglDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
+	if (text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (glcol)
+		qglEnableClientState( GL_COLOR_ARRAY );
 #else
 	qglBegin( GL_QUADS );
 	qglVertex3f( -100, 100, -10 );
diff --git a/SP/code/renderer/tr_sky.c b/SP/code/renderer/tr_sky.c
index d3c2b78..186b6c0 100644
--- a/SP/code/renderer/tr_sky.c
+++ b/SP/code/renderer/tr_sky.c
@@ -373,30 +373,40 @@ static vec3_t s_skyPoints[SKY_SUBDIVISIONS + 1][SKY_SUBDIVISIONS + 1];
 static float s_skyTexCoords[SKY_SUBDIVISIONS + 1][SKY_SUBDIVISIONS + 1][2];
 
 static void DrawSkySide( struct image_s *image, const int mins[2], const int maxs[2] ) {
-#ifdef VCMODS_OPENGLES
-	int s, t, i=0;
-	int size;
-	glIndex_t *indicies;
-	
-	size = (maxs[1]-mins[1]) * (maxs[0] - mins[0] + 1);
-	indicies = ri.Hunk_AllocateTempMemory( sizeof(glIndex_t) * size );
-#else
 	int s, t;
-#endif
 
 	GL_Bind( image );
 
+#ifdef USE_OPENGLES
+	GLfloat vtx[3*1024];	// arbitrary sized
+	GLfloat tex[2*1024];
+	int idx;
+	
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (glcol)
+		qglDisableClientState(GL_COLOR_ARRAY);
+	if (!text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+#endif
+
 	for ( t = mins[1] + HALF_SKY_SUBDIVISIONS; t < maxs[1] + HALF_SKY_SUBDIVISIONS; t++ )
 	{
-#ifndef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
+		idx=0;
+#else
 		qglBegin( GL_TRIANGLE_STRIP );
 #endif
 
 		for ( s = mins[0] + HALF_SKY_SUBDIVISIONS; s <= maxs[0] + HALF_SKY_SUBDIVISIONS; s++ )
 		{
-#ifdef VCMODS_OPENGLES
-			indicies[i++] = t*(SKY_SUBDIVISIONS+1) + s;
-			indicies[i++] = (t+1)*(SKY_SUBDIVISIONS+1) + s;
+#ifdef USE_OPENGLES
+			memcpy(tex+idx*2, s_skyTexCoords[t][s], sizeof(GLfloat)*2);
+			memcpy(vtx+idx*3, s_skyPoints[t][s], sizeof(GLfloat)*3);
+			idx++;
+			memcpy(tex+idx*2, s_skyTexCoords[t+1][s], sizeof(GLfloat)*2);
+			memcpy(vtx+idx*3, s_skyPoints[t+1][s], sizeof(GLfloat)*3);
+			idx++;
 #else
 			qglTexCoord2fv( s_skyTexCoords[t][s] );
 			qglVertex3fv( s_skyPoints[t][s] );
@@ -406,34 +416,42 @@ static void DrawSkySide( struct image_s *image, const int mins[2], const int max
 #endif
 		}
 
-#ifndef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
+		//*TODO* Try to switch from many DrawArrays of GL_TRIANGLE_STRIP to a single DrawArrays of TRIANGLES to see if it perform better
+		qglVertexPointer (3, GL_FLOAT, 0, vtx);
+		qglTexCoordPointer(2, GL_FLOAT, 0, tex);
+		qglDrawArrays(GL_TRIANGLE_STRIP, 0, idx);
+#else
 		qglEnd();
 #endif
 	}
-#ifdef VCMODS_OPENGLES	
-	qglDisableClientState( GL_COLOR_ARRAY);
-	qglEnableClientState( GL_TEXTURE_COORD_ARRAY);
-	qglTexCoordPointer( 2, GL_FLOAT, 0, s_skyTexCoords );
-	qglVertexPointer  ( 3, GL_FLOAT, 0, s_skyPoints );
-	qglDrawElements( GL_TRIANGLE_STRIP, i, GL_INDEX_TYPE, indicies );
-	Hunk_FreeTempMemory(indicies);
+
+#ifdef USE_OPENGLES
+	if (glcol)
+		qglEnableClientState(GL_COLOR_ARRAY);
+	if (!text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
 #endif
 }
 
 static void DrawSkySideInner( struct image_s *image, const int mins[2], const int maxs[2] ) {
-#ifdef VCMODS_OPENGLES
-	int s, t, i=0;
-	int size;
-	glIndex_t *indicies;
-	
-	size = (maxs[1]-mins[1]) * (maxs[0] - mins[0] + 1);
-	indicies = ri.Hunk_AllocateTempMemory( sizeof(glIndex_t) * size );
-#else
 	int s, t;
-#endif
 
 	GL_Bind( image );
 
+#ifdef USE_OPENGLES
+	GLfloat vtx[3*1024];	// arbitrary sized
+	GLfloat tex[2*1024];
+	int idx;
+	
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (glcol)
+		qglDisableClientState(GL_COLOR_ARRAY);
+	if (!text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+#endif
+
 	//qglDisable (GL_BLEND);
 	qglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
 	qglEnable( GL_BLEND );
@@ -441,15 +459,21 @@ static void DrawSkySideInner( struct image_s *image, const int mins[2], const in
 
 	for ( t = mins[1] + HALF_SKY_SUBDIVISIONS; t < maxs[1] + HALF_SKY_SUBDIVISIONS; t++ )
 	{
-#ifndef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
+		idx=0;
+#else
 		qglBegin( GL_TRIANGLE_STRIP );
 #endif
 
 		for ( s = mins[0] + HALF_SKY_SUBDIVISIONS; s <= maxs[0] + HALF_SKY_SUBDIVISIONS; s++ )
 		{
-#ifdef VCMODS_OPENGLES
-			indicies[i++] = t*(SKY_SUBDIVISIONS+1) + s;
-			indicies[i++] = (t+1)*(SKY_SUBDIVISIONS+1) + s;
+#ifdef USE_OPENGLES
+			memcpy(tex+idx*2, s_skyTexCoords[t][s], sizeof(GLfloat)*2);
+			memcpy(vtx+idx*3, s_skyPoints[t][s], sizeof(GLfloat)*3);
+			idx++;
+			memcpy(tex+idx*2, s_skyTexCoords[t+1][s], sizeof(GLfloat)*2);
+			memcpy(vtx+idx*3, s_skyPoints[t+1][s], sizeof(GLfloat)*3);
+			idx++;
 #else
 			qglTexCoord2fv( s_skyTexCoords[t][s] );
 			qglVertex3fv( s_skyPoints[t][s] );
@@ -459,21 +483,24 @@ static void DrawSkySideInner( struct image_s *image, const int mins[2], const in
 #endif
 		}
 
-#ifndef VCMODS_OPENGLES
+#ifdef USE_OPENGLES
+		//*TODO* Try to switch from many DrawArrays of GL_TRIANGLE_STRIP to a single DrawArrays of TRIANGLES to see if it perform better
+		qglVertexPointer (3, GL_FLOAT, 0, vtx);
+		qglTexCoordPointer(2, GL_FLOAT, 0, tex);
+		qglDrawArrays(GL_TRIANGLE_STRIP, 0, idx);
+#else
 		qglEnd();
 #endif
 	}
 
-#ifdef VCMODS_OPENGLES	
-	qglDisableClientState( GL_COLOR_ARRAY);
-	qglEnableClientState( GL_TEXTURE_COORD_ARRAY);
-	qglTexCoordPointer( 2, GL_FLOAT, 0, s_skyTexCoords );
-	qglVertexPointer  ( 3, GL_FLOAT, 0, s_skyPoints );
-	qglDrawElements( GL_TRIANGLE_STRIP, i, GL_INDEX_TYPE, indicies );
-	Hunk_FreeTempMemory(indicies);
-#endif
-
 	qglDisable( GL_BLEND );
+
+#ifdef USE_OPENGLES
+	if (glcol)
+		qglEnableClientState(GL_COLOR_ARRAY);
+	if (!text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+#endif
 }
 
 static void DrawSkyBox( shader_t *shader ) {
@@ -984,11 +1011,7 @@ void RB_StageIteratorSky( void ) {
 
 	// draw the outer skybox
 	if ( tess.shader->sky.outerbox[0] && tess.shader->sky.outerbox[0] != tr.defaultImage ) {
-#ifdef VCMODS_OPENGLES
-		qglColor4f( tr.identityLight, tr.identityLight, tr.identityLight, 1.0f );
-#else
 		qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
-#endif
 
 		qglPushMatrix();
 		GL_State( 0 );
@@ -1008,11 +1031,7 @@ void RB_StageIteratorSky( void ) {
 	// draw the inner skybox
 	// Rafael - drawing inner skybox
 	if ( tess.shader->sky.innerbox[0] && tess.shader->sky.innerbox[0] != tr.defaultImage ) {
-#ifdef VCMODS_OPENGLES
-		qglColor4f( tr.identityLight, tr.identityLight, tr.identityLight, 1.0f );
-#else
 		qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
-#endif
 
 		qglPushMatrix();
 		GL_State( 0 );
diff --git a/SP/code/renderer/tr_surface.c b/SP/code/renderer/tr_surface.c
index 1a23b87..2cb026f 100644
--- a/SP/code/renderer/tr_surface.c
+++ b/SP/code/renderer/tr_surface.c
@@ -317,11 +317,7 @@ static void RB_SurfaceBeam( void ) {
 	int i;
 	vec3_t perpvec;
 	vec3_t direction, normalized_direction;
-#ifdef VCMODS_OPENGLES
-	vec3_t points[NUM_BEAM_SEGS*2];
-#else
 	vec3_t start_points[NUM_BEAM_SEGS], end_points[NUM_BEAM_SEGS];
-#endif
 	vec3_t oldorigin, origin;
 
 	e = &backEnd.currentEntity->e;
@@ -348,29 +344,36 @@ static void RB_SurfaceBeam( void ) {
 
 	for ( i = 0; i < NUM_BEAM_SEGS ; i++ )
 	{
-#ifdef VCMODS_OPENGLES
-		RotatePointAroundVector( points[i*2], normalized_direction, perpvec, (360.0/NUM_BEAM_SEGS)*i );
-//		VectorAdd( start_points[i], origin, start_points[i] );
-		VectorAdd( points[i*2], direction, points[i*2+1] );
-#else
 		RotatePointAroundVector( start_points[i], normalized_direction, perpvec, ( 360.0 / NUM_BEAM_SEGS ) * i );
 //		VectorAdd( start_points[i], origin, start_points[i] );
 		VectorAdd( start_points[i], direction, end_points[i] );
-#endif
 	}
 
 	GL_Bind( tr.whiteImage );
 
 	GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
 
-#ifdef VCMODS_OPENGLES
-	qglColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
-
-	qglVertexPointer( 3, GL_FLOAT, 0, points );
-	qglDrawArrays( GL_TRIANGLE_STRIP, 0, NUM_BEAM_SEGS*2);
-#else
 	qglColor3f( 1, 0, 0 );
 
+#ifdef USE_OPENGLES
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (glcol)
+		qglDisableClientState(GL_COLOR_ARRAY);
+	if (text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+	GLfloat vtx[NUM_BEAM_SEGS*6+6];
+	for ( i = 0; i <= NUM_BEAM_SEGS; i++ ) {
+		memcpy(vtx+i*6, start_points[ i % NUM_BEAM_SEGS], sizeof(GLfloat)*3);
+		memcpy(vtx+i*6+3, end_points[ i % NUM_BEAM_SEGS], sizeof(GLfloat)*3);
+	}
+	qglVertexPointer (3, GL_FLOAT, 0, vtx);
+	qglDrawArrays(GL_TRIANGLE_STRIP, 0, NUM_BEAM_SEGS*2+2);
+	if (glcol)
+		qglEnableClientState(GL_COLOR_ARRAY);
+	if (text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+#else
 	qglBegin( GL_TRIANGLE_STRIP );
 	for ( i = 0; i <= NUM_BEAM_SEGS; i++ ) {
 		qglVertex3fv( start_points[ i % NUM_BEAM_SEGS] );
@@ -1170,11 +1173,7 @@ RB_SurfaceFace
 */
 void RB_SurfaceFace( srfSurfaceFace_t *surf ) {
 	int i;
-#ifdef VCMODS_OPENGLES
-	unsigned int	*indices;
-#else
 	unsigned	*indices;
-#endif
 	glIndex_t	*tessIndexes;
 	float       *v;
 	float       *normal;
@@ -1426,24 +1425,39 @@ Draws x/y/z lines from the origin for orientation debugging
 ===================
 */
 static void RB_SurfaceAxis( void ) {
-#ifdef VCMODS_OPENGLES
-	byte colors[3][4] = { {255,0,0,255},{0,255,0,255},{0,0,255,255}};
-	vec3_t verts[6] = {
-		{0.0f, 0.0f, 0.0f}, {16.0f, 0.0f, 0.0f},
-		{0.0f, 0.0f, 0.0f}, {0.0f, 16.0f, 0.0f},
-		{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 16.0f}
-	};
-	glIndex_t indicies[6] = {0, 1, 0, 2, 0, 3};
-#endif
 	GL_Bind( tr.whiteImage );
 	GL_State( GLS_DEFAULT );
 	qglLineWidth( 3 );
-#ifdef VCMODS_OPENGLES
-	qglEnableClientState( GL_COLOR_ARRAY );
-	qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, colors );
-	qglVertexPointer( 3, GL_FLOAT, 0, verts );
-
-	qglDrawElements( GL_LINES, 6, GL_INDEX_TYPE, indicies );
+#ifdef USE_OPENGLES
+	GLfloat col[] = {
+	  1,0,0, 1,
+	  1,0,0, 1,
+	  0,1,0, 1,
+	  0,1,0, 1,
+	  0,0,1, 1,
+	  0,0,1, 1
+	 };
+	 GLfloat vtx[] = {
+	  0,0,0,
+	  16,0,0,
+	  0,0,0,
+	  0,16,0,
+	  0,0,0,
+	  0,0,16
+	 };
+	GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
+	GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
+	if (text)
+		qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (!glcol)
+		qglEnableClientState( GL_COLOR_ARRAY);
+	qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, col );
+	qglVertexPointer (3, GL_FLOAT, 0, vtx);
+	qglDrawArrays(GL_LINES, 0, 6);
+	if (text)
+		qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
+	if (!glcol)
+		qglDisableClientState( GL_COLOR_ARRAY);
 #else
 	qglBegin( GL_LINES );
 	qglColor3f( 1,0,0 );
diff --git a/SP/code/sdl/sdl_glimp.c b/SP/code/sdl/sdl_glimp.c
index 85d1f22..b6df7b8 100644
--- a/SP/code/sdl/sdl_glimp.c
+++ b/SP/code/sdl/sdl_glimp.c
@@ -35,6 +35,18 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "../sys/sys_local.h"
 #include "sdl_icon.h"
 
+#ifdef USE_OPENGLES
+#ifdef USE_LOCAL_HEADERS
+#	include "EGL/egl.h"
+#else
+#	include <EGL/egl.h>
+#endif
+void myglMultiTexCoord2f( GLenum texture, GLfloat s, GLfloat t )
+{
+	glMultiTexCoord4f(texture, s, t, 0, 1);
+}
+#endif
+
 typedef enum
 {
 	RSERR_OK,
@@ -226,6 +238,7 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder)
 	Uint32 flags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL;
 	SDL_DisplayMode desktopMode;
 	int display = 0;
+	int x = SDL_WINDOWPOS_UNDEFINED, y = SDL_WINDOWPOS_UNDEFINED;
 
 	ri.Printf( PRINT_ALL, "Initializing OpenGL display\n");
 
@@ -397,6 +410,7 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder)
 		else
 			perChannelColorBits = 4;
 
+#ifndef USE_OPENGLES
 #ifdef __sgi /* Fix for SGIs grabbing too many bits of color */
 		if (perChannelColorBits == 4)
 			perChannelColorBits = 0; /* Use minimum size for 16-bit color */
@@ -489,6 +503,16 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder)
 				continue;
 			}
 		}
+#else
+		SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
+
+		if( ( SDL_window = SDL_CreateWindow( CLIENT_WINDOW_TITLE, x, y,
+			glConfig.vidWidth, glConfig.vidHeight, flags ) ) == 0 )
+		{
+			ri.Printf( PRINT_DEVELOPER, "SDL_CreateWindow failed: %s\n", SDL_GetError( ) );
+			continue;
+		}
+#endif // USE_OPENGLES
 
 		SDL_SetWindowIcon( SDL_window, icon );
 
@@ -647,6 +671,10 @@ static void GLimp_InitExtensions( void )
 
 
 	// GL_EXT_texture_env_add
+#ifdef USE_OPENGLES
+	glConfig.textureEnvAddAvailable = qtrue;
+	ri.Printf( PRINT_ALL, "...using GL_EXT_texture_env_add\n" );
+#else
 	glConfig.textureEnvAddAvailable = qfalse;
 	if ( GLimp_HaveExtension( "EXT_texture_env_add" ) )
 	{
@@ -665,11 +693,31 @@ static void GLimp_InitExtensions( void )
 	{
 		ri.Printf( PRINT_ALL, "...GL_EXT_texture_env_add not found\n" );
 	}
+#endif
 
 	// GL_ARB_multitexture
 	qglMultiTexCoord2fARB = NULL;
 	qglActiveTextureARB = NULL;
 	qglClientActiveTextureARB = NULL;
+#ifdef USE_OPENGLES
+	qglGetIntegerv( GL_MAX_TEXTURE_UNITS, &glConfig.numTextureUnits );
+	//ri.Printf( PRINT_ALL, "...not using GL_ARB_multitexture, %i texture units\n", glConfig.maxActiveTextures );
+	//glConfig.maxActiveTextures=4;
+	qglMultiTexCoord2fARB = myglMultiTexCoord2f;
+	qglActiveTextureARB = glActiveTexture;
+	qglClientActiveTextureARB = glClientActiveTexture;
+	if ( glConfig.numTextureUnits > 1 )
+	{
+		ri.Printf( PRINT_ALL, "...using GL_ARB_multitexture (%i texture units)\n", glConfig.numTextureUnits );
+	}
+	else
+	{
+		qglMultiTexCoord2fARB = NULL;
+		qglActiveTextureARB = NULL;
+		qglClientActiveTextureARB = NULL;
+		ri.Printf( PRINT_ALL, "...not using GL_ARB_multitexture, < 2 texture units\n" );
+	}
+#else
 	if ( GLimp_HaveExtension( "GL_ARB_multitexture" ) )
 	{
 		if ( r_ext_multitexture->value )
@@ -705,6 +753,7 @@ static void GLimp_InitExtensions( void )
 	{
 		ri.Printf( PRINT_ALL, "...GL_ARB_multitexture not found\n" );
 	}
+#endif
 
 	// GL_EXT_compiled_vertex_array
 	if ( GLimp_HaveExtension( "GL_EXT_compiled_vertex_array" ) )
diff --git a/SP/code/splines/q_splineshared.h b/SP/code/splines/q_splineshared.h
index 0d386b2..17addf5 100644
--- a/SP/code/splines/q_splineshared.h
+++ b/SP/code/splines/q_splineshared.h
@@ -169,11 +169,6 @@ typedef int intptr_t;
 #include <ctype.h>
 #include <limits.h>
 
-#ifdef VCMODS_REPLACETRIG
-#define sin(f) sinf(f)
-#define cos(f) cosf(f)
-#endif
-
 #ifdef _MSC_VER
   #include <io.h>
 
diff --git a/SP/code/sys/sys_loadlib.h b/SP/code/sys/sys_loadlib.h
index 90dad18..0b1eac3 100644
--- a/SP/code/sys/sys_loadlib.h
+++ b/SP/code/sys/sys_loadlib.h
@@ -20,21 +20,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 ===========================================================================
 */
 
-#ifdef VCMODS_NOSDL
-#	ifdef _WIN32
-#		include <windows.h>
-#		define Sys_LoadLibrary(f) (void*)LoadLibrary(f)
-#		define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h)
-#		define Sys_LoadFunction(h,fn) (void*)GetProcAddress((HMODULE)h,fn)
-#		define Sys_LibraryError() "unknown"
-#	else
-#	include <dlfcn.h>
-#		define Sys_LoadLibrary(f) dlopen(f,RTLD_NOW)
-#		define Sys_UnloadLibrary(h) dlclose(h)
-#		define Sys_LoadFunction(h,fn) dlsym(h,fn)
-#		define Sys_LibraryError() dlerror()
-#	endif
-#else
 #ifdef DEDICATED
 #	ifdef _WIN32
 #		include <windows.h>
@@ -62,6 +47,5 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #	define Sys_LoadFunction(h,fn) SDL_LoadFunction(h,fn)
 #	define Sys_LibraryError() SDL_GetError()
 #endif
-#endif
 
 void * QDECL Sys_LoadDll(const char *name, qboolean useSystemLib);
diff --git a/SP/code/sys/sys_main.c b/SP/code/sys/sys_main.c
index 794ef8d..f665b0d 100644
--- a/SP/code/sys/sys_main.c
+++ b/SP/code/sys/sys_main.c
@@ -31,11 +31,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <ctype.h>
 #include <errno.h>
 
-#ifdef VCMODS_MISC
-#include "bcm_host.h"
-#endif
-
-#ifndef VCMODS_NOSDL
 #ifndef DEDICATED
 #ifdef USE_LOCAL_HEADERS
 #	include "SDL.h"
@@ -45,7 +40,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #	include <SDL_cpuinfo.h>
 #endif
 #endif
-#endif
 
 #include "sys_local.h"
 #include "sys_loadlib.h"
@@ -241,10 +235,8 @@ static __attribute__ ((noreturn)) void Sys_Exit( int exitCode )
 	CON_Shutdown( );
 
 #ifndef DEDICATED
-#ifndef VCMODS_NOSDL
 	SDL_Quit( );
 #endif
-#endif
 
 	if( exitCode < 2 )
 	{
@@ -281,14 +273,12 @@ cpuFeatures_t Sys_GetProcessorFeatures( void )
 {
 	cpuFeatures_t features = 0;
 
-#ifndef VCMODS_NOSDL
 #ifndef DEDICATED
 	if( SDL_HasRDTSC( ) )    features |= CF_RDTSC;
 	if( SDL_HasMMX( ) )      features |= CF_MMX;
 	if( SDL_HasSSE( ) )      features |= CF_SSE;
 	if( SDL_HasSSE2( ) )     features |= CF_SSE2;
 #endif
-#endif
 
 	return features;
 }
@@ -381,9 +371,6 @@ Sys_Print
 */
 void Sys_Print( const char *msg )
 {
-#if defined(VCMODS_MISC)&&defined(_WIN32)
-	OutputDebugString(msg);
-#endif
 	CON_LogWrite( msg );
 	CON_Print( msg );
 }
@@ -621,14 +608,10 @@ main
 */
 int main( int argc, char **argv )
 {
-#ifdef VCMODS_MISC
-	bcm_host_init();
-#endif
 	int   i;
 	char  commandLine[ MAX_STRING_CHARS ] = { 0 };
 
 #ifndef DEDICATED
-#ifndef VCMODS_NOSDL
 	// SDL version check
 
 	// Compile time
@@ -655,7 +638,6 @@ int main( int argc, char **argv )
 		Sys_Exit( 1 );
 	}
 #endif
-#endif
 
 	Sys_PlatformInit( );
 
diff --git a/SP/make-raspberrypi.sh b/SP/make-raspberrypi.sh
index 2451bd2..c86d607 100755
--- a/SP/make-raspberrypi.sh
+++ b/SP/make-raspberrypi.sh
@@ -4,8 +4,8 @@
 	USE_CODEC_OPUS=0 \
 	USE_CURL=0 \
 	USE_CURL_DLOPEN=0 \
-	USE_OPENAL=0 \
-	USE_OPENAL_DLOPEN=0 \
+	USE_OPENAL=1 \
+	USE_OPENAL_DLOPEN=1 \
 	USE_RENDERER_DLOPEN=0 \
 	USE_VOIP=0 \
 	USE_LOCAL_HEADERS=1 \
@@ -13,7 +13,7 @@
 	USE_INTERNAL_OPUS=1 \
 	USE_INTERNAL_ZLIB=1 \
 	USE_OPENGLES=1 \
-	USE_BLOOM=0 \
+	RASPBERRY_PI=1 \
 	USE_MUMBLE=0 \
 	BUILD_GAME_SO=1 \
 	BUILD_GAME_QVM=0 \
@@ -22,7 +22,5 @@
 	PLATFORM=linux \
 	COMPILE_ARCH=arm \
 	COMPILE_PLATFORM=linux \
-	CFLAGS="-DVCMODS_MISC -DVCMODS_OPENGLES -DVCMODS_DEPTH -DVCMODS_REPLACETRIG -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux" \
-	LDFLAGS="-L/opt/vc/lib -lbcm_host" \
 	make $*
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git



More information about the Pkg-games-commits mailing list