glsl: add xfb_* qualifiers to glsl_struct_field
These will be used to hold qualifier values for interface and struct members. Support is added to the struct/interface constructors to copy these fields upon creation. We also update record_compare() to ensure we don't reuse a glsl_type with the wrong xfb_* qualifier values. Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -334,6 +334,8 @@ per_vertex_accumulator::add_field(int slot, const glsl_type *type,
|
||||
this->fields[this->num_fields].image_coherent = 0;
|
||||
this->fields[this->num_fields].image_volatile = 0;
|
||||
this->fields[this->num_fields].image_restrict = 0;
|
||||
this->fields[this->num_fields].xfb_buffer = -1;
|
||||
this->fields[this->num_fields].xfb_stride = -1;
|
||||
this->num_fields++;
|
||||
}
|
||||
|
||||
|
||||
@@ -132,6 +132,8 @@ glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
|
||||
this->fields.structure[i].image_volatile = fields[i].image_volatile;
|
||||
this->fields.structure[i].image_restrict = fields[i].image_restrict;
|
||||
this->fields.structure[i].precision = fields[i].precision;
|
||||
this->fields.structure[i].xfb_buffer = fields[i].xfb_buffer;
|
||||
this->fields.structure[i].xfb_stride = fields[i].xfb_stride;
|
||||
}
|
||||
|
||||
mtx_unlock(&glsl_type::mutex);
|
||||
@@ -172,6 +174,8 @@ glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
|
||||
this->fields.structure[i].image_volatile = fields[i].image_volatile;
|
||||
this->fields.structure[i].image_restrict = fields[i].image_restrict;
|
||||
this->fields.structure[i].precision = fields[i].precision;
|
||||
this->fields.structure[i].xfb_buffer = fields[i].xfb_buffer;
|
||||
this->fields.structure[i].xfb_stride = fields[i].xfb_stride;
|
||||
}
|
||||
|
||||
mtx_unlock(&glsl_type::mutex);
|
||||
@@ -915,6 +919,12 @@ glsl_type::record_compare(const glsl_type *b) const
|
||||
if (this->fields.structure[i].precision
|
||||
!= b->fields.structure[i].precision)
|
||||
return false;
|
||||
if (this->fields.structure[i].xfb_buffer
|
||||
!= b->fields.structure[i].xfb_buffer)
|
||||
return false;
|
||||
if (this->fields.structure[i].xfb_stride
|
||||
!= b->fields.structure[i].xfb_stride)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -839,12 +839,24 @@ struct glsl_struct_field {
|
||||
|
||||
/**
|
||||
* For interface blocks, members may have an explicit byte offset
|
||||
* specified; -1 otherwise.
|
||||
* specified; -1 otherwise. Also used for xfb_offset layout qualifier.
|
||||
*
|
||||
* Ignored for structs.
|
||||
* Unless used for xfb_offset this field is ignored for structs.
|
||||
*/
|
||||
int offset;
|
||||
|
||||
/**
|
||||
* For interface blocks, members may define a transform feedback buffer;
|
||||
* -1 otherwise.
|
||||
*/
|
||||
int xfb_buffer;
|
||||
|
||||
/**
|
||||
* For interface blocks, members may define a transform feedback stride;
|
||||
* -1 otherwise.
|
||||
*/
|
||||
int xfb_stride;
|
||||
|
||||
/**
|
||||
* For interface blocks, the interpolation mode (as in
|
||||
* ir_variable::interpolation). 0 otherwise.
|
||||
|
||||
Reference in New Issue
Block a user