diff options
author | Dave Airlie <[email protected]> | 2015-12-19 14:43:12 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2016-01-01 09:43:53 +1000 |
commit | aab0c6c9c400bc7f83516b29cf736fa7ce1f2a13 (patch) | |
tree | 1580a5894014e373aef233a6ebf34aa25e4ccac5 /src | |
parent | fc890d703ee079b1eb37c316f8ba8554b3184248 (diff) |
st/glsl_to_tgsi: handle doubles outputs in arrays.
This handles the case where a double output is stored
in an array, and tracks it for use in the double
instruction emit code.
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 163f6ea8066..d152bf93485 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -334,8 +334,24 @@ struct array_decl { unsigned mesa_index; unsigned array_id; unsigned array_size; + unsigned array_type; }; +static unsigned +find_array_type(struct array_decl *arrays, unsigned count, unsigned array_id) +{ + unsigned i; + + for (i = 0; i < count; i++) { + struct array_decl *decl = &arrays[i]; + + if (array_id == decl->array_id) { + return decl->array_type; + } + } + return GLSL_TYPE_ERROR; +} + struct rename_reg_pair { int old_reg; int new_reg; @@ -663,6 +679,11 @@ glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op, dst_is_double[j] = false; if (inst->dst[j].type == GLSL_TYPE_DOUBLE) dst_is_double[j] = true; + else if (inst->dst[j].file == PROGRAM_OUTPUT && inst->dst[j].type == GLSL_TYPE_ARRAY) { + unsigned type = find_array_type(this->output_arrays, this->num_output_arrays, inst->dst[j].array_id); + if (type == GLSL_TYPE_DOUBLE) + dst_is_double[j] = true; + } } if (dst_is_double[0] || dst_is_double[1] || @@ -2270,10 +2291,13 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir) decl->mesa_index = var->data.location; decl->array_id = num_input_arrays + 1; - if (is_2d) + if (is_2d) { decl->array_size = type_size(var->type->fields.array); - else + decl->array_type = var->type->fields.array->without_array()->base_type; + } else { decl->array_size = type_size(var->type); + decl->array_type = var->type->without_array()->base_type; + } num_input_arrays++; entry = new(mem_ctx) variable_storage(var, @@ -2296,10 +2320,13 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir) decl->mesa_index = var->data.location; decl->array_id = num_output_arrays + 1; - if (is_2d) + if (is_2d) { decl->array_size = type_size(var->type->fields.array); - else + decl->array_type = var->type->fields.array->without_array()->base_type; + } else { decl->array_size = type_size(var->type); + decl->array_type = var->type->without_array()->base_type; + } num_output_arrays++; entry = new(mem_ctx) variable_storage(var, |