From 0a763c0c86bb9845c2eac9726690d83b82d46978 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 5 Aug 2020 09:56:52 -0700 Subject: [PATCH] glsl/lower_precision: split out const lowering MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Some hw can narrow 32b const/uniform to 16b on load.. and in particular lowering constants to 16b would break const->uniform lowering. Allow them to lower temps to 16b, while skipping consts. Initially it is set to the same value as LowerPrecisionTemporaries, to preserve the current behavior. Signed-off-by: Rob Clark Reviewed-by: Alyssa Rosenzweig Reviewed-by: Marek Olšák Reviewed-by: Eric Anholt Part-of: --- src/compiler/glsl/lower_precision.cpp | 4 ++++ src/compiler/glsl/standalone.cpp | 1 + src/mesa/main/mtypes.h | 7 +++++++ src/mesa/state_tracker/st_extensions.c | 1 + 4 files changed, 13 insertions(+) diff --git a/src/compiler/glsl/lower_precision.cpp b/src/compiler/glsl/lower_precision.cpp index 1f116cd..07798f3 100644 --- a/src/compiler/glsl/lower_precision.cpp +++ b/src/compiler/glsl/lower_precision.cpp @@ -1028,6 +1028,8 @@ lower_variables_visitor::visit(ir_variable *var) /* Lower constant initializers. */ if (var->constant_value && var->type == var->constant_value->type) { + if (!options->LowerPrecisionConstants) + return visit_continue; var->constant_value = var->constant_value->clone(ralloc_parent(var), NULL); lower_constant(var->constant_value); @@ -1035,6 +1037,8 @@ lower_variables_visitor::visit(ir_variable *var) if (var->constant_initializer && var->type == var->constant_initializer->type) { + if (!options->LowerPrecisionConstants) + return visit_continue; var->constant_initializer = var->constant_initializer->clone(ralloc_parent(var), NULL); lower_constant(var->constant_initializer); diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp index f0305f7..c1510d5 100644 --- a/src/compiler/glsl/standalone.cpp +++ b/src/compiler/glsl/standalone.cpp @@ -442,6 +442,7 @@ standalone_compile_shader(const struct standalone_options *_options, options->LowerPrecisionInt16 = true; options->LowerPrecisionDerivatives = true; options->LowerPrecisionTemporaries = true; + options->LowerPrecisionConstants = true; } } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index a6af3fb..1df6d34 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3211,6 +3211,13 @@ struct gl_shader_compiler_options GLboolean LowerPrecisionDerivatives; /** + * This enables lowering of 16b constants. Some drivers may not + * to lower constants to 16b (ie. if the hw can do automatic + * narrowing on constant load) + */ + GLboolean LowerPrecisionConstants; + + /** * This enables 16-bit phis in NIR, 16-bit loop counters, 16-bit indirect * arrays, etc. */ diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index e39ee75..331df12 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -348,6 +348,7 @@ void st_init_limits(struct pipe_screen *screen, screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_INT16); options->LowerPrecisionTemporaries = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_GLSL_16BIT_TEMPS); + options->LowerPrecisionConstants = options->LowerPrecisionTemporaries; } c->MaxUserAssignableUniformLocations = -- 2.7.4