softpipe: don't use 3-component formats
authorBrian Paul <brianp@vmware.com>
Tue, 28 Jul 2015 21:59:36 +0000 (15:59 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 10 Jun 2016 21:50:04 +0000 (15:50 -0600)
Mesa and gallium don't have a complete set of matching 3-component
texture formats.  For example, 8-bit sRGB unorm.  To fully support
the GL_ARB_copy_image extension we need to have support for all of
these formats: RGB8_UNORM, RGB8_SNORM, RGB8_SRGB, RGB8_UINT, and
RGB8_SINT using the same component order.  Since we don't have that,
disable the 3-component formats for now.

v2: Simplify 3-component format check, per Marek.
Also check that target != PIPE_BUFFER.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/softpipe/sp_screen.c

index 0c87f6902cff7d1a2fa3186d58cd71002c3b25c5..e74f2d2f127ce9f3518e0d1b54395e50094d7e42 100644 (file)
@@ -396,6 +396,24 @@ softpipe_is_format_supported( struct pipe_screen *screen,
       return FALSE;
    }
 
+   if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) &&
+       ((bind & PIPE_BIND_DISPLAY_TARGET) == 0) &&
+       target != PIPE_BUFFER) {
+      const struct util_format_description *desc =
+         util_format_description(format);
+      if (desc->nr_channels == 3 && desc->is_array) {
+         /* Don't support any 3-component formats for rendering/texturing
+          * since we don't support the corresponding 8-bit 3 channel UNORM
+          * formats.  This allows us to support GL_ARB_copy_image between
+          * GL_RGB8 and GL_RGB8UI, for example.  Otherwise, we may be asked to
+          * do a resource copy between PIPE_FORMAT_R8G8B8_UINT and
+          * PIPE_FORMAT_R8G8B8X8_UNORM, for example, which will not work
+          * (different bpp).
+          */
+         return FALSE;
+      }
+   }
+
    if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC &&
        format != PIPE_FORMAT_ETC1_RGB8)
       return FALSE;