Patch provides new compiler option for backend to force unroll loops that have non-constant expression indexing on sampler arrays.
This makes sure that we can never end up with a shader that uses loop induction variable as sampler array index but does not unroll because of having too much instructions. This would not work without dynamic indexing support. Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- src/glsl/loop_unroll.cpp | 10 ++++++++++ src/mesa/main/mtypes.h | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/glsl/loop_unroll.cpp b/src/glsl/loop_unroll.cpp index 635e1dd..b9de51d 100644 --- a/src/glsl/loop_unroll.cpp +++ b/src/glsl/loop_unroll.cpp @@ -100,6 +100,16 @@ public: virtual ir_visitor_status visit_enter(ir_dereference_array *ir) { + /* Force unroll in case of dynamic indexing with sampler arrays. */ + if (options->UnrollSamplerArrayDynamicIndexing) { + if ((ir->array->type->is_array() && + ir->array->type->contains_sampler()) && + !ir->array_index->constant_expression_value()) { + unsupported_variable_indexing = true; + return visit_continue; + } + } + /* Check for arrays variably-indexed by a loop induction variable. * Unrolling the loop may convert that access into constant-indexing. * diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 1598e2c..61d1dfb 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2896,6 +2896,12 @@ struct gl_shader_compiler_options */ GLboolean OptimizeForAOS; + /** + * Unroll any loops with dynamic indexing to sampler array. This can be used + * to force loop unroll from the backend for GLSL <= 1.20 and GLSL ES 1.00. + */ + GLboolean UnrollSamplerArrayDynamicIndexing; + const struct nir_shader_compiler_options *NirOptions; }; -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev