mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 10:40:11 +01:00
glsl/gs: add gl_in support to builtin_variables.cpp.
Previously, builtin_variables.cpp was written assuming that we supported ARB_geometry_shader4 style geometry shader inputs, meaning that each built-in varying input to a geometry was supplied via an array variable whose name ended in "In", e.g. gl_PositionIn or gl_PointSizeIn. However, in GLSL 1.50 style geometry shaders, things work differently--built-in inputs are supplied to geometry shaders via a built-in interface block called gl_in, which contains all the built-in inputs using their usual names (e.g. the gl_Position input is supplied to the geometry shader as gl_in[i].gl_Position). This patch adds the necessary logic to builtin_variables.cpp to create the gl_in interface block and populate it accordingly for geometry shader inputs. The old ARB_geometry_shader4 style varyings are removed, though they can easily be added back in the future if we decide to support ARB_geometry_shader4. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
parent
378ff1dbac
commit
c09adcb21b
1 changed files with 31 additions and 2 deletions
|
|
@ -358,6 +358,17 @@ private:
|
|||
const glsl_type * const vec4_t;
|
||||
const glsl_type * const mat3_t;
|
||||
const glsl_type * const mat4_t;
|
||||
|
||||
/**
|
||||
* Array where the contents of the gl_PerVertex interface instance are
|
||||
* accumulated.
|
||||
*/
|
||||
glsl_struct_field per_vertex_fields[10];
|
||||
|
||||
/**
|
||||
* Number of elements of per_vertex_fields which have been populated.
|
||||
*/
|
||||
unsigned num_per_vertex_fields;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -368,7 +379,8 @@ builtin_variable_generator::builtin_variable_generator(
|
|||
bool_t(glsl_type::bool_type), int_t(glsl_type::int_type),
|
||||
float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type),
|
||||
vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type),
|
||||
mat3_t(glsl_type::mat3_type), mat4_t(glsl_type::mat4_type)
|
||||
mat3_t(glsl_type::mat3_type), mat4_t(glsl_type::mat4_type),
|
||||
num_per_vertex_fields(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -757,7 +769,13 @@ builtin_variable_generator::add_varying(int slot, const glsl_type *type,
|
|||
{
|
||||
switch (state->target) {
|
||||
case geometry_shader:
|
||||
add_input(slot, array(type, 0), name_as_gs_input);
|
||||
assert(this->num_per_vertex_fields <
|
||||
ARRAY_SIZE(this->per_vertex_fields));
|
||||
this->per_vertex_fields[this->num_per_vertex_fields].type = type;
|
||||
this->per_vertex_fields[this->num_per_vertex_fields].name = name;
|
||||
this->per_vertex_fields[this->num_per_vertex_fields].row_major = false;
|
||||
this->per_vertex_fields[this->num_per_vertex_fields].location = slot;
|
||||
this->num_per_vertex_fields++;
|
||||
/* FALLTHROUGH */
|
||||
case vertex_shader:
|
||||
add_output(slot, type, name);
|
||||
|
|
@ -804,6 +822,17 @@ builtin_variable_generator::generate_varyings()
|
|||
ADD_VARYING(VARYING_SLOT_BFC1, vec4_t, "gl_BackSecondaryColor");
|
||||
}
|
||||
}
|
||||
|
||||
if (state->target == geometry_shader) {
|
||||
const glsl_type *per_vertex_type =
|
||||
glsl_type::get_interface_instance(this->per_vertex_fields,
|
||||
this->num_per_vertex_fields,
|
||||
GLSL_INTERFACE_PACKING_STD140,
|
||||
"gl_in");
|
||||
ir_variable *var = add_variable("gl_in", array(per_vertex_type, 0),
|
||||
ir_var_shader_in, 0);
|
||||
var->interface_type = per_vertex_type;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue