Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an read_clock_khr function that calls OpReadClockKHR #757

Merged
merged 10 commits into from
Oct 8, 2021
2 changes: 1 addition & 1 deletion crates/rustc_codegen_spirv/src/spirv_type_constraints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,7 @@ pub fn instruction_signatures(op: Op) -> Option<&'static [InstSig<'static>]> {
// SPV_AMD_shader_fragment_mask
Op::FragmentMaskFetchAMD | Op::FragmentFetchAMD => reserved!(SPV_AMD_shader_fragment_mask),
// SPV_KHR_shader_clock
Op::ReadClockKHR => reserved!(SPV_KHR_shader_clock),
Op::ReadClockKHR => {}
expenses marked this conversation as resolved.
Show resolved Hide resolved
// SPV_NV_mesh_shader
Op::WritePackedPrimitiveIndices4x8NV => reserved!(SPV_NV_mesh_shader),
// SPV_NV_ray_tracing
Expand Down
22 changes: 22 additions & 0 deletions crates/spirv-std/src/arch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,25 @@ pub unsafe fn vector_insert_dynamic<T: Scalar, V: Vector<T, N>, const N: usize>(
pub fn kill() -> ! {
unsafe { asm!("OpKill", options(noreturn)) }
}

/// Read from the shader clock.
///
/// Requires the `SPV_KHR_shader_clock` extension and the `ShaderClockKHR` capability.
///
/// See:
/// <https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/KHR/SPV_KHR_shader_clock.html>
#[spirv_std_macros::gpu_only]
#[doc(alias = "OpReadClockKHR")]
pub unsafe fn read_clock_khr() -> u64 {
expenses marked this conversation as resolved.
Show resolved Hide resolved
let mut result: u64 = 0;

asm! {
"%uint = OpTypeInt 32 0",
"%uint_3 = OpConstant %uint 3",
expenses marked this conversation as resolved.
Show resolved Hide resolved
"%result = OpReadClockKHR typeof*{result} %uint_3",
"OpStore {result} %result",
result = in(reg) &mut result,
expenses marked this conversation as resolved.
Show resolved Hide resolved
};

result
}