glsl: Assign GLSL StreamIds to transform feedback outputs.
Inter-shader outputs must be on stream 0, which is the default. Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
This commit is contained in:
@@ -291,6 +291,7 @@ tfeedback_decl::init(struct gl_context *ctx, const void *mem_ctx,
|
|||||||
this->skip_components = 0;
|
this->skip_components = 0;
|
||||||
this->next_buffer_separator = false;
|
this->next_buffer_separator = false;
|
||||||
this->matched_candidate = NULL;
|
this->matched_candidate = NULL;
|
||||||
|
this->stream_id = 0;
|
||||||
|
|
||||||
if (ctx->Extensions.ARB_transform_feedback3) {
|
if (ctx->Extensions.ARB_transform_feedback3) {
|
||||||
/* Parse gl_NextBuffer. */
|
/* Parse gl_NextBuffer. */
|
||||||
@@ -355,8 +356,8 @@ tfeedback_decl::is_same(const tfeedback_decl &x, const tfeedback_decl &y)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assign a location for this tfeedback_decl object based on the transform
|
* Assign a location and stream ID for this tfeedback_decl object based on the
|
||||||
* feedback candidate found by find_candidate.
|
* transform feedback candidate found by find_candidate.
|
||||||
*
|
*
|
||||||
* If an error occurs, the error is reported through linker_error() and false
|
* If an error occurs, the error is reported through linker_error() and false
|
||||||
* is returned.
|
* is returned.
|
||||||
@@ -437,6 +438,11 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Only transform feedback varyings can be assigned to non-zero streams,
|
||||||
|
* so assign the stream id here.
|
||||||
|
*/
|
||||||
|
this->stream_id = this->matched_candidate->toplevel_var->data.stream;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,7 +501,7 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
|
|||||||
info->Outputs[info->NumOutputs].ComponentOffset = location_frac;
|
info->Outputs[info->NumOutputs].ComponentOffset = location_frac;
|
||||||
info->Outputs[info->NumOutputs].OutputRegister = location;
|
info->Outputs[info->NumOutputs].OutputRegister = location;
|
||||||
info->Outputs[info->NumOutputs].NumComponents = output_size;
|
info->Outputs[info->NumOutputs].NumComponents = output_size;
|
||||||
info->Outputs[info->NumOutputs].StreamId = 0;
|
info->Outputs[info->NumOutputs].StreamId = stream_id;
|
||||||
info->Outputs[info->NumOutputs].OutputBuffer = buffer;
|
info->Outputs[info->NumOutputs].OutputBuffer = buffer;
|
||||||
info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer];
|
info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer];
|
||||||
++info->NumOutputs;
|
++info->NumOutputs;
|
||||||
|
@@ -210,6 +210,13 @@ private:
|
|||||||
* data structure that was found. Otherwise NULL.
|
* data structure that was found. Otherwise NULL.
|
||||||
*/
|
*/
|
||||||
const tfeedback_candidate *matched_candidate;
|
const tfeedback_candidate *matched_candidate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StreamId assigned to this varying (defaults to 0). Can only be set to
|
||||||
|
* values other than 0 in geometry shaders that use the stream layout
|
||||||
|
* modifier. Accepted values must be in the range [0, MAX_VERTEX_STREAMS-1].
|
||||||
|
*/
|
||||||
|
unsigned stream_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user