mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-29 22:30:24 +01:00
glsl: create helper to remove outer vertex index array used by some stages
This will be used in the following patch for calculating array sizes correctly
when reserving explicit varying locations.
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
(cherry picked from commit 5907a02ab6)
This commit is contained in:
parent
ae0733e2a1
commit
65dfe8ba5f
1 changed files with 26 additions and 10 deletions
|
|
@ -40,6 +40,29 @@
|
|||
#include "program.h"
|
||||
|
||||
|
||||
/**
|
||||
* Get the varying type stripped of the outermost array if we're processing
|
||||
* a stage whose varyings are arrays indexed by a vertex number (such as
|
||||
* geometry shader inputs).
|
||||
*/
|
||||
static const glsl_type *
|
||||
get_varying_type(const ir_variable *var, gl_shader_stage stage)
|
||||
{
|
||||
const glsl_type *type = var->type;
|
||||
|
||||
if (!var->data.patch &&
|
||||
((var->data.mode == ir_var_shader_out &&
|
||||
stage == MESA_SHADER_TESS_CTRL) ||
|
||||
(var->data.mode == ir_var_shader_in &&
|
||||
(stage == MESA_SHADER_TESS_CTRL || stage == MESA_SHADER_TESS_EVAL ||
|
||||
stage == MESA_SHADER_GEOMETRY)))) {
|
||||
assert(type->is_array());
|
||||
type = type->fields.array;
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the types and qualifiers of an output from one stage against the
|
||||
* matching input to another stage.
|
||||
|
|
@ -943,18 +966,11 @@ varying_matches::record(ir_variable *producer_var, ir_variable *consumer_var)
|
|||
this->matches[this->num_matches].packing_order
|
||||
= this->compute_packing_order(var);
|
||||
if (this->disable_varying_packing) {
|
||||
const struct glsl_type *type = var->type;
|
||||
unsigned slots;
|
||||
gl_shader_stage stage =
|
||||
(producer_var != NULL) ? producer_stage : consumer_stage;
|
||||
|
||||
/* Some shader stages have 2-dimensional varyings. Use the inner type. */
|
||||
if (!var->data.patch &&
|
||||
((var == producer_var && producer_stage == MESA_SHADER_TESS_CTRL) ||
|
||||
(var == consumer_var && (consumer_stage == MESA_SHADER_TESS_CTRL ||
|
||||
consumer_stage == MESA_SHADER_TESS_EVAL ||
|
||||
consumer_stage == MESA_SHADER_GEOMETRY)))) {
|
||||
assert(type->is_array());
|
||||
type = type->fields.array;
|
||||
}
|
||||
const glsl_type *type = get_varying_type(var, stage);
|
||||
|
||||
slots = type->count_attribute_slots(false);
|
||||
this->matches[this->num_matches].num_components = slots * 4;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue