From 5747b73b3f53b88e7a92bf6318177f9050910d11 Mon Sep 17 00:00:00 2001 From: Erin Power Date: Wed, 31 Mar 2021 15:33:56 +0200 Subject: [PATCH] Fix issues with terminators --- crates/rustc_codegen_spirv/src/linker/new_structurizer.rs | 8 +++++++- crates/rustc_codegen_spirv/src/linker/simple_passes.rs | 8 +++++++- crates/spirv-std/src/arch/ray_tracing.rs | 4 ++-- tests/ui/arch/terminate_ray_khr.rs | 5 ++--- tests/ui/arch/trace_ray_khr.rs | 2 +- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/crates/rustc_codegen_spirv/src/linker/new_structurizer.rs b/crates/rustc_codegen_spirv/src/linker/new_structurizer.rs index d36a2b175c..6140b67ccb 100644 --- a/crates/rustc_codegen_spirv/src/linker/new_structurizer.rs +++ b/crates/rustc_codegen_spirv/src/linker/new_structurizer.rs @@ -168,7 +168,13 @@ impl Structurizer<'_> { let block_id = self.func.blocks()[block].label_id().unwrap(); let terminator = self.func.blocks()[block].instructions.last().unwrap(); let mut region = match terminator.class.opcode { - Op::Return | Op::ReturnValue | Op::Kill | Op::Unreachable => Region { + | Op::Return + | Op::ReturnValue + | Op::Kill + | Op::IgnoreIntersectionKHR + | Op::TerminateRayKHR + | Op::Unreachable + => Region { merge: block, merge_id: block_id, exits: indexmap! {}, diff --git a/crates/rustc_codegen_spirv/src/linker/simple_passes.rs b/crates/rustc_codegen_spirv/src/linker/simple_passes.rs index 70eed5d48a..e510fda7e9 100644 --- a/crates/rustc_codegen_spirv/src/linker/simple_passes.rs +++ b/crates/rustc_codegen_spirv/src/linker/simple_passes.rs @@ -98,7 +98,13 @@ pub fn outgoing_edges(block: &Block) -> Vec { .map(|op| op.unwrap_id_ref()), ) .collect(), - Op::Return | Op::ReturnValue | Op::Kill | Op::Unreachable => Vec::new(), + | Op::Return + | Op::ReturnValue + | Op::Kill + | Op::Unreachable + | Op::IgnoreIntersectionKHR + | Op::TerminateRayKHR + => Vec::new(), _ => panic!("Invalid block terminator: {:?}", terminator), } } diff --git a/crates/spirv-std/src/arch/ray_tracing.rs b/crates/spirv-std/src/arch/ray_tracing.rs index ef188e2bf3..5801a202b9 100644 --- a/crates/spirv-std/src/arch/ray_tracing.rs +++ b/crates/spirv-std/src/arch/ray_tracing.rs @@ -134,7 +134,7 @@ pub unsafe fn report_intersection_khr(hit: f32, hit_kind: u32) -> bool { #[doc(alias = "OpIgnoreIntersectionKHR")] #[inline] pub unsafe fn ignore_intersection_khr() { - asm!("OpIgnoreIntersectionKHR"); + asm!("OpIgnoreIntersectionKHR", "%unused = OpLabel") } /// Terminates the invocation that executes it, stops the ray traversal, accepts @@ -145,7 +145,7 @@ pub unsafe fn ignore_intersection_khr() { #[doc(alias = "OpTerminateRayKHR")] #[inline] pub unsafe fn terminate_ray_khr() { - asm!("OpTerminateRayKHR"); + asm!("OpTerminateRayKHR", "%unused = OpLabel") } /// Invoke a callable shader. diff --git a/tests/ui/arch/terminate_ray_khr.rs b/tests/ui/arch/terminate_ray_khr.rs index b6a174c879..9041e720a6 100644 --- a/tests/ui/arch/terminate_ray_khr.rs +++ b/tests/ui/arch/terminate_ray_khr.rs @@ -1,12 +1,11 @@ // build-pass -use spirv_std as _; - #[spirv(any_hit_khr)] pub fn main() { unsafe { asm!(r#"OpExtension "SPV_KHR_ray_tracing""#); - asm!("OpCapability RayTracingKHR", "OpTerminateRayKHR"); + asm!("OpCapability RayTracingKHR"); + spirv_std::arch::terminate_ray_khr(); } } diff --git a/tests/ui/arch/trace_ray_khr.rs b/tests/ui/arch/trace_ray_khr.rs index 4f34ef99b3..67a9c04ecd 100644 --- a/tests/ui/arch/trace_ray_khr.rs +++ b/tests/ui/arch/trace_ray_khr.rs @@ -2,7 +2,7 @@ #[spirv(ray_generation_khr)] pub fn main( - acceleration_structure: &spirv_std::ray_tracing::AccelerationStructureKhr, + #[spirv(uniform_constant, descriptor_set = 0, binding = 0)] acceleration_structure: &spirv_std::ray_tracing::AccelerationStructureKhr, #[spirv(ray_payload_khr)] payload: &mut glam::Vec3, ) { unsafe {