microsoft/compiler: Remove alu type info from store_dest()

We pass in a *typed* value, we don't need to pass in additional
type info. That's just more opportunities to get it wrong.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22972>
This commit is contained in:
Jesse Natalie 2023-05-11 09:58:01 -07:00 committed by Marge Bot
parent f98871608c
commit 049d340d8e

View file

@ -2072,30 +2072,17 @@ store_dest_value(struct ntd_context *ctx, nir_dest *dest, unsigned chan,
static void
store_dest(struct ntd_context *ctx, nir_dest *dest, unsigned chan,
const struct dxil_value *value, nir_alu_type type)
const struct dxil_value *value)
{
switch (nir_alu_type_get_base_type(type)) {
case nir_type_float:
if (nir_dest_bit_size(*dest) == 64)
ctx->mod.feats.doubles = true;
if (nir_dest_bit_size(*dest) == 16)
ctx->mod.feats.native_low_precision = true;
store_dest_value(ctx, dest, chan, value);
break;
case nir_type_uint:
case nir_type_int:
if (nir_dest_bit_size(*dest) == 16)
ctx->mod.feats.native_low_precision = true;
if (nir_dest_bit_size(*dest) == 64)
ctx->mod.feats.int64_ops = true;
FALLTHROUGH;
case nir_type_bool:
case nir_type_invalid:
store_dest_value(ctx, dest, chan, value);
break;
default:
unreachable("unexpected nir_alu_type");
}
const struct dxil_type *type = dxil_value_get_type(value);
if (type == ctx->mod.float64_type)
ctx->mod.feats.doubles = true;
if (type == ctx->mod.float16_type ||
type == ctx->mod.int16_type)
ctx->mod.feats.native_low_precision = true;
if (type == ctx->mod.int64_type)
ctx->mod.feats.int64_ops = true;
store_dest_value(ctx, dest, chan, value);
}
static void
@ -2103,8 +2090,7 @@ store_alu_dest(struct ntd_context *ctx, nir_alu_instr *alu, unsigned chan,
const struct dxil_value *value)
{
assert(!alu->dest.saturate);
store_dest(ctx, &alu->dest.dest, chan, value,
nir_op_infos[alu->op].output_type);
store_dest(ctx, &alu->dest.dest, chan, value);
}
static const struct dxil_value *
@ -2704,7 +2690,7 @@ emit_make_double(struct ntd_context *ctx, nir_alu_instr *alu)
const struct dxil_value *v = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!v)
return false;
store_dest(ctx, &alu->dest.dest, 0, v, nir_type_float64);
store_dest(ctx, &alu->dest.dest, 0, v);
return true;
}
@ -2735,8 +2721,8 @@ emit_split_double(struct ntd_context *ctx, nir_alu_instr *alu)
if (!hi || !lo)
return false;
store_dest(ctx, &alu->dest.dest, 0, hi, nir_type_uint);
store_dest(ctx, &alu->dest.dest, 1, lo, nir_type_uint);
store_dest(ctx, &alu->dest.dest, 0, hi);
store_dest(ctx, &alu->dest.dest, 1, lo);
return true;
}
@ -3061,7 +3047,7 @@ emit_load_global_invocation_id(struct ntd_context *ctx,
if (!globalid)
return false;
store_dest(ctx, &intr->dest, i, globalid, nir_type_uint);
store_dest(ctx, &intr->dest, i, globalid);
}
}
return true;
@ -3084,7 +3070,7 @@ emit_load_local_invocation_id(struct ntd_context *ctx,
*threadidingroup = emit_threadidingroup_call(ctx, idx);
if (!threadidingroup)
return false;
store_dest(ctx, &intr->dest, i, threadidingroup, nir_type_uint);
store_dest(ctx, &intr->dest, i, threadidingroup);
}
}
return true;
@ -3100,7 +3086,7 @@ emit_load_local_invocation_index(struct ntd_context *ctx,
*flattenedthreadidingroup = emit_flattenedthreadidingroup_call(ctx);
if (!flattenedthreadidingroup)
return false;
store_dest(ctx, &intr->dest, 0, flattenedthreadidingroup, nir_type_uint);
store_dest(ctx, &intr->dest, 0, flattenedthreadidingroup);
return true;
}
@ -3120,7 +3106,7 @@ emit_load_local_workgroup_id(struct ntd_context *ctx,
const struct dxil_value *groupid = emit_groupid_call(ctx, idx);
if (!groupid)
return false;
store_dest(ctx, &intr->dest, i, groupid, nir_type_uint);
store_dest(ctx, &intr->dest, i, groupid);
}
}
return true;
@ -3155,7 +3141,7 @@ emit_load_unary_external_function(struct ntd_context *ctx,
{
const struct dxil_value *value = call_unary_external_function(ctx, name, dxil_intr,
get_overload(type, intr->dest.ssa.bit_size));
store_dest(ctx, &intr->dest, 0, value, type);
store_dest(ctx, &intr->dest, 0, value);
return true;
}
@ -3174,7 +3160,7 @@ emit_load_sample_mask_in(struct ntd_context *ctx, nir_intrinsic_instr *intr)
call_unary_external_function(ctx, "dx.op.sampleIndex", DXIL_INTR_SAMPLE_INDEX, DXIL_I32), 0), 0);
}
store_dest(ctx, &intr->dest, 0, value, nir_type_int);
store_dest(ctx, &intr->dest, 0, value);
return true;
}
@ -3204,12 +3190,12 @@ emit_load_tess_coord(struct ntd_context *ctx,
const struct dxil_value *value =
dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
store_dest(ctx, &intr->dest, i, value, nir_type_float);
store_dest(ctx, &intr->dest, i, value);
}
for (unsigned i = num_coords; i < intr->dest.ssa.num_components; ++i) {
const struct dxil_value *value = dxil_module_get_float_const(&ctx->mod, 0.0f);
store_dest(ctx, &intr->dest, i, value, nir_type_float);
store_dest(ctx, &intr->dest, i, value);
}
return true;
@ -3405,7 +3391,7 @@ emit_load_ssbo(struct ntd_context *ctx, nir_intrinsic_instr *intr)
dxil_emit_extractval(&ctx->mod, load, i);
if (!val)
return false;
store_dest(ctx, &intr->dest, i, val, nir_type_uint);
store_dest(ctx, &intr->dest, i, val);
}
return true;
}
@ -3598,8 +3584,7 @@ emit_load_ubo(struct ntd_context *ctx, nir_intrinsic_instr *intr)
for (unsigned i = 0; i < nir_dest_num_components(intr->dest); ++i) {
const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, agg, i);
store_dest(ctx, &intr->dest, i, retval,
nir_dest_bit_size(intr->dest) > 1 ? nir_type_float : nir_type_bool);
store_dest(ctx, &intr->dest, i, retval);
}
return true;
}
@ -3623,8 +3608,7 @@ emit_load_ubo_dxil(struct ntd_context *ctx, nir_intrinsic_instr *intr)
for (unsigned i = 0; i < nir_dest_num_components(intr->dest); i++)
store_dest(ctx, &intr->dest, i,
dxil_emit_extractval(&ctx->mod, agg, i),
nir_type_uint);
dxil_emit_extractval(&ctx->mod, agg, i));
return true;
}
@ -3867,7 +3851,7 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr
const struct dxil_value *retval = dxil_emit_call(&ctx->mod, func, args, num_args);
if (!retval)
return false;
store_dest(ctx, &intr->dest, i, retval, out_type);
store_dest(ctx, &intr->dest, i, retval);
}
return true;
}
@ -3951,7 +3935,7 @@ emit_load_interpolated_input(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *retval = dxil_emit_call(&ctx->mod, func, args, num_args);
if (!retval)
return false;
store_dest(ctx, &intr->dest, i, retval, nir_type_float);
store_dest(ctx, &intr->dest, i, retval);
}
return true;
}
@ -3976,7 +3960,7 @@ emit_load_ptr(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4012,7 +3996,7 @@ emit_load_shared(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4048,7 +4032,7 @@ emit_load_scratch(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4244,7 +4228,7 @@ emit_image_load(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *component = dxil_emit_extractval(&ctx->mod, load_result, i);
if (!component)
return false;
store_dest(ctx, &intr->dest, i, component, out_type);
store_dest(ctx, &intr->dest, i, component);
}
if (num_components > 1)
@ -4255,7 +4239,7 @@ emit_image_load(struct ntd_context *ctx, nir_intrinsic_instr *intr)
static bool
emit_image_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
enum dxil_atomic_op op, nir_alu_type type)
enum dxil_atomic_op op)
{
nir_deref_instr *src_as_deref = nir_src_as_deref(intr->src[0]);
bool is_bindless = !src_as_deref && !nir_intrinsic_has_range_base(intr);
@ -4290,7 +4274,7 @@ emit_image_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
return false;
}
const struct dxil_value *value = get_src(ctx, &intr->src[3], 0, type);
const struct dxil_value *value = get_src(ctx, &intr->src[3], 0, nir_type_uint);
if (!value)
return false;
@ -4300,7 +4284,7 @@ emit_image_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, type);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4349,7 +4333,7 @@ emit_image_atomic_comp_swap(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4406,7 +4390,7 @@ emit_image_size(struct ntd_context *ctx, nir_intrinsic_instr *intr)
for (unsigned i = 0; i < nir_dest_num_components(intr->dest); ++i) {
const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, dimensions, i);
store_dest(ctx, &intr->dest, i, retval, nir_type_uint);
store_dest(ctx, &intr->dest, i, retval);
}
return true;
@ -4437,20 +4421,20 @@ emit_get_ssbo_size(struct ntd_context *ctx, nir_intrinsic_instr *intr)
return false;
const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, dimensions, 0);
store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
static bool
emit_ssbo_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
enum dxil_atomic_op op, nir_alu_type type)
enum dxil_atomic_op op)
{
const struct dxil_value* handle = get_resource_handle(ctx, &intr->src[0], DXIL_RESOURCE_CLASS_UAV, DXIL_RESOURCE_KIND_RAW_BUFFER);
const struct dxil_value *offset =
get_src(ctx, &intr->src[1], 0, nir_type_uint);
const struct dxil_value *value =
get_src(ctx, &intr->src[2], 0, type);
get_src(ctx, &intr->src[2], 0, nir_type_uint);
if (!value || !handle || !offset)
return false;
@ -4469,7 +4453,7 @@ emit_ssbo_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, type);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4501,13 +4485,13 @@ emit_ssbo_atomic_comp_swap(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, nir_type_int);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
static bool
emit_shared_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
enum dxil_rmw_op op, nir_alu_type type)
enum dxil_rmw_op op)
{
const struct dxil_value *zero, *index;
@ -4528,7 +4512,7 @@ emit_shared_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
if (!ptr)
return false;
value = get_src(ctx, &intr->src[1], 0, type);
value = get_src(ctx, &intr->src[1], 0, nir_type_uint);
if (!value)
return false;
@ -4538,7 +4522,7 @@ emit_shared_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, type);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4575,7 +4559,7 @@ emit_shared_atomic_comp_swap(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
store_dest(ctx, &intr->dest, 0, retval);
return true;
}
@ -4603,8 +4587,8 @@ emit_vulkan_resource_index(struct ntd_context *ctx, nir_intrinsic_instr *intr)
return false;
}
store_dest(ctx, &intr->dest, 0, index_value, nir_type_uint32);
store_dest(ctx, &intr->dest, 1, dxil_module_get_int32_const(&ctx->mod, 0), nir_type_uint32);
store_dest(ctx, &intr->dest, 0, index_value);
store_dest(ctx, &intr->dest, 1, dxil_module_get_int32_const(&ctx->mod, 0));
return true;
}
@ -4659,7 +4643,7 @@ emit_load_vulkan_descriptor(struct ntd_context *ctx, nir_intrinsic_instr *intr)
}
store_dest_value(ctx, &intr->dest, 0, handle);
store_dest(ctx, &intr->dest, 1, get_src(ctx, &intr->src[0], 1, nir_type_uint32), nir_type_uint32);
store_dest(ctx, &intr->dest, 1, get_src(ctx, &intr->src[0], 1, nir_type_uint32));
return true;
}
@ -4691,7 +4675,7 @@ emit_load_sample_pos_from_id(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *coord = dxil_emit_binop(&ctx->mod, DXIL_BINOP_ADD,
dxil_emit_extractval(&ctx->mod, v, i),
dxil_module_get_float_const(&ctx->mod, 0.5f), 0);
store_dest(ctx, &intr->dest, i, coord, nir_type_float32);
store_dest(ctx, &intr->dest, i, coord);
}
return true;
}
@ -4706,7 +4690,7 @@ emit_load_sample_id(struct ntd_context *ctx, nir_intrinsic_instr *intr)
return emit_load_unary_external_function(ctx, intr, "dx.op.sampleIndex",
DXIL_INTR_SAMPLE_INDEX, nir_type_int);
store_dest(ctx, &intr->dest, 0, dxil_module_get_int32_const(&ctx->mod, 0), nir_type_int);
store_dest(ctx, &intr->dest, 0, dxil_module_get_int32_const(&ctx->mod, 0));
return true;
}
@ -4726,7 +4710,7 @@ emit_read_first_invocation(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, nir_type_int);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -4748,7 +4732,7 @@ emit_read_invocation(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, nir_type_int);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -4769,7 +4753,7 @@ emit_vote_eq(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, nir_type_bool);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -4791,7 +4775,7 @@ emit_vote(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, nir_type_bool);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -4811,7 +4795,7 @@ emit_ballot(struct ntd_context *ctx, nir_intrinsic_instr *intr)
if (!ret)
return false;
for (uint32_t i = 0; i < 4; ++i)
store_dest(ctx, &intr->dest, i, dxil_emit_extractval(&ctx->mod, ret, i), nir_type_int);
store_dest(ctx, &intr->dest, i, dxil_emit_extractval(&ctx->mod, ret, i));
return true;
}
@ -4832,7 +4816,7 @@ emit_quad_op(struct ntd_context *ctx, nir_intrinsic_instr *intr, enum dxil_quad_
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, nir_type_uint);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -4865,7 +4849,7 @@ emit_reduce_bitwise(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, nir_type_uint);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -4924,7 +4908,7 @@ emit_reduce(struct ntd_context *ctx, nir_intrinsic_instr *intr)
const struct dxil_value *ret = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!ret)
return false;
store_dest(ctx, &intr->dest, 0, ret, alu_type);
store_dest(ctx, &intr->dest, 0, ret);
return true;
}
@ -5012,81 +4996,81 @@ emit_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr)
case nir_intrinsic_control_barrier:
return emit_control_barrier(ctx, intr);
case nir_intrinsic_ssbo_atomic_add:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_ADD, nir_type_int);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_ADD);
case nir_intrinsic_ssbo_atomic_imin:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_IMIN, nir_type_int);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_IMIN);
case nir_intrinsic_ssbo_atomic_umin:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_UMIN, nir_type_uint);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_UMIN);
case nir_intrinsic_ssbo_atomic_imax:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_IMAX, nir_type_int);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_IMAX);
case nir_intrinsic_ssbo_atomic_umax:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_UMAX, nir_type_uint);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_UMAX);
case nir_intrinsic_ssbo_atomic_and:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_AND, nir_type_uint);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_AND);
case nir_intrinsic_ssbo_atomic_or:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_OR, nir_type_uint);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_OR);
case nir_intrinsic_ssbo_atomic_xor:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_XOR, nir_type_uint);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_XOR);
case nir_intrinsic_ssbo_atomic_exchange:
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_EXCHANGE, nir_type_int);
return emit_ssbo_atomic(ctx, intr, DXIL_ATOMIC_EXCHANGE);
case nir_intrinsic_ssbo_atomic_comp_swap:
return emit_ssbo_atomic_comp_swap(ctx, intr);
case nir_intrinsic_shared_atomic_add_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_ADD, nir_type_int);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_ADD);
case nir_intrinsic_shared_atomic_imin_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_MIN, nir_type_int);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_MIN);
case nir_intrinsic_shared_atomic_umin_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_UMIN, nir_type_uint);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_UMIN);
case nir_intrinsic_shared_atomic_imax_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_MAX, nir_type_int);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_MAX);
case nir_intrinsic_shared_atomic_umax_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_UMAX, nir_type_uint);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_UMAX);
case nir_intrinsic_shared_atomic_and_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_AND, nir_type_uint);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_AND);
case nir_intrinsic_shared_atomic_or_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_OR, nir_type_uint);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_OR);
case nir_intrinsic_shared_atomic_xor_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_XOR, nir_type_uint);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_XOR);
case nir_intrinsic_shared_atomic_exchange_dxil:
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_XCHG, nir_type_int);
return emit_shared_atomic(ctx, intr, DXIL_RMWOP_XCHG);
case nir_intrinsic_shared_atomic_comp_swap_dxil:
return emit_shared_atomic_comp_swap(ctx, intr);
case nir_intrinsic_image_deref_atomic_add:
case nir_intrinsic_image_atomic_add:
case nir_intrinsic_bindless_image_atomic_add:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_ADD, nir_type_int);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_ADD);
case nir_intrinsic_image_deref_atomic_imin:
case nir_intrinsic_image_atomic_imin:
case nir_intrinsic_bindless_image_atomic_imin:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_IMIN, nir_type_int);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_IMIN);
case nir_intrinsic_image_deref_atomic_umin:
case nir_intrinsic_image_atomic_umin:
case nir_intrinsic_bindless_image_atomic_umin:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_UMIN, nir_type_uint);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_UMIN);
case nir_intrinsic_image_deref_atomic_imax:
case nir_intrinsic_image_atomic_imax:
case nir_intrinsic_bindless_image_atomic_imax:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_IMAX, nir_type_int);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_IMAX);
case nir_intrinsic_image_deref_atomic_umax:
case nir_intrinsic_image_atomic_umax:
case nir_intrinsic_bindless_image_atomic_umax:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_UMAX, nir_type_uint);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_UMAX);
case nir_intrinsic_image_deref_atomic_and:
case nir_intrinsic_image_atomic_and:
case nir_intrinsic_bindless_image_atomic_and:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_AND, nir_type_uint);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_AND);
case nir_intrinsic_image_deref_atomic_or:
case nir_intrinsic_image_atomic_or:
case nir_intrinsic_bindless_image_atomic_or:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_OR, nir_type_uint);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_OR);
case nir_intrinsic_image_deref_atomic_xor:
case nir_intrinsic_image_atomic_xor:
case nir_intrinsic_bindless_image_atomic_xor:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_XOR, nir_type_uint);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_XOR);
case nir_intrinsic_image_deref_atomic_exchange:
case nir_intrinsic_image_atomic_exchange:
case nir_intrinsic_bindless_image_atomic_exchange:
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_EXCHANGE, nir_type_uint);
return emit_image_atomic(ctx, intr, DXIL_ATOMIC_EXCHANGE);
case nir_intrinsic_image_deref_atomic_comp_swap:
case nir_intrinsic_image_atomic_comp_swap:
case nir_intrinsic_bindless_image_atomic_comp_swap:
@ -5271,7 +5255,7 @@ emit_deref(struct ntd_context* ctx, nir_deref_instr* instr)
/* Haven't finished chasing the deref chain yet, just store the value */
if (glsl_type_is_array(type)) {
store_dest(ctx, &instr->dest, 0, binding, nir_type_uint32);
store_dest(ctx, &instr->dest, 0, binding);
return true;
}
@ -5833,16 +5817,16 @@ emit_tex(struct ntd_context *ctx, nir_tex_instr *instr)
case nir_texop_lod:
sample = emit_texture_lod(ctx, &params, true);
store_dest(ctx, &instr->dest, 0, sample, nir_alu_type_get_base_type(instr->dest_type));
store_dest(ctx, &instr->dest, 0, sample);
sample = emit_texture_lod(ctx, &params, false);
store_dest(ctx, &instr->dest, 1, sample, nir_alu_type_get_base_type(instr->dest_type));
store_dest(ctx, &instr->dest, 1, sample);
return true;
case nir_texop_query_levels: {
params.lod_or_sample = dxil_module_get_int_const(&ctx->mod, 0, 32);
sample = emit_texture_size(ctx, &params);
const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, sample, 3);
store_dest(ctx, &instr->dest, 0, retval, nir_alu_type_get_base_type(instr->dest_type));
store_dest(ctx, &instr->dest, 0, retval);
return true;
}
@ -5850,7 +5834,7 @@ emit_tex(struct ntd_context *ctx, nir_tex_instr *instr)
params.lod_or_sample = int_undef;
sample = emit_texture_size(ctx, &params);
const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, sample, 3);
store_dest(ctx, &instr->dest, 0, retval, nir_alu_type_get_base_type(instr->dest_type));
store_dest(ctx, &instr->dest, 0, retval);
return true;
}
@ -5864,7 +5848,7 @@ emit_tex(struct ntd_context *ctx, nir_tex_instr *instr)
for (unsigned i = 0; i < nir_dest_num_components(instr->dest); ++i) {
const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, sample, i);
store_dest(ctx, &instr->dest, i, retval, nir_alu_type_get_base_type(instr->dest_type));
store_dest(ctx, &instr->dest, i, retval);
}
return true;