mesa/glsl: new compiler option EmitNoIndirectSampler
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. v2: change option name as EmitNoIndirectSampler Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Francisco Jerez <currojerez@riseup.net> Cc: "10.5" and "10.6" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
edb8383c98
commit
e4512e1581
|
@ -100,6 +100,18 @@ public:
|
||||||
|
|
||||||
virtual ir_visitor_status visit_enter(ir_dereference_array *ir)
|
virtual ir_visitor_status visit_enter(ir_dereference_array *ir)
|
||||||
{
|
{
|
||||||
|
/* Force unroll in case of dynamic indexing with sampler arrays
|
||||||
|
* when EmitNoIndirectSampler is set.
|
||||||
|
*/
|
||||||
|
if (options->EmitNoIndirectSampler) {
|
||||||
|
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.
|
/* Check for arrays variably-indexed by a loop induction variable.
|
||||||
* Unrolling the loop may convert that access into constant-indexing.
|
* Unrolling the loop may convert that access into constant-indexing.
|
||||||
*
|
*
|
||||||
|
|
|
@ -2881,6 +2881,7 @@ struct gl_shader_compiler_options
|
||||||
GLboolean EmitNoIndirectOutput; /**< No indirect addressing of outputs */
|
GLboolean EmitNoIndirectOutput; /**< No indirect addressing of outputs */
|
||||||
GLboolean EmitNoIndirectTemp; /**< No indirect addressing of temps */
|
GLboolean EmitNoIndirectTemp; /**< No indirect addressing of temps */
|
||||||
GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */
|
GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */
|
||||||
|
GLboolean EmitNoIndirectSampler; /**< No indirect addressing of samplers */
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
GLuint MaxIfDepth; /**< Maximum nested IF blocks */
|
GLuint MaxIfDepth; /**< Maximum nested IF blocks */
|
||||||
|
|
Loading…
Reference in New Issue