[Mesa-dev] [PATCH 4/9] mesa: add helper convenience functions for fetching geometry of gl_framebuffer

Rogovin, Kevin kevin.rogovin at intel.com
Wed May 6 00:27:34 PDT 2015

> I'm waffling about this a bit.  I'm concerned that people will use
> buffer->Width when they should use the accessor.  I don't see any
> changes to core Mesa code to use the accessor, so I'm a little concerned that some subtle, incorrect behavior is introduced... but there may well not be.

> A common idiom in Mesa is to have an _Value field that is the derived value.  In many structures in mtypes.h you can see things like Enabled and _ReallyEnabled.  One is what the API sets, and the other is what the driver uses that is based on the API setting and "other factors."  In many ways, the existing gl_framebuffer Width and Height fields are already derived values based on the sizes of the attachments.

>For at least Width, Height, and MaxNumLayers, it seems better to set the existing fields differently when _HasAttachments is true.  That reduces the number of places where a person has to think about _HasAttachments considerably... though perhaps there is something else that I'm not thinking of?

I was thinking of doing this when I was making the patch. The problem is that Width, Height and MaxNumLayers were used for two different purposes:
 1. Specifying the intersection of the attached buffers (this affects blitting for example)
 2. Specifying the "geometry" to send to a rasterizer

Changing Width and Height to be the geometry made me itch because Width and Height are zero when there are no buffer attachments. I added a mess of comments about the meaning of Width and Height. My concern is that other parts of code use Width and Height being 0 to do other things.  With this patch way, the meaning of Width and Height has not changed; instead a diver has to "know" what it is doing when it enables the extension.

I am not particular about this though; I made it this way in an attempt to reduce the scope of changes from this patch series. If people want that the meaning of Width, Height and MaxSamplers changes I can go with that too, I just think it can increase the ickiness of making sure no unintended side effects are added is ickier.

> If we go that route, we should probably just add a gl_framebuffer::Samples field for uniformity.

> +
> +
> +static inline  GLuint
> +_mesa_geometric_height(const struct gl_framebuffer *buffer) {
> +   return buffer->_HasAttachments ?
> +      buffer->Height : buffer->DefaultGeometry.Height; }
> +
> +static inline  GLuint
> +_mesa_geometric_samples(const struct gl_framebuffer *buffer) {
> +   return buffer->_HasAttachments ?
> +      buffer->Visual.samples : buffer->DefaultGeometry.NumSamples;
> +}
> +
> +static inline  GLuint
> +_mesa_geometric_layers(const struct gl_framebuffer *buffer) {
> +   return buffer->_HasAttachments ?
> +      buffer->MaxNumLayers : buffer->DefaultGeometry.Layers; }
> +
>  extern void
>  _mesa_update_draw_buffer_bounds(struct gl_context *ctx);
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 
> ef97538..f0e8fbc 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3178,7 +3178,13 @@ struct gl_framebuffer
>      * the values in DefaultGeometry to initialize its
>      * viewport, scissor and so on (in particular _Xmin,
>      * _Xmax, _Ymin and _Ymax do NOT take into account
> -    * _HasAttachments being false)
> +    * _HasAttachments being false). To get the geometry
> +    * of the framebuffer, the  helper functions
> +    *   _mesa_geometric_width(),
> +    *   _mesa_geometric_height(),
> +    *   _mesa_geometric_samples(),
> +    *   _mesa_geometric_layers()
> +    * are available that check _HasAttachments.
>      */
>     GLboolean _HasAttachments;

More information about the mesa-dev mailing list