[PATCH vkd3d 8/9] vkd3d-shader: Do not insert branch to loop header if outside of block.

Conor McCarthy cmccarthy at codeweavers.com
Tue Sep 28 00:38:17 CDT 2021


Fixes invalid SPIR-V in case there is an unconditional break right
before the loop ends.

From: Philip Rebohle <philip.rebohle at tu-dortmund.de>
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d-shader/spirv.c | 4 +++-
 tests/d3d12.c             | 6 ------
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 9499159c..7d479184 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -7615,6 +7615,7 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
             cf_info->u.loop.continue_block_id = continue_block_id;
             cf_info->u.loop.merge_block_id = merge_block_id;
             cf_info->current_block = VKD3D_BLOCK_LOOP;
+            cf_info->inside_block = true;
 
             vkd3d_spirv_build_op_name(builder, loop_header_block_id, "loop%u_header", compiler->loop_id);
             vkd3d_spirv_build_op_name(builder, loop_body_block_id, "loop%u_body", compiler->loop_id);
@@ -7627,7 +7628,8 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
             assert(compiler->control_flow_depth);
             assert(cf_info->current_block == VKD3D_BLOCK_LOOP);
 
-            vkd3d_spirv_build_op_branch(builder, cf_info->u.loop.continue_block_id);
+            if (cf_info->inside_block)
+                vkd3d_spirv_build_op_branch(builder, cf_info->u.loop.continue_block_id);
 
             vkd3d_spirv_build_op_label(builder, cf_info->u.loop.continue_block_id);
             vkd3d_spirv_build_op_branch(builder, cf_info->u.loop.header_block_id);
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 20eeac9d..8dbced41 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -10391,12 +10391,6 @@ static void test_shader_instructions(void)
             continue;
         }
 
-        if (tests[i].ps == &ps_loop_end_break && !vkd3d_test_platform_is_windows())
-        {
-            skip("Skipping shader '%s' test (would generate invalid SPIR-V).\n", tests[i].ps->name);
-            continue;
-        }
-
         if (current_ps != tests[i].ps)
         {
             if (context.pipeline_state)
-- 
2.32.0




More information about the wine-devel mailing list