gallivm: Make it possible to disable some optimization shortcuts in release builds
authorGert Wollny <gert.wollny@collabora.com>
Fri, 5 Oct 2018 13:08:51 +0000 (15:08 +0200)
committerGert Wollny <gw.fossdev@gmail.com>
Sat, 6 Oct 2018 11:12:48 +0000 (13:12 +0200)
For testing it is of interest that all tests of dEQP pass, e.g. to test
virglrenderer on a host only providing software rendering like in a CI.
Hence make it possible to disable certain optimizations that make tests fail.

While we are there also add some documentation to the flags to make it clear
that this is opt-out.

Setting the environment variable "GALLIVM_PERF=no_filter_hacks" can be used to make
the following tests pass in release mode:

  dEQP-GLES2.functional.texture.mipmap.2d.affine.*_linear_*
  dEQP-GLES2.functional.texture.mipmap.cube.generate.*
  dEQP-GLES2.functional.texture.vertex.2d.filtering.*_mipmap_linear_*
  dEQP-GLES2.functional.texture.vertex.2d.wrap.*

Related:
  https://bugs.freedesktop.org/show_bug.cgi?id=94957

v2: rename optimization disabling flag to 'safemath' and also move the
    nopt flag to the perf flags.

v3: rename flag "safemath" to "no_filter_hacks" since safemath is usually
    associated with floating point operations (Roland)

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_debug.h
src/gallium/auxiliary/gallivm/lp_bld_init.c
src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c

index f96a1afa7aa58295b897efb45a20392d60492c04..eeef0d6ba61252a0d64c881eea91b86c77e587fe 100644 (file)
 #define GALLIVM_DEBUG_TGSI          (1 << 0)
 #define GALLIVM_DEBUG_IR            (1 << 1)
 #define GALLIVM_DEBUG_ASM           (1 << 2)
-#define GALLIVM_DEBUG_NO_OPT        (1 << 3)
-#define GALLIVM_DEBUG_PERF          (1 << 4)
-#define GALLIVM_DEBUG_NO_BRILINEAR  (1 << 5)
-#define GALLIVM_DEBUG_NO_RHO_APPROX (1 << 6)
-#define GALLIVM_DEBUG_NO_QUAD_LOD   (1 << 7)
-#define GALLIVM_DEBUG_GC            (1 << 8)
-#define GALLIVM_DEBUG_DUMP_BC       (1 << 9)
+#define GALLIVM_DEBUG_PERF          (1 << 3)
+#define GALLIVM_DEBUG_GC            (1 << 4)
+#define GALLIVM_DEBUG_DUMP_BC       (1 << 5)
 
+#define GALLIVM_PERF_NO_BRILINEAR  (1 << 0)
+#define GALLIVM_PERF_NO_RHO_APPROX (1 << 1)
+#define GALLIVM_PERF_NO_QUAD_LOD   (1 << 2)
+#define GALLIVM_PERF_NO_OPT        (1 << 3)
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 
+extern unsigned gallivm_perf;
+
 #ifdef DEBUG
 extern unsigned gallivm_debug;
 #else
index 1f0a01cde6717ade94d243acb9ae7d2215367e8a..e8bca5bc3afce7210149cb5b100efd99ea1814c3 100644 (file)
@@ -59,6 +59,17 @@ static const bool use_mcjit = USE_MCJIT;
 static bool use_mcjit = FALSE;
 #endif
 
+unsigned gallivm_perf = 0;
+
+static const struct debug_named_value lp_bld_perf_flags[] = {
+   { "no_brilinear", GALLIVM_PERF_NO_BRILINEAR, "disable brilinear optimization" },
+   { "no_rho_approx", GALLIVM_PERF_NO_RHO_APPROX, "disable rho_approx optimization" },
+   { "no_quad_lod", GALLIVM_PERF_NO_QUAD_LOD, "disable quad_lod optimization" },
+   { "nopt",   GALLIVM_PERF_NO_OPT, "disable optimization passes to speed up shader compilation" },
+   { "no_filter_hacks", GALLIVM_PERF_NO_BRILINEAR | GALLIVM_PERF_NO_RHO_APPROX |
+     GALLIVM_PERF_NO_QUAD_LOD, "disable filter optimization hacks" },
+   DEBUG_NAMED_VALUE_END
+};
 
 #ifdef DEBUG
 unsigned gallivm_debug = 0;
@@ -67,11 +78,7 @@ static const struct debug_named_value lp_bld_debug_flags[] = {
    { "tgsi",   GALLIVM_DEBUG_TGSI, NULL },
    { "ir",     GALLIVM_DEBUG_IR, NULL },
    { "asm",    GALLIVM_DEBUG_ASM, NULL },
-   { "nopt",   GALLIVM_DEBUG_NO_OPT, NULL },
    { "perf",   GALLIVM_DEBUG_PERF, NULL },
-   { "no_brilinear", GALLIVM_DEBUG_NO_BRILINEAR, NULL },
-   { "no_rho_approx", GALLIVM_DEBUG_NO_RHO_APPROX, NULL },
-   { "no_quad_lod", GALLIVM_DEBUG_NO_QUAD_LOD, NULL },
    { "gc",     GALLIVM_DEBUG_GC, NULL },
    { "dumpbc", GALLIVM_DEBUG_DUMP_BC, NULL },
    DEBUG_NAMED_VALUE_END
@@ -136,7 +143,7 @@ create_pass_manager(struct gallivm_state *gallivm)
       free(td_str);
    }
 
-   if ((gallivm_debug & GALLIVM_DEBUG_NO_OPT) == 0) {
+   if ((gallivm_perf & GALLIVM_PERF_NO_OPT) == 0) {
       /*
        * TODO: Evaluate passes some more - keeping in mind
        * both quality of generated code and compile times.
@@ -240,7 +247,7 @@ init_gallivm_engine(struct gallivm_state *gallivm)
       char *error = NULL;
       int ret;
 
-      if (gallivm_debug & GALLIVM_DEBUG_NO_OPT) {
+      if (gallivm_perf & GALLIVM_PERF_NO_OPT) {
          optlevel = None;
       }
       else {
@@ -420,6 +427,8 @@ lp_build_init(void)
    gallivm_debug = debug_get_option_gallivm_debug();
 #endif
 
+   gallivm_perf = debug_get_flags_option("GALLIVM_PERF", lp_bld_perf_flags, 0 );
+
    lp_set_target_options();
 
    util_cpu_detect();
@@ -589,10 +598,10 @@ gallivm_compile_module(struct gallivm_state *gallivm)
       LLVMWriteBitcodeToFile(gallivm->module, filename);
       debug_printf("%s written\n", filename);
       debug_printf("Invoke as \"opt %s %s | llc -O%d %s%s\"\n",
-                   gallivm_debug & GALLIVM_DEBUG_NO_OPT ? "-mem2reg" :
+                   gallivm_debug & GALLIVM_PERF_NO_OPT ? "-mem2reg" :
                    "-sroa -early-cse -simplifycfg -reassociate "
                    "-mem2reg -constprop -instcombine -gvn",
-                   filename, gallivm_debug & GALLIVM_DEBUG_NO_OPT ? 0 : 2,
+                   filename, gallivm_debug & GALLIVM_PERF_NO_OPT ? 0 : 2,
                    (HAVE_LLVM >= 0x0305) ? "[-mcpu=<-mcpu option>] " : "",
                    "[-mattr=<-mattr option(s)>]");
    }
index 8f760f59fed3ad21a8927337da37298addd79f46..018cca8f9dfa48757ac5f4f815c63762f0cf87c3 100644 (file)
@@ -2825,13 +2825,13 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
    bld.format_desc = util_format_description(static_texture_state->format);
    bld.dims = dims;
 
-   if (gallivm_debug & GALLIVM_DEBUG_NO_QUAD_LOD || op_is_lodq) {
+   if (gallivm_perf & GALLIVM_PERF_NO_QUAD_LOD || op_is_lodq) {
       bld.no_quad_lod = TRUE;
    }
-   if (gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX || op_is_lodq) {
+   if (gallivm_perf & GALLIVM_PERF_NO_RHO_APPROX || op_is_lodq) {
       bld.no_rho_approx = TRUE;
    }
-   if (gallivm_debug & GALLIVM_DEBUG_NO_BRILINEAR || op_is_lodq) {
+   if (gallivm_perf & GALLIVM_PERF_NO_BRILINEAR || op_is_lodq) {
       bld.no_brilinear = TRUE;
    }
 
index 79ece639e35539eeb897a36530126c663dfa73e6..5fecad4ea675572fa9e7386bc5940cac6eb3503e 100644 (file)
@@ -2037,7 +2037,7 @@ lp_build_lod_property(
       lod_property = LP_SAMPLER_LOD_SCALAR;
    }
    else if (bld_base->info->processor == PIPE_SHADER_FRAGMENT) {
-      if (gallivm_debug & GALLIVM_DEBUG_NO_QUAD_LOD) {
+      if (gallivm_perf & GALLIVM_PERF_NO_QUAD_LOD) {
          lod_property = LP_SAMPLER_LOD_PER_ELEMENT;
       }
       else {
@@ -2225,7 +2225,7 @@ emit_tex( struct lp_build_tgsi_soa_context *bld,
        * cases exist in practice.
        */
       if (bld->bld_base.info->processor == PIPE_SHADER_FRAGMENT) {
-         if (gallivm_debug & GALLIVM_DEBUG_NO_QUAD_LOD) {
+         if (gallivm_perf & GALLIVM_PERF_NO_QUAD_LOD) {
             lod_property = LP_SAMPLER_LOD_PER_ELEMENT;
          }
          else {
@@ -2394,7 +2394,7 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
        * cases exist in practice.
        */
       if (bld->bld_base.info->processor == PIPE_SHADER_FRAGMENT) {
-         if (gallivm_debug & GALLIVM_DEBUG_NO_QUAD_LOD) {
+         if (gallivm_perf & GALLIVM_PERF_NO_QUAD_LOD) {
             lod_property = LP_SAMPLER_LOD_PER_ELEMENT;
          }
          else {