[Mesa-dev] [PATCH 6/6] glsl: Don't constant propagate arrays.
Timothy Arceri
timothy.arceri at collabora.com
Wed Jun 22 04:41:49 UTC 2016
Patches 3-6 are:
Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>
On Tue, 2016-06-21 at 20:02 -0700, Kenneth Graunke wrote:
> Constant propagation on arrays doesn't make a lot of sense. If the
> array is only accessed with constant indexes, then
> opt_array_splitting
> would split it up. Otherwise, we have variable indexing. If there's
> multiple accesses, then constant propagation would end up replicating
> the data.
>
> The lower_const_arrays_to_uniforms pass creates uniforms for each
> ir_constant with array type that it encounters. This means that it
> creates redundant uniforms for each copy of the constant, which means
> uploading too much data. It can even mean exceeding the maximum
> number
> of uniform components, causing link failures.
>
> We could try and teach the pass to de-duplicate the data by hashing
> constants, but it makes more sense to avoid duplicating it in the
> first
> place. We should promote constant arrays to uniforms, then propagate
> the uniform access.
>
> Fixes the TressFX shaders from Tomb Raider, which exceeded the
> maximum
> number of uniform components by a huge margin and failed to link.
>
> On Broadwell:
>
> total instructions in shared programs: 9067702 -> 9068202 (0.01%)
> instructions in affected programs: 10335 -> 10835 (4.84%)
> helped: 10 (Hoard, Shadow of Mordor, Amnesia: The Dark Descent)
> HURT: 20 (Natural Selection 2)
>
> loops in affected programs: 4 -> 0
>
> The hurt programs appear to no longer have a constarray uniform, as
> all constants were successfully propagated. Apparently before this
> patch, we successfully unrolled a loop containing array access, but
> only after promoting constant arrays to uniforms. With this patch,
> we unroll it first, so all array access is direct, and the array
> is split up, and individual constants are propagated. This seems
> better.
>
> Cc: mesa-stable at lists.freedesktop.org
> Reported-by: Karol Herbst <nouveau at karolherbst.de>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/compiler/glsl/opt_constant_propagation.cpp | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/src/compiler/glsl/opt_constant_propagation.cpp
> b/src/compiler/glsl/opt_constant_propagation.cpp
> index 6ec4ab4..69bca74 100644
> --- a/src/compiler/glsl/opt_constant_propagation.cpp
> +++ b/src/compiler/glsl/opt_constant_propagation.cpp
> @@ -145,7 +145,7 @@
> ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue)
> this->progress = true;
>
> ir_dereference_variable *var_ref = (*rvalue)-
> >as_dereference_variable();
> - if (var_ref) {
> + if (var_ref && !var_ref->type->is_array()) {
> ir_constant *constant = var_ref->constant_expression_value();
> if (constant) {
> *rvalue = constant;
More information about the mesa-dev
mailing list