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>tags/12.0-branchpoint
| @@ -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. | |||