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 dcf9591e0af..a0a93abb1fe 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 @@ -2057,6 +2057,12 @@ emit_alu(struct ntv_context *ctx, nir_alu_instr *alu) UNOP(nir_op_bit_count, SpvOpBitCount) #undef UNOP + case nir_op_f2f16_rtz: + assert(nir_op_infos[alu->op].num_inputs == 1); + result = emit_unop(ctx, SpvOpFConvert, dest_type, src[0]); + spirv_builder_emit_rounding_mode(&ctx->builder, result, SpvFPRoundingModeRTZ); + break; + case nir_op_inot: if (bit_size == 1) result = emit_unop(ctx, SpvOpLogicalNot, dest_type, src[0]); 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 5446016be64..0108826589d 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -216,6 +216,14 @@ spirv_builder_emit_decoration(struct spirv_builder *b, SpvId target, emit_decoration(b, target, decoration, NULL, 0); } +void +spirv_builder_emit_rounding_mode(struct spirv_builder *b, SpvId target, + SpvFPRoundingMode rounding) +{ + uint32_t args[] = { rounding }; + emit_decoration(b, target, SpvDecorationFPRoundingMode, args, ARRAY_SIZE(args)); +} + void spirv_builder_emit_input_attachment_index(struct spirv_builder *b, SpvId target, uint32_t id) { 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 c3233a0030d..db7c64f17d0 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -89,6 +89,10 @@ void spirv_builder_emit_decoration(struct spirv_builder *b, SpvId target, SpvDecoration decoration); +void +spirv_builder_emit_rounding_mode(struct spirv_builder *b, SpvId target, + SpvFPRoundingMode rounding); + void spirv_builder_emit_input_attachment_index(struct spirv_builder *b, SpvId target, uint32_t id);