[Mesa-dev] [PATCH 32/34] glsl: Allow geometry shader input instance arrays to be unsized.

Ian Romanick idr at freedesktop.org
Thu Aug 1 09:48:16 PDT 2013


On 08/01/2013 08:07 AM, Paul Berry wrote:
> On 31 July 2013 18:17, Ian Romanick <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
>
>     On 07/28/2013 11:03 PM, Paul Berry wrote:
>
>         ---
>            src/glsl/ast.h          | 24 ++++++++++++++++--------
>            src/glsl/ast_to_hir.cpp | 31 +++++++++++++++++++++++++++++-__-
>            src/glsl/glsl_parser.yy | 11 ++++-------
>            3 files changed, 49 insertions(+), 17 deletions(-)
>
>         diff --git a/src/glsl/ast.h b/src/glsl/ast.h
>         index 3ef9913..a40bbc0 100644
>         --- a/src/glsl/ast.h
>         +++ b/src/glsl/ast.h
>         @@ -907,12 +907,14 @@ public:
>            class ast_interface_block : public ast_node {
>            public:
>               ast_interface_block(ast_type___qualifier layout,
>         -                     const char *instance_name,
>         -                    ast_expression *array_size)
>         +                       const char *instance_name,
>         +                       bool is_array,
>         +                       ast_expression *array_size)
>               : layout(layout), block_name(NULL),
>         instance_name(instance_name),
>         -     array_size(array_size)
>         +     is_array(is_array), array_size(array_size)
>               {
>         -      /* empty */
>         +      if (!is_array)
>         +         assert(array_size == NULL);
>
>
>     I think this is better as:
>
>              assert(is_array || array_size == NULL);
>
>     The otherwise empty if-statements always bug me.
>
>
> I won't press you on the issue, but since you've asked me to rephrase
> assertions like this before, I'm curious why my original formulation
> bugs you.  Are you bothered because it makes it less obvious that the
> check will compile down to nothing in release builds?

It has become such a habit, that I actually had to think about why it 
bugs me. :)  There are three reasons, I think.

- As you identified, the oddness of the empty if-statement in debug builds.

- It always makes me wonder if there used to be more code in the 
if-statement, and that makes me wonder if the assertion still being 
there is evidence of bit rot.

- Having the assertion be entirely self-contained makes it easier to 
copy-and-paste or cut-and-paste it elsewhere.

> The reason I personally prefer the approach with the "if" statement is
> because it more closely matches the way we talk about these invariants
> using if/then language in the comments.  I have an easier time mentally
> translating from:

That's fair.  I think in this case it's clearly more clear (ha!), so 
that outweighs my reasons.

I'll see if I can write something to put in the coding standards to 
capture both of our thoughts on this.  The bigger utility, I suspect, 
will be capturing the reasons behind the guidelines than capturing the 
guidelines themselves.

> /**
>   * If the block is not declared as an array or if the block instance
>   * array is unsizied, this field will be \c NULL.
>   */
>
> to:
>
> if(!is_array) assert(array_size == NULL);
>
> than I do translating to:
>
> assert(is_array || array_size == NULL);
>
>
>
>               }
>
>               virtual ir_rvalue *hir(exec_list *instructions,
>         @@ -933,13 +935,19 @@ public:
>               exec_list declarations;
>
>               /**
>         -    * Declared array size of the block instance
>         -    *
>         -    * If the block is not declared as an array, this field will
>         be \c NULL.
>         +    * True if the block is declared as an array
>                *
>                * \note
>                * A block can only be an array if it also has an instance
>         name.  If this
>         -    * field is not \c NULL, ::instance_name must also not be \c
>         NULL.
>         +    * field is true, ::instance_name must also not be \c NULL.
>         +    */
>         +   bool is_array;
>         +
>         +   /**
>         +    * Declared array size of the block instance, or NULL if the
>         block instance
>         +    * array is unsized.
>
>
>     I'd leave the first line as-is and change the second part to be:
>
>         * If the block is not declared as an array or if the block instance
>         * array is unsizied, this field will be \c NULL.
>
>     That has the added benefit of making the diff look cleaner.
>
>
> I'm not certain I'm following your suggestion.  Is this better?

Yes, that's exactly what I had in mind.

>     /**
>      * True if the block is declared as an array
>      *
>      * \note
>      * A block can only be an array if it also has an instance name.  If
> this
>      * field is true, ::instance_name must also not be \c NULL.
>      */
>     bool is_array;
>
>     /**
>      * Declared array size of the block instance
>      *
>      * If the block is not declared as an array or if the block instance
> array
>      * is unsized, this field will be \c NULL.
>      */
>     ast_expression *array_size;



More information about the mesa-dev mailing list