[Mesa-dev] [PATCH 04/13] mesa: Introduce a yet unused _DrawVAO.
Mathias.Froehlich at gmx.net
Mathias.Froehlich at gmx.net
Thu Feb 15 19:55:16 UTC 2018
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;
+ /** 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;
+
/**
* 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)
+{
+ 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();
--
2.14.3
More information about the mesa-dev
mailing list