Mesa (master): zink: have_triangle_fans support.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 6 17:14:15 UTC 2020


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

Author: Duncan Hopkins <duncan.hopkins at foundry.com>
Date:   Thu Nov  5 11:17:40 2020 +0000

zink: have_triangle_fans support.

MoltenVK, at least upto 1.2.141, does not render triangle fans. This is reflected in the portability EXTX extension.
This code get the extensions properties and features and then sets the have_triangle_fans.
This extension is not avaiable on all systems, so an amout of the code has to be protected by the define VK_EXTX_PORTABILITY_SUBSET_EXTENSION_NAME.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7457>

---

 src/gallium/drivers/zink/zink_context.c      | 5 +++--
 src/gallium/drivers/zink/zink_device_info.py | 7 +++++++
 src/gallium/drivers/zink/zink_draw.c         | 1 +
 src/gallium/drivers/zink/zink_screen.c       | 7 +++++++
 src/gallium/drivers/zink/zink_screen.h       | 1 +
 5 files changed, 19 insertions(+), 2 deletions(-)

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 <vulkan/vulkan.h>
 
+#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;



More information about the mesa-commit mailing list