[Mesa-dev] [PATCH 04/13] mesa: Introduce a yet unused _DrawVAO.

Brian Paul brianp at vmware.com
Thu Feb 15 23:27:07 UTC 2018


On 02/15/2018 12:55 PM, Mathias.Froehlich at gmx.net wrote:
> From: Mathias Fröhlich <mathias.froehlich at web.de>
> 
> During the patch series this VAO gets populated with
> either the currently bound VAO or an internal VAO that
> will be used for immediate mode and dlist rendering.
> 
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
>   src/mesa/main/arrayobj.c |  4 ++++
>   src/mesa/main/attrib.c   |  2 ++
>   src/mesa/main/context.c  |  2 ++
>   src/mesa/main/mtypes.h   |  7 +++++++
>   src/mesa/main/state.c    | 21 +++++++++++++++++++++
>   src/mesa/main/state.h    |  8 ++++++++
>   src/mesa/main/varray.c   |  2 ++
>   7 files changed, 46 insertions(+)
> 
> diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
> index a6fa33c82c..cf9c5d7ecc 100644
> --- a/src/mesa/main/arrayobj.c
> +++ b/src/mesa/main/arrayobj.c
> @@ -49,6 +49,7 @@
>   #include "arrayobj.h"
>   #include "macros.h"
>   #include "mtypes.h"
> +#include "state.h"
>   #include "varray.h"
>   #include "main/dispatch.h"
>   #include "util/bitscan.h"
> @@ -578,6 +579,7 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, bool no_error)
>       * deleted.
>       */
>      _mesa_set_drawing_arrays(ctx, NULL);
> +   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
>   
>      ctx->NewState |= _NEW_ARRAY;
>      _mesa_reference_vao(ctx, &ctx->Array.VAO, newObj);
> @@ -629,6 +631,8 @@ delete_vertex_arrays(struct gl_context *ctx, GLsizei n, const GLuint *ids)
>   
>            if (ctx->Array.LastLookedUpVAO == obj)
>               _mesa_reference_vao(ctx, &ctx->Array.LastLookedUpVAO, NULL);
> +         if (ctx->Array._DrawVAO == obj)
> +            _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
>   
>            /* Unreference the array object.
>             * If refcount hits zero, the object will be deleted.
> diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
> index 398ff653b7..dd6b98ce04 100644
> --- a/src/mesa/main/attrib.c
> +++ b/src/mesa/main/attrib.c
> @@ -57,6 +57,7 @@
>   #include "viewport.h"
>   #include "mtypes.h"
>   #include "main/dispatch.h"
> +#include "state.h"
>   #include "hash.h"
>   #include <stdbool.h>
>   
> @@ -1548,6 +1549,7 @@ copy_array_attrib(struct gl_context *ctx,
>   
>      /* Invalidate array state. It will be updated during the next draw. */
>      _mesa_set_drawing_arrays(ctx, NULL);
> +   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
>   }
>   
>   /**
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 0aa2e3639f..e13343b5e6 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -1335,6 +1335,8 @@ _mesa_free_context_data( struct gl_context *ctx )
>   
>      _mesa_reference_vao(ctx, &ctx->Array.VAO, NULL);
>      _mesa_reference_vao(ctx, &ctx->Array.DefaultVAO, NULL);
> +   _mesa_reference_vao(ctx, &ctx->Array._EmptyVAO, NULL);
> +   _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, NULL);
>   
>      _mesa_free_attrib_data(ctx);
>      _mesa_free_buffer_objects(ctx);
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 41df04d38d..b6fdb69283 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1691,6 +1691,13 @@ struct gl_array_attrib
>      /* GL_ARB_vertex_buffer_object */
>      struct gl_buffer_object *ArrayBufferObj;
>   
> +   /** Vertex array object used when no specific DrawVAO is bound */
> +   struct gl_vertex_array_object *_EmptyVAO;

I'm not sure I understand the purpose of that.  By "used" do you mean 
when drawing?


> +   /** Vertex array object used for the current draw */
> +   struct gl_vertex_array_object *_DrawVAO;
> +   /** The possibly reduced set of enabled vertex attributes from the above */
> +   GLbitfield _DrawVAOEnabled;

_DrawVAOEnabledAttribs?


> +
>      /**
>       * Vertex arrays as consumed by a driver.
>       * The array pointer is set up only by the VBO module.
> diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
> index 2fd4fb9d32..42bf483682 100644
> --- a/src/mesa/main/state.c
> +++ b/src/mesa/main/state.c
> @@ -479,3 +479,24 @@ _mesa_update_vertex_processing_mode(struct gl_context *ctx)
>      else
>         ctx->VertexProgram._VPMode = VP_MODE_FF;
>   }
> +
> +
> +void
> +_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
> +                   GLbitfield filter)

Can you put a comment on this function to explain it, and specifically, 
the filter parameter?


> +{
> +   struct gl_vertex_array_object **ptr = &ctx->Array._DrawVAO;
> +   if (*ptr != vao) {
> +      _mesa_reference_vao_(ctx, ptr, vao);
> +      ctx->NewDriverState |= ctx->DriverFlags.NewArray;
> +   } else if (vao->NewArrays) {
> +      ctx->NewDriverState |= ctx->DriverFlags.NewArray;
> +   }
> +
> +   /* May shuffle the position and generic0 bits around, filter out unwanted */
> +   const GLbitfield enabled = filter & _mesa_get_vao_vp_inputs(vao);
> +   if (ctx->Array._DrawVAOEnabled != enabled)
> +      ctx->NewDriverState |= ctx->DriverFlags.NewArray;
> +   ctx->Array._DrawVAOEnabled = enabled;
> +   _mesa_set_varying_vp_inputs(ctx, enabled);
> +}
> diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h
> index 049166578c..589c6650ad 100644
> --- a/src/mesa/main/state.h
> +++ b/src/mesa/main/state.h
> @@ -53,6 +53,14 @@ extern void
>   _mesa_update_vertex_processing_mode(struct gl_context *ctx);
>   
>   
> +/**
> + * Set the _DrawVAO and the net enabled arrays.
> + */
> +void
> +_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
> +                   GLbitfield filter);
> +
> +
>   static inline bool
>   _mesa_ati_fragment_shader_enabled(const struct gl_context *ctx)
>   {
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index d55f74e968..fc9e6fb6ba 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -2925,6 +2925,8 @@ _mesa_init_varray(struct gl_context *ctx)
>   {
>      ctx->Array.DefaultVAO = _mesa_new_vao(ctx, 0);
>      _mesa_reference_vao(ctx, &ctx->Array.VAO, ctx->Array.DefaultVAO);
> +   ctx->Array._EmptyVAO = _mesa_new_vao(ctx, ~0u);
> +   _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, ctx->Array._EmptyVAO);
>      ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
>   
>      ctx->Array.Objects = _mesa_NewHashTable();
> 



More information about the mesa-dev mailing list