virgl: Add code to accept BGRx_SRGB as RGBx_SRGB
authorGert Wollny <gert.wollny@collabora.com>
Mon, 27 May 2019 14:26:25 +0000 (16:26 +0200)
committerGert Wollny <gert.wollny@collabora.com>
Thu, 20 Jun 2019 06:50:38 +0000 (08:50 +0200)
This will be enabled in later patches by the emulation tweak.

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
src/gallium/drivers/virgl/virgl_screen.c
src/gallium/drivers/virgl/virgl_screen.h

index e8fbdac654456d7a96d4b729bb3318294b337353..1baea5d3f197b4b24ea97c98dc5cb4c3dbcd3c10 100644 (file)
@@ -595,13 +595,30 @@ virgl_is_vertex_format_supported(struct pipe_screen *screen,
 
 static boolean
 virgl_format_check_bitmask(enum pipe_format format,
-                           uint32_t bitmask[16])
+                           uint32_t bitmask[16],
+                           boolean may_emulate_bgra)
 {
    int big = format / 32;
    int small = format % 32;
    if ((bitmask[big] & (1 << small)))
       return TRUE;
 
+   /* On GLES hosts we don't advertise BGRx_SRGB, but we may be able
+    * emulate it by using a swizzled RGBx */
+   if (may_emulate_bgra) {
+      if (format == PIPE_FORMAT_B8G8R8A8_SRGB)
+         format = PIPE_FORMAT_R8G8B8A8_SRGB;
+      else if (format == PIPE_FORMAT_B8G8R8X8_SRGB)
+         format = PIPE_FORMAT_R8G8B8X8_SRGB;
+      else {
+         return FALSE;
+      }
+
+      big = format / 32;
+      small = format % 32;
+      if (bitmask[big] & (1 << small))
+         return TRUE;
+   }
    return FALSE;
 }
 
@@ -693,7 +710,8 @@ virgl_is_format_supported( struct pipe_screen *screen,
          return FALSE;
 
       if (!virgl_format_check_bitmask(format,
-                                      vscreen->caps.caps.v1.render.bitmask))
+                                      vscreen->caps.caps.v1.render.bitmask,
+                                      may_emulate_bgra))
          return FALSE;
    }
 
@@ -738,7 +756,8 @@ virgl_is_format_supported( struct pipe_screen *screen,
 
  out_lookup:
    return virgl_format_check_bitmask(format,
-                                     vscreen->caps.caps.v1.sampler.bitmask);
+                                     vscreen->caps.caps.v1.sampler.bitmask,
+                                     may_emulate_bgra);
 }
 
 static void virgl_flush_frontbuffer(struct pipe_screen *screen,
index 93b52b5138d7dab413a9ea45e863e25ac3fcc824..620014219368bbe4269cf9647821c50ded7aa7ec 100644 (file)
@@ -46,6 +46,7 @@ struct virgl_screen {
    struct slab_parent_pool transfer_pool;
 
    uint32_t sub_ctx_id;
+   bool tweak_gles_emulate_bgra;
 };