Module: vkd3d Branch: master Commit: 0d252f894aefb6cf26a590e775a562723112aff9 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/0d252f894aefb6cf26a590e775a562...
Author: Francisco Casas fcasas@codeweavers.com Date: Fri Apr 26 12:15:52 2024 -0400
vkd3d-shader/hlsl: Run more constant passes on static expressions eval.
---
libs/vkd3d-shader/hlsl.y | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index c6b6219e..9c1bdef9 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -1293,7 +1293,7 @@ static unsigned int evaluate_static_expression_as_uint(struct hlsl_ctx *ctx, str struct hlsl_ir_node *node; struct hlsl_block expr; unsigned int ret = 0; - bool progress; + struct hlsl_src src;
LIST_FOR_EACH_ENTRY(node, &block->instrs, struct hlsl_ir_node, entry) { @@ -1330,13 +1330,12 @@ static unsigned int evaluate_static_expression_as_uint(struct hlsl_ctx *ctx, str return 0; }
- do - { - progress = hlsl_transform_ir(ctx, hlsl_fold_constant_exprs, &expr, NULL); - progress |= hlsl_copy_propagation_execute(ctx, &expr); - } while (progress); + /* Wrap the node into a src to allow the reference to survive the multiple const passes. */ + hlsl_src_from_node(&src, node_from_block(&expr)); + hlsl_run_const_passes(ctx, &expr); + node = src.node; + hlsl_src_remove(&src);
- node = node_from_block(&expr); if (node->type == HLSL_IR_CONSTANT) { constant = hlsl_ir_constant(node);