Mesa (main): virgl: Disable nir_op_ffloor to avoid sending DFLR to virglrenderer.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 8 17:47:05 UTC 2022


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

Author: Emma Anholt <emma at anholt.net>
Date:   Mon Mar 28 16:48:31 2022 -0700

virgl: Disable nir_op_ffloor to avoid sending DFLR to virglrenderer.

This means that we send ffract+fsub in place of a normal FLR, but
hopefully virglrenderer can be fixed (or doubles support removed).

Reviewed-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15825>

---

 src/gallium/drivers/virgl/tests/meson.build |  2 +-
 src/gallium/drivers/virgl/virgl_screen.c    | 22 +++++++++++++++++++++-
 src/gallium/drivers/virgl/virgl_screen.h    |  3 +++
 src/gallium/winsys/virgl/drm/meson.build    |  2 +-
 4 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/virgl/tests/meson.build b/src/gallium/drivers/virgl/tests/meson.build
index d047bdc94e6..a41fcc0781e 100644
--- a/src/gallium/drivers/virgl/tests/meson.build
+++ b/src/gallium/drivers/virgl/tests/meson.build
@@ -23,7 +23,7 @@ test(
   executable(
     'virgl_staging_mgr_test',
     files('virgl_staging_mgr_test.cpp'),
-    dependencies : [dep_thread, idep_gtest, idep_mesautil],
+    dependencies : [dep_thread, idep_gtest, idep_mesautil, idep_nir_headers],
     include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_virtio, include_directories('..')],
     link_with : [libvirgl, libgallium],
   ),
diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
index d4024994575..17f9b58a7a1 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -1011,6 +1011,16 @@ fixup_renderer(union virgl_caps *caps)
    memcpy(caps->v2.renderer, renderer, renderer_len + 1);
 }
 
+static const void *
+virgl_get_compiler_options(struct pipe_screen *pscreen,
+                           enum pipe_shader_ir ir,
+                           unsigned shader)
+{
+   struct virgl_screen *vscreen = virgl_screen(pscreen);
+
+   return &vscreen->compiler_options;
+}
+
 struct pipe_screen *
 virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *config)
 {
@@ -1051,7 +1061,7 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c
    screen->base.get_shader_param = virgl_get_shader_param;
    screen->base.get_compute_param = virgl_get_compute_param;
    screen->base.get_paramf = virgl_get_paramf;
-   screen->base.get_compiler_options = nir_to_tgsi_get_compiler_options;
+   screen->base.get_compiler_options = virgl_get_compiler_options;
    screen->base.is_format_supported = virgl_is_format_supported;
    screen->base.destroy = virgl_destroy_screen;
    screen->base.context_create = virgl_context_create;
@@ -1078,6 +1088,16 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c
    screen->tweak_gles_emulate_bgra &= !virgl_format_check_bitmask(PIPE_FORMAT_B8G8R8A8_SRGB, caps->v1.render.bitmask, false);
    screen->refcnt = 1;
 
+   /* Set up the NIR shader compiler options now that we've figured out the caps. */
+   screen->compiler_options = *(nir_shader_compiler_options *)
+      nir_to_tgsi_get_compiler_options(&screen->base, PIPE_SHADER_IR_NIR, PIPE_SHADER_FRAGMENT);
+   if (virgl_get_param(&screen->base, PIPE_CAP_DOUBLES)) {
+      /* virglrenderer is missing DFLR support, so avoid turning 64-bit
+       * ffract+fsub back into ffloor.
+       */
+      screen->compiler_options.lower_ffloor = true;
+   }
+
    slab_create_parent(&screen->transfer_pool, sizeof(struct virgl_transfer), 16);
 
    virgl_disk_cache_create(screen);
diff --git a/src/gallium/drivers/virgl/virgl_screen.h b/src/gallium/drivers/virgl/virgl_screen.h
index ed12dec4f09..90bcaba8846 100644
--- a/src/gallium/drivers/virgl/virgl_screen.h
+++ b/src/gallium/drivers/virgl/virgl_screen.h
@@ -27,6 +27,7 @@
 #include "util/slab.h"
 #include "util/disk_cache.h"
 #include "virgl_winsys.h"
+#include "compiler/nir/nir.h"
 
 enum virgl_debug_flags {
    VIRGL_DEBUG_VERBOSE              = 1 << 0,
@@ -63,6 +64,8 @@ struct virgl_screen {
    bool no_coherent;
    int32_t tweak_gles_tf3_value;
 
+   nir_shader_compiler_options compiler_options;
+
    struct disk_cache *disk_cache;
 };
 
diff --git a/src/gallium/winsys/virgl/drm/meson.build b/src/gallium/winsys/virgl/drm/meson.build
index d4decb0cfbe..79bac2fd211 100644
--- a/src/gallium/winsys/virgl/drm/meson.build
+++ b/src/gallium/winsys/virgl/drm/meson.build
@@ -22,6 +22,6 @@ libvirgldrm = static_library(
   'virgldrm',
   'virgl_drm_winsys.c',
   include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_gallium_drivers, inc_virtio],
-  dependencies : [dep_libdrm, dep_libvirglcommon, idep_mesautil],
+  dependencies : [dep_libdrm, dep_libvirglcommon, idep_mesautil, idep_nir_headers],
   gnu_symbol_visibility : 'hidden',
 )



More information about the mesa-commit mailing list