vkd3d-shader/hlsl: Replace register offsets with index paths in split copies.

hlsl_new_store() and hlsl_new_load() are deleted, so now there are no more
direct ways to create derefs with offsets in hlsl.c and hlsl.h.

Signed-off-by: Francisco Casas <fcasas@codeweavers.com>
Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com>
This commit is contained in:
Francisco Casas 2022-06-28 17:20:24 -04:00 committed by Alexandre Julliard
parent d7d2fe145f
commit 577014c017
Notes: Alexandre Julliard 2022-10-18 00:13:00 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Zebediah Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/5
3 changed files with 11 additions and 65 deletions

View File

@ -797,25 +797,6 @@ void hlsl_cleanup_deref(struct hlsl_deref *deref)
hlsl_src_remove(&deref->offset); hlsl_src_remove(&deref->offset);
} }
struct hlsl_ir_store *hlsl_new_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
struct hlsl_ir_node *rhs, unsigned int writemask, struct vkd3d_shader_location loc)
{
struct hlsl_ir_store *store;
if (!writemask && type_is_single_reg(rhs->data_type))
writemask = (1 << rhs->data_type->dimx) - 1;
if (!(store = hlsl_alloc(ctx, sizeof(*store))))
return NULL;
init_node(&store->node, HLSL_IR_STORE, NULL, loc);
init_deref(ctx, &store->lhs, var, 0);
hlsl_src_from_node(&store->lhs.offset, offset);
hlsl_src_from_node(&store->rhs, rhs);
store->writemask = writemask;
return store;
}
/* Initializes a simple variable derefence, so that it can be passed to load/store functions. */ /* Initializes a simple variable derefence, so that it can be passed to load/store functions. */
void hlsl_init_simple_deref_from_var(struct hlsl_deref *deref, struct hlsl_ir_var *var) void hlsl_init_simple_deref_from_var(struct hlsl_deref *deref, struct hlsl_ir_var *var)
{ {
@ -971,19 +952,6 @@ struct hlsl_ir_if *hlsl_new_if(struct hlsl_ctx *ctx, struct hlsl_ir_node *condit
return iff; return iff;
} }
struct hlsl_ir_load *hlsl_new_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
struct hlsl_type *type, const struct vkd3d_shader_location loc)
{
struct hlsl_ir_load *load;
if (!(load = hlsl_alloc(ctx, sizeof(*load))))
return NULL;
init_node(&load->node, HLSL_IR_LOAD, type, loc);
init_deref(ctx, &load->src, var, 0);
hlsl_src_from_node(&load->src.offset, offset);
return load;
}
struct hlsl_ir_load *hlsl_new_load_index(struct hlsl_ctx *ctx, const struct hlsl_deref *deref, struct hlsl_ir_load *hlsl_new_load_index(struct hlsl_ctx *ctx, const struct hlsl_deref *deref,
struct hlsl_ir_node *idx, const struct vkd3d_shader_location *loc) struct hlsl_ir_node *idx, const struct vkd3d_shader_location *loc)
{ {

View File

@ -774,11 +774,7 @@ struct hlsl_ir_resource_load *hlsl_new_resource_load(struct hlsl_ctx *ctx, struc
enum hlsl_resource_load_type type, struct hlsl_deref *resource, struct hlsl_deref *sampler, enum hlsl_resource_load_type type, struct hlsl_deref *resource, struct hlsl_deref *sampler,
struct hlsl_ir_node *coords, struct hlsl_ir_node *texel_offset, const struct vkd3d_shader_location *loc); struct hlsl_ir_node *coords, struct hlsl_ir_node *texel_offset, const struct vkd3d_shader_location *loc);
struct hlsl_ir_load *hlsl_new_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
struct hlsl_type *type, struct vkd3d_shader_location loc);
struct hlsl_ir_loop *hlsl_new_loop(struct hlsl_ctx *ctx, struct vkd3d_shader_location loc); struct hlsl_ir_loop *hlsl_new_loop(struct hlsl_ctx *ctx, struct vkd3d_shader_location loc);
struct hlsl_ir_store *hlsl_new_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
struct hlsl_ir_node *rhs, unsigned int writemask, struct vkd3d_shader_location loc);
struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name,
struct hlsl_struct_field *fields, size_t field_count); struct hlsl_struct_field *fields, size_t field_count);
struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned int components, struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned int components,

View File

@ -958,39 +958,21 @@ static bool fold_redundant_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *inst
* split_matrix_copies(). Inserts new instructions right before * split_matrix_copies(). Inserts new instructions right before
* "store". */ * "store". */
static bool split_copy(struct hlsl_ctx *ctx, struct hlsl_ir_store *store, static bool split_copy(struct hlsl_ctx *ctx, struct hlsl_ir_store *store,
const struct hlsl_ir_load *load, const unsigned int offset, struct hlsl_type *type) const struct hlsl_ir_load *load, const unsigned int idx, struct hlsl_type *type)
{ {
struct hlsl_ir_node *offset_instr, *add;
struct hlsl_ir_store *split_store; struct hlsl_ir_store *split_store;
struct hlsl_ir_load *split_load; struct hlsl_ir_load *split_load;
struct hlsl_ir_constant *c; struct hlsl_ir_constant *c;
if (!(c = hlsl_new_uint_constant(ctx, offset, &store->node.loc))) if (!(c = hlsl_new_uint_constant(ctx, idx, &store->node.loc)))
return false; return false;
list_add_before(&store->node.entry, &c->node.entry); list_add_before(&store->node.entry, &c->node.entry);
offset_instr = &c->node; if (!(split_load = hlsl_new_load_index(ctx, &load->src, &c->node, &store->node.loc)))
if (load->src.offset.node)
{
if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, load->src.offset.node, &c->node)))
return false;
list_add_before(&store->node.entry, &add->entry);
offset_instr = add;
}
if (!(split_load = hlsl_new_load(ctx, load->src.var, offset_instr, type, store->node.loc)))
return false; return false;
list_add_before(&store->node.entry, &split_load->node.entry); list_add_before(&store->node.entry, &split_load->node.entry);
offset_instr = &c->node; if (!(split_store = hlsl_new_store_index(ctx, &store->lhs, &c->node, &split_load->node, 0, &store->node.loc)))
if (store->lhs.offset.node)
{
if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, store->lhs.offset.node, &c->node)))
return false;
list_add_before(&store->node.entry, &add->entry);
offset_instr = add;
}
if (!(split_store = hlsl_new_store(ctx, store->lhs.var, offset_instr, &split_load->node, 0, store->node.loc)))
return false; return false;
list_add_before(&store->node.entry, &split_store->node.entry); list_add_before(&store->node.entry, &split_store->node.entry);
@ -1002,8 +984,8 @@ static bool split_array_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
const struct hlsl_ir_node *rhs; const struct hlsl_ir_node *rhs;
struct hlsl_type *element_type; struct hlsl_type *element_type;
const struct hlsl_type *type; const struct hlsl_type *type;
unsigned int element_size, i;
struct hlsl_ir_store *store; struct hlsl_ir_store *store;
unsigned int i;
if (instr->type != HLSL_IR_STORE) if (instr->type != HLSL_IR_STORE)
return false; return false;
@ -1014,7 +996,6 @@ static bool split_array_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
if (type->type != HLSL_CLASS_ARRAY) if (type->type != HLSL_CLASS_ARRAY)
return false; return false;
element_type = type->e.array.type; element_type = type->e.array.type;
element_size = hlsl_type_get_array_element_reg_size(element_type);
if (rhs->type != HLSL_IR_LOAD) if (rhs->type != HLSL_IR_LOAD)
{ {
@ -1024,7 +1005,7 @@ static bool split_array_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
for (i = 0; i < type->e.array.elements_count; ++i) for (i = 0; i < type->e.array.elements_count; ++i)
{ {
if (!split_copy(ctx, store, hlsl_ir_load(rhs), i * element_size, element_type)) if (!split_copy(ctx, store, hlsl_ir_load(rhs), i, element_type))
return false; return false;
} }
@ -1062,7 +1043,7 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
{ {
const struct hlsl_struct_field *field = &type->e.record.fields[i]; const struct hlsl_struct_field *field = &type->e.record.fields[i];
if (!split_copy(ctx, store, hlsl_ir_load(rhs), field->reg_offset, field->type)) if (!split_copy(ctx, store, hlsl_ir_load(rhs), i, field->type))
return false; return false;
} }
@ -1100,7 +1081,7 @@ static bool split_matrix_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
for (i = 0; i < hlsl_type_major_size(type); ++i) for (i = 0; i < hlsl_type_major_size(type); ++i)
{ {
if (!split_copy(ctx, store, hlsl_ir_load(rhs), 4 * i, element_type)) if (!split_copy(ctx, store, hlsl_ir_load(rhs), i, element_type))
return false; return false;
} }
@ -2114,8 +2095,6 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
append_output_var_copy(ctx, &body->instrs, entry_func->return_var); append_output_var_copy(ctx, &body->instrs, entry_func->return_var);
} }
transform_ir(ctx, transform_deref_paths_into_offsets, body, NULL); /* TODO: move forward, remove when no longer needed */
transform_ir(ctx, lower_broadcasts, body, NULL); transform_ir(ctx, lower_broadcasts, body, NULL);
while (transform_ir(ctx, fold_redundant_casts, body, NULL)); while (transform_ir(ctx, fold_redundant_casts, body, NULL));
do do
@ -2125,6 +2104,9 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
} }
while (progress); while (progress);
transform_ir(ctx, split_matrix_copies, body, NULL); transform_ir(ctx, split_matrix_copies, body, NULL);
transform_ir(ctx, transform_deref_paths_into_offsets, body, NULL); /* TODO: move forward, remove when no longer needed */
transform_ir(ctx, lower_narrowing_casts, body, NULL); transform_ir(ctx, lower_narrowing_casts, body, NULL);
transform_ir(ctx, lower_casts_to_bool, body, NULL); transform_ir(ctx, lower_casts_to_bool, body, NULL);
do do