microsoft/compiler: Delete non-sysval deref load/store code

Reviewed-by: Enrico Galli <enrico.galli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14175>
This commit is contained in:
Jesse Natalie 2021-12-11 09:57:36 -08:00
parent f30768f1d6
commit 8d5b7450a4
1 changed files with 0 additions and 231 deletions

View File

@ -2696,73 +2696,6 @@ emit_load_ubo_dxil(struct ntd_context *ctx, nir_intrinsic_instr *intr)
return true;
}
static bool
emit_store_output(struct ntd_context *ctx, nir_intrinsic_instr *intr,
nir_variable *output)
{
nir_alu_type out_type = nir_get_nir_type_for_glsl_base_type(glsl_get_base_type(output->type));
enum overload_type overload = DXIL_F32;
if (output->data.compact)
out_type = nir_type_float;
else
overload = get_overload(out_type, glsl_get_bit_size(output->type));
const struct dxil_func *func = dxil_get_function(&ctx->mod, "dx.op.storeOutput", overload);
if (!func)
return false;
const struct dxil_value *opcode = dxil_module_get_int32_const(&ctx->mod, DXIL_INTR_STORE_OUTPUT);
const struct dxil_value *output_id = dxil_module_get_int32_const(&ctx->mod, (int)output->data.driver_location);
const struct dxil_value *row = dxil_module_get_int32_const(&ctx->mod, 0);
bool success = true;
if (output->data.compact) {
nir_deref_instr *array_deref = nir_instr_as_deref(intr->src[0].ssa->parent_instr);
unsigned array_index = nir_src_as_uint(array_deref->arr.index);
const struct dxil_value *col = dxil_module_get_int8_const(&ctx->mod, array_index);
const struct dxil_value *value = get_src(ctx, &intr->src[1], 0, out_type);
if (!col || !value)
return false;
const struct dxil_value *args[] = {
opcode, output_id, row, col, value
};
success = dxil_emit_call_void(&ctx->mod, func, args, ARRAY_SIZE(args));
} else {
uint32_t writemask = nir_intrinsic_write_mask(intr);
for (unsigned i = 0; i < nir_src_num_components(intr->src[1]) && success; ++i) {
if (writemask & (1 << i)) {
const struct dxil_value *col = dxil_module_get_int8_const(&ctx->mod, i);
const struct dxil_value *value = get_src(ctx, &intr->src[1], i, out_type);
if (!col || !value)
return false;
const struct dxil_value *args[] = {
opcode, output_id, row, col, value
};
success &= dxil_emit_call_void(&ctx->mod, func, args, ARRAY_SIZE(args));
}
}
}
return success;
}
static bool
emit_store_deref(struct ntd_context *ctx, nir_intrinsic_instr *intr)
{
nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
nir_variable *var = nir_deref_instr_get_variable(deref);
switch (var->data.mode) {
case nir_var_shader_out:
return emit_store_output(ctx, intr, var);
default:
unreachable("unsupported nir_variable_mode");
}
}
static bool
emit_store_output_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr)
{
@ -2795,100 +2728,6 @@ emit_store_output_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *in
return success;
}
static bool
emit_load_input_array(struct ntd_context *ctx, nir_intrinsic_instr *intr, nir_variable *var, nir_src *index)
{
assert(var);
const struct dxil_value *opcode = dxil_module_get_int32_const(&ctx->mod, DXIL_INTR_LOAD_INPUT);
const struct dxil_value *input_id = dxil_module_get_int32_const(&ctx->mod, var->data.driver_location);
const struct dxil_value *vertex_id;
const struct dxil_value *row;
if (ctx->mod.shader_kind == DXIL_GEOMETRY_SHADER) {
vertex_id = get_src(ctx, index, 0, nir_type_int);
row = dxil_module_get_int32_const(&ctx->mod, 0);
} else {
const struct dxil_type *int32_type = dxil_module_get_int_type(&ctx->mod, 32);
vertex_id = dxil_module_get_undef(&ctx->mod, int32_type);
row = get_src(ctx, index, 0, nir_type_int);
}
if (!opcode || !input_id || !vertex_id || !row)
return false;
nir_alu_type out_type = nir_get_nir_type_for_glsl_base_type(glsl_get_base_type(glsl_get_array_element(var->type)));
enum overload_type overload = get_overload(out_type, glsl_get_bit_size(glsl_get_array_element(var->type)));
const struct dxil_func *func = dxil_get_function(&ctx->mod, "dx.op.loadInput", overload);
if (!func)
return false;
for (unsigned i = 0; i < nir_dest_num_components(intr->dest); ++i) {
const struct dxil_value *comp = dxil_module_get_int8_const(&ctx->mod, i);
if (!comp)
return false;
const struct dxil_value *args[] = {
opcode, input_id, row, comp, vertex_id
};
const struct dxil_value *retval = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!retval)
return false;
store_dest(ctx, &intr->dest, i, retval, out_type);
}
return true;
}
static bool
emit_load_compact_input_array(struct ntd_context *ctx, nir_intrinsic_instr *intr, nir_variable *var, nir_deref_instr *deref)
{
assert(var);
const struct dxil_value *opcode = dxil_module_get_int32_const(&ctx->mod, DXIL_INTR_LOAD_INPUT);
const struct dxil_value *input_id = dxil_module_get_int32_const(&ctx->mod, var->data.driver_location);
const struct dxil_value *row = dxil_module_get_int32_const(&ctx->mod, 0);
const struct dxil_value *vertex_id;
nir_src *col = &deref->arr.index;
nir_src_is_const(*col);
if (ctx->mod.shader_kind == DXIL_GEOMETRY_SHADER) {
nir_deref_instr *deref_parent = nir_deref_instr_parent(deref);
assert(deref_parent->deref_type == nir_deref_type_array);
vertex_id = get_src(ctx, &deref_parent->arr.index, 0, nir_type_int);
} else {
const struct dxil_type *int32_type = dxil_module_get_int_type(&ctx->mod, 32);
vertex_id = dxil_module_get_undef(&ctx->mod, int32_type);
}
if (!opcode || !input_id || !row || !vertex_id)
return false;
nir_alu_type out_type = nir_type_float;
enum overload_type overload = get_overload(out_type, 32);
const struct dxil_func *func = dxil_get_function(&ctx->mod, "dx.op.loadInput", overload);
if (!func)
return false;
const struct dxil_value *comp = dxil_module_get_int8_const(&ctx->mod, nir_src_as_int(*col));
if (!comp)
return false;
const struct dxil_value *args[] = {
opcode, input_id, row, comp, vertex_id
};
const struct dxil_value *retval = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!retval)
return false;
store_dest(ctx, &intr->dest, 0, retval, out_type);
return true;
}
static bool
emit_load_input_interpolated(struct ntd_context *ctx, nir_intrinsic_instr *intr, nir_variable *var)
{
@ -2925,50 +2764,6 @@ emit_load_input_interpolated(struct ntd_context *ctx, nir_intrinsic_instr *intr,
return true;
}
static bool
emit_load_input_flat(struct ntd_context *ctx, nir_intrinsic_instr *intr, nir_variable* var)
{
const struct dxil_value *opcode = dxil_module_get_int32_const(&ctx->mod, DXIL_INTR_ATTRIBUTE_AT_VERTEX);
const struct dxil_value *input_id = dxil_module_get_int32_const(&ctx->mod, (int)var->data.driver_location);
const struct dxil_value *row = dxil_module_get_int32_const(&ctx->mod, 0);
const struct dxil_value *vertex_id = dxil_module_get_int8_const(&ctx->mod, ctx->opts->provoking_vertex);
nir_alu_type out_type = nir_get_nir_type_for_glsl_base_type(glsl_get_base_type(var->type));
enum overload_type overload = get_overload(out_type, glsl_get_bit_size(var->type));
const struct dxil_func *func = dxil_get_function(&ctx->mod, "dx.op.attributeAtVertex", overload);
if (!func)
return false;
for (unsigned i = 0; i < nir_dest_num_components(intr->dest); ++i) {
const struct dxil_value *comp = dxil_module_get_int8_const(&ctx->mod, i);
const struct dxil_value *args[] = {
opcode, input_id, row, comp, vertex_id
};
const struct dxil_value *retval = dxil_emit_call(&ctx->mod, func, args, ARRAY_SIZE(args));
if (!retval)
return false;
store_dest(ctx, &intr->dest, i, retval, out_type);
}
return true;
}
static bool
emit_load_input(struct ntd_context *ctx, nir_intrinsic_instr *intr,
nir_variable *input)
{
if (ctx->mod.shader_kind != DXIL_PIXEL_SHADER ||
input->data.interpolation != INTERP_MODE_FLAT ||
!ctx->opts->interpolate_at_vertex ||
ctx->opts->provoking_vertex == 0 ||
glsl_type_is_integer(input->type))
return emit_load_input_interpolated(ctx, intr, input);
else
return emit_load_input_flat(ctx, intr, input);
}
static bool
emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr)
{
@ -3123,28 +2918,6 @@ emit_load_scratch(struct ntd_context *ctx, nir_intrinsic_instr *intr)
return true;
}
static bool
emit_load_deref(struct ntd_context *ctx, nir_intrinsic_instr *intr)
{
assert(intr->src[0].is_ssa);
nir_deref_instr *deref = nir_instr_as_deref(intr->src[0].ssa->parent_instr);
nir_variable *var = nir_deref_instr_get_variable(deref);
switch (var->data.mode) {
case nir_var_shader_in:
if (glsl_type_is_array(var->type)) {
if (var->data.compact)
return emit_load_compact_input_array(ctx, intr, var, deref);
else
return emit_load_input_array(ctx, intr, var, &deref->arr.index);
}
return emit_load_input(ctx, intr, var);
default:
unreachable("unsupported nir_variable_mode");
}
}
static bool
emit_discard_if_with_value(struct ntd_context *ctx, const struct dxil_value *value)
{
@ -3676,15 +3449,11 @@ emit_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr)
return emit_store_ssbo(ctx, intr);
case nir_intrinsic_store_ssbo_masked_dxil:
return emit_store_ssbo_masked(ctx, intr);
case nir_intrinsic_store_deref:
return emit_store_deref(ctx, intr);
case nir_intrinsic_store_shared_dxil:
case nir_intrinsic_store_shared_masked_dxil:
return emit_store_shared(ctx, intr);
case nir_intrinsic_store_scratch_dxil:
return emit_store_scratch(ctx, intr);
case nir_intrinsic_load_deref:
return emit_load_deref(ctx, intr);
case nir_intrinsic_load_ptr_dxil:
return emit_load_ptr(ctx, intr);
case nir_intrinsic_load_ubo: