Mesa (main): zink: implement pipe_context::draw_vertex_state

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 17 03:31:54 UTC 2021


Module: Mesa
Branch: main
Commit: 86eb1549efded1e6209b65d2b90a0d270d076824
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=86eb1549efded1e6209b65d2b90a0d270d076824

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Nov  5 12:00:25 2021 -0400

zink: implement pipe_context::draw_vertex_state

rough implementation, but it should be a decent start

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13692>

---

 src/gallium/drivers/zink/zink_context.h |   8 +-
 src/gallium/drivers/zink/zink_draw.cpp  | 130 ++++++++++++++++++++++++++------
 src/gallium/drivers/zink/zink_inlines.h |   2 +
 src/gallium/drivers/zink/zink_screen.c  |   8 ++
 src/gallium/drivers/zink/zink_screen.h  |   2 +
 src/gallium/drivers/zink/zink_state.c   |  93 +++++++++++++++++++++++
 src/gallium/drivers/zink/zink_state.h   |  40 +++++++++-
 7 files changed, 258 insertions(+), 25 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index 65aaf02c00f..9e017c7d9bc 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -160,7 +160,12 @@ typedef void (*pipe_draw_vbo_func)(struct pipe_context *pipe,
                                    const struct pipe_draw_indirect_info *indirect,
                                    const struct pipe_draw_start_count_bias *draws,
                                    unsigned num_draws);
-
+typedef void (*pipe_draw_vertex_state_func)(struct pipe_context *ctx,
+                                            struct pipe_vertex_state *vstate,
+                                            uint32_t partial_velem_mask,
+                                            struct pipe_draw_vertex_state_info info,
+                                            const struct pipe_draw_start_count_bias *draws,
+                                            unsigned num_draws);
 typedef void (*pipe_launch_grid_func)(struct pipe_context *pipe, const struct pipe_grid_info *info);
 
 typedef enum {
@@ -183,6 +188,7 @@ struct zink_context {
    struct blitter_context *blitter;
 
    pipe_draw_vbo_func draw_vbo[2]; //batch changed
+   pipe_draw_vertex_state_func draw_state[2]; //batch changed
    pipe_launch_grid_func launch_grid[2]; //batch changed
 
    struct pipe_device_reset_callback reset;
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index 2be1085048b..532aeb4814f 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -171,6 +171,28 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx)
    ctx->vertex_buffers_dirty = false;
 }
 
+static void
+zink_bind_vertex_state(struct zink_batch *batch, struct zink_context *ctx,
+                       struct pipe_vertex_state *vstate, uint32_t partial_velem_mask)
+{
+   if (!vstate->input.vbuffer.buffer.resource)
+      return;
+
+   const struct zink_vertex_elements_hw_state *hw_state = zink_vertex_state_mask(vstate, partial_velem_mask, true);
+   assert(hw_state);
+
+   struct zink_resource *res = zink_resource(vstate->input.vbuffer.buffer.resource);
+   zink_batch_resource_usage_set(&ctx->batch, res, false);
+   VkDeviceSize offset = vstate->input.vbuffer.buffer_offset;
+   VKCTX(CmdBindVertexBuffers)(batch->state->cmdbuf, 0,
+                               hw_state->num_bindings,
+                               &res->obj->buffer, &offset);
+
+   VKCTX(CmdSetVertexInputEXT)(batch->state->cmdbuf,
+                               hw_state->num_bindings, hw_state->dynbindings,
+                               hw_state->num_attribs, hw_state->dynattribs);
+}
+
 static void
 update_gfx_program(struct zink_context *ctx)
 {
@@ -452,14 +474,16 @@ hack_conditional_render(struct pipe_context *pctx,
    return true;
 }
 
-template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED>
+template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED, bool DRAW_STATE>
 void
-zink_draw_vbo(struct pipe_context *pctx,
-              const struct pipe_draw_info *dinfo,
-              unsigned drawid_offset,
-              const struct pipe_draw_indirect_info *dindirect,
-              const struct pipe_draw_start_count_bias *draws,
-              unsigned num_draws)
+zink_draw(struct pipe_context *pctx,
+          const struct pipe_draw_info *dinfo,
+          unsigned drawid_offset,
+          const struct pipe_draw_indirect_info *dindirect,
+          const struct pipe_draw_start_count_bias *draws,
+          unsigned num_draws,
+          struct pipe_vertex_state *vstate,
+          uint32_t partial_velem_mask)
 {
    struct zink_context *ctx = zink_context(pctx);
    struct zink_screen *screen = zink_screen(pctx->screen);
@@ -734,7 +758,9 @@ zink_draw_vbo(struct pipe_context *pctx,
    }
    ctx->blend_state_changed = false;
 
-   if (BATCH_CHANGED || ctx->vertex_buffers_dirty)
+   if (DRAW_STATE)
+      zink_bind_vertex_state(batch, ctx, vstate, partial_velem_mask);
+   else if (BATCH_CHANGED || ctx->vertex_buffers_dirty)
       zink_bind_vertex_buffers<DYNAMIC_STATE>(batch, ctx);
 
    zink_query_update_gs_states(ctx);
@@ -859,6 +885,47 @@ zink_draw_vbo(struct pipe_context *pctx,
       pctx->flush(pctx, NULL, 0);
 }
 
+template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED>
+static void
+zink_draw_vbo(struct pipe_context *pctx,
+              const struct pipe_draw_info *info,
+              unsigned drawid_offset,
+              const struct pipe_draw_indirect_info *indirect,
+              const struct pipe_draw_start_count_bias *draws,
+              unsigned num_draws)
+{
+   zink_draw<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED, false>(pctx, info, drawid_offset, indirect, draws, num_draws, NULL, 0);
+}
+
+template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED>
+static void
+zink_draw_vertex_state(struct pipe_context *pctx,
+                       struct pipe_vertex_state *vstate,
+                       uint32_t partial_velem_mask,
+                       struct pipe_draw_vertex_state_info info,
+                       const struct pipe_draw_start_count_bias *draws,
+                       unsigned num_draws)
+{
+   struct pipe_draw_info dinfo = {};
+
+   dinfo.mode = info.mode;
+   dinfo.index_size = 4;
+   dinfo.instance_count = 1;
+   dinfo.index.resource = vstate->input.indexbuf;
+   struct zink_context *ctx = zink_context(pctx);
+   struct zink_resource *res = zink_resource(vstate->input.vbuffer.buffer.resource);
+   zink_resource_buffer_barrier(ctx, res, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
+                                VK_PIPELINE_STAGE_VERTEX_INPUT_BIT);
+   struct zink_vertex_elements_hw_state *hw_state = ctx->gfx_pipeline_state.element_state;
+   ctx->gfx_pipeline_state.element_state = &((struct zink_vertex_state*)vstate)->velems.hw_state;
+
+   zink_draw<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED, true>(pctx, &dinfo, 0, NULL, draws, num_draws, vstate, partial_velem_mask);
+   ctx->gfx_pipeline_state.element_state = hw_state;
+
+   if (info.take_vertex_state_ownership)
+      pipe_vertex_state_reference(&vstate, NULL);
+}
+
 template <bool BATCH_CHANGED>
 static void
 zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info)
@@ -928,35 +995,35 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info)
 
 template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED>
 static void
-init_batch_changed_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2])
+init_batch_changed_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2], pipe_draw_vertex_state_func draw_state_array[2][4][2])
 {
-   draw_vbo_array[HAS_MULTIDRAW][DYNAMIC_STATE][BATCH_CHANGED] =
-   zink_draw_vbo<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED>;
+   draw_vbo_array[HAS_MULTIDRAW][DYNAMIC_STATE][BATCH_CHANGED] = zink_draw_vbo<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED>;
+   draw_state_array[HAS_MULTIDRAW][DYNAMIC_STATE][BATCH_CHANGED] = zink_draw_vertex_state<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED>;
 }
 
 template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE>
 static void
-init_dynamic_state_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2])
+init_dynamic_state_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2], pipe_draw_vertex_state_func draw_state_array[2][4][2])
 {
-   init_batch_changed_functions<HAS_MULTIDRAW, DYNAMIC_STATE, false>(ctx, draw_vbo_array);
-   init_batch_changed_functions<HAS_MULTIDRAW, DYNAMIC_STATE, true>(ctx, draw_vbo_array);
+   init_batch_changed_functions<HAS_MULTIDRAW, DYNAMIC_STATE, false>(ctx, draw_vbo_array, draw_state_array);
+   init_batch_changed_functions<HAS_MULTIDRAW, DYNAMIC_STATE, true>(ctx, draw_vbo_array, draw_state_array);
 }
 
 template <zink_multidraw HAS_MULTIDRAW>
 static void
-init_multidraw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2])
+init_multidraw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2], pipe_draw_vertex_state_func draw_state_array[2][4][2])
 {
-   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_NO_DYNAMIC_STATE>(ctx, draw_vbo_array);
-   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_STATE>(ctx, draw_vbo_array);
-   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_STATE2>(ctx, draw_vbo_array);
-   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_VERTEX_INPUT>(ctx, draw_vbo_array);
+   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_NO_DYNAMIC_STATE>(ctx, draw_vbo_array, draw_state_array);
+   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_STATE>(ctx, draw_vbo_array, draw_state_array);
+   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_STATE2>(ctx, draw_vbo_array, draw_state_array);
+   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_VERTEX_INPUT>(ctx, draw_vbo_array, draw_state_array);
 }
 
 static void
-init_all_draw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2])
+init_all_draw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][4][2], pipe_draw_vertex_state_func draw_state_array[2][4][2])
 {
-   init_multidraw_functions<ZINK_NO_MULTIDRAW>(ctx, draw_vbo_array);
-   init_multidraw_functions<ZINK_MULTIDRAW>(ctx, draw_vbo_array);
+   init_multidraw_functions<ZINK_NO_MULTIDRAW>(ctx, draw_vbo_array, draw_state_array);
+   init_multidraw_functions<ZINK_MULTIDRAW>(ctx, draw_vbo_array, draw_state_array);
 }
 
 template <bool BATCH_CHANGED>
@@ -984,6 +1051,17 @@ zink_invalid_draw_vbo(struct pipe_context *pipe,
    unreachable("vertex shader not bound");
 }
 
+static void
+zink_invalid_draw_vertex_state(struct pipe_context *pipe,
+                               struct pipe_vertex_state *vstate,
+                               uint32_t partial_velem_mask,
+                               struct pipe_draw_vertex_state_info info,
+                               const struct pipe_draw_start_count_bias *draws,
+                               unsigned num_draws)
+{
+   unreachable("vertex shader not bound");
+}
+
 static void
 zink_invalid_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info)
 {
@@ -1043,6 +1121,8 @@ zink_init_draw_functions(struct zink_context *ctx, struct zink_screen *screen)
 {
    pipe_draw_vbo_func draw_vbo_array[2][4] //multidraw, zink_dynamic_state
                                     [2];   //batch changed
+   pipe_draw_vertex_state_func draw_state_array[2][4] //multidraw, zink_dynamic_state
+                                               [2];   //batch changed
    zink_dynamic_state dynamic;
    if (screen->info.have_EXT_extended_dynamic_state) {
       if (screen->info.have_EXT_extended_dynamic_state2) {
@@ -1056,15 +1136,19 @@ zink_init_draw_functions(struct zink_context *ctx, struct zink_screen *screen)
    } else {
       dynamic = ZINK_NO_DYNAMIC_STATE;
    }
-   init_all_draw_functions(ctx, draw_vbo_array);
+   init_all_draw_functions(ctx, draw_vbo_array, draw_state_array);
    memcpy(ctx->draw_vbo, &draw_vbo_array[screen->info.have_EXT_multi_draw]
                                         [dynamic],
                                         sizeof(ctx->draw_vbo));
+   memcpy(ctx->draw_state, &draw_state_array[screen->info.have_EXT_multi_draw]
+                                          [dynamic],
+                                          sizeof(ctx->draw_state));
 
    /* Bind a fake draw_vbo, so that draw_vbo isn't NULL, which would skip
     * initialization of callbacks in upper layers (such as u_threaded_context).
     */
    ctx->base.draw_vbo = zink_invalid_draw_vbo;
+   ctx->base.draw_vertex_state = zink_invalid_draw_vertex_state;
 
    _mesa_hash_table_init(&ctx->program_cache[0], ctx, hash_gfx_program<0>, equals_gfx_program<0>);
    _mesa_hash_table_init(&ctx->program_cache[1], ctx, hash_gfx_program<1>, equals_gfx_program<1>);
diff --git a/src/gallium/drivers/zink/zink_inlines.h b/src/gallium/drivers/zink/zink_inlines.h
index fe873828423..44d4474d99a 100644
--- a/src/gallium/drivers/zink/zink_inlines.h
+++ b/src/gallium/drivers/zink/zink_inlines.h
@@ -6,7 +6,9 @@ static inline void
 zink_select_draw_vbo(struct zink_context *ctx)
 {
    ctx->base.draw_vbo = ctx->draw_vbo[ctx->pipeline_changed[0]];
+   ctx->base.draw_vertex_state = ctx->draw_state[ctx->pipeline_changed[0]];
    assert(ctx->base.draw_vbo);
+   assert(ctx->base.draw_vertex_state);
 }
 
 static inline void
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 11814e25a9a..45ae6c4b5b2 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -363,6 +363,9 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
       return 1;
 
+   case PIPE_CAP_DRAW_VERTEX_STATE:
+      return screen->info.have_EXT_vertex_input_dynamic_state;
+
    case PIPE_CAP_SURFACE_SAMPLE_COUNT:
       return screen->vk_version >= VK_MAKE_VERSION(1,2,0);
 
@@ -2068,6 +2071,11 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
    zink_screen_init_descriptor_funcs(screen, false);
    util_idalloc_mt_init_tc(&screen->buffer_ids);
 
+   util_vertex_state_cache_init(&screen->vertex_state_cache,
+                                zink_create_vertex_state, zink_vertex_state_destroy);
+   screen->base.create_vertex_state = zink_cache_create_vertex_state;
+   screen->base.vertex_state_destroy = zink_cache_vertex_state_destroy;
+
    return screen;
 
 fail:
diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h
index 6bb14fc4545..7df140b078f 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -37,6 +37,7 @@
 #include "util/simple_mtx.h"
 #include "util/u_queue.h"
 #include "util/u_live_shader_cache.h"
+#include "util/u_vertex_state_cache.h"
 #include "pipebuffer/pb_cache.h"
 #include "pipebuffer/pb_slab.h"
 #include <vulkan/vulkan.h>
@@ -120,6 +121,7 @@ struct zink_screen {
    VkPhysicalDevice pdev;
    uint32_t vk_version, spirv_version;
    struct util_idalloc_mt buffer_ids;
+   struct util_vertex_state_cache vertex_state_cache;
 
    struct zink_device_info info;
    struct nir_shader_compiler_options nir_options;
diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c
index 68e8d413ff9..313c78cc396 100644
--- a/src/gallium/drivers/zink/zink_state.c
+++ b/src/gallium/drivers/zink/zink_state.c
@@ -31,6 +31,7 @@
 #include "compiler/shader_enums.h"
 #include "util/u_dual_blend.h"
 #include "util/u_memory.h"
+#include "util/u_helpers.h"
 
 #include <math.h>
 
@@ -714,6 +715,98 @@ zink_delete_rasterizer_state(struct pipe_context *pctx, void *rs_state)
    FREE(rs_state);
 }
 
+struct pipe_vertex_state *
+zink_create_vertex_state(struct pipe_screen *pscreen,
+                          struct pipe_vertex_buffer *buffer,
+                          const struct pipe_vertex_element *elements,
+                          unsigned num_elements,
+                          struct pipe_resource *indexbuf,
+                          uint32_t full_velem_mask)
+{
+   struct zink_vertex_state *zstate = CALLOC_STRUCT(zink_vertex_state);
+   _mesa_set_init(&zstate->masks, NULL, NULL, _mesa_key_pointer_equal);
+
+   util_init_pipe_vertex_state(pscreen, buffer, elements, num_elements, indexbuf, full_velem_mask,
+                               &zstate->b);
+
+   /* Initialize the vertex element state in state->element.
+    * Do it by creating a vertex element state object and copying it there.
+    */
+   struct zink_context ctx;
+   ctx.base.screen = pscreen;
+   struct zink_vertex_elements_state *elems = zink_create_vertex_elements_state(&ctx.base, num_elements, elements);
+   for (unsigned i = 0; i < elems->hw_state.num_bindings; i++) {
+      if (zink_screen(pscreen)->info.have_EXT_vertex_input_dynamic_state)
+         elems->hw_state.dynbindings[i].stride = buffer->stride;
+   }
+   zstate->velems = *elems;
+   zink_delete_vertex_elements_state(&ctx.base, elems);
+
+   return &zstate->b;
+}
+
+void
+zink_vertex_state_destroy(struct pipe_screen *pscreen, struct pipe_vertex_state *vstate)
+{
+   struct zink_vertex_state *zstate = (struct zink_vertex_state *)vstate;
+   ralloc_free(zstate->masks.table);
+   pipe_vertex_buffer_unreference(&vstate->input.vbuffer);
+   pipe_resource_reference(&vstate->input.indexbuf, NULL);
+   FREE(vstate);
+}
+
+const struct zink_vertex_elements_hw_state *
+zink_vertex_state_mask(struct pipe_vertex_state *vstate, uint32_t partial_velem_mask, bool have_EXT_vertex_input_dynamic_state)
+{
+   struct zink_vertex_state *zstate = (struct zink_vertex_state *)vstate;
+
+   if (partial_velem_mask == vstate->input.full_velem_mask)
+      return &zstate->velems.hw_state;
+   struct set_entry *he = _mesa_set_search_pre_hashed(&zstate->masks, partial_velem_mask, (void*)(uintptr_t)partial_velem_mask);
+   if (he)
+      return he->key;
+
+   struct zink_vertex_elements_hw_state *hw_state = rzalloc(zstate->masks.table, struct zink_vertex_elements_hw_state);
+   unsigned i = 0;
+   if (have_EXT_vertex_input_dynamic_state) {
+      u_foreach_bit(elem, vstate->input.full_velem_mask & partial_velem_mask) {
+         unsigned idx = util_bitcount(vstate->input.full_velem_mask & BITFIELD_MASK(elem));
+         hw_state->dynattribs[i] = zstate->velems.hw_state.dynattribs[idx];
+         hw_state->dynattribs[i].location = i;
+         i++;
+      }
+      memcpy(hw_state->dynbindings, zstate->velems.hw_state.dynbindings,
+             zstate->velems.hw_state.num_bindings * sizeof(VkVertexInputBindingDescription2EXT));
+   } else {
+   }
+   hw_state->num_attribs = i;
+   hw_state->num_bindings = zstate->velems.hw_state.num_bindings;
+   _mesa_set_add_pre_hashed(&zstate->masks, partial_velem_mask, hw_state);
+   return hw_state;
+}
+
+struct pipe_vertex_state *
+zink_cache_create_vertex_state(struct pipe_screen *pscreen,
+                               struct pipe_vertex_buffer *buffer,
+                               const struct pipe_vertex_element *elements,
+                               unsigned num_elements,
+                               struct pipe_resource *indexbuf,
+                               uint32_t full_velem_mask)
+{
+   struct zink_screen *screen = zink_screen(pscreen);
+
+   return util_vertex_state_cache_get(pscreen, buffer, elements, num_elements, indexbuf,
+                                      full_velem_mask, &screen->vertex_state_cache);
+}
+
+void
+zink_cache_vertex_state_destroy(struct pipe_screen *pscreen, struct pipe_vertex_state *vstate)
+{
+   struct zink_screen *screen = zink_screen(pscreen);
+
+   util_vertex_state_destroy(pscreen, &screen->vertex_state_cache, vstate);
+}
+
 void
 zink_context_state_init(struct pipe_context *pctx)
 {
diff --git a/src/gallium/drivers/zink/zink_state.h b/src/gallium/drivers/zink/zink_state.h
index 1254498377c..27011903fe4 100644
--- a/src/gallium/drivers/zink/zink_state.h
+++ b/src/gallium/drivers/zink/zink_state.h
@@ -27,9 +27,11 @@
 #include <vulkan/vulkan.h>
 
 #include "pipe/p_state.h"
+#include "util/set.h"
 
 struct zink_vertex_elements_hw_state {
    uint32_t hash;
+   uint32_t num_bindings, num_attribs;
    union {
       VkVertexInputAttributeDescription attribs[PIPE_MAX_ATTRIBS];
       VkVertexInputAttributeDescription2EXT dynattribs[PIPE_MAX_ATTRIBS];
@@ -42,7 +44,6 @@ struct zink_vertex_elements_hw_state {
       } b;
       VkVertexInputBindingDescription2EXT dynbindings[PIPE_MAX_ATTRIBS];
    };
-   uint32_t num_bindings, num_attribs;
 };
 
 struct zink_vertex_elements_state {
@@ -59,6 +60,12 @@ struct zink_vertex_elements_state {
    struct zink_vertex_elements_hw_state hw_state;
 };
 
+struct zink_vertex_state {
+   struct pipe_vertex_state b;
+   struct zink_vertex_elements_state velems;
+   struct set masks;
+};
+
 struct zink_rasterizer_hw_state {
    unsigned polygon_mode : 2; //VkPolygonMode
    unsigned cull_mode : 2; //VkCullModeFlags
@@ -115,7 +122,38 @@ struct zink_depth_stencil_alpha_state {
    struct zink_depth_stencil_alpha_hw_state hw_state;
 };
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 void
 zink_context_state_init(struct pipe_context *pctx);
 
+
+struct pipe_vertex_state *
+zink_create_vertex_state(struct pipe_screen *pscreen,
+                          struct pipe_vertex_buffer *buffer,
+                          const struct pipe_vertex_element *elements,
+                          unsigned num_elements,
+                          struct pipe_resource *indexbuf,
+                          uint32_t full_velem_mask);
+void
+zink_vertex_state_destroy(struct pipe_screen *pscreen, struct pipe_vertex_state *vstate);
+struct pipe_vertex_state *
+zink_cache_create_vertex_state(struct pipe_screen *pscreen,
+                               struct pipe_vertex_buffer *buffer,
+                               const struct pipe_vertex_element *elements,
+                               unsigned num_elements,
+                               struct pipe_resource *indexbuf,
+                               uint32_t full_velem_mask);
+void
+zink_cache_vertex_state_destroy(struct pipe_screen *pscreen, struct pipe_vertex_state *vstate);
+
+const struct zink_vertex_elements_hw_state *
+zink_vertex_state_mask(struct pipe_vertex_state *vstate, uint32_t partial_velem_mask, bool have_EXT_vertex_input_dynamic_state);
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif



More information about the mesa-commit mailing list