glsl: Create and use a new ir_variable::count_attribute_slots() wrapper.

This wraps glsl_type::count_attribute_slots(), but will soon contain a
couple of overrides for a couple of GLSL built-ins variables.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
This commit is contained in:
Kenneth Graunke
2015-11-15 04:32:52 -08:00
parent aead6a1e94
commit 6aa5cb34d0
5 changed files with 17 additions and 11 deletions

View File

@@ -1618,6 +1618,13 @@ ir_variable::get_extension_warning() const
? NULL : warn_extension_table[this->data.warn_extension_index];
}
unsigned
ir_variable::count_attribute_slots(bool is_vertex_stage) const
{
bool is_vs_input = is_vertex_stage && this->data.mode == ir_var_shader_in;
return this->type->count_attribute_slots(is_vs_input);
}
ir_function_signature::ir_function_signature(const glsl_type *return_type,
builtin_available_predicate b)
: ir_instruction(ir_type_function_signature),

View File

@@ -553,6 +553,8 @@ public:
return this->u.max_ifc_array_access;
}
unsigned count_attribute_slots(bool is_vertex_stage) const;
inline unsigned get_num_state_slots() const
{
assert(!this->is_interface_instance()

View File

@@ -149,7 +149,7 @@ void
ir_set_program_inouts_visitor::mark_whole_variable(ir_variable *var)
{
const glsl_type *type = var->type;
bool is_vertex_input = false;
if (this->shader_stage == MESA_SHADER_GEOMETRY &&
var->data.mode == ir_var_shader_in && type->is_array()) {
type = type->fields.array;
@@ -173,11 +173,8 @@ ir_set_program_inouts_visitor::mark_whole_variable(ir_variable *var)
type = type->fields.array;
}
if (this->shader_stage == MESA_SHADER_VERTEX &&
var->data.mode == ir_var_shader_in)
is_vertex_input = true;
mark(this->prog, var, 0, type->count_attribute_slots(is_vertex_input),
mark(this->prog, var, 0,
var->count_attribute_slots(this->shader_stage == MESA_SHADER_VERTEX),
this->shader_stage);
}

View File

@@ -2301,7 +2301,7 @@ check_against_output_limit(struct gl_context *ctx,
var->data.mode == ir_var_shader_out &&
var_counts_against_varying_limit(producer->Stage, var)) {
/* outputs for fragment shader can't be doubles */
output_vectors += var->type->count_attribute_slots(false);
output_vectors += var->count_attribute_slots(false);
}
}
@@ -2345,7 +2345,7 @@ check_against_input_limit(struct gl_context *ctx,
var->data.mode == ir_var_shader_in &&
var_counts_against_varying_limit(consumer->Stage, var)) {
/* vertex inputs aren't varying counted */
input_vectors += var->type->count_attribute_slots(false);
input_vectors += var->count_attribute_slots(false);
}
}

View File

@@ -2670,7 +2670,7 @@ assign_attribute_or_color_locations(void *mem_ctx,
return false;
}
const unsigned slots = var->type->count_attribute_slots(target_index == MESA_SHADER_VERTEX);
const unsigned slots = var->count_attribute_slots(target_index == MESA_SHADER_VERTEX);
/* If the variable is not a built-in and has a location statically
* assigned in the shader (presumably via a layout qualifier), make sure
@@ -2782,7 +2782,7 @@ assign_attribute_or_color_locations(void *mem_ctx,
*/
for (unsigned i = 0; i < assigned_attr; i++) {
unsigned assigned_slots =
assigned[i]->type->count_attribute_slots(false);
assigned[i]->count_attribute_slots(false);
unsigned assig_attr =
assigned[i]->data.location - generic_base;
unsigned assigned_use_mask = (1 << assigned_slots) - 1;
@@ -3233,7 +3233,7 @@ check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog)
ir_variable *var = node->as_variable();
if (var && var->data.mode == ir_var_shader_out)
/* since there are no double fs outputs - pass false */
fragment_outputs += var->type->count_attribute_slots(false);
fragment_outputs += var->count_attribute_slots(false);
}
}
}