From 055625448b03bb0c83604c3abddf7538c45728bb Mon Sep 17 00:00:00 2001 From: Elizabeth Figura Date: Mon, 9 Dec 2024 14:15:33 -0600 Subject: [PATCH] vkd3d-shader/hlsl: Add a hlsl_block_add_simple_load() helper. --- libs/vkd3d-shader/hlsl.c | 9 ++++ libs/vkd3d-shader/hlsl.h | 2 + libs/vkd3d-shader/hlsl.y | 60 ++++++------------------- libs/vkd3d-shader/hlsl_codegen.c | 76 +++++++------------------------- 4 files changed, 41 insertions(+), 106 deletions(-) diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index a64f2a1c..94a43833 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -1877,6 +1877,15 @@ struct hlsl_ir_load *hlsl_new_var_load(struct hlsl_ctx *ctx, struct hlsl_ir_var return hlsl_new_load_index(ctx, &var_deref, NULL, loc); } +struct hlsl_ir_node *hlsl_block_add_simple_load(struct hlsl_ctx *ctx, struct hlsl_block *block, + struct hlsl_ir_var *var, const struct vkd3d_shader_location *loc) +{ + struct hlsl_deref var_deref; + + hlsl_init_simple_deref_from_var(&var_deref, var); + return hlsl_block_add_load_index(ctx, block, &var_deref, NULL, loc); +} + struct hlsl_ir_node *hlsl_block_add_load_component(struct hlsl_ctx *ctx, struct hlsl_block *block, const struct hlsl_deref *deref, unsigned int comp, const struct vkd3d_shader_location *loc) { diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index 4b0cce4a..76cc51c1 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -1520,6 +1520,8 @@ struct hlsl_ir_node *hlsl_block_add_load_component(struct hlsl_ctx *ctx, struct const struct hlsl_deref *deref, unsigned int comp, const struct vkd3d_shader_location *loc); struct hlsl_ir_node *hlsl_block_add_load_index(struct hlsl_ctx *ctx, struct hlsl_block *block, const struct hlsl_deref *deref, struct hlsl_ir_node *idx, const struct vkd3d_shader_location *loc); +struct hlsl_ir_node *hlsl_block_add_simple_load(struct hlsl_ctx *ctx, struct hlsl_block *block, + struct hlsl_ir_var *var, const struct vkd3d_shader_location *loc); void hlsl_block_add_simple_store(struct hlsl_ctx *ctx, struct hlsl_block *block, struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs); void hlsl_block_add_store_component(struct hlsl_ctx *ctx, struct hlsl_block *block, diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 68a158f9..8ee7d769 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -1584,7 +1584,6 @@ static struct hlsl_ir_node *add_expr(struct hlsl_ctx *ctx, struct hlsl_block *bl if (type->class == HLSL_CLASS_MATRIX) { struct hlsl_type *scalar_type; - struct hlsl_ir_load *var_load; struct hlsl_deref var_deref; struct hlsl_ir_var *var; @@ -1611,11 +1610,7 @@ static struct hlsl_ir_node *add_expr(struct hlsl_ctx *ctx, struct hlsl_block *bl hlsl_block_add_store_component(ctx, block, &var_deref, i, value); } - if (!(var_load = hlsl_new_var_load(ctx, var, loc))) - return NULL; - hlsl_block_add_instr(block, &var_load->node); - - return &var_load->node; + return hlsl_block_add_simple_load(ctx, block, var, loc); } return hlsl_block_add_expr(ctx, block, op, operands, type, loc); @@ -3141,33 +3136,22 @@ static struct hlsl_ir_node *add_user_call(struct hlsl_ctx *ctx, if (param->storage_modifiers & HLSL_STORAGE_OUT) { - struct hlsl_ir_load *load; + struct hlsl_ir_node *load; if (arg->data_type->modifiers & HLSL_MODIFIER_CONST) hlsl_error(ctx, &arg->loc, VKD3D_SHADER_ERROR_HLSL_MODIFIES_CONST, "Output argument to \"%s\" is const.", func->func->name); - if (!(load = hlsl_new_var_load(ctx, param, &arg->loc))) - return NULL; - hlsl_block_add_instr(args->instrs, &load->node); - - if (!add_assignment(ctx, args->instrs, arg, ASSIGN_OP_ASSIGN, &load->node, true)) + load = hlsl_block_add_simple_load(ctx, args->instrs, param, &arg->loc); + if (!add_assignment(ctx, args->instrs, arg, ASSIGN_OP_ASSIGN, load, true)) return NULL; } } if (func->return_var) - { - struct hlsl_ir_load *load; - - if (!(load = hlsl_new_var_load(ctx, func->return_var, loc))) - return false; - hlsl_block_add_instr(args->instrs, &load->node); - } + hlsl_block_add_simple_load(ctx, args->instrs, func->return_var, loc); else - { add_void_expr(ctx, args->instrs, loc); - } return call; } @@ -4358,7 +4342,7 @@ static bool intrinsic_mul(struct hlsl_ctx *ctx, struct hlsl_type *cast_type1 = arg1->data_type, *cast_type2 = arg2->data_type, *matrix_type, *ret_type; unsigned int i, j, k, vect_count = 0; struct hlsl_deref var_deref; - struct hlsl_ir_load *load; + struct hlsl_ir_node *load; struct hlsl_ir_var *var; if (arg1->data_type->class == HLSL_CLASS_SCALAR || arg2->data_type->class == HLSL_CLASS_SCALAR) @@ -4436,11 +4420,8 @@ static bool intrinsic_mul(struct hlsl_ctx *ctx, } } - if (!(load = hlsl_new_var_load(ctx, var, loc))) - return false; - hlsl_block_add_instr(params->instrs, &load->node); - - return !!add_implicit_conversion(ctx, params->instrs, &load->node, ret_type, loc); + load = hlsl_block_add_simple_load(ctx, params->instrs, var, loc); + return !!add_implicit_conversion(ctx, params->instrs, load, ret_type, loc); } static bool intrinsic_normalize(struct hlsl_ctx *ctx, @@ -4934,7 +4915,6 @@ static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer * is used for the second coordinate, while older ones appear to replicate first coordinate.*/ if (dim == HLSL_SAMPLER_DIM_1D) { - struct hlsl_ir_load *load; struct hlsl_ir_var *var; unsigned int idx = 0; @@ -4946,12 +4926,7 @@ static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer * coords = hlsl_block_add_float_constant(ctx, params->instrs, 0.5f, loc); initialize_var_components(ctx, params->instrs, var, &idx, coords, false); - if (!(load = hlsl_new_var_load(ctx, var, loc))) - return false; - hlsl_block_add_instr(params->instrs, &load->node); - - coords = &load->node; - + coords = hlsl_block_add_simple_load(ctx, params->instrs, var, loc); dim = HLSL_SAMPLER_DIM_2D; } @@ -5049,7 +5024,6 @@ static bool intrinsic_transpose(struct hlsl_ctx *ctx, { struct hlsl_ir_node *arg = params->args[0]; struct hlsl_type *arg_type = arg->data_type; - struct hlsl_ir_load *var_load; struct hlsl_deref var_deref; struct hlsl_type *mat_type; struct hlsl_ir_node *load; @@ -5091,10 +5065,7 @@ static bool intrinsic_transpose(struct hlsl_ctx *ctx, } } - if (!(var_load = hlsl_new_var_load(ctx, var, loc))) - return false; - hlsl_block_add_instr(params->instrs, &var_load->node); - + hlsl_block_add_simple_load(ctx, params->instrs, var, loc); return true; } @@ -5618,7 +5589,6 @@ static struct hlsl_block *add_compile_variant(struct hlsl_ctx *ctx, enum hlsl_co static struct hlsl_block *add_constructor(struct hlsl_ctx *ctx, struct hlsl_type *type, struct parse_initializer *params, const struct vkd3d_shader_location *loc) { - struct hlsl_ir_load *load; struct hlsl_ir_var *var; if (!hlsl_is_numeric_type(type)) @@ -5637,9 +5607,7 @@ static struct hlsl_block *add_constructor(struct hlsl_ctx *ctx, struct hlsl_type initialize_var(ctx, var, params, false); - if (!(load = hlsl_new_var_load(ctx, var, loc))) - return NULL; - hlsl_block_add_instr(params->instrs, &load->node); + hlsl_block_add_simple_load(ctx, params->instrs, var, loc); vkd3d_free(params->args); return params->instrs; @@ -9308,17 +9276,15 @@ primary_expr: } | VAR_IDENTIFIER { - struct hlsl_ir_load *load; struct hlsl_ir_var *var; if ((var = hlsl_get_var(ctx->cur_scope, $1))) { vkd3d_free($1); - if (!(load = hlsl_new_var_load(ctx, var, &@1))) - YYABORT; - if (!($$ = make_block(ctx, &load->node))) + if (!($$ = make_empty_block(ctx))) YYABORT; + hlsl_block_add_simple_load(ctx, $$, var, &@1); } else { diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index d0bbcfb1..8eaa2fdc 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -1003,9 +1003,8 @@ static bool lower_return(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *fun else if (cf_instr) { struct list *tail = list_tail(&block->instrs); - struct hlsl_ir_node *not, *iff; + struct hlsl_ir_node *not, *iff, *load; struct hlsl_block then_block; - struct hlsl_ir_load *load; /* If we're in a loop, we should have used "break" instead. */ VKD3D_ASSERT(!in_loop); @@ -1017,11 +1016,8 @@ static bool lower_return(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *fun list_move_slice_tail(&then_block.instrs, list_next(&block->instrs, &cf_instr->entry), tail); lower_return(ctx, func, &then_block, in_loop); - if (!(load = hlsl_new_var_load(ctx, func->early_return_var, &cf_instr->loc))) - return false; - hlsl_block_add_instr(block, &load->node); - - not = hlsl_block_add_unary_expr(ctx, block, HLSL_OP1_LOGIC_NOT, &load->node, &cf_instr->loc); + load = hlsl_block_add_simple_load(ctx, block, func->early_return_var, &cf_instr->loc); + not = hlsl_block_add_unary_expr(ctx, block, HLSL_OP1_LOGIC_NOT, load, &cf_instr->loc); if (!(iff = hlsl_new_if(ctx, not, &then_block, NULL, &cf_instr->loc))) return false; @@ -1060,7 +1056,6 @@ static struct hlsl_ir_node *add_zero_mipmap_level(struct hlsl_ctx *ctx, struct h struct hlsl_ir_node *index, const struct vkd3d_shader_location *loc) { unsigned int dim_count = index->data_type->e.numeric.dimx; - struct hlsl_ir_load *coords_load; struct hlsl_deref coords_deref; struct hlsl_ir_var *coords; struct hlsl_ir_node *zero; @@ -1075,14 +1070,9 @@ static struct hlsl_ir_node *add_zero_mipmap_level(struct hlsl_ctx *ctx, struct h hlsl_block_add_store_index(ctx, block, &coords_deref, NULL, index, (1u << dim_count) - 1, loc); zero = hlsl_block_add_uint_constant(ctx, block, 0, loc); - hlsl_block_add_store_index(ctx, block, &coords_deref, NULL, zero, 1u << dim_count, loc); - if (!(coords_load = hlsl_new_var_load(ctx, coords, loc))) - return NULL; - hlsl_block_add_instr(block, &coords_load->node); - - return &coords_load->node; + return hlsl_block_add_simple_load(ctx, block, coords, loc); } static bool lower_complex_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, struct hlsl_block *block) @@ -1091,7 +1081,6 @@ static bool lower_complex_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr struct hlsl_type *src_type, *dst_type; struct hlsl_deref var_deref; bool broadcast, matrix_cast; - struct hlsl_ir_load *load; struct hlsl_ir_node *arg; struct hlsl_ir_var *var; unsigned int dst_idx; @@ -1154,10 +1143,7 @@ static bool lower_complex_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr hlsl_block_add_store_component(ctx, block, &var_deref, dst_idx, cast); } - if (!(load = hlsl_new_var_load(ctx, var, &instr->loc))) - return false; - hlsl_block_add_instr(block, &load->node); - + hlsl_block_add_simple_load(ctx, block, var, &instr->loc); return true; } @@ -1169,7 +1155,6 @@ static bool lower_complex_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr static bool lower_matrix_swizzles(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, struct hlsl_block *block) { struct hlsl_ir_swizzle *swizzle; - struct hlsl_ir_load *var_load; struct hlsl_deref var_deref; struct hlsl_type *matrix_type; struct hlsl_ir_var *var; @@ -1196,10 +1181,7 @@ static bool lower_matrix_swizzles(struct hlsl_ctx *ctx, struct hlsl_ir_node *ins hlsl_block_add_store_component(ctx, block, &var_deref, i, load); } - if (!(var_load = hlsl_new_var_load(ctx, var, &instr->loc))) - return false; - hlsl_block_add_instr(block, &var_load->node); - + hlsl_block_add_simple_load(ctx, block, var, &instr->loc); return true; } @@ -1282,9 +1264,7 @@ static bool lower_index_loads(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, hlsl_block_add_store_index(ctx, block, &row_deref, c, &load->node, 0, &instr->loc); } - if (!(load = hlsl_new_var_load(ctx, var, &instr->loc))) - return false; - hlsl_block_add_instr(block, &load->node); + hlsl_block_add_simple_load(ctx, block, var, &instr->loc); } else { @@ -2879,11 +2859,10 @@ static bool lower_nonconstant_array_loads(struct hlsl_ctx *ctx, struct hlsl_ir_n element_count = hlsl_type_element_count(cut_type); for (i = 0; i < element_count; ++i) { + struct hlsl_ir_node *const_i, *equals, *ternary, *specific_load, *var_load; struct hlsl_type *btype = hlsl_get_scalar_type(ctx, HLSL_TYPE_BOOL); - struct hlsl_ir_node *const_i, *equals, *ternary, *specific_load; struct hlsl_ir_node *operands[HLSL_MAX_OPERANDS] = {0}; struct hlsl_deref deref_copy = {0}; - struct hlsl_ir_load *var_load; const_i = hlsl_block_add_uint_constant(ctx, block, i, &cut_index->loc); @@ -2896,9 +2875,7 @@ static bool lower_nonconstant_array_loads(struct hlsl_ctx *ctx, struct hlsl_ir_n return false; hlsl_block_add_instr(block, equals); - if (!(var_load = hlsl_new_var_load(ctx, var, &cut_index->loc))) - return false; - hlsl_block_add_instr(block, &var_load->node); + var_load = hlsl_block_add_simple_load(ctx, block, var, &cut_index->loc); if (!hlsl_copy_deref(ctx, &deref_copy, deref)) return false; @@ -2909,16 +2886,13 @@ static bool lower_nonconstant_array_loads(struct hlsl_ctx *ctx, struct hlsl_ir_n operands[0] = equals; operands[1] = specific_load; - operands[2] = &var_load->node; + operands[2] = var_load; ternary = hlsl_block_add_expr(ctx, block, HLSL_OP3_TERNARY, operands, instr->data_type, &cut_index->loc); hlsl_block_add_simple_store(ctx, block, var, ternary); } - if (!(load = hlsl_new_var_load(ctx, var, &instr->loc))) - return false; - hlsl_block_add_instr(block, &load->node); - + hlsl_block_add_simple_load(ctx, block, var, &instr->loc); return true; } @@ -11378,17 +11352,13 @@ static bool loop_unrolling_remove_jumps_visit(struct hlsl_ctx *ctx, struct hlsl_ static struct hlsl_ir_if *loop_unrolling_generate_var_check(struct hlsl_ctx *ctx, struct hlsl_block *dst, struct hlsl_ir_var *var, struct vkd3d_shader_location *loc) { - struct hlsl_ir_node *cond, *iff; + struct hlsl_ir_node *cond, *load, *iff; struct hlsl_block then_block; - struct hlsl_ir_load *load; hlsl_block_init(&then_block); - if (!(load = hlsl_new_var_load(ctx, var, loc))) - return NULL; - hlsl_block_add_instr(dst, &load->node); - - cond = hlsl_block_add_unary_expr(ctx, dst, HLSL_OP1_LOGIC_NOT, &load->node, loc); + load = hlsl_block_add_simple_load(ctx, dst, var, loc); + cond = hlsl_block_add_unary_expr(ctx, dst, HLSL_OP1_LOGIC_NOT, load, loc); if (!(iff = hlsl_new_if(ctx, cond, &then_block, NULL, loc))) return NULL; @@ -11733,7 +11703,6 @@ static bool lower_f16tof32(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, stru struct hlsl_ir_function_decl *func; struct hlsl_ir_node *call, *rhs; unsigned int component_count; - struct hlsl_ir_load *load; struct hlsl_ir_expr *expr; struct hlsl_ir_var *lhs; char *body; @@ -11802,10 +11771,7 @@ static bool lower_f16tof32(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, stru return false; hlsl_block_add_instr(block, call); - if (!(load = hlsl_new_var_load(ctx, func->return_var, &node->loc))) - return false; - hlsl_block_add_instr(block, &load->node); - + hlsl_block_add_simple_load(ctx, block, func->return_var, &node->loc); return true; } @@ -11814,7 +11780,6 @@ static bool lower_f32tof16(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, stru struct hlsl_ir_function_decl *func; struct hlsl_ir_node *call, *rhs; unsigned int component_count; - struct hlsl_ir_load *load; struct hlsl_ir_expr *expr; struct hlsl_ir_var *lhs; char *body; @@ -11871,10 +11836,7 @@ static bool lower_f32tof16(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, stru return false; hlsl_block_add_instr(block, call); - if (!(load = hlsl_new_var_load(ctx, func->return_var, &node->loc))) - return false; - hlsl_block_add_instr(block, &load->node); - + hlsl_block_add_simple_load(ctx, block, func->return_var, &node->loc); return true; } @@ -11883,7 +11845,6 @@ static bool lower_isinf(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, struct struct hlsl_ir_function_decl *func; struct hlsl_ir_node *call, *rhs; unsigned int component_count; - struct hlsl_ir_load *load; struct hlsl_ir_expr *expr; const char *template; char *body; @@ -11955,10 +11916,7 @@ static bool lower_isinf(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, struct return false; hlsl_block_add_instr(block, call); - if (!(load = hlsl_new_var_load(ctx, func->return_var, &node->loc))) - return false; - hlsl_block_add_instr(block, &load->node); - + hlsl_block_add_simple_load(ctx, block, func->return_var, &node->loc); return true; }