Mesa (master): virgl: Add driconf tweak for emulating BGRA surfaces on GLES

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 20 07:18:47 UTC 2019


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

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Mon May 27 16:31:17 2019 +0200

virgl: Add driconf tweak for emulating BGRA surfaces on GLES

These tweaks are used to fix rendering issues with Valve games and
at least also "The Raven Remastered" when run on a GLES host.

v2: Fix type in define and remove virgl from driconf option (Emil)
v3: Encode tweak binary instead of using strings (Gurchetan)

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh at chromium.org>

---

 src/gallium/drivers/virgl/virgl_context.c  |  2 ++
 src/gallium/drivers/virgl/virgl_protocol.h |  1 +
 src/gallium/drivers/virgl/virgl_screen.c   |  7 +++++++
 src/util/00-mesa-defaults.conf             | 28 +++++++++++++++++++++++++++-
 src/util/xmlpool/t_options.h               |  7 +++++++
 5 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c
index cd653b70ce9..3ce131a1e06 100644
--- a/src/gallium/drivers/virgl/virgl_context.c
+++ b/src/gallium/drivers/virgl/virgl_context.c
@@ -1404,6 +1404,8 @@ static void virgl_get_sample_position(struct pipe_context *ctx,
 
 static void virgl_send_tweaks(struct virgl_context *vctx, struct virgl_screen *rs)
 {
+   if (rs->tweak_gles_emulate_bgra)
+      virgl_encode_tweak(vctx, virgl_tweak_gles_brga_emulate, 1);
 }
 
 struct pipe_context *virgl_context_create(struct pipe_screen *pscreen,
diff --git a/src/gallium/drivers/virgl/virgl_protocol.h b/src/gallium/drivers/virgl/virgl_protocol.h
index c3ad598601d..71d1703cada 100644
--- a/src/gallium/drivers/virgl/virgl_protocol.h
+++ b/src/gallium/drivers/virgl/virgl_protocol.h
@@ -592,6 +592,7 @@ enum virgl_context_cmd {
 #define VIRGL_SET_TWEAKS_VALUE 2
 
 enum vrend_tweak_type {
+   virgl_tweak_gles_brga_emulate,
    virgl_tweak_undefined
 };
 
diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
index 31de32f9289..54bde6f1237 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -27,6 +27,7 @@
 #include "util/u_video.h"
 #include "util/u_math.h"
 #include "util/os_time.h"
+#include "util/xmlconfig.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_screen.h"
 
@@ -36,6 +37,7 @@
 #include "virgl_resource.h"
 #include "virgl_public.h"
 #include "virgl_context.h"
+#include "virgl_protocol.h"
 
 int virgl_debug = 0;
 static const struct debug_named_value debug_options[] = {
@@ -852,11 +854,16 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c
 {
    struct virgl_screen *screen = CALLOC_STRUCT(virgl_screen);
 
+   const char *VIRGL_GLES_EMULATE_BGRA = "gles_emulate_bgra";
    if (!screen)
       return NULL;
 
    virgl_debug = debug_get_option_virgl_debug();
 
+   if (config && config->options) {
+      screen->tweak_gles_emulate_bgra =
+            driQueryOptionb(config->options, VIRGL_GLES_EMULATE_BGRA);
+   }
    screen->vws = vws;
    screen->base.get_name = virgl_get_name;
    screen->base.get_vendor = virgl_get_vendor;
diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf
index e36190f61c8..ae29d8837d5 100644
--- a/src/util/00-mesa-defaults.conf
+++ b/src/util/00-mesa-defaults.conf
@@ -490,4 +490,30 @@ TODO: document the other workarounds.
             <option name="radeonsi_prim_restart_tri_strips_only" value="true"/>
         </application>
     </device>
-  </driconf>
+    <device driver="virtio_gpu">
+        <!-- Some Valve games do a final blit to a BRGA_sRGB surface. On a GLES
+        host this format is not supported and the blit will go to BGRA_UNORM
+        resulting in an unintended linearization and the final output being
+        too dark. -->
+        <application name="Half Life 2" executable="hl2_linux">
+            <option name="gles_emulate_bgra" value="true" />
+        </application>
+        <application name="Portal" executable="hl2_linux">
+            <option name="gles_emulate_bgra" value="true" />
+        </application>
+        <application name="Left 4 Dead 2" executable="hl2_linux">
+            <option name="gles_emulate_bgra" value="true" />
+        </application>
+        <application name="Dota 2" executable="dota2">
+            <option name="gles_emulate_bgra" value="true" />
+        </application>
+        <!-- The Raven Remastered expects a BGRA_sRGB surface and a BGRA_sRGB
+         surface that is capable to do texture views, since on GLES the BGRA
+         format provided by EXT_texture_BGRA8888 has no sRGB counterpart and
+         is not in the list of suppoerted TextureView formats we need to
+         emulate this  -->
+        <application name="The Raven Remastered" executable="Raven">
+            <option name="gles_emulate_bgra" value="true" />
+        </application>
+    </device>
+</driconf>
diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h
index 4396ba79f79..e43692c8ef9 100644
--- a/src/util/xmlpool/t_options.h
+++ b/src/util/xmlpool/t_options.h
@@ -361,5 +361,12 @@ DRI_CONF_OPT_END
 #define DRI_CONF_V3D_NONMSAA_TEXTURE_SIZE_LIMIT(def) \
 DRI_CONF_OPT_BEGIN_B(v3d_nonmsaa_texture_size_limit, def) \
         DRI_CONF_DESC(en,"Report the non-MSAA-only texture size limit") \
+/**
+ * \brief virgl specific configuration options
+ */
+
+#define DRI_CONF_GLES_EMULATE_BGRA(def) \
+DRI_CONF_OPT_BEGIN_B(gles_emulate_bgra, def) \
+        DRI_CONF_DESC(en,gettext("On GLES emulate BGRA formats by using a swizzled RGBA format")) \
 DRI_CONF_OPT_END
 




More information about the mesa-commit mailing list