mesa: split _mesa_set_draw_vao into set and update functions
authorMarek Olšák <marek.olsak@amd.com>
Fri, 18 Nov 2022 21:27:36 +0000 (16:27 -0500)
committerMarge Bot <emma+marge@anholt.net>
Mon, 12 Dec 2022 19:15:34 +0000 (19:15 +0000)
This is the beginning of splitting _mesa_set_draw_vao and moving pieces
of it out of draw functions.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19953>

src/mesa/main/arrayobj.c
src/mesa/main/attrib.c
src/mesa/main/draw.c
src/mesa/main/draw.h
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_cb_rasterpos.c
src/mesa/vbo/vbo_exec_draw.c
src/mesa/vbo/vbo_save_draw.c

index 300184d..f4338d6 100644 (file)
@@ -951,7 +951,8 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, bool no_error)
     * or to prevent a crash if the VAO being unbound is going to be
     * deleted.
     */
-   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
+   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO);
+   _mesa_update_vao_state(ctx, 0);
 
    _mesa_reference_vao(ctx, &ctx->Array.VAO, newObj);
 
@@ -1013,8 +1014,11 @@ 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);
+
+         if (ctx->Array._DrawVAO == obj) {
+            _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO);
+            _mesa_update_vao_state(ctx, 0);
+         }
 
          /* Unreference the array object.
           * If refcount hits zero, the object will be deleted.
index 9ecc6ac..4b9d641 100644 (file)
@@ -1310,7 +1310,8 @@ restore_array_attrib(struct gl_context *ctx,
    }
 
    /* Invalidate array state. It will be updated during the next draw. */
-   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
+   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO);
+   _mesa_update_vao_state(ctx, 0);
 
    if (is_vao_name_zero || !src->VAO->IndexBufferObj ||
        _mesa_IsBuffer(src->VAO->IndexBufferObj->Name)) {
index 33da01a..192b943 100644 (file)
@@ -104,17 +104,29 @@ _mesa_set_varying_vp_inputs(struct gl_context *ctx, GLbitfield varying_inputs)
  * enabled arrays when a fixed function array draw is executed.
  */
 void
-_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
-                   GLbitfield filter)
+_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao)
 {
    struct gl_vertex_array_object **ptr = &ctx->Array._DrawVAO;
-   bool new_vertex_buffers = false, new_vertex_elements = false;
 
    if (*ptr != vao) {
       _mesa_reference_vao_(ctx, ptr, vao);
-      new_vertex_buffers = true;
-      new_vertex_elements = true;
+      ctx->Array.NewVAO = true;
    }
+}
+
+/**
+ * Update derived VAO state. This determines whether to update gallium vertex
+ * buffers and vertex elements, and it sets which vertex attribs are enabled
+ * according to the filter.
+ */
+void
+_mesa_update_vao_state(struct gl_context *ctx, GLbitfield filter)
+{
+   struct gl_vertex_array_object *vao = ctx->Array._DrawVAO;
+   bool new_vertex_buffers, new_vertex_elements;
+
+   new_vertex_buffers = new_vertex_elements = ctx->Array.NewVAO;
+   ctx->Array.NewVAO = false;
 
    if (vao->NewVertexBuffers || vao->NewVertexElements) {
       _mesa_update_vao_derived_arrays(ctx, vao);
@@ -1368,8 +1380,8 @@ _mesa_DrawArrays(GLenum mode, GLint start, GLsizei count)
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1399,8 +1411,8 @@ _mesa_DrawArraysInstanced(GLenum mode, GLint start, GLsizei count,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1431,8 +1443,8 @@ _mesa_DrawArraysInstancedBaseInstance(GLenum mode, GLint first,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1462,8 +1474,8 @@ _mesa_MultiDrawArrays(GLenum mode, const GLint *first,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1695,8 +1707,8 @@ _mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1791,8 +1803,8 @@ _mesa_DrawElements(GLenum mode, GLsizei count, GLenum type,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1816,8 +1828,8 @@ _mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1841,8 +1853,8 @@ _mesa_DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1869,8 +1881,8 @@ _mesa_DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1899,8 +1911,8 @@ _mesa_DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -1931,8 +1943,8 @@ _mesa_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2082,8 +2094,8 @@ _mesa_MultiDrawElements(GLenum mode, const GLsizei *count, GLenum type,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2108,8 +2120,8 @@ _mesa_MultiDrawElementsBaseVertex(GLenum mode,
    GET_CURRENT_CONTEXT(ctx);
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2139,8 +2151,8 @@ _mesa_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
 {
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2245,8 +2257,8 @@ _mesa_DrawArraysIndirect(GLenum mode, const GLvoid *indirect)
 
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2303,8 +2315,8 @@ _mesa_DrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
 
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2329,8 +2341,8 @@ _mesa_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect,
 
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2401,8 +2413,8 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type,
 
    FLUSH_FOR_DRAW(ctx);
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2498,8 +2510,8 @@ _mesa_MultiDrawArraysIndirectCountARB(GLenum mode, GLintptr indirect,
    if (stride == 0)
       stride = 4 * sizeof(GLuint);      /* sizeof(DrawArraysIndirectCommand) */
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -2528,8 +2540,8 @@ _mesa_MultiDrawElementsIndirectCountARB(GLenum mode, GLenum type,
    if (stride == 0)
       stride = 5 * sizeof(GLuint);      /* sizeof(DrawElementsIndirectCommand) */
 
-   _mesa_set_draw_vao(ctx, ctx->Array.VAO,
-                      ctx->VertexProgram._VPModeInputFilter);
+   _mesa_set_draw_vao(ctx, ctx->Array.VAO);
+   _mesa_update_vao_state(ctx, ctx->VertexProgram._VPModeInputFilter);
 
    if (ctx->NewState)
       _mesa_update_state(ctx);
index ad603ca..0b5dd46 100644 (file)
@@ -80,12 +80,11 @@ struct _mesa_index_buffer
 void
 _mesa_set_varying_vp_inputs(struct gl_context *ctx, GLbitfield varying_inputs);
 
-/**
- * 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);
+_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao);
+
+void
+_mesa_update_vao_state(struct gl_context *ctx, GLbitfield filter);
 
 void
 _mesa_bitmap(struct gl_context *ctx, GLsizei width, GLsizei height,
index 43a7048..b195a9f 100644 (file)
@@ -1766,6 +1766,11 @@ struct gl_array_attrib
    GLbitfield _DrawVAOEnabledAttribs;
 
    /**
+    * Whether the VAO has been changed.
+    */
+   bool NewVAO;
+
+   /**
     * If gallium vertex buffers are dirty, this flag indicates whether gallium
     * vertex elements are dirty too. If this is false, GL states corresponding
     * to vertex elements have not been changed. Thus, this affects what will
index 6f38138..fecbb0b 100644 (file)
@@ -264,7 +264,9 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4])
    /* Non-dynamic VAOs merge vertex buffers, which changes vertex elements. */
    if (!rs->VAO->IsDynamic)
       rs->VAO->NewVertexElements = true;
-   _mesa_set_draw_vao(ctx, rs->VAO, VERT_BIT_POS);
+
+   _mesa_set_draw_vao(ctx, rs->VAO);
+   _mesa_update_vao_state(ctx, VERT_BIT_POS);
 
    st_feedback_draw_vbo(ctx, &rs->info, 0, &rs->draw, 1);
 
index 132509a..e4adbc1 100644 (file)
@@ -147,7 +147,8 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
    assert(!exec->vtx.bufferobj ||
           (vao_enabled & ~vao->VertexAttribBufferMask) == 0);
 
-   _mesa_set_draw_vao(ctx, vao, vao_filter);
+   _mesa_set_draw_vao(ctx, vao);
+   _mesa_update_vao_state(ctx, vao_filter);
 }
 
 
index 95dcd98..4a53a8a 100644 (file)
@@ -138,7 +138,8 @@ bind_vertex_list(struct gl_context *ctx,
 {
    const gl_vertex_processing_mode mode = ctx->VertexProgram._VPMode;
 
-   _mesa_set_draw_vao(ctx, node->cold->VAO[mode], _vbo_get_vao_filter(mode));
+   _mesa_set_draw_vao(ctx, node->cold->VAO[mode]);
+   _mesa_update_vao_state(ctx, _vbo_get_vao_filter(mode));
 }