Browse Source

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>
tags/12.0-branchpoint
Timothy Arceri 10 years ago
parent
commit
733f1b2a55
3 changed files with 26 additions and 2 deletions
  1. 2
    0
      src/compiler/glsl/builtin_variables.cpp
  2. 10
    0
      src/compiler/glsl_types.cpp
  3. 14
    2
      src/compiler/glsl_types.h

+ 2
- 0
src/compiler/glsl/builtin_variables.cpp View File

@@ -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++;
}


+ 10
- 0
src/compiler/glsl_types.cpp View File

@@ -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;

+ 14
- 2
src/compiler/glsl_types.h View File

@@ -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.

Loading…
Cancel
Save