dxil: switch to derivative intrinsics
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30568>
This commit is contained in:
committed by
Marge Bot
parent
0d170a8128
commit
50c0dbfd70
@@ -161,6 +161,8 @@ nir_options = {
|
||||
.support_16bit_alu = true,
|
||||
.preserve_mediump = true,
|
||||
.discard_is_demote = true,
|
||||
.has_ddx_intrinsics = true,
|
||||
.scalarize_ddx = true,
|
||||
};
|
||||
|
||||
const nir_shader_compiler_options*
|
||||
@@ -2596,6 +2598,19 @@ emit_tertiary_intin(struct ntd_context *ctx, nir_alu_instr *alu,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
emit_derivative(struct ntd_context *ctx, nir_intrinsic_instr *intr,
|
||||
enum dxil_intr dxil_intr)
|
||||
{
|
||||
const struct dxil_value *src = get_src(ctx, &intr->src[0], 0, nir_type_float);
|
||||
enum overload_type overload = get_overload(nir_type_float, intr->src[0].ssa->bit_size);
|
||||
const struct dxil_value *v = emit_unary_call(ctx, overload, dxil_intr, src);
|
||||
if (!v)
|
||||
return false;
|
||||
store_def(ctx, &intr->def, 0, v);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
emit_bitfield_insert(struct ntd_context *ctx, nir_alu_instr *alu,
|
||||
const struct dxil_value *base,
|
||||
@@ -2960,13 +2975,6 @@ emit_alu(struct ntd_context *ctx, nir_alu_instr *alu)
|
||||
case nir_op_fisnormal: return emit_unary_intin(ctx, alu, DXIL_INTR_ISNORMAL, src[0]);
|
||||
case nir_op_fisfinite: return emit_unary_intin(ctx, alu, DXIL_INTR_ISFINITE, src[0]);
|
||||
|
||||
case nir_op_fddx:
|
||||
case nir_op_fddx_coarse: return emit_unary_intin(ctx, alu, DXIL_INTR_DDX_COARSE, src[0]);
|
||||
case nir_op_fddx_fine: return emit_unary_intin(ctx, alu, DXIL_INTR_DDX_FINE, src[0]);
|
||||
case nir_op_fddy:
|
||||
case nir_op_fddy_coarse: return emit_unary_intin(ctx, alu, DXIL_INTR_DDY_COARSE, src[0]);
|
||||
case nir_op_fddy_fine: return emit_unary_intin(ctx, alu, DXIL_INTR_DDY_FINE, src[0]);
|
||||
|
||||
case nir_op_fround_even: return emit_unary_intin(ctx, alu, DXIL_INTR_ROUND_NE, src[0]);
|
||||
case nir_op_frcp: {
|
||||
const struct dxil_value *one;
|
||||
@@ -4942,6 +4950,13 @@ emit_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr)
|
||||
case nir_intrinsic_exclusive_scan:
|
||||
return emit_reduce(ctx, intr);
|
||||
|
||||
case nir_intrinsic_ddx:
|
||||
case nir_intrinsic_ddx_coarse: return emit_derivative(ctx, intr, DXIL_INTR_DDX_COARSE);
|
||||
case nir_intrinsic_ddx_fine: return emit_derivative(ctx, intr, DXIL_INTR_DDX_FINE);
|
||||
case nir_intrinsic_ddy:
|
||||
case nir_intrinsic_ddy_coarse: return emit_derivative(ctx, intr, DXIL_INTR_DDY_COARSE);
|
||||
case nir_intrinsic_ddy_fine: return emit_derivative(ctx, intr, DXIL_INTR_DDY_FINE);
|
||||
|
||||
case nir_intrinsic_load_first_vertex:
|
||||
ctx->mod.feats.extended_command_info = true;
|
||||
return emit_load_unary_external_function(ctx, intr, "dx.op.startVertexLocation",
|
||||
|
||||
Reference in New Issue
Block a user