svga: fix format for screen target
authorCharmaine Lee <charmainel@vmware.com>
Tue, 18 Apr 2017 22:55:59 +0000 (15:55 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 26 Apr 2017 17:37:59 +0000 (11:37 -0600)
This patch revises the fix in commit 606f13afa31c9f041a68eb22cc32112ce813f944
to properly translate the surface format for screen target.
Instead of changing the svga format for PIPE_FORMAT_B5G6R5_UNORM
to SVGA3D_R5G6B5 for all texture surfaces, this patch only restricts
SVGA3D_R5G6B5 for screen target surfaces. This avoids rendering
failures when specify a non-vgpu10 format in a vgpu10 context with
software renderer.

Fixes piglit failures spec@!opengl 1.1@draw-pixels,
                      spec@!opengl 1.1@teximage-colors gl_r3_g3_b2
                      spec@!opengl 1.1@texwrap formats

Tested Xorg with 16bits depth.
Also tested with MTT piglit, MTT glretrace.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/svga_format.c

index 29692599f6865c512eaffd7517ccd32d49a3eaa4..7d970be4e5e7583f98e13574f34ca6bf35272df6 100644 (file)
@@ -376,6 +376,29 @@ svga_translate_vertex_format_vgpu10(enum pipe_format format,
 }
 
 
+/**
+ * Translate a gallium scanout format to a svga format valid
+ * for screen target surface.
+ */
+static SVGA3dSurfaceFormat
+svga_translate_screen_target_format_vgpu10(enum pipe_format format)
+{
+   switch (format) {
+   case PIPE_FORMAT_B8G8R8A8_UNORM:
+      return SVGA3D_B8G8R8A8_UNORM;
+   case PIPE_FORMAT_B8G8R8X8_UNORM:
+      return SVGA3D_B8G8R8X8_UNORM;
+   case PIPE_FORMAT_B5G6R5_UNORM:
+      return SVGA3D_R5G6B5;
+   case PIPE_FORMAT_B5G5R5A1_UNORM:
+      return SVGA3D_A1R5G5B5;
+   default:
+      debug_printf("Invalid format %s specified for screen target\n",
+                   svga_format_name(format));
+      return SVGA3D_FORMAT_INVALID;
+   }
+}
+
 /*
  * Translate from gallium format to SVGA3D format.
  */
@@ -388,6 +411,9 @@ svga_translate_format(const struct svga_screen *ss,
       if (bind & (PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER)) {
          return format_conversion_table[format].vertex_format;
       }
+      else if (bind & PIPE_BIND_SCANOUT) {
+         return svga_translate_screen_target_format_vgpu10(format);
+      }
       else {
          return format_conversion_table[format].pixel_format;
       }