Mesa (master): softpipe: More accurate softpipe_is_format_supported().

Jose Fonseca jrfonseca at kemper.freedesktop.org
Sun Apr 25 14:59:13 UTC 2010


Module: Mesa
Branch: master
Commit: 7e4ce65d714624d5d2888c59f0d83ffda0662834
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7e4ce65d714624d5d2888c59f0d83ffda0662834

Author: José Fonseca <jfonseca at vmware.com>
Date:   Sun Apr 25 14:51:33 2010 +0100

softpipe: More accurate softpipe_is_format_supported().

Unfortunately there are some heavy limitations on supported render target
formats due to the way clear values are used internally.

---

 src/gallium/drivers/softpipe/sp_screen.c |   74 ++++++++++++++++++++++--------
 1 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
index 8406aa1..11aa0c4 100644
--- a/src/gallium/drivers/softpipe/sp_screen.c
+++ b/src/gallium/drivers/softpipe/sp_screen.c
@@ -27,6 +27,7 @@
 
 
 #include "util/u_memory.h"
+#include "util/u_format.h"
 #include "util/u_format_s3tc.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_screen.h"
@@ -144,42 +145,77 @@ static boolean
 softpipe_is_format_supported( struct pipe_screen *screen,
                               enum pipe_format format, 
                               enum pipe_texture_target target,
-                              unsigned tex_usage, 
+                              unsigned bind,
                               unsigned geom_flags )
 {
    struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
+   const struct util_format_description *format_desc;
 
    assert(target == PIPE_TEXTURE_1D ||
           target == PIPE_TEXTURE_2D ||
           target == PIPE_TEXTURE_3D ||
           target == PIPE_TEXTURE_CUBE);
 
-   switch(format) {
-   case PIPE_FORMAT_DXT1_RGB:
-   case PIPE_FORMAT_DXT1_RGBA:
-   case PIPE_FORMAT_DXT3_RGBA:
-   case PIPE_FORMAT_DXT5_RGBA:
-      if (tex_usage & PIPE_BIND_RENDER_TARGET)
+   format_desc = util_format_description(format);
+   if (!format_desc)
+      return FALSE;
+
+   if (bind & (PIPE_BIND_DISPLAY_TARGET |
+               PIPE_BIND_SCANOUT |
+               PIPE_BIND_SHARED)) {
+      if(!winsys->is_displaytarget_format_supported(winsys, bind, format))
          return FALSE;
-      else
-         return util_format_s3tc_enabled;
+   }
 
-   case PIPE_FORMAT_Z32_FLOAT:
-   case PIPE_FORMAT_NONE:
-      return FALSE;
+   if (bind & PIPE_BIND_RENDER_TARGET) {
+      if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS)
+         return FALSE;
 
-   default:
-      break;
+      /*
+       * Although possible, it is unnatural to render into compressed or YUV
+       * surfaces. So disable these here to avoid going into weird paths
+       * inside the state trackers.
+       */
+      if (format_desc->block.width != 1 ||
+          format_desc->block.height != 1)
+         return FALSE;
+
+      /*
+       * TODO: Unfortunately we cannot render into anything more than 32 bits
+       * because we encode color clear values into a 32bit word.
+       */
+      if (format_desc->block.bits > 32)
+         return FALSE;
    }
 
-   if(tex_usage & (PIPE_BIND_DISPLAY_TARGET |
-                   PIPE_BIND_SCANOUT |
-                   PIPE_BIND_SHARED)) {
-      if(!winsys->is_displaytarget_format_supported(winsys, tex_usage, format))
+   if (bind & PIPE_BIND_DEPTH_STENCIL) {
+      if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
          return FALSE;
+
+      /*
+       * TODO: Unfortunately we cannot render into anything more than 32 bits
+       * because we encode depth and stencil clear values into a 32bit word.
+       */
+      if (format_desc->block.bits > 32)
+         return FALSE;
+
+      /*
+       * TODO: eliminate this restriction
+       */
+      if (format == PIPE_FORMAT_Z32_FLOAT)
+         return FALSE;
+   }
+
+   /*
+    * All other operations (sampling, transfer, etc).
+    */
+
+   if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
+      return util_format_s3tc_enabled;
    }
 
-   /* XXX: this is often a lie.  Pull in logic from llvmpipe to fix.
+   /*
+    * Everything else should be supported by u_format.
     */
    return TRUE;
 }




More information about the mesa-commit mailing list