Module: vkd3d Branch: master Commit: 9aff65c6d2df86e7f8eb5986421095c70b36102b URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/9aff65c6d2df86e7f8eb5986421095...
Author: Giovanni Mascellani gmascellani@codeweavers.com Date: Wed Mar 20 16:58:25 2024 +0100
vkd3d-shader/ir: Open a loop when visiting the loop header.
Not when making the loop header available, which is too early and might lead to open too many loops at once.
---
libs/vkd3d-shader/ir.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 15fe6ca9..b04e85df 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -3629,27 +3629,11 @@ struct vsir_cfg_node_sorter
static enum vkd3d_result vsir_cfg_node_sorter_make_node_available(struct vsir_cfg_node_sorter *sorter, struct vsir_block *block) { - struct vsir_block_list *loop = NULL; - struct vsir_cfg_node_sorter_stack_item *item; enum vkd3d_result ret;
- if (sorter->cfg->loops_by_header[block->label - 1] != SIZE_MAX) - loop = &sorter->cfg->loops[sorter->cfg->loops_by_header[block->label - 1]]; - if ((ret = vsir_block_list_add_checked(&sorter->available_blocks, block)) < 0) return ret;
- if (!loop) - return VKD3D_OK; - - if (!vkd3d_array_reserve((void **)&sorter->stack, &sorter->stack_capacity, sorter->stack_count + 1, sizeof(*sorter->stack))) - return VKD3D_ERROR_OUT_OF_MEMORY; - - item = &sorter->stack[sorter->stack_count++]; - item->loop = loop; - item->seen_count = 0; - item->begin = sorter->cfg->order.count; - return VKD3D_OK; }
@@ -3754,6 +3738,24 @@ static enum vkd3d_result vsir_cfg_sort_nodes(struct vsir_cfg *cfg) break; }
+ /* If the node is a loop header, open the loop. */ + if (sorter.cfg->loops_by_header[block->label - 1] != SIZE_MAX) + { + struct vsir_block_list *loop = &sorter.cfg->loops[sorter.cfg->loops_by_header[block->label - 1]]; + + if (loop) + { + if (!vkd3d_array_reserve((void **)&sorter.stack, &sorter.stack_capacity, + sorter.stack_count + 1, sizeof(*sorter.stack))) + return VKD3D_ERROR_OUT_OF_MEMORY; + + inner_stack_item = &sorter.stack[sorter.stack_count++]; + inner_stack_item->loop = loop; + inner_stack_item->seen_count = 0; + inner_stack_item->begin = sorter.cfg->order.count; + } + } + vsir_block_list_remove_index(&sorter.available_blocks, i); block->order_pos = cfg->order.count; if ((ret = vsir_block_list_add_checked(&cfg->order, block)) < 0)