glsl: add xfb helpers and fields to the tfeedback_decl class
We also apply any array/struct offsets. Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -506,6 +506,8 @@ tfeedback_decl::init(struct gl_context *ctx, const void *mem_ctx,
|
|||||||
this->next_buffer_separator = false;
|
this->next_buffer_separator = false;
|
||||||
this->matched_candidate = NULL;
|
this->matched_candidate = NULL;
|
||||||
this->stream_id = 0;
|
this->stream_id = 0;
|
||||||
|
this->buffer = 0;
|
||||||
|
this->offset = 0;
|
||||||
|
|
||||||
if (ctx->Extensions.ARB_transform_feedback3) {
|
if (ctx->Extensions.ARB_transform_feedback3) {
|
||||||
/* Parse gl_NextBuffer. */
|
/* Parse gl_NextBuffer. */
|
||||||
@@ -598,6 +600,8 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
|
|||||||
= this->matched_candidate->toplevel_var->data.location * 4
|
= this->matched_candidate->toplevel_var->data.location * 4
|
||||||
+ this->matched_candidate->toplevel_var->data.location_frac
|
+ this->matched_candidate->toplevel_var->data.location_frac
|
||||||
+ this->matched_candidate->offset;
|
+ this->matched_candidate->offset;
|
||||||
|
const unsigned dmul =
|
||||||
|
this->matched_candidate->type->without_array()->is_double() ? 2 : 1;
|
||||||
|
|
||||||
if (this->matched_candidate->type->is_array()) {
|
if (this->matched_candidate->type->is_array()) {
|
||||||
/* Array variable */
|
/* Array variable */
|
||||||
@@ -605,8 +609,6 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
|
|||||||
this->matched_candidate->type->fields.array->matrix_columns;
|
this->matched_candidate->type->fields.array->matrix_columns;
|
||||||
const unsigned vector_elements =
|
const unsigned vector_elements =
|
||||||
this->matched_candidate->type->fields.array->vector_elements;
|
this->matched_candidate->type->fields.array->vector_elements;
|
||||||
const unsigned dmul =
|
|
||||||
this->matched_candidate->type->fields.array->is_double() ? 2 : 1;
|
|
||||||
unsigned actual_array_size;
|
unsigned actual_array_size;
|
||||||
switch (this->lowered_builtin_array_variable) {
|
switch (this->lowered_builtin_array_variable) {
|
||||||
case clip_distance:
|
case clip_distance:
|
||||||
@@ -684,6 +686,12 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
|
|||||||
*/
|
*/
|
||||||
this->stream_id = this->matched_candidate->toplevel_var->data.stream;
|
this->stream_id = this->matched_candidate->toplevel_var->data.stream;
|
||||||
|
|
||||||
|
unsigned array_offset = this->array_subscript * 4 * dmul;
|
||||||
|
unsigned struct_offset = this->matched_candidate->offset * 4 * dmul;
|
||||||
|
this->buffer = this->matched_candidate->toplevel_var->data.xfb_buffer;
|
||||||
|
this->offset = this->matched_candidate->toplevel_var->data.offset +
|
||||||
|
array_offset + struct_offset;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -122,6 +122,16 @@ public:
|
|||||||
return this->stream_id;
|
return this->stream_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned get_buffer() const
|
||||||
|
{
|
||||||
|
return this->buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned get_offset() const
|
||||||
|
{
|
||||||
|
return this->offset;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The total number of varying components taken up by this variable. Only
|
* The total number of varying components taken up by this variable. Only
|
||||||
* valid if assign_location() has been called.
|
* valid if assign_location() has been called.
|
||||||
@@ -201,6 +211,16 @@ private:
|
|||||||
*/
|
*/
|
||||||
int location;
|
int location;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to store the buffer assigned by xfb_buffer.
|
||||||
|
*/
|
||||||
|
unsigned buffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to store the offset assigned by xfb_offset.
|
||||||
|
*/
|
||||||
|
unsigned offset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If non-zero, then this variable may be packed along with other variables
|
* If non-zero, then this variable may be packed along with other variables
|
||||||
* into a single varying slot, so this offset should be applied when
|
* into a single varying slot, so this offset should be applied when
|
||||||
|
Reference in New Issue
Block a user