[Mesa-dev] [PATCH v2] gallivm: Make it possible to disable some optimization shortcuts in release builds

Gert Wollny gw.fossdev at gmail.com
Sat Oct 6 10:31:23 UTC 2018


Am Freitag, den 05.10.2018, 21:46 +0000 schrieb Roland Scheidegger:
> Looks alright to me. I'm not quite sold on the "safemath" name
> though, since "safe math" is usually associated with floating point 
> optimizations, and this here is just filtering hacks. Maybe
> something like disable_filtering_hacks would be more fitting?
I think I'll push a shorter version: "no_filter_hacks"

best, 
Gert 
> 
> Reviewed-by: Roland Scheidegger <sroland at vmware.com>
> 
> On 10/05/2018 06:08 AM, Gert Wollny wrote:
> > From: Gert Wollny <gert.wollny at collabora.com>
> > 
> > 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=disable_all" 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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2
> > Fbugs.freedesktop.org%2Fshow_bug.cgi%3Fid%3D94957&data=02%7C01%
> > 7Csroland%40vmware.com%7Cca786b57a0ab40daeddd08d62ac3e86d%7Cb39138c
> > a3cee4b4aa4d6cd83d9dd62f0%7C1%7C0%7C636743418250432350&sdata=cz
> > SAaylr1oCdY5lsPRxB7EsVb6mPhMU2e1t1ZuhYnYk%3D&reserved=0
> > 
> > v2: rename optimization disabling flag to 'safemath' and also move
> > the
> >      nopt flag to the perf flags.
> > 
> > Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> > ---
> >   src/gallium/auxiliary/gallivm/lp_bld_debug.h      | 16 ++++++++
> > -------
> >   src/gallium/auxiliary/gallivm/lp_bld_init.c       | 25
> > +++++++++++++++--------
> >   src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c |  6 +++---
> >   src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c   |  6 +++---
> >   4 files changed, 32 insertions(+), 21 deletions(-)
> > 
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> > b/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> > index f96a1afa7a..eeef0d6ba6 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> > @@ -39,20 +39,22 @@
> >   #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
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c
> > b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> > index 1f0a01cde6..3f7c4d3154 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> > @@ -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" },
> > +   { "safemath", GALLIVM_PERF_NO_BRILINEAR |
> > GALLIVM_PERF_NO_RHO_APPROX |
> > +     GALLIVM_PERF_NO_QUAD_LOD, "disable unsafe optimizations" },
> > +   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)>]");
> >      }
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > index 8f760f59fe..018cca8f9d 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > @@ -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;
> >      }
> >   
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > index 79ece639e3..5fecad4ea6 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > @@ -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 {
> > 
> 
> 


More information about the mesa-dev mailing list