Skip to content

[Migrated] Closure capture acceleration structure fails spirv-val #110

@rust-gpu-bot

Description

@rust-gpu-bot

Issue automatically imported from old repo: EmbarkStudios/rust-gpu#873
Old labels: t: bug,s: qptr may fix
Originally creatd by molikto on 2022-05-16T06:30:35Z


Expected Behaviour

spriv-val should not fail. Looks it's because the bug mentioned here EmbarkStudios/rust-gpu#690 (review) . I will try to make a PR to fix it

Example & Steps To Reproduce

This shader fails with spirv-val error

But either:

  1. move out of the closure
  2. remove the rayquery

Make it compile successfully.

// build-pass
// compile-flags: -Ctarget-feature=+RayTracingKHR,+RayQueryKHR,+ext:SPV_KHR_ray_tracing,+ext:SPV_KHR_ray_query

#[cfg(not(target_arch = "spirv"))]
use spirv_std::macros::spirv;
use spirv_std::ray_tracing::{AccelerationStructure, RayFlags, RayQuery};
use spirv_std::{glam::Vec3, ray_query};
use spirv_std::macros::spirv;
use spirv_std::ray_tracing::{AccelerationStructure, CommittedIntersection, RayFlags, RayQuery};
use spirv_std::{glam::Vec3, ray_query};

pub fn some_fun(mut c: impl FnMut() -> bool) {
    let mut i = 0;
    while i < 10 {
        if c() {
            return;
        }
        i += 1;
    }
}
#[spirv(intersection)]
pub fn voxels_gbuffer_is(
    #[spirv(storage_buffer, descriptor_set = 1, binding = 1)] vertices: &[u32],
    #[spirv(descriptor_set = 1, binding = 3)] acceleration_structure: &AccelerationStructure,
) {
    some_fun(|| {
        unsafe {
            ray_query!(let mut handle);
            handle.initialize(
                acceleration_structure,
                RayFlags::TERMINATE_ON_FIRST_HIT,
                0xFF,
                Vec3::new(0.0, 0.0, 0.0),
                0.0,
                Vec3::new(0.0, 0.0, 0.0),
                10000.0,
            );
            unsafe {
                // Indices of the triangle
                let ind = vertices.index_unchecked(0);
            };
            true
        }
    });
}

System Info

  • Rust: rustc 1.62.0-nightly (1f7fb6413 2022-04-10)
  • OS: Windows 10 Version 10.0.19044 Build 19044
  • GPU: RTX 3070 Ti
  • SPIR-V: SPIRV-Tools v2022.2-dev v2022.1-6-g45dd184c

Backtrace

Backtrace

error: error:0:0 - OpLoad Pointer <id> '58[%58]' is not a logical pointer.
         %61 = OpLoad %20 %58
  |
  = note: spirv-val failed

spirv:

; SPIR-V
; Version: 1.3
; Generator: Embark Studios Rust GPU Compiler Backend; 0
; Bound: 76
; Schema: 0
               OpCapability Int16
               OpCapability Int64
               OpCapability Int8
               OpCapability RayQueryKHR
               OpCapability RayTracingKHR
               OpCapability Shader
               OpExtension "SPV_EXT_descriptor_indexing"
               OpExtension "SPV_KHR_ray_query"
               OpExtension "SPV_KHR_ray_tracing"
               OpMemoryModel Logical Simple
               OpEntryPoint IntersectionNV %1 "main"
          %2 = OpString "C:\\Users\\molikto\\.cargo\\git\\checkouts\\rust-gpu-c5ec26e609830c67\\8609aab\\crates\\spirv-std\\src\\arch.rs"
          %3 = OpString "crates\\mocraft-client\\shader\\src\\lib.rs"
          %4 = OpString "C:\\Users\\molikto\\.cargo\\git\\checkouts\\rust-gpu-c5ec26e609830c67\\8609aab\\crates\\spirv-std\\src\\ray_tracing.rs"
          %5 = OpString "C:\\Users\\molikto\\.cargo\\git\\checkouts\\glam-rs-ce970401f3f26dcb\\ef12fa7\\src\\vec3.rs"
          %6 = OpString "C:\\Users\\molikto\\.cargo\\registry\\src\\github.com-1ecc6299db9ec823\\bitflags-1.3.2\\src\\lib.rs"
          %7 = OpString "C:\\Users\\molikto\\.cargo\\git\\checkouts\\glam-rs-ce970401f3f26dcb\\ef12fa7\\src\\core\\scalar\\vector.rs"
               OpName %__u32_ "&[u32]"
               OpMemberName %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ 0 "0"
               OpMemberName %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ 1 "1"
               OpMemberName %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ 2 "2"
               OpName %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ "[closure@crates\\mocraft-client\\shader\\src\\lib.rs:30:14: 47:6]"
               OpName %vertices "vertices"
               OpName %acceleration_structure "acceleration_structure"
               OpDecorate %_runtimearr_uint ArrayStride 4
               OpMemberDecorate %__u32_ 0 Offset 0
               OpMemberDecorate %__u32_ 1 Offset 4
               OpMemberDecorate %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ 0 Offset 0
               OpMemberDecorate %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ 1 Offset 4
               OpMemberDecorate %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ 2 Offset 8
               OpDecorate %_struct_13 Block
               OpMemberDecorate %_struct_13 0 Offset 0
               OpDecorate %vertices DescriptorSet 1
               OpDecorate %vertices Binding 1
               OpDecorate %acceleration_structure DescriptorSet 1
               OpDecorate %acceleration_structure Binding 3
       %uint = OpTypeInt 32 0
%_runtimearr_uint = OpTypeRuntimeArray %uint
%_ptr_StorageBuffer__runtimearr_uint = OpTypePointer StorageBuffer %_runtimearr_uint
     %__u32_ = OpTypeStruct %_ptr_StorageBuffer__runtimearr_uint %uint
     %uint_0 = OpConstant %uint 0
       %void = OpTypeVoid
         %18 = OpTypeRayQueryKHR
%_ptr_Function_18 = OpTypePointer Function %18
         %20 = OpTypeAccelerationStructureKHR
%_ptr_UniformConstant_20 = OpTypePointer UniformConstant %20
      %float = OpTypeFloat 32
    %v3float = OpTypeVector %float 3
%_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ = OpTypeStruct %_ptr_Function_18 %_ptr_UniformConstant_20 %__u32_
         %24 = OpTypeFunction %void
 %_struct_13 = OpTypeStruct %_runtimearr_uint
%_ptr_StorageBuffer__struct_13 = OpTypePointer StorageBuffer %_struct_13
   %vertices = OpVariable %_ptr_StorageBuffer__struct_13 StorageBuffer
%acceleration_structure = OpVariable %_ptr_UniformConstant_20 UniformConstant
       %bool = OpTypeBool
        %int = OpTypeInt 32 1
      %int_0 = OpConstant %int 0
     %int_10 = OpConstant %int 10
      %int_1 = OpConstant %int 1
    %float_0 = OpConstant %float 0
     %uint_4 = OpConstant %uint 4
   %uint_255 = OpConstant %uint 255
%float_10000 = OpConstant %float 10000
       %true = OpConstantTrue %bool
      %false = OpConstantFalse %bool
         %37 = OpUndef %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_
          %1 = OpFunction %void None %24
         %38 = OpLabel
         %39 = OpVariable %_ptr_Function_18 Function
               OpLine %3 26 4
         %40 = OpAccessChain %_ptr_StorageBuffer__runtimearr_uint %vertices %uint_0
         %41 = OpArrayLength %uint %vertices 0
               OpLine %3 30 13
         %42 = OpCompositeInsert %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ %39 %37 0
               OpLine %3 30 13
         %43 = OpCompositeInsert %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ %acceleration_structure %42 1
               OpLine %3 30 13
         %44 = OpCompositeInsert %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ %40 %43 2 0
         %45 = OpCompositeInsert %_closure_crates_mocraft_client_shader_src_lib_rs_30_14__47_6_ %41 %44 2 1
               OpLine %3 17 4
               OpBranch %46
         %46 = OpLabel
               OpBranch %47
         %47 = OpLabel
         %48 = OpPhi %int %int_0 %46 %49 %50
         %51 = OpPhi %bool %true %46 %52 %50
               OpLoopMerge %53 %50 None
               OpBranchConditional %51 %54 %53
         %54 = OpLabel
               OpLine %3 17 10
         %55 = OpSLessThan %bool %48 %int_10
               OpLine %3 17 10
               OpSelectionMerge %56 None
               OpBranchConditional %55 %57 %58
         %57 = OpLabel
               OpLine %3 32 12
         %59 = OpCompositeExtract %_ptr_Function_18 %45 0
               OpLine %3 33 16
         %60 = OpCompositeExtract %_ptr_UniformConstant_20 %45 1
               OpLine %7 745 8
         %61 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
               OpLine %7 745 8
         %62 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
               OpLine %4 246 8
         %63 = OpLoad %20 %60
               OpRayQueryInitializeKHR %59 %63 %uint_4 %uint_255 %61 %float_0 %62 %float_10000
               OpLine %3 18 11
               OpSelectionMerge %64 None
               OpBranchConditional %true %65 %66
         %65 = OpLabel
               OpLine %3 23 0
               OpBranch %64
         %66 = OpLabel
               OpLine %3 21 8
         %67 = OpIAdd %int %48 %int_1
               OpLine %3 17 4
               OpBranch %64
         %64 = OpLabel
         %68 = OpPhi %int %48 %65 %67 %66
         %69 = OpPhi %bool %true %65 %false %66
         %70 = OpPhi %bool %false %65 %true %66
               OpBranch %56
         %58 = OpLabel
               OpLine %3 23 0
               OpBranch %56
         %56 = OpLabel
         %49 = OpPhi %int %68 %64 %48 %58
         %71 = OpPhi %bool %69 %64 %true %58
         %72 = OpPhi %bool %70 %64 %false %58
               OpSelectionMerge %73 None
               OpBranchConditional %71 %74 %75
         %74 = OpLabel
               OpLine %3 48 1
               OpReturn
         %75 = OpLabel
               OpBranch %73
         %73 = OpLabel
         %52 = OpPhi %bool %72 %75
               OpBranch %50
         %50 = OpLabel
               OpBranch %47
         %53 = OpLabel
               OpUnreachable
               OpFunctionEnd

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions