[Mesa-dev] [PATCH 3/3] glsl/linker: Adapt flat varying handling in preparation for geometry shaders.
Paul Berry
stereotype441 at gmail.com
Mon Apr 8 11:06:24 PDT 2013
On 8 April 2013 10:57, Ian Romanick <idr at freedesktop.org> wrote:
> On 04/06/2013 07:49 PM, Paul Berry wrote:
>
>> When a varying is consumed by transform feedback, but is not used by
>> the fragment shader, assign_varying_locations() sets its interpolation
>> type to "flat" in order to ensure that lower_packed_varyings never has
>> to deal with non-flat integral varyings (the GLSL spec doesn't require
>> integral vertex outputs to be flat if they aren't consumed by the
>> fragment shader).
>>
>> A similar situation will arise when geometry shader support is added,
>> since the GLSL spec only requires integral vertex shader outputs to be
>> flat when they are consumed by the geometry shader. This patch
>>
> ^^^^^^^^
> fragment?
Oops, yes. Thanks.
>
>
> modifies the linker to handle this situation too.
>> ---
>> src/glsl/link_varyings.cpp | 30 ++++++++++++++++++++----------
>> 1 file changed, 20 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
>> index 431d8fd..7e90beb 100644
>> --- a/src/glsl/link_varyings.cpp
>> +++ b/src/glsl/link_varyings.cpp
>> @@ -541,7 +541,7 @@ store_tfeedback_info(struct gl_context *ctx, struct
>> gl_shader_program *prog,
>> class varying_matches
>> {
>> public:
>> - varying_matches(bool disable_varying_packing);
>> + varying_matches(bool disable_varying_packing, bool consumer_is_fs);
>> ~varying_matches();
>> void record(ir_variable *producer_var, ir_variable *consumer_var);
>> unsigned assign_locations();
>> @@ -621,11 +621,15 @@ private:
>> * it was allocated.
>> */
>> unsigned matches_capacity;
>> +
>> + const bool consumer_is_fs;
>> };
>>
>>
>> -varying_matches::varying_**matches(bool disable_varying_packing)
>> - : disable_varying_packing(**disable_varying_packing)
>> +varying_matches::varying_**matches(bool disable_varying_packing,
>> + bool consumer_is_fs)
>> + : disable_varying_packing(**disable_varying_packing),
>> + consumer_is_fs(consumer_is_fs)
>> {
>> /* Note: this initial capacity is rather arbitrarily chosen to be
>> large
>> * enough for many cases without wasting an unreasonable amount of
>> space.
>> @@ -672,12 +676,12 @@ varying_matches::record(ir_**variable
>> *producer_var, ir_variable *consumer_var)
>> return;
>> }
>>
>> - if (consumer_var == NULL) {
>> - /* Since there is no consumer_var, the interpolation type of this
>> - * varying cannot possibly affect rendering. Also, since the GL
>> spec
>> - * only requires integer varyings to be "flat" when they are
>> fragment
>> - * shader inputs, it is possible that this variable is non-flat
>> and is
>> - * (or contains) an integer.
>> + if (consumer_var == NULL || !consumer_is_fs) {
>> + /* Since this varying is not being consumed by the fragment
>> shader, its
>> + * interpolation type varying cannot possibly affect rendering.
>> Also,
>> + * since the GL spec only requires integer varyings to be "flat"
>> when
>> + * they are fragment shader inputs, it is possible that this
>> variable is
>> + * non-flat and is (or contains) an integer.
>> *
>> * lower_packed_varyings requires all integer varyings to flat,
>> * regardless of where they appear. We can trivially satisfy that
>> @@ -685,6 +689,11 @@ varying_matches::record(ir_**variable
>> *producer_var, ir_variable *consumer_var)
>> */
>> producer_var->centroid = false;
>> producer_var->interpolation = INTERP_QUALIFIER_FLAT;
>> +
>> + if (consumer_var) {
>> + consumer_var->centroid = false;
>> + consumer_var->interpolation = INTERP_QUALIFIER_FLAT;
>> + }
>> }
>>
>> if (this->num_matches == this->matches_capacity) {
>> @@ -979,7 +988,8 @@ assign_varying_locations(**struct gl_context *ctx,
>> {
>> const unsigned producer_base = VARYING_SLOT_VAR0;
>> const unsigned consumer_base = VARYING_SLOT_VAR0;
>> - varying_matches matches(ctx->Const.**DisableVaryingPacking);
>> + varying_matches matches(ctx->Const.**DisableVaryingPacking,
>> + consumer && consumer->Type ==
>> GL_FRAGMENT_SHADER);
>> hash_table *tfeedback_candidates
>> = hash_table_ctor(0, hash_table_string_hash,
>> hash_table_string_compare);
>> hash_table *consumer_inputs
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130408/8bbc5344/attachment-0001.html>
More information about the mesa-dev
mailing list