diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 802e4a116f0..ab3884522ca 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1251,8 +1251,9 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) 1 << PIPE_PRIM_LINES | 1 << PIPE_PRIM_LINE_STRIP | 1 << PIPE_PRIM_TRIANGLES | - 1 << PIPE_PRIM_TRIANGLE_STRIP | - 1 << PIPE_PRIM_TRIANGLE_FAN; + 1 << PIPE_PRIM_TRIANGLE_STRIP; + if (screen->have_triangle_fans) + prim_hwsupport |= 1 << PIPE_PRIM_TRIANGLE_FAN; ctx->primconvert = util_primconvert_create(&ctx->base, prim_hwsupport); if (!ctx->primconvert) diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py index 7e334c5a742..0a7ec8fd137 100644 --- a/src/gallium/drivers/zink/zink_device_info.py +++ b/src/gallium/drivers/zink/zink_device_info.py @@ -72,6 +72,7 @@ def EXTENSIONS(): Extension("VK_EXT_extended_dynamic_state", alias="dynamic_state", have_feature="extendedDynamicState"), Extension("VK_EXT_pipeline_creation_cache_control", alias="pipeline_cache_control", have_feature="pipelineCreationCacheControl"), Extension("VK_EXT_shader_stencil_export", alias="stencil_export"), + Extension("VK_EXTX_portability_subset", alias="portability_subset_extx", properties=True, features=True, guard=True), ] # There exists some inconsistencies regarding the enum constants, fix them. @@ -90,6 +91,12 @@ header_code = """ #include +#if defined(__APPLE__) +// Source of MVK_VERSION +// Source of VK_EXTX_PORTABILITY_SUBSET_EXTENSION_NAME +#include "MoltenVK/vk_mvk_moltenvk.h" +#endif + struct zink_screen; struct zink_device_info { diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index cedba3fcf1d..3daafcf9833 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -225,6 +225,7 @@ zink_draw_vbo(struct pipe_context *pctx, if (dinfo->mode == PIPE_PRIM_QUADS || dinfo->mode == PIPE_PRIM_QUAD_STRIP || dinfo->mode == PIPE_PRIM_POLYGON || + (dinfo->mode == PIPE_PRIM_TRIANGLE_FAN && !screen->have_triangle_fans) || dinfo->mode == PIPE_PRIM_LINE_LOOP) { if (!u_trim_pipe_prim(dinfo->mode, (unsigned *)&dinfo->count)) return; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 3749ce955c8..b15dbfd5667 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -918,6 +918,13 @@ load_device_extensions(struct zink_screen *screen) GET_PROC_ADDR(CmdSetScissorWithCountEXT); } + screen->have_triangle_fans = true; +#if defined(VK_EXTX_PORTABILITY_SUBSET_EXTENSION_NAME) + if (screen->info.have_EXTX_portability_subset) { + screen->have_triangle_fans = (VK_TRUE == screen->info.portability_subset_extx_feats.triangleFans); + } +#endif // VK_EXTX_PORTABILITY_SUBSET_EXTENSION_NAME + return true; } diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index 39c7e146476..aa8adffd1ee 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -57,6 +57,7 @@ struct zink_screen { bool have_X8_D24_UNORM_PACK32; bool have_D24_UNORM_S8_UINT; + bool have_triangle_fans; uint32_t gfx_queue; uint32_t timestamp_valid_bits;