From: Erik Faye-Lund Date: Thu, 2 Jan 2020 10:26:38 +0000 (+0100) Subject: zink: support offset-variants of texturing X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8112240d2931be2d5d572914d159d769888cab2d;p=mesa.git zink: support offset-variants of texturing Part-of: --- 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 35c2fc4c0f3..5ed0d0ba6b8 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 @@ -1372,7 +1372,8 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex) nir_alu_type_get_base_type(tex->dest_type) == nir_type_float); assert(tex->texture_index == tex->sampler_index); - SpvId coord = 0, proj = 0, bias = 0, lod = 0, dref = 0, dx = 0, dy = 0; + SpvId coord = 0, proj = 0, bias = 0, lod = 0, dref = 0, dx = 0, dy = 0, + offset = 0; unsigned coord_components = 0; for (unsigned i = 0; i < tex->num_srcs; i++) { switch (tex->src[i].src_type) { @@ -1390,6 +1391,10 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex) assert(proj != 0); break; + case nir_tex_src_offset: + offset = get_src_int(ctx, &tex->src[i].src); + break; + case nir_tex_src_bias: assert(tex->op == nir_texop_txb); bias = get_src_float(ctx, &tex->src[i].src); @@ -1494,7 +1499,8 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex) actual_dest_type, load, coord, proj != 0, - lod, bias, dref, dx, dy); + lod, bias, dref, dx, dy, + offset); } 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 bae23c97d4c..bdb8b8a1179 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -515,7 +515,8 @@ spirv_builder_emit_image_sample(struct spirv_builder *b, SpvId bias, SpvId dref, SpvId dx, - SpvId dy) + SpvId dy, + SpvId offset) { SpvId result = spirv_builder_new_id(b); @@ -531,7 +532,7 @@ spirv_builder_emit_image_sample(struct spirv_builder *b, } SpvImageOperandsMask operand_mask = SpvImageOperandsMaskNone; - SpvId extra_operands[4]; + SpvId extra_operands[5]; int num_extra_operands = 0; if (bias) { extra_operands[++num_extra_operands] = bias; @@ -545,6 +546,10 @@ spirv_builder_emit_image_sample(struct spirv_builder *b, extra_operands[++num_extra_operands] = dy; operand_mask |= SpvImageOperandsGradMask; } + if (offset) { + extra_operands[++num_extra_operands] = offset; + operand_mask |= SpvImageOperandsOffsetMask; + } /* finalize num_extra_operands / extra_operands */ if (num_extra_operands > 0) { 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 56db0a11cf5..bd19e74822c 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -215,7 +215,8 @@ spirv_builder_emit_image_sample(struct spirv_builder *b, SpvId bias, SpvId dref, SpvId dx, - SpvId dy); + SpvId dy, + SpvId offset); SpvId spirv_builder_emit_image(struct spirv_builder *b, SpvId result_type,