[Mesa-dev] [PATCH 11/34] glsl: support compilation of geometry shaders
Paul Berry
stereotype441 at gmail.com
Wed Jul 31 14:13:17 PDT 2013
On 30 July 2013 15:16, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On 07/28/2013 11:03 PM, Paul Berry wrote:
>
>> @@ -112,14 +111,24 @@
>> ir_set_program_inouts_visitor::visit(ir_dereference_variable *ir)
>> return visit_continue;
>>
>> if (ir->type->is_array()) {
>> - mark(this->prog, ir->var, 0,
>> - ir->type->length * ir->type->fields.array->matrix_columns,
>> - this->is_fragment_shader);
>> + int matrix_columns = ir->type->fields.array->matrix_columns;
>> + int length = ir->type->length;
>>
>
> I was wondering if this was left over from the ARB_gs4 stuff. Apparently
> it's for lowered arrays of instance blocks? Maybe a comment would be in
> order.
>
>
> + if (this->shader_type == GL_GEOMETRY_SHADER &&
>> + ir->var->mode == ir_var_shader_in) {
>> + if (ir->type->element_type()->is_**array()) {
>> + const glsl_type *inner_array_type = ir->type->fields.array;
>> + matrix_columns = inner_array_type->fields.**
>> array->matrix_columns;
>> + length = inner_array_type->length;
>> + } else {
>> + length = 1;
>> + }
>> + }
>> + mark(this->prog, ir->var, 0, length * matrix_columns,
>> + this->shader_type == GL_FRAGMENT_SHADER);
>> } else {
>> mark(this->prog, ir->var, 0, ir->type->matrix_columns,
>> - this->is_fragment_shader);
>> + this->shader_type == GL_FRAGMENT_SHADER);
>> }
>> -
>> return visit_continue;
>> }
>>
>> @@ -129,7 +138,40 @@ ir_set_program_inouts_visitor:**
>> :visit_enter(ir_dereference_**array *ir)
>> ir_dereference_variable *deref_var;
>> ir_constant *index = ir->array_index->as_constant()**;
>> deref_var = ir->array->as_dereference_**variable();
>> - ir_variable *var = deref_var ? deref_var->var : NULL;
>> + ir_variable *var;
>> + bool is_vert_array = false, is_2D_array = false;
>> +
>> + /* Check whether this dereference is of a GS input array. These are
>> special
>> + * because the array index refers to the index of an input vertex
>> instead of
>> + * the attribute index. The exceptions to this exception are 2D
>> arrays
>> + * such as gl_TexCoordIn. For these, there is a nested
>> dereference_array,
>> + * where the inner index specifies the vertex and the outer index
>> specifies
>> + * the attribute. To complicate things further, matrix columns are
>> also
>> + * accessed with dereference_array. So we have to correctly handle 1D
>> + * arrays of non-matrices, 1D arrays of matrices, 2D arrays of
>> non-matrices,
>> + * and 2D arrays of matrices.
>> + */
>> + if (this->shader_type == GL_GEOMETRY_SHADER) {
>> + if (!deref_var) {
>> + /* Either an outer (attribute) dereference of a 2D array or a
>> column
>> + * dereference of an array of matrices. */
>>
>
> Style-nit: */ goes on a separate line.
>
>
> + ir_dereference_array *inner_deref = ir->array->as_dereference_*
>> *array();
>> + assert(inner_deref);
>> + deref_var = inner_deref->array->as_**dereference_variable();
>> + is_2D_array = true;
>> + }
>> +
>> + if (deref_var && deref_var->var->mode == ir_var_shader_in) {
>> + if (ir->type->is_array())
>> + /* Inner (vertex) dereference of a 2D array */
>> + return visit_continue;
>> + else
>> + /* Dereference of a 1D (vertex) array */
>> + is_vert_array = true;
>> + }
>> + }
>>
>
> I'm not terribly comfortable with this code, but I'm not sure what to
> suggest instead. One concern I have is varying structs.
>
> As I understand it, if a VS outputs a struct, the corresponding GS input
> would be an array of structs. Wouldn't those be accessed via (array_ref
> (record_ref ...) ...)?
>
> The code above seems to assume that if it's not
> (array_ref (var_ref ...))
> then it *must* be
> (array_ref (array_ref ...) ...)
> which seems wrong, or at least dubious.
>
> The "this must be a matrix" stuff concerns me too.
I believe that we don't need to worry about structs, because
lower_packed_varyings() gets rid of them before this analysis runs. But
that assumption isn't documented (or checked) anywhere, and it really
should be.
Even with that, I had a very difficult time figuring out whether these
modifications to ir_set_program_inouts were correct, so I decided to rework
it. It was easy to isolate this from the rest of the patch series, so I'm
going to send it to the list as a series of its own. Hopefully the rework
will be easier to convince ourselves that the rework is correct.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130731/227778f8/attachment.html>
More information about the mesa-dev
mailing list