diff src/video/SDL_video.c @ 2357:ad4a291c85ab gsoc2008_iphone

Added support for OpenGL ES and UIKit Video Driver: - included SDL_renderer_gles.h - added UIKit Video driver bootstrap declaration - added property "retained_backing" to gl_config structure. Having retained backing means your video buffers can't be overwritten by other applications between drawing frames. By default, this is enabled. I wanted to give the option to disable this on iPhone because it increases performance greatly. - modified SDL_GetAttribute and SDL_SetAttribute function for OpenGL ES support. OpenGL ES does not have support for accumulation buffers, and is always double buffered, among other things.
author Holmes Futrell <hfutrell@umail.ucsb.edu>
date Thu, 17 Jul 2008 23:07:58 +0000
parents 91e601d9df8b
children 06d986e73eb0
line wrap: on
line diff
--- a/src/video/SDL_video.c	Thu Jul 17 22:50:39 2008 +0000
+++ b/src/video/SDL_video.c	Thu Jul 17 23:07:58 2008 +0000
@@ -27,11 +27,19 @@
 #include "SDL_sysvideo.h"
 #include "SDL_blit.h"
 #include "SDL_pixels_c.h"
-#include "SDL_renderer_gl.h"
+
+
+#include "glrenderer/SDL_renderer_gl.h"
+#include "glesrenderer/SDL_renderer_gles.h"
+
 #include "SDL_renderer_sw.h"
 #include "../events/SDL_sysevents.h"
 #include "../events/SDL_events_c.h"
 
+#if SDL_VIDEO_OPENGL_ES
+#include "SDL_opengles.h"
+#endif /* SDL_VIDEO_OPENGL_ES */
+
 #if SDL_VIDEO_OPENGL
 #include "SDL_opengl.h"
 
@@ -103,6 +111,9 @@
 #if SDL_VIDEO_DRIVER_OS2FS
     &OS2FSLib_bootstrap,
 #endif
+#if SDL_VIDEO_DRIVER_UIKIT
+	&UIKIT_bootstrap,
+#endif
 #if SDL_VIDEO_DRIVER_DUMMY
     &DUMMY_bootstrap,
 #endif
@@ -243,6 +254,7 @@
     _this->gl_config.stereo = 0;
     _this->gl_config.multisamplebuffers = 0;
     _this->gl_config.multisamplesamples = 0;
+	_this->gl_config.retained_backing = 1; /* most systems have retained backing on the color buffers */
     _this->gl_config.accelerated = -1;  /* not known, don't set */
 
     /* Initialize the video subsystem */
@@ -263,6 +275,10 @@
 #if SDL_VIDEO_RENDER_OGL
         SDL_AddRenderDriver(i, &GL_RenderDriver);
 #endif
+		
+#if SDL_VIDEO_RENDER_OGL_ES
+		SDL_AddRenderDriver(i, &GL_ES_RenderDriver);
+#endif
         if (_this->displays[i].num_render_drivers > 0) {
             SDL_AddRenderDriver(i, &SW_RenderDriver);
         }
@@ -1410,7 +1426,9 @@
 
     if (index < 0) {
         const char *override = SDL_getenv("SDL_VIDEO_RENDERER");
-        int n = SDL_GetNumRenderDrivers();
+        		
+		int n = SDL_GetNumRenderDrivers();
+				
         for (index = 0; index < n; ++index) {
             SDL_RenderDriver *driver =
                 &SDL_CurrentDisplay.render_drivers[index];
@@ -1443,6 +1461,7 @@
     /* Create a new renderer instance */
     window->renderer = SDL_CurrentDisplay.render_drivers[index]
         .CreateRenderer(window, flags);
+	
     SDL_SelectRenderer(window->id);
 
     return 0;
@@ -1546,7 +1565,7 @@
     }
     fmt = surface->format;
 
-    if (format) {
+    if (format) { /* if we were passed in a format */
         if (!SDL_PixelFormatEnumToMasks
             (format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
             SDL_SetError("Unknown pixel format");
@@ -1556,7 +1575,7 @@
         if (surface->format->Amask
             || !(surface->map->info.flags &
                  (SDL_COPY_COLORKEY | SDL_COPY_MASK | SDL_COPY_BLEND))) {
-            bpp = fmt->BitsPerPixel;
+			bpp = fmt->BitsPerPixel;
             Rmask = fmt->Rmask;
             Gmask = fmt->Gmask;
             Bmask = fmt->Bmask;
@@ -1576,8 +1595,7 @@
         }
     }
 
-    textureID =
-        SDL_CreateTexture(format, SDL_TEXTUREACCESS_STATIC, surface->w,
+    textureID = SDL_CreateTexture(format, SDL_TEXTUREACCESS_STATIC, surface->w,
                           surface->h);
     if (!textureID) {
         return 0;
@@ -1612,9 +1630,8 @@
                     SDL_DitherColors(dst_fmt->palette->colors,
                                      SDL_BITSPERPIXEL(format));
                 }
-            }
-
-            dst = SDL_ConvertSurface(surface, dst_fmt, 0);
+            }			
+			dst = SDL_ConvertSurface(surface, dst_fmt, 0);
             if (dst) {
                 SDL_UpdateTexture(textureID, NULL, dst->pixels, dst->pitch);
                 SDL_FreeSurface(dst);
@@ -1628,7 +1645,7 @@
             SDL_DestroyTexture(textureID);
             return 0;
         }
-    }
+	}
 
     if (SDL_ISPIXELFORMAT_INDEXED(format) && fmt->palette) {
         SDL_SetTexturePalette(textureID, fmt->palette->colors, 0,
@@ -1996,6 +2013,7 @@
 int
 SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect)
 {
+		
     SDL_Renderer *renderer;
     SDL_Window *window;
     SDL_Rect real_rect;
@@ -2281,8 +2299,9 @@
 SDL_bool
 SDL_GL_ExtensionSupported(const char *extension)
 {
-#if SDL_VIDEO_OPENGL
-    const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
+#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES
+	
+	const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
     const char *extensions;
     const char *start;
     const char *where, *terminator;
@@ -2337,7 +2356,7 @@
 int
 SDL_GL_SetAttribute(SDL_GLattr attr, int value)
 {
-#if SDL_VIDEO_OPENGL
+#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES
     int retval;
 
     if (!_this) {
@@ -2395,6 +2414,9 @@
     case SDL_GL_ACCELERATED_VISUAL:
         _this->gl_config.accelerated = value;
         break;
+	case SDL_GL_RETAINED_BACKING:
+		_this->gl_config.retained_backing = value;
+		break;
     default:
         SDL_SetError("Unknown OpenGL attribute");
         retval = -1;
@@ -2410,7 +2432,7 @@
 int
 SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
 {
-#if SDL_VIDEO_OPENGL
+#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES
     void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params);
     GLenum attrib = 0;
 
@@ -2419,6 +2441,9 @@
         return -1;
     }
     switch (attr) {
+	case SDL_GL_RETAINED_BACKING:
+		*value = _this->gl_config.retained_backing;
+		return 0;
     case SDL_GL_RED_SIZE:
         attrib = GL_RED_BITS;
         break;
@@ -2432,14 +2457,22 @@
         attrib = GL_ALPHA_BITS;
         break;
     case SDL_GL_DOUBLEBUFFER:
+	#ifndef SDL_VIDEO_OPENGL_ES
         attrib = GL_DOUBLEBUFFER;
         break;
+	#else
+		/* I believe double buffering is the only option in OpenGL ES
+		   -- in any case, GL_DOUBLEBUFFER doesn't exist */
+		*value = 1;
+		return 0;
+	#endif
     case SDL_GL_DEPTH_SIZE:
         attrib = GL_DEPTH_BITS;
         break;
     case SDL_GL_STENCIL_SIZE:
         attrib = GL_STENCIL_BITS;
         break;
+#ifndef SDL_VIDEO_OPENGL_ES
     case SDL_GL_ACCUM_RED_SIZE:
         attrib = GL_ACCUM_RED_BITS;
         break;
@@ -2452,15 +2485,33 @@
     case SDL_GL_ACCUM_ALPHA_SIZE:
         attrib = GL_ACCUM_ALPHA_BITS;
         break;
-    case SDL_GL_STEREO:
-        attrib = GL_STEREO;
-        break;
-    case SDL_GL_MULTISAMPLEBUFFERS:
-        attrib = GL_SAMPLE_BUFFERS_ARB;
-        break;
-    case SDL_GL_MULTISAMPLESAMPLES:
-        attrib = GL_SAMPLES_ARB;
-        break;
+	case SDL_GL_STEREO:
+		attrib = GL_STEREO;
+		break;
+#else
+	    case SDL_GL_ACCUM_RED_SIZE:
+		case SDL_GL_ACCUM_GREEN_SIZE:
+		case SDL_GL_ACCUM_BLUE_SIZE:
+		case SDL_GL_ACCUM_ALPHA_SIZE:
+		case SDL_GL_STEREO:
+			/* none of these are supported in OpenGL ES */
+			*value = 0;
+			return 0;
+#endif
+		case SDL_GL_MULTISAMPLEBUFFERS:
+		#ifndef SDL_VIDEO_OPENGL_ES
+			attrib = GL_SAMPLE_BUFFERS_ARB;
+		#else
+			attrib = GL_SAMPLE_BUFFERS;
+		#endif
+			break;
+		case SDL_GL_MULTISAMPLESAMPLES:
+		#ifndef SDL_VIDEO_OPENGL_ES
+			attrib = GL_SAMPLES_ARB;
+		#else
+			attrib = GL_SAMPLES;
+		#endif
+			break;
     case SDL_GL_BUFFER_SIZE:
         {
             GLint bits = 0;
@@ -2507,7 +2558,6 @@
         return NULL;
     }
     if (!(window->flags & SDL_WINDOW_OPENGL)) {
-        SDL_SetError("The specified window isn't an OpenGL window");
         return NULL;
     }
     return _this->GL_CreateContext(_this, window);
@@ -2525,12 +2575,6 @@
     if (!context) {
         window = NULL;
     }
-    if (window) {
-        if (window->context == context) {
-            return 0;
-        }
-        window->context = context;
-    }
     return _this->GL_MakeCurrent(_this, window, context);
 }
 
@@ -2572,6 +2616,7 @@
     SDL_Window *window = SDL_GetWindowFromID(windowID);
 
     if (!window) {
+		SDL_SetError("The specified window doesn't exist");
         return;
     }
     if (!(window->flags & SDL_WINDOW_OPENGL)) {