gallium: test if PIPE_FORMAT_YCBCR[_REV] is supported and enable GL_MESA_ycbcr_texture
authorBrian <brian.paul@tungstengraphics.com>
Thu, 3 Apr 2008 22:37:30 +0000 (16:37 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 3 Apr 2008 22:37:30 +0000 (16:37 -0600)
Update texture format selection code too.

src/mesa/state_tracker/st_extensions.c
src/mesa/state_tracker/st_format.c

index 20f4652413d75df3766b7269002a513a3cd173f2..47a50d40ca1fe71278dab7fe2301370c777c65a7 100644 (file)
@@ -220,4 +220,9 @@ void st_init_extensions(struct st_context *st)
       ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;
    }
 
+   if (screen->is_format_supported(screen, PIPE_FORMAT_YCBCR, PIPE_TEXTURE) ||
+       screen->is_format_supported(screen, PIPE_FORMAT_YCBCR_REV, PIPE_TEXTURE)) {
+      ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
+   }
+
 }
index cb6fa9a573dc3d04c3a5aa911f4abba131dff23a..761645c10571bcb3abbb50b5b3bda010e2d1a763 100644 (file)
@@ -189,15 +189,14 @@ st_get_format_info(enum pipe_format format, struct pipe_format_info *pinfo)
          pinfo->base_format = GL_RGBA;
       }
    }
+   else if (pf_layout(format) == PIPE_FORMAT_LAYOUT_YCBCR) {
+      pinfo->base_format = GL_YCBCR_MESA;
+      pinfo->datatype = GL_UNSIGNED_SHORT;
+      pinfo->size = 2; /* two bytes per "texel" */
+   }
    else {
-      pipe_format_ycbcr_t info;
-
-      assert( pf_layout(format) == PIPE_FORMAT_LAYOUT_YCBCR );
-
-      info = format;
-
-      /* TODO */
-      assert( 0 );
+      /* compressed format? */
+      assert(0);
    }
 
 #if 0
@@ -275,6 +274,8 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat)
       return PIPE_FORMAT_Z32_UNORM;
    case MESA_FORMAT_Z24_S8:
       return PIPE_FORMAT_Z24S8_UNORM;
+   case MESA_FORMAT_YCBCR:
+      return PIPE_FORMAT_YCBCR;
    default:
       assert(0);
       return 0;
@@ -435,6 +436,14 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)
       return default_rgba_format( screen, surfType );
 
    case GL_YCBCR_MESA:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_YCBCR,
+                                      PIPE_TEXTURE)) {
+         return PIPE_FORMAT_YCBCR;
+      }
+      if (screen->is_format_supported(screen, PIPE_FORMAT_YCBCR_REV,
+                                      PIPE_TEXTURE)) {
+         return PIPE_FORMAT_YCBCR_REV;
+      }
       return PIPE_FORMAT_NONE;
 
    case GL_RGB_S3TC: