Skip to content
Snippets Groups Projects
Commit 7d6c37b0 authored by Ian Romanick's avatar Ian Romanick
Browse files

glsl: Treat ir_dereference_array of non-var as a constant for lowering


Previously the code would just look at deref->array->type to see if it
was a constant.  This isn't good enough because deref->array might be
another ir_dereference_array... of a constant.  As a result,
deref->array->type wouldn't be a constant, but
deref->variable_referenced() would return NULL.  The unchecked NULL
pointer would shortly lead to a segfault.

Instead just look at the return of deref->variable_referenced().  If
it's NULL, assume that either a constant or some other form of
anonymous temporary storage is being dereferenced.

This is a bit hinkey because most drivers treat constant arrays as
uniforms, but the lowering pass treats them as temporaries.  This
keeps the behavior of the old code, so this change isn't making things
worse.

Fixes i965 piglit:

    vs-temp-array-mat[234]-index-col-rd
    vs-temp-array-mat[234]-index-col-row-rd
    vs-uniform-array-mat[234]-index-col-rd
    vs-uniform-array-mat[234]-index-col-row-rd

Reviewed-by: default avatarEric Anholt <eric@anholt.net>
(cherry picked from commit 156f8533)
parent 32c7224e
No related branches found
No related tags found
Loading
......@@ -321,10 +321,16 @@ public:
bool storage_type_needs_lowering(ir_dereference_array *deref) const
{
if (deref->array->ir_type == ir_type_constant)
/* If a variable isn't eventually the target of this dereference, then
* it must be a constant or some sort of anonymous temporary storage.
*
* FINISHME: Is this correct? Most drivers treat arrays of constants as
* FINISHME: uniforms. It seems like this should do the same.
*/
const ir_variable *const var = deref->array->variable_referenced();
if (var == NULL)
return this->lower_temps;
const ir_variable *const var = deref->array->variable_referenced();
switch (var->mode) {
case ir_var_auto:
case ir_var_temporary:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment