From 166c68914b494c45fbd9e4a736a0fe5867581b6a Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 13 Mar 2026 10:00:12 -0400 Subject: [PATCH] zink: use EXT_primitive_restart_index Part-of: --- src/gallium/drivers/zink/VP_ZINK_requirements.json | 6 +++++- src/gallium/drivers/zink/zink_device_info.py | 3 +++ src/gallium/drivers/zink/zink_draw.cpp | 2 ++ src/gallium/drivers/zink/zink_screen.c | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/VP_ZINK_requirements.json b/src/gallium/drivers/zink/VP_ZINK_requirements.json index a3f1c0b7768..5e773b96875 100644 --- a/src/gallium/drivers/zink/VP_ZINK_requirements.json +++ b/src/gallium/drivers/zink/VP_ZINK_requirements.json @@ -505,7 +505,8 @@ "VK_EXT_primitives_generated_query": 1, "VK_EXT_color_write_enable": 1, "VK_EXT_extended_dynamic_state3": 1, - "VK_EXT_descriptor_buffer": 1 + "VK_EXT_descriptor_buffer": 1, + "VK_EXT_primitive_restart_index": 1 }, "features": { "VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT": { @@ -525,6 +526,9 @@ }, "VkPhysicalDeviceDescriptorBufferFeaturesEXT": { "descriptorBuffer": true + }, + "VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT": { + "primitiveRestartIndex": true } } }, diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py index 00a8dd0608b..e932ad2400f 100644 --- a/src/gallium/drivers/zink/zink_device_info.py +++ b/src/gallium/drivers/zink/zink_device_info.py @@ -330,6 +330,9 @@ EXTENSIONS = [ alias="list_restart", features=True, conditions=["$feats.primitiveTopologyListRestart"]), + Extension("VK_EXT_primitive_restart_index", + alias="restart_index", + features=True), Extension("VK_KHR_dedicated_allocation", alias="dedicated"), Extension("VK_EXT_descriptor_indexing", diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 2bcbba8ce34..28d99da1318 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -778,6 +778,8 @@ zink_draw(struct pipe_context *pctx, VKCTX(CmdSetPrimitiveRestartEnable)(bs->cmdbuf, dinfo->primitive_restart); ctx->primitive_restart = dinfo->primitive_restart; } + if (dinfo->primitive_restart && screen->info.have_EXT_primitive_restart_index) + VKCTX(CmdSetPrimitiveRestartIndexEXT)(bs->cmdbuf, dinfo->restart_index); if (zink_program_has_descriptors(&ctx->curr_program->base) && (BATCH_CHANGED || ctx->dd.push_state_changed[0] || ctx->dd.state_changed[0] || pipeline_changed)) zink_descriptors_update(ctx, ZINK_PIPELINE_GFX); diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 01518d4e002..e56ecb7a7c0 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -731,7 +731,7 @@ zink_init_screen_caps(struct zink_screen *screen) caps->texrect = false; caps->multi_draw_indirect_partial_stride = false; caps->anisotropic_filter = screen->info.feats.features.samplerAnisotropy; - caps->emulate_nonfixed_primitive_restart = true; + caps->emulate_nonfixed_primitive_restart = !screen->info.have_EXT_primitive_restart_index; { uint32_t modes = BITFIELD_BIT(MESA_PRIM_LINE_STRIP) | BITFIELD_BIT(MESA_PRIM_TRIANGLE_STRIP) |