From 44b7ebe52d6f4b220a1c943bac2e571bb593f7e1 Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Wed, 23 Oct 2013 12:55:24 -0700 Subject: 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 Reviewed-by: Ian Romanick Reviewed-by: Matt Turner --- src/glsl/link_varyings.cpp | 2 +- src/glsl/linker.cpp | 2 ++ src/mesa/main/mtypes.h | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index 4ba6d8a2057..c503645fda1 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -328,7 +328,7 @@ tfeedback_decl::assign_location(struct gl_context *ctx, const unsigned vector_elements = this->matched_candidate->type->fields.array->vector_elements; unsigned actual_array_size = this->is_clip_distance_mesa ? - prog->Vert.ClipDistanceArraySize : + prog->LastClipDistanceArraySize : this->matched_candidate->type->array_size(); if (this->is_subscripted) { diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index b23c31a166b..d8f655c3939 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -2100,6 +2100,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) validate_vertex_shader_executable(prog, sh); if (!prog->LinkStatus) goto done; + prog->LastClipDistanceArraySize = prog->Vert.ClipDistanceArraySize; _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX], sh); @@ -2132,6 +2133,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) validate_geometry_shader_executable(prog, sh); if (!prog->LinkStatus) goto done; + prog->LastClipDistanceArraySize = prog->Geom.ClipDistanceArraySize; _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_GEOMETRY], sh); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 6374e8c0d58..2c5ea4b5d2a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2476,6 +2476,12 @@ struct gl_shader_program unsigned NumUserUniformStorage; 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; unsigned NumUniformBlocks; -- cgit v1.2.3