st/mesa: Fall back to R8G8B8A8_SRGB for ETC2
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Fri, 22 Jun 2018 13:59:09 +0000 (15:59 +0200)
committerGert Wollny <gw.fossdev@gmail.com>
Mon, 2 Jul 2018 07:33:41 +0000 (09:33 +0200)
If the driver doesn't support PIPE_FORMAT_B8G8R8A8_SRGB, fall back to
PIPE_FORMAT_R8G8B8A8_SRGB.

Drivers such as Virgl will have a hard time supporting
PIPE_FORMAT_B8G8R8A8_SRGB when the host runs GLES, as GL_BGRA isn't as
well suported there.

So go with PIPE_FORMAT_R8G8B8A8_SRGB so these drivers can avoid a
conversion copy.

v2: Fix typo in commit message

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_format.c

index 418f5342025c7758fb89fc6c1556eb2b6d04c1ec..9ae796eca9eb1565e7bfcb3a0f3ea297451525f6 100644 (file)
@@ -61,6 +61,12 @@ enum pipe_format
 st_mesa_format_to_pipe_format(const struct st_context *st,
                               mesa_format mesaFormat)
 {
+   struct pipe_screen *screen = st->pipe->screen;
+   bool has_bgra_srgb = screen->is_format_supported(screen,
+                                                   PIPE_FORMAT_B8G8R8A8_SRGB,
+                                                   PIPE_TEXTURE_2D, 0,
+                                                   PIPE_BIND_SAMPLER_VIEW);
+
    switch (mesaFormat) {
    case MESA_FORMAT_A8B8G8R8_UNORM:
       return PIPE_FORMAT_ABGR8888_UNORM;
@@ -458,11 +464,13 @@ st_mesa_format_to_pipe_format(const struct st_context *st,
    case MESA_FORMAT_ETC2_RGB8:
       return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
    case MESA_FORMAT_ETC2_SRGB8:
-      return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 : PIPE_FORMAT_B8G8R8A8_SRGB;
+      return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 :
+        has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
    case MESA_FORMAT_ETC2_RGBA8_EAC:
       return st->has_etc2 ? PIPE_FORMAT_ETC2_RGBA8 : PIPE_FORMAT_R8G8B8A8_UNORM;
    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
-      return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 : PIPE_FORMAT_B8G8R8A8_SRGB;
+      return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 :
+        has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
    case MESA_FORMAT_ETC2_R11_EAC:
       return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_UNORM : PIPE_FORMAT_R16_UNORM;
    case MESA_FORMAT_ETC2_RG11_EAC:
@@ -474,7 +482,8 @@ st_mesa_format_to_pipe_format(const struct st_context *st,
    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
       return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8A1 : PIPE_FORMAT_R8G8B8A8_UNORM;
    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
-      return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 : PIPE_FORMAT_B8G8R8A8_SRGB;
+      return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 :
+        has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
 
    case MESA_FORMAT_RGBA_ASTC_4x4:
       return PIPE_FORMAT_ASTC_4x4;