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