Module: Mesa
Branch: main
Commit: 30bd4ff72e2fd17746a8b772f966f09b80e1c10e
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=30bd4ff72e2fd17746a8b772f966f09b80e1c10e

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Jan 14 11:22:43 2022 -0500

zink: handle min_lod texture operands

Acked-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14381>

---

 src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c  | 12 ++++++++++--
 src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c |  7 ++++++-
 src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h |  1 +
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c 
b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 1ccae1a88d2..47f69f9fe39 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -2913,7 +2913,7 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
    assert(tex->texture_index == tex->sampler_index);
 
    SpvId coord = 0, proj = 0, bias = 0, lod = 0, dref = 0, dx = 0, dy = 0,
-         const_offset = 0, offset = 0, sample = 0, tex_offset = 0, bindless = 
0;
+         const_offset = 0, offset = 0, sample = 0, tex_offset = 0, bindless = 
0, min_lod = 0;
    unsigned coord_components = 0;
    nir_variable *bindless_var = NULL;
    for (unsigned i = 0; i < tex->num_srcs; i++) {
@@ -2964,6 +2964,12 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
          assert(bias != 0);
          break;
 
+      case nir_tex_src_min_lod:
+         assert(nir_src_num_components(tex->src[i].src) == 1);
+         min_lod = get_src_float(ctx, &tex->src[i].src);
+         assert(min_lod != 0);
+         break;
+
       case nir_tex_src_lod:
          assert(nir_src_num_components(tex->src[i].src) == 1);
          if (tex->op == nir_texop_txf ||
@@ -3143,6 +3149,8 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
    SpvId result;
    if (offset)
       spirv_builder_emit_cap(&ctx->builder, SpvCapabilityImageGatherExtended);
+   if (min_lod)
+      spirv_builder_emit_cap(&ctx->builder, SpvCapabilityMinLod);
    if (tex->op == nir_texop_txf ||
        tex->op == nir_texop_txf_ms ||
        tex->op == nir_texop_tg4) {
@@ -3164,7 +3172,7 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
                                                coord,
                                                proj != 0,
                                                lod, bias, dref, dx, dy,
-                                               const_offset, offset, 
tex->is_sparse);
+                                               const_offset, offset, min_lod, 
tex->is_sparse);
    }
 
    spirv_builder_emit_decoration(&ctx->builder, result,
diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c 
b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
index 0a02476c4a9..e17afaa64a7 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -764,6 +764,7 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
                                 SpvId dy,
                                 SpvId const_offset,
                                 SpvId offset,
+                                SpvId min_lod,
                                 bool sparse)
 {
    SpvId result = spirv_builder_new_id(b);
@@ -794,7 +795,7 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
    }
 
    SpvImageOperandsMask operand_mask = SpvImageOperandsMaskNone;
-   SpvId extra_operands[5];
+   SpvId extra_operands[6];
    int num_extra_operands = 1;
    if (bias) {
       extra_operands[num_extra_operands++] = bias;
@@ -816,6 +817,10 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
       extra_operands[num_extra_operands++] = offset;
       operand_mask |= SpvImageOperandsOffsetMask;
    }
+   if (min_lod) {
+      extra_operands[num_extra_operands++] = min_lod;
+      operand_mask |= SpvImageOperandsMinLodMask;
+   }
 
    /* finalize num_extra_operands / extra_operands */
    extra_operands[0] = operand_mask;
diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h 
b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
index 15a27a17f44..5c91f951817 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
@@ -284,6 +284,7 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
                                 SpvId dy,
                                 SpvId const_offset,
                                 SpvId offset,
+                                SpvId min_lod,
                                 bool sparse);
 
 SpvId

Reply via email to