glsl/gs: Fix transform feedback of gl_ClipDistance.
Since gl_ClipDistance is lowered from an array of floats to an array of vec4's during compilation, transform feedback has special logic to keep track of the pre-lowered array size so that attempting to perform transform feedback on gl_ClipDistance produces a result with the correct size. Previously, this special logic always consulted the vertex shader's size for gl_ClipDistance. This patch fixes it so that it uses the geometry shader's size for gl_ClipDistance when a geometry shader is in use. Fixes piglit test spec/glsl-1.50/transform-feedback-type-and-size. v2: Change the type of LastClipDistanceArraySize to "unsigned", and clarify the comment above it. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -328,7 +328,7 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
|
|||||||
const unsigned vector_elements =
|
const unsigned vector_elements =
|
||||||
this->matched_candidate->type->fields.array->vector_elements;
|
this->matched_candidate->type->fields.array->vector_elements;
|
||||||
unsigned actual_array_size = this->is_clip_distance_mesa ?
|
unsigned actual_array_size = this->is_clip_distance_mesa ?
|
||||||
prog->Vert.ClipDistanceArraySize :
|
prog->LastClipDistanceArraySize :
|
||||||
this->matched_candidate->type->array_size();
|
this->matched_candidate->type->array_size();
|
||||||
|
|
||||||
if (this->is_subscripted) {
|
if (this->is_subscripted) {
|
||||||
|
@@ -2100,6 +2100,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
validate_vertex_shader_executable(prog, sh);
|
validate_vertex_shader_executable(prog, sh);
|
||||||
if (!prog->LinkStatus)
|
if (!prog->LinkStatus)
|
||||||
goto done;
|
goto done;
|
||||||
|
prog->LastClipDistanceArraySize = prog->Vert.ClipDistanceArraySize;
|
||||||
|
|
||||||
_mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX],
|
_mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX],
|
||||||
sh);
|
sh);
|
||||||
@@ -2132,6 +2133,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
validate_geometry_shader_executable(prog, sh);
|
validate_geometry_shader_executable(prog, sh);
|
||||||
if (!prog->LinkStatus)
|
if (!prog->LinkStatus)
|
||||||
goto done;
|
goto done;
|
||||||
|
prog->LastClipDistanceArraySize = prog->Geom.ClipDistanceArraySize;
|
||||||
|
|
||||||
_mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_GEOMETRY],
|
_mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_GEOMETRY],
|
||||||
sh);
|
sh);
|
||||||
|
@@ -2476,6 +2476,12 @@ struct gl_shader_program
|
|||||||
unsigned NumUserUniformStorage;
|
unsigned NumUserUniformStorage;
|
||||||
struct gl_uniform_storage *UniformStorage;
|
struct gl_uniform_storage *UniformStorage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size of the gl_ClipDistance array that is output from the last pipeline
|
||||||
|
* stage before the fragment shader.
|
||||||
|
*/
|
||||||
|
unsigned LastClipDistanceArraySize;
|
||||||
|
|
||||||
struct gl_uniform_block *UniformBlocks;
|
struct gl_uniform_block *UniformBlocks;
|
||||||
unsigned NumUniformBlocks;
|
unsigned NumUniformBlocks;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user