Mesa (main): zink: use dynamic prim type
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Aug 27 03:51:13 UTC 2021
Module: Mesa
Branch: main
Commit: 305966ca75b0141202a854a36e5623fce64a2586
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=305966ca75b0141202a854a36e5623fce64a2586
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Mon Jun 14 14:21:39 2021 -0400
zink: use dynamic prim type
this is part of dynamic state but wasn't used since it required
actual work to effectively make use of it
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12585>
---
src/gallium/drivers/zink/zink_draw.cpp | 5 +++-
src/gallium/drivers/zink/zink_pipeline.c | 1 +
src/gallium/drivers/zink/zink_program.c | 44 +-------------------------------
src/gallium/drivers/zink/zink_program.h | 42 ++++++++++++++++++++++++++++++
4 files changed, 48 insertions(+), 44 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index 441ce986111..71af46852aa 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -677,8 +677,11 @@ zink_draw_vbo(struct pipe_context *pctx,
zink_select_draw_vbo(ctx);
}
- if (HAS_DYNAMIC_STATE)
+ if (HAS_DYNAMIC_STATE) {
update_gfx_pipeline<BATCH_CHANGED>(ctx, batch->state, mode);
+ if (BATCH_CHANGED || mode_changed)
+ screen->vk.CmdSetPrimitiveTopologyEXT(batch->state->cmdbuf, zink_primitive_topology(mode));
+ }
if (zink_program_has_descriptors(&ctx->curr_program->base))
screen->descriptors_update(ctx, false);
diff --git a/src/gallium/drivers/zink/zink_pipeline.c b/src/gallium/drivers/zink/zink_pipeline.c
index c61ca87d60e..5fbdcc1667b 100644
--- a/src/gallium/drivers/zink/zink_pipeline.c
+++ b/src/gallium/drivers/zink/zink_pipeline.c
@@ -185,6 +185,7 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT;
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_FRONT_FACE_EXT;
+ dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT;
if (state->sample_locations_enabled)
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT;
} else {
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index 470a3a4fb85..b42bba423e0 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -715,48 +715,6 @@ zink_destroy_compute_program(struct zink_screen *screen,
ralloc_free(comp);
}
-static VkPrimitiveTopology
-primitive_topology(enum pipe_prim_type mode)
-{
- switch (mode) {
- case PIPE_PRIM_POINTS:
- return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
-
- case PIPE_PRIM_LINES:
- return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
-
- case PIPE_PRIM_LINE_STRIP:
- return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
-
- case PIPE_PRIM_TRIANGLES:
- return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
-
- case PIPE_PRIM_TRIANGLE_STRIP:
- return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
-
- case PIPE_PRIM_TRIANGLE_FAN:
- return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
-
- case PIPE_PRIM_LINE_STRIP_ADJACENCY:
- return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY;
-
- case PIPE_PRIM_LINES_ADJACENCY:
- return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY;
-
- case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
- return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;
-
- case PIPE_PRIM_TRIANGLES_ADJACENCY:
- return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY;
-
- case PIPE_PRIM_PATCHES:
- return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
-
- default:
- unreachable("unexpected enum pipe_prim_type");
- }
-}
-
VkPipeline
zink_get_gfx_pipeline(struct zink_context *ctx,
struct zink_gfx_program *prog,
@@ -769,7 +727,7 @@ zink_get_gfx_pipeline(struct zink_context *ctx,
(have_EXT_vertex_input_dynamic_state || !ctx->vertex_state_changed))
return state->pipeline;
- VkPrimitiveTopology vkmode = primitive_topology(mode);
+ VkPrimitiveTopology vkmode = zink_primitive_topology(mode);
assert(vkmode <= ARRAY_SIZE(prog->pipelines));
struct hash_entry *entry = NULL;
diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h
index fc66f8d767e..29be8bc4761 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -135,6 +135,48 @@ zink_desc_type_from_vktype(VkDescriptorType type)
}
}
+static inline VkPrimitiveTopology
+zink_primitive_topology(enum pipe_prim_type mode)
+{
+ switch (mode) {
+ case PIPE_PRIM_POINTS:
+ return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
+
+ case PIPE_PRIM_LINES:
+ return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+
+ case PIPE_PRIM_LINE_STRIP:
+ return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
+
+ case PIPE_PRIM_TRIANGLES:
+ return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+
+ case PIPE_PRIM_TRIANGLE_STRIP:
+ return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+
+ case PIPE_PRIM_TRIANGLE_FAN:
+ return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
+
+ case PIPE_PRIM_LINE_STRIP_ADJACENCY:
+ return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY;
+
+ case PIPE_PRIM_LINES_ADJACENCY:
+ return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY;
+
+ case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
+ return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY;
+
+ case PIPE_PRIM_TRIANGLES_ADJACENCY:
+ return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY;
+
+ case PIPE_PRIM_PATCHES:
+ return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
+
+ default:
+ unreachable("unexpected enum pipe_prim_type");
+ }
+}
+
void
zink_delete_shader_state(struct pipe_context *pctx, void *cso);
void *
More information about the mesa-commit
mailing list