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