From b18374002e5b1bb6aba917b9330204828aecff45 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Mon, 28 Mar 2022 16:48:31 -0700 Subject: [PATCH] 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 Part-of: --- 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', )