mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/hlsl: Run constant passes in a separate function.
This commit is contained in:
parent
58a6db5589
commit
4f60c7167e
Notes:
Alexandre Julliard
2024-05-15 23:03:23 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Elizabeth Figura (@zfigura) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/839
@ -1250,6 +1250,7 @@ bool hlsl_clone_block(struct hlsl_ctx *ctx, struct hlsl_block *dst_block, const
|
|||||||
|
|
||||||
void hlsl_dump_function(struct hlsl_ctx *ctx, const struct hlsl_ir_function_decl *func);
|
void hlsl_dump_function(struct hlsl_ctx *ctx, const struct hlsl_ir_function_decl *func);
|
||||||
|
|
||||||
|
void hlsl_run_const_passes(struct hlsl_ctx *ctx, struct hlsl_block *body);
|
||||||
int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func,
|
int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func,
|
||||||
enum vkd3d_shader_target_type target_type, struct vkd3d_shader_code *out);
|
enum vkd3d_shader_target_type target_type, struct vkd3d_shader_code *out);
|
||||||
int hlsl_emit_effect_binary(struct hlsl_ctx *ctx, struct vkd3d_shader_code *out);
|
int hlsl_emit_effect_binary(struct hlsl_ctx *ctx, struct vkd3d_shader_code *out);
|
||||||
|
@ -5408,6 +5408,41 @@ static void remove_unreachable_code(struct hlsl_ctx *ctx, struct hlsl_block *bod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hlsl_run_const_passes(struct hlsl_ctx *ctx, struct hlsl_block *body)
|
||||||
|
{
|
||||||
|
bool progress;
|
||||||
|
|
||||||
|
lower_ir(ctx, lower_broadcasts, body);
|
||||||
|
while (hlsl_transform_ir(ctx, fold_redundant_casts, body, NULL));
|
||||||
|
do
|
||||||
|
{
|
||||||
|
progress = hlsl_transform_ir(ctx, split_array_copies, body, NULL);
|
||||||
|
progress |= hlsl_transform_ir(ctx, split_struct_copies, body, NULL);
|
||||||
|
}
|
||||||
|
while (progress);
|
||||||
|
hlsl_transform_ir(ctx, split_matrix_copies, body, NULL);
|
||||||
|
|
||||||
|
lower_ir(ctx, lower_narrowing_casts, body);
|
||||||
|
lower_ir(ctx, lower_int_dot, body);
|
||||||
|
lower_ir(ctx, lower_int_division, body);
|
||||||
|
lower_ir(ctx, lower_int_modulus, body);
|
||||||
|
lower_ir(ctx, lower_int_abs, body);
|
||||||
|
lower_ir(ctx, lower_casts_to_bool, body);
|
||||||
|
lower_ir(ctx, lower_float_modulus, body);
|
||||||
|
hlsl_transform_ir(ctx, fold_redundant_casts, body, NULL);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
progress = hlsl_transform_ir(ctx, hlsl_fold_constant_exprs, body, NULL);
|
||||||
|
progress |= hlsl_transform_ir(ctx, hlsl_fold_constant_identities, body, NULL);
|
||||||
|
progress |= hlsl_transform_ir(ctx, hlsl_fold_constant_swizzles, body, NULL);
|
||||||
|
progress |= hlsl_copy_propagation_execute(ctx, body);
|
||||||
|
progress |= hlsl_transform_ir(ctx, fold_swizzle_chains, body, NULL);
|
||||||
|
progress |= hlsl_transform_ir(ctx, remove_trivial_swizzles, body, NULL);
|
||||||
|
progress |= hlsl_transform_ir(ctx, remove_trivial_conditional_branches, body, NULL);
|
||||||
|
} while (progress);
|
||||||
|
}
|
||||||
|
|
||||||
int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func,
|
int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func,
|
||||||
enum vkd3d_shader_target_type target_type, struct vkd3d_shader_code *out)
|
enum vkd3d_shader_target_type target_type, struct vkd3d_shader_code *out)
|
||||||
{
|
{
|
||||||
@ -5416,7 +5451,6 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
|
|||||||
struct recursive_call_ctx recursive_call_ctx;
|
struct recursive_call_ctx recursive_call_ctx;
|
||||||
struct hlsl_ir_var *var;
|
struct hlsl_ir_var *var;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
bool progress;
|
|
||||||
|
|
||||||
list_move_head(&body->instrs, &ctx->static_initializers.instrs);
|
list_move_head(&body->instrs, &ctx->static_initializers.instrs);
|
||||||
|
|
||||||
@ -5494,35 +5528,9 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
|
|||||||
{
|
{
|
||||||
hlsl_transform_ir(ctx, lower_discard_neg, body, NULL);
|
hlsl_transform_ir(ctx, lower_discard_neg, body, NULL);
|
||||||
}
|
}
|
||||||
lower_ir(ctx, lower_broadcasts, body);
|
|
||||||
while (hlsl_transform_ir(ctx, fold_redundant_casts, body, NULL));
|
|
||||||
do
|
|
||||||
{
|
|
||||||
progress = hlsl_transform_ir(ctx, split_array_copies, body, NULL);
|
|
||||||
progress |= hlsl_transform_ir(ctx, split_struct_copies, body, NULL);
|
|
||||||
}
|
|
||||||
while (progress);
|
|
||||||
hlsl_transform_ir(ctx, split_matrix_copies, body, NULL);
|
|
||||||
|
|
||||||
lower_ir(ctx, lower_narrowing_casts, body);
|
hlsl_run_const_passes(ctx, body);
|
||||||
lower_ir(ctx, lower_int_dot, body);
|
|
||||||
lower_ir(ctx, lower_int_division, body);
|
|
||||||
lower_ir(ctx, lower_int_modulus, body);
|
|
||||||
lower_ir(ctx, lower_int_abs, body);
|
|
||||||
lower_ir(ctx, lower_casts_to_bool, body);
|
|
||||||
lower_ir(ctx, lower_float_modulus, body);
|
|
||||||
hlsl_transform_ir(ctx, fold_redundant_casts, body, NULL);
|
|
||||||
do
|
|
||||||
{
|
|
||||||
progress = hlsl_transform_ir(ctx, hlsl_fold_constant_exprs, body, NULL);
|
|
||||||
progress |= hlsl_transform_ir(ctx, hlsl_fold_constant_identities, body, NULL);
|
|
||||||
progress |= hlsl_transform_ir(ctx, hlsl_fold_constant_swizzles, body, NULL);
|
|
||||||
progress |= hlsl_copy_propagation_execute(ctx, body);
|
|
||||||
progress |= hlsl_transform_ir(ctx, fold_swizzle_chains, body, NULL);
|
|
||||||
progress |= hlsl_transform_ir(ctx, remove_trivial_swizzles, body, NULL);
|
|
||||||
progress |= hlsl_transform_ir(ctx, remove_trivial_conditional_branches, body, NULL);
|
|
||||||
}
|
|
||||||
while (progress);
|
|
||||||
remove_unreachable_code(ctx, body);
|
remove_unreachable_code(ctx, body);
|
||||||
hlsl_transform_ir(ctx, normalize_switch_cases, body, NULL);
|
hlsl_transform_ir(ctx, normalize_switch_cases, body, NULL);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user