diff src/video/SDL_renderer_gl.c @ 2845:1cc5d5b164e2

Added official support for GL_APPLE_ycbcr_422 and GL_MESA_ycbcr_texture
author Sam Lantinga <slouken@libsdl.org>
date Sun, 07 Dec 2008 04:02:23 +0000
parents 70b63882d2ef
children 3d7833d5a4be
line wrap: on
line diff
--- a/src/video/SDL_renderer_gl.c	Sat Dec 06 18:37:06 2008 +0000
+++ b/src/video/SDL_renderer_gl.c	Sun Dec 07 04:02:23 2008 +0000
@@ -146,6 +146,8 @@
     SDL_bool updateSize;
     SDL_bool GL_ARB_texture_rectangle_supported;
     SDL_bool GL_EXT_paletted_texture_supported;
+    SDL_bool GL_APPLE_ycbcr_422_supported;
+    SDL_bool GL_MESA_ycbcr_texture_supported;
     SDL_bool GL_ARB_fragment_program_supported;
     int blendMode;
     int scaleMode;
@@ -378,6 +380,12 @@
         }
         --info->num_texture_formats;
     }
+    if (SDL_GL_ExtensionSupported("GL_APPLE_ycbcr_422")) {
+        data->GL_APPLE_ycbcr_422_supported = SDL_TRUE;
+    }
+    if (SDL_GL_ExtensionSupported("GL_MESA_ycbcr_texture")) {
+        data->GL_MESA_ycbcr_texture_supported = SDL_TRUE;
+    }
     if (SDL_GL_ExtensionSupported("GL_APPLE_texture_range")) {
         data->glTextureRangeAPPLE =
             (void (*)(GLenum, GLsizei, const GLvoid *))
@@ -483,7 +491,7 @@
                              SDL_strlen(source), source);
 
     if (data->glGetError() == GL_INVALID_OPERATION)
-    { 
+    {
 #if DEBUG_PROGRAM_COMPILE
         GLint pos = 0;
         const GLubyte *errstr;
@@ -660,28 +668,24 @@
         format = GL_BGRA;
         type = GL_UNSIGNED_INT_2_10_10_10_REV;
         break;
-#if 0 /* Ryan's pixel shader code should be better, once it works. :) */
-    case SDL_PIXELFORMAT_UYVY: 	 
-//        if (renderdata->GL_MESA_ycbcr_texture) { 	 
-//            internalFormat = 3; 	 
-//            format = GL_YCBCR_MESA; 	 
-//            type = GL_UNSIGNED_SHORT_8_8_MESA; 	 
-//        } else if (renderdata->GL_APPLE_ycbcr_422) { 	 
-            internalFormat = GL_RGB; 	 
-            format = GL_YCBCR_422_APPLE; 	 
-#if SDL_BYTEORDER == SDL_LIL_ENDIAN 	 
-            type = GL_UNSIGNED_SHORT_8_8_APPLE; 	 
-#else 	 
-            type = GL_UNSIGNED_SHORT_8_8_REV_APPLE; 	 
-#endif 	 
-//        } else { 	 
-//            SDL_SetError("Unsupported texture format"); 	 
-//            return -1; 	 
-//        } 	 
-        break;
+    case SDL_PIXELFORMAT_UYVY:
+        if (renderdata->GL_APPLE_ycbcr_422_supported) {
+            internalFormat = GL_RGB;
+            format = GL_YCBCR_422_APPLE;
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+            type = GL_UNSIGNED_SHORT_8_8_APPLE;
 #else
-    case SDL_PIXELFORMAT_UYVY:
-        if (renderdata->GL_ARB_fragment_program_supported) {
+            type = GL_UNSIGNED_SHORT_8_8_REV_APPLE;
+#endif
+        } else if (renderdata->GL_MESA_ycbcr_texture_supported) {
+            internalFormat = GL_RGB;
+            format = GL_YCBCR_MESA;
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+            type = GL_UNSIGNED_SHORT_8_8_MESA;
+#else
+            type = GL_UNSIGNED_SHORT_8_8_REV_MESA;
+#endif
+        } else if (renderdata->GL_ARB_fragment_program_supported) {
             if (renderdata->fragment_program_UYVY == 0) {
                 renderdata->fragment_program_UYVY =
                     compile_shader(renderdata, GL_FRAGMENT_PROGRAM_ARB,
@@ -700,7 +704,28 @@
             return -1;
         }
         break;
+    case SDL_PIXELFORMAT_YUY2:
+        if (renderdata->GL_APPLE_ycbcr_422_supported) {
+            internalFormat = GL_RGB;
+            format = GL_YCBCR_422_APPLE;
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+            type = GL_UNSIGNED_SHORT_8_8_REV_APPLE;
+#else
+            type = GL_UNSIGNED_SHORT_8_8_APPLE;
 #endif
+        } else if (renderdata->GL_MESA_ycbcr_texture_supported) {
+            internalFormat = GL_RGB;
+            format = GL_YCBCR_MESA;
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+            type = GL_UNSIGNED_SHORT_8_8_REV_MESA;
+#else
+            type = GL_UNSIGNED_SHORT_8_8_MESA;
+#endif
+        } else {
+            SDL_SetError("Unsupported texture format");
+            return -1;
+        }
+        break;
     default:
         SDL_SetError("Unsupported texture format");
         return -1;