[Mesa-dev] [PATCH 15/34] glsl/linker: Properly error check VS-GS linkage.
Paul Berry
stereotype441 at gmail.com
Thu Aug 1 07:12:23 PDT 2013
On 31 July 2013 17:22, Ian Romanick <idr at freedesktop.org> wrote:
> On 07/28/2013 11:03 PM, Paul Berry wrote:
>
>> From section 4.3.4 (Inputs) of the GLSL 1.50 spec:
>>
>> Geometry shader input variables get the per-vertex values written
>> out by vertex shader output variables of the same names. Since a
>> geometry shader operates on a set of vertices, each input varying
>> variable (or input block, see interface blocks below) needs to be
>> declared as an array.
>>
>> Therefore, the element type of each geometry shader input array should
>> match the type of the corresponding vertex shader output.
>> ---
>> src/glsl/link_varyings.cpp | 11 ++++++++++-
>> 1 file changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
>> index 2c7e451..07b5699 100644
>> --- a/src/glsl/link_varyings.cpp
>> +++ b/src/glsl/link_varyings.cpp
>> @@ -68,6 +68,10 @@ cross_validate_outputs_to_**inputs(struct
>> gl_shader_program *prog,
>> /* Find all shader inputs in the "consumer" stage. Any variables
>> that have
>> * matching outputs already in the symbol table must have the same
>> type and
>> * qualifiers.
>> + *
>> + * Exception: if the consumer is the geometry shader, then the inputs
>> + * should be arrays and the type of the array element should match
>> the type
>> + * of the corresponding producer output.
>> */
>> foreach_list(node, consumer->ir) {
>> ir_variable *const input = ((ir_instruction *)
>> node)->as_variable();
>> @@ -79,7 +83,12 @@ cross_validate_outputs_to_**inputs(struct
>> gl_shader_program *prog,
>> if (output != NULL) {
>> /* Check that the types match between stages.
>> */
>> - if (input->type != output->type) {
>> + const glsl_type *type_to_match = input->type;
>> + if (consumer->Type == GL_GEOMETRY_SHADER_ARB) {
>>
>
> Use the undecorated name.
Fixed (as well as similar corrections to patches 11, 18, and 29).
>
>
> + assert(type_to_match->is_**array()); /* Enforced by
>> ast_to_hir */
>> + type_to_match = type_to_match->element_type();
>> + }
>> + if (type_to_match != output->type) {
>> /* There is a bit of a special case for gl_TexCoord. This
>> * built-in is unsized by default. Applications that variable
>> * access it must redeclare it with a size. There is some
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130801/9d3d35eb/attachment.html>
More information about the mesa-dev
mailing list