[Mesa-dev] [PATCH] glsl: use an enum for AMD_conservative_depth layout qualifiers

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri Feb 24 10:21:38 UTC 2017



On 02/24/2017 10:07 AM, Andres Gomez wrote:
> On Thu, 2017-02-23 at 18:07 +0100, Samuel Pitoiset wrote:
>> The main idea behind this is to free some bits in the flags.q
>> struct because currently all 64-bits are used and we can't
>> add more layout qualifiers without reaching a static assert.
>>
>> In order to do that (mainly for ARB_bindless_texture), use an
>> enumeration for the AMD_conservative_depth layout qualifiers
>> because it's forbidden to declare more than one depth qualifier
>> for gl_FragDepth.
>>
>> Note that ast_type_qualifier::merge_qualifier() will prevent
>> using duplicate layout qualifiers by returning a compile-time
>> error.
>>
>> No piglit regressions found (including compiler tests) with
>> RX480 on RadeonSI.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>  src/compiler/glsl/ast.h          | 16 ++++++++++++----
>>  src/compiler/glsl/ast_to_hir.cpp | 21 ++++++---------------
>>  src/compiler/glsl/ast_type.cpp   | 12 +++---------
>>  src/compiler/glsl/glsl_parser.yy | 12 ++++++++----
>>  4 files changed, 29 insertions(+), 32 deletions(-)
>>
>> diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h
>> index 3dff164232..11a092e41c 100644
>> --- a/src/compiler/glsl/ast.h
>> +++ b/src/compiler/glsl/ast.h
>> @@ -463,6 +463,14 @@ enum {
>>     ast_precision_low
>>  };
>>
>> +enum {
>> +   ast_depth_none = 0, /**< Absence of depth qualifier. */
>> +   ast_depth_any,
>> +   ast_depth_greater,
>> +   ast_depth_less,
>> +   ast_depth_unchanged
>> +};
>> +
>>  struct ast_type_qualifier {
>>     DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier);
>>
>> @@ -528,10 +536,7 @@ struct ast_type_qualifier {
>>
>>           /** \name Layout qualifiers for GL_AMD_conservative_depth */
>>           /** \{ */
>> -         unsigned depth_any:1;
>> -         unsigned depth_greater:1;
>> -         unsigned depth_less:1;
>> -         unsigned depth_unchanged:1;
>> +         unsigned depth_type:1;
>>           /** \} */
>>
>>  	 /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */
>> @@ -630,6 +635,9 @@ struct ast_type_qualifier {
>>     /** Precision of the type (highp/medium/lowp). */
>>     unsigned precision:2;
>>
>> +   /** Type of layout qualifiers for GL_AMD_conservative_depth. */
>> +   unsigned depth_type:3;
>> +
>>     /**
>>      * Alignment specified via GL_ARB_enhanced_layouts "align" layout qualifier
>>      */
>> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
>> index 88febe7ff3..ad1fd9150a 100644
>> --- a/src/compiler/glsl/ast_to_hir.cpp
>> +++ b/src/compiler/glsl/ast_to_hir.cpp
>> @@ -3629,11 +3629,7 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual,
>>     /* Layout qualifiers for gl_FragDepth, which are enabled by extension
>>      * AMD_conservative_depth.
>>      */
>> -   int depth_layout_count = qual->flags.q.depth_any
>> -      + qual->flags.q.depth_greater
>> -      + qual->flags.q.depth_less
>> -      + qual->flags.q.depth_unchanged;
>> -   if (depth_layout_count > 0
>> +   if (qual->flags.q.depth_type
>>         && !state->is_version(420, 0)
>>         && !state->AMD_conservative_depth_enable
>>         && !state->ARB_conservative_depth_enable) {
>> @@ -3641,24 +3637,19 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual,
>>                          "extension GL_AMD_conservative_depth or "
>>                          "GL_ARB_conservative_depth must be enabled "
>>                          "to use depth layout qualifiers");
>> -   } else if (depth_layout_count > 0
>> +   } else if (qual->flags.q.depth_type
>>                && strcmp(var->name, "gl_FragDepth") != 0) {
>>         _mesa_glsl_error(loc, state,
>>                          "depth layout qualifiers can be applied only to "
>>                          "gl_FragDepth");
>> -   } else if (depth_layout_count > 1
>> -              && strcmp(var->name, "gl_FragDepth") == 0) {
>> -      _mesa_glsl_error(loc, state,
>> -                       "at most one depth layout qualifier can be applied to "
>> -                       "gl_FragDepth");
>>     }
>> -   if (qual->flags.q.depth_any)
>> +   if (qual->depth_type == ast_depth_any)
>>        var->data.depth_layout = ir_depth_layout_any;
>> -   else if (qual->flags.q.depth_greater)
>> +   else if (qual->depth_type == ast_depth_greater)
>>        var->data.depth_layout = ir_depth_layout_greater;
>> -   else if (qual->flags.q.depth_less)
>> +   else if (qual->depth_type == ast_depth_less)
>>        var->data.depth_layout = ir_depth_layout_less;
>> -   else if (qual->flags.q.depth_unchanged)
>> +   else if (qual->depth_type == ast_depth_unchanged)
>>         var->data.depth_layout = ir_depth_layout_unchanged;
>>     else
>>         var->data.depth_layout = ir_depth_layout_none;
>
> Maybe replace this with a ?
>
> switch(qual->depth_type) {
> case ast_depth_any:
> ...
> }
>
> Other than that nitpick, this is:

Okay, I will update locally before pushing.
Thanks!

>
> Reviewed-by: Andres Gomez <agomez at igalia.com>
>


More information about the mesa-dev mailing list