Mesa (main): zink: add draw template for dynamic state

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 20 00:37:34 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue May 11 15:07:15 2021 -0400

zink: add draw template for dynamic state

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

---

 src/gallium/drivers/zink/zink_context.c |   1 +
 src/gallium/drivers/zink/zink_context.h |  10 ++-
 src/gallium/drivers/zink/zink_draw.cpp  | 107 +++++++++++++++++---------------
 src/gallium/drivers/zink/zink_inlines.h |   2 +-
 4 files changed, 67 insertions(+), 53 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index f7e0c38249b..f9b04853e69 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -3416,6 +3416,7 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
    if (!ctx)
       goto fail;
    ctx->have_timelines = screen->info.have_KHR_timeline_semaphore;
+   ctx->dynamic_state = screen->info.have_EXT_extended_dynamic_state;
 
    ctx->gfx_pipeline_state.dirty = true;
    ctx->compute_pipeline_state.dirty = true;
diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index 3c177046785..0a11a627b65 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -149,6 +149,11 @@ typedef enum {
    ZINK_MULTIDRAW,
 } zink_multidraw;
 
+typedef enum {
+   ZINK_NO_DYNAMIC_STATE,
+   ZINK_DYNAMIC_STATE,
+} zink_dynamic_state;
+
 struct zink_context {
    struct pipe_context base;
    struct threaded_context *tc;
@@ -156,8 +161,9 @@ struct zink_context {
    struct slab_child_pool transfer_pool_unsync;
    struct blitter_context *blitter;
 
-   zink_multidraw multidraw;
-   pipe_draw_vbo_func draw_vbo[2]; //multidraw
+   zink_multidraw multidraw : 1;
+   zink_dynamic_state dynamic_state : 1;
+   pipe_draw_vbo_func draw_vbo[2][2]; //multidraw, dynamic state
 
    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 f5f44187259..c56edb6bb73 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -122,6 +122,7 @@ barrier_draw_buffers(struct zink_context *ctx, const struct pipe_draw_info *dinf
    }
 }
 
+template <zink_dynamic_state HAS_DYNAMIC_STATE>
 static void
 zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx)
 {
@@ -149,7 +150,7 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx)
       }
    }
 
-   if (screen->info.have_EXT_extended_dynamic_state)
+   if (HAS_DYNAMIC_STATE)
       screen->vk.CmdBindVertexBuffers2EXT(batch->state->cmdbuf, 0,
                                           elems->hw_state.num_bindings,
                                           buffers, buffer_offsets, NULL, buffer_strides);
@@ -394,7 +395,7 @@ update_barriers(struct zink_context *ctx, bool is_compute)
    }
 }
 
-template <zink_multidraw HAS_MULTIDRAW>
+template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state HAS_DYNAMIC_STATE>
 void
 zink_draw_vbo(struct pipe_context *pctx,
               const struct pipe_draw_info *dinfo,
@@ -511,7 +512,7 @@ zink_draw_vbo(struct pipe_context *pctx,
          };
          viewports[i] = viewport;
       }
-      if (screen->info.have_EXT_extended_dynamic_state)
+      if (HAS_DYNAMIC_STATE)
          screen->vk.CmdSetViewportWithCountEXT(batch->state->cmdbuf, ctx->vp_state.num_viewports, viewports);
       else
          vkCmdSetViewport(batch->state->cmdbuf, 0, ctx->vp_state.num_viewports, viewports);
@@ -533,7 +534,7 @@ zink_draw_vbo(struct pipe_context *pctx,
             scissors[i].extent.height = ctx->fb_state.height;
          }
       }
-      if (screen->info.have_EXT_extended_dynamic_state)
+      if (HAS_DYNAMIC_STATE)
          screen->vk.CmdSetScissorWithCountEXT(batch->state->cmdbuf, ctx->vp_state.num_viewports, scissors);
       else
          vkCmdSetScissor(batch->state->cmdbuf, 0, ctx->vp_state.num_viewports, scissors);
@@ -549,50 +550,46 @@ zink_draw_vbo(struct pipe_context *pctx,
       ctx->stencil_ref_changed = false;
    }
 
-   if (pipeline_changed || ctx->dsa_state_changed) {
-      if (screen->info.have_EXT_extended_dynamic_state) {
-         screen->vk.CmdSetDepthBoundsTestEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_bounds_test);
-         if (dsa_state->hw_state.depth_bounds_test)
-            vkCmdSetDepthBounds(batch->state->cmdbuf,
-                                dsa_state->hw_state.min_depth_bounds,
-                                dsa_state->hw_state.max_depth_bounds);
-         screen->vk.CmdSetDepthTestEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_test);
-         if (dsa_state->hw_state.depth_test)
-            screen->vk.CmdSetDepthCompareOpEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_compare_op);
-         screen->vk.CmdSetDepthWriteEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_write);
-         screen->vk.CmdSetStencilTestEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.stencil_test);
-         if (dsa_state->hw_state.stencil_test) {
-            screen->vk.CmdSetStencilOpEXT(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_BIT,
-                                          dsa_state->hw_state.stencil_front.failOp,
-                                          dsa_state->hw_state.stencil_front.passOp,
-                                          dsa_state->hw_state.stencil_front.depthFailOp,
-                                          dsa_state->hw_state.stencil_front.compareOp);
-            screen->vk.CmdSetStencilOpEXT(batch->state->cmdbuf, VK_STENCIL_FACE_BACK_BIT,
-                                          dsa_state->hw_state.stencil_back.failOp,
-                                          dsa_state->hw_state.stencil_back.passOp,
-                                          dsa_state->hw_state.stencil_back.depthFailOp,
-                                          dsa_state->hw_state.stencil_back.compareOp);
-         }
-         if (dsa_state->base.stencil[0].enabled) {
-            if (dsa_state->base.stencil[1].enabled) {
-               vkCmdSetStencilWriteMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_BIT, dsa_state->hw_state.stencil_front.writeMask);
-               vkCmdSetStencilWriteMask(batch->state->cmdbuf, VK_STENCIL_FACE_BACK_BIT, dsa_state->hw_state.stencil_back.writeMask);
-               vkCmdSetStencilCompareMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_BIT, dsa_state->hw_state.stencil_front.compareMask);
-               vkCmdSetStencilCompareMask(batch->state->cmdbuf, VK_STENCIL_FACE_BACK_BIT, dsa_state->hw_state.stencil_back.compareMask);
-            } else {
-               vkCmdSetStencilWriteMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_AND_BACK, dsa_state->hw_state.stencil_front.writeMask);
-               vkCmdSetStencilCompareMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_AND_BACK, dsa_state->hw_state.stencil_front.compareMask);
-            }
+   if (HAS_DYNAMIC_STATE && (pipeline_changed || ctx->dsa_state_changed)) {
+      screen->vk.CmdSetDepthBoundsTestEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_bounds_test);
+      if (dsa_state->hw_state.depth_bounds_test)
+         vkCmdSetDepthBounds(batch->state->cmdbuf,
+                             dsa_state->hw_state.min_depth_bounds,
+                             dsa_state->hw_state.max_depth_bounds);
+      screen->vk.CmdSetDepthTestEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_test);
+      if (dsa_state->hw_state.depth_test)
+         screen->vk.CmdSetDepthCompareOpEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_compare_op);
+      screen->vk.CmdSetDepthWriteEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.depth_write);
+      screen->vk.CmdSetStencilTestEnableEXT(batch->state->cmdbuf, dsa_state->hw_state.stencil_test);
+      if (dsa_state->hw_state.stencil_test) {
+         screen->vk.CmdSetStencilOpEXT(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_BIT,
+                                       dsa_state->hw_state.stencil_front.failOp,
+                                       dsa_state->hw_state.stencil_front.passOp,
+                                       dsa_state->hw_state.stencil_front.depthFailOp,
+                                       dsa_state->hw_state.stencil_front.compareOp);
+         screen->vk.CmdSetStencilOpEXT(batch->state->cmdbuf, VK_STENCIL_FACE_BACK_BIT,
+                                       dsa_state->hw_state.stencil_back.failOp,
+                                       dsa_state->hw_state.stencil_back.passOp,
+                                       dsa_state->hw_state.stencil_back.depthFailOp,
+                                       dsa_state->hw_state.stencil_back.compareOp);
+      }
+      if (dsa_state->base.stencil[0].enabled) {
+         if (dsa_state->base.stencil[1].enabled) {
+            vkCmdSetStencilWriteMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_BIT, dsa_state->hw_state.stencil_front.writeMask);
+            vkCmdSetStencilWriteMask(batch->state->cmdbuf, VK_STENCIL_FACE_BACK_BIT, dsa_state->hw_state.stencil_back.writeMask);
+            vkCmdSetStencilCompareMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_BIT, dsa_state->hw_state.stencil_front.compareMask);
+            vkCmdSetStencilCompareMask(batch->state->cmdbuf, VK_STENCIL_FACE_BACK_BIT, dsa_state->hw_state.stencil_back.compareMask);
+         } else {
+            vkCmdSetStencilWriteMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_AND_BACK, dsa_state->hw_state.stencil_front.writeMask);
+            vkCmdSetStencilCompareMask(batch->state->cmdbuf, VK_STENCIL_FACE_FRONT_AND_BACK, dsa_state->hw_state.stencil_front.compareMask);
          }
       }
-      ctx->dsa_state_changed = false;
    }
+   ctx->dsa_state_changed = false;
 
    bool rast_state_changed = ctx->rast_state_changed;
-   if (pipeline_changed || rast_state_changed) {
-      if (screen->info.have_EXT_extended_dynamic_state)
-         screen->vk.CmdSetFrontFaceEXT(batch->state->cmdbuf, ctx->gfx_pipeline_state.front_face);
-   }
+   if (HAS_DYNAMIC_STATE && (pipeline_changed || rast_state_changed))
+      screen->vk.CmdSetFrontFaceEXT(batch->state->cmdbuf, ctx->gfx_pipeline_state.front_face);
 
    if (pipeline_changed || rast_state_changed || mode_changed) {
       enum pipe_prim_type reduced_prim = u_reduced_prim(dinfo->mode);
@@ -628,18 +625,20 @@ zink_draw_vbo(struct pipe_context *pctx,
    }
    ctx->rast_state_changed = false;
 
-   if (ctx->sample_locations_changed) {
-      VkSampleLocationsInfoEXT loc;
-      zink_init_vk_sample_locations(ctx, &loc);
-      screen->vk.CmdSetSampleLocationsEXT(batch->state->cmdbuf, &loc);
+   if (HAS_DYNAMIC_STATE) {
+      if (ctx->sample_locations_changed) {
+         VkSampleLocationsInfoEXT loc;
+         zink_init_vk_sample_locations(ctx, &loc);
+         screen->vk.CmdSetSampleLocationsEXT(batch->state->cmdbuf, &loc);
+      }
+      ctx->sample_locations_changed = false;
    }
-   ctx->sample_locations_changed = false;
 
    if (ctx->gfx_pipeline_state.blend_state->need_blend_constants)
       vkCmdSetBlendConstants(batch->state->cmdbuf, ctx->blend_constants);
 
    if (ctx->vertex_buffers_dirty || pipeline_changed)
-      zink_bind_vertex_buffers(batch, ctx);
+      zink_bind_vertex_buffers<HAS_DYNAMIC_STATE>(batch, ctx);
 
    if (BITSET_TEST(ctx->gfx_stages[PIPE_SHADER_VERTEX]->nir->info.system_values_read, SYSTEM_VALUE_BASE_VERTEX)) {
       unsigned draw_mode_is_indexed = index_size > 0;
@@ -783,11 +782,19 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info)
    zink_maybe_flush_or_stall(ctx);
 }
 
+template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state HAS_DYNAMIC_STATE>
+static void
+init_dynamic_state_functions(struct zink_context *ctx)
+{
+   ctx->draw_vbo[HAS_MULTIDRAW][HAS_DYNAMIC_STATE] = zink_draw_vbo<HAS_MULTIDRAW, HAS_DYNAMIC_STATE>;
+}
+
 template <zink_multidraw HAS_MULTIDRAW>
 static void
 init_multidraw_functions(struct zink_context *ctx)
 {
-   ctx->draw_vbo[HAS_MULTIDRAW] = zink_draw_vbo<HAS_MULTIDRAW>;
+   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_NO_DYNAMIC_STATE>(ctx);
+   init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_STATE>(ctx);
 }
 
 static void
diff --git a/src/gallium/drivers/zink/zink_inlines.h b/src/gallium/drivers/zink/zink_inlines.h
index 8c8c7d329d6..7fe4c8bf77c 100644
--- a/src/gallium/drivers/zink/zink_inlines.h
+++ b/src/gallium/drivers/zink/zink_inlines.h
@@ -5,7 +5,7 @@
 static inline void
 zink_select_draw_vbo(struct zink_context *ctx)
 {
-   ctx->base.draw_vbo = ctx->draw_vbo[ctx->multidraw];
+   ctx->base.draw_vbo = ctx->draw_vbo[ctx->multidraw][ctx->dynamic_state];
    assert(ctx->base.draw_vbo);
 }
 



More information about the mesa-commit mailing list