zink: add `has_edgeflags` flag to zink_shader and zink_gfx_program
authorantonino <antonino.maniscalco@collabora.com>
Tue, 21 Feb 2023 09:27:54 +0000 (10:27 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 29 Mar 2023 19:18:40 +0000 (19:18 +0000)
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21238>

src/gallium/drivers/zink/zink_compiler.c
src/gallium/drivers/zink/zink_program.c
src/gallium/drivers/zink/zink_types.h

index a918ef8..a3514e2 100644 (file)
@@ -4330,6 +4330,9 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
    struct zink_shader *ret = rzalloc(NULL, struct zink_shader);
    bool have_psiz = false;
 
+   ret->has_edgeflags = nir->info.stage == MESA_SHADER_VERTEX &&
+                        nir_find_variable_with_location(nir, nir_var_shader_out, VARYING_SLOT_EDGE);
+
    ret->sinfo.have_vulkan_memory_model = screen->info.have_KHR_vulkan_memory_model;
 
    util_queue_fence_init(&ret->precompile.fence);
index 737b262..e535ad0 100644 (file)
@@ -367,6 +367,7 @@ update_gfx_shader_modules(struct zink_context *ctx,
    bool default_variants = true;
    assert(prog->modules[MESA_SHADER_VERTEX]);
    uint32_t variant_hash = prog->last_variant_hash;
+   prog->has_edgeflags = prog->shaders[MESA_SHADER_VERTEX]->has_edgeflags;
    for (unsigned i = 0; i < MESA_SHADER_COMPUTE; i++) {
       if (!(mask & BITFIELD_BIT(i)))
          continue;
@@ -1034,6 +1035,8 @@ zink_create_gfx_program(struct zink_context *ctx,
    prog->gfx_hash = gfx_hash;
    prog->base.removed = true;
 
+   prog->has_edgeflags = prog->shaders[MESA_SHADER_VERTEX] &&
+                         prog->shaders[MESA_SHADER_VERTEX]->has_edgeflags;
    for (int i = 0; i < ZINK_GFX_SHADER_COUNT; ++i) {
       util_dynarray_init(&prog->shader_cache[i][0][0], prog);
       util_dynarray_init(&prog->shader_cache[i][0][1], prog);
index eb447f5..6d59c10 100644 (file)
@@ -736,6 +736,7 @@ struct zink_shader {
    bool bindless;
    bool can_inline;
    bool has_uniforms;
+   bool has_edgeflags;
    struct spirv_shader *spirv;
 
    struct {
@@ -1022,6 +1023,7 @@ struct zink_gfx_program {
    unsigned inlined_variant_count[ZINK_GFX_SHADER_COUNT];
    uint32_t default_variant_hash;
    uint8_t inline_variants; //which stages are using inlined uniforms
+   bool has_edgeflags;
 
    /* separable */
    struct zink_gfx_program *full_prog;