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
5 changes: 4 additions & 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,10 @@ 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 => {
// NOTE(eddyb) we actually use these despite not being in the standard yet.
// reserved!(SPV_KHR_shader_clock)
}
// SPV_NV_mesh_shader
Op::WritePackedPrimitiveIndices4x8NV => reserved!(SPV_NV_mesh_shader),
// SPV_NV_ray_tracing
Expand Down
50 changes: 50 additions & 0 deletions crates/spirv-std/src/arch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,53 @@ 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 with either the `Subgroup` or `Device` scope.
///
/// See:
/// <https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/KHR/SPV_KHR_shader_clock.html>
#[cfg(all(
target_feature = "Int64",
target_feature = "ShaderClockKHR",
target_feature = "ext:SPV_KHR_shader_clock"
))]
#[spirv_std_macros::gpu_only]
#[doc(alias = "OpReadClockKHR")]
pub unsafe fn read_clock_khr<const SCOPE: u32>() -> u64 {
let mut result: u64;

asm! {
"%uint = OpTypeInt 32 0",
"%scope = OpConstant %uint {scope}",
"{result} = OpReadClockKHR typeof*{result} %scope",
result = out(reg) result,
scope = const SCOPE,
};

result
}

/// Like `read_clock_khr` but returns a vector to avoid requiring the `Int64`
/// capability. It returns a 'vector of two-components of 32-bit unsigned
/// integer type with the first component containing the 32 least significant
/// bits and the second component containing the 32 most significant bits.'
#[cfg(all(
target_feature = "ShaderClockKHR",
target_feature = "ext:SPV_KHR_shader_clock"
))]
#[spirv_std_macros::gpu_only]
#[doc(alias = "OpReadClockKHR")]
pub unsafe fn read_clock_uvec2_khr<V: Vector<u32, 2>, const SCOPE: u32>() -> V {
let mut result = V::default();

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

result
}
12 changes: 11 additions & 1 deletion tests/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,13 +294,23 @@ struct TestDeps {
/// The RUSTFLAGS passed to all SPIR-V builds.
// FIXME(eddyb) expose most of these from `spirv-builder`.
fn rust_flags(codegen_backend_path: &Path) -> String {
let target_features = [
"Int8",
"Int16",
"Int64",
"Float64",
// Only needed for `ui/arch/read_clock_khr.rs`.
"ShaderClockKHR",
"ext:SPV_KHR_shader_clock",
];

[
&*format!("-Zcodegen-backend={}", codegen_backend_path.display()),
"-Coverflow-checks=off",
"-Cdebug-assertions=off",
"-Cdebuginfo=2",
"-Cembed-bitcode=no",
"-Ctarget-feature=+Int8,+Int16,+Int64,+Float64",
&format!("-Ctarget-feature=+{}", target_features.join(",+")),
"-Zsymbol-mangling-version=v0",
]
.join(" ")
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/arch/read_clock_khr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// build-pass
// compile-flags: -Ctarget-feature=+Int64,+ShaderClockKHR,+ext:SPV_KHR_shader_clock
expenses marked this conversation as resolved.
Show resolved Hide resolved

use glam::UVec2;
use spirv_std::{
arch::{read_clock_khr, read_clock_uvec2_khr},
memory::Scope,
};

#[spirv(fragment)]
pub fn main() {
let clock_time = unsafe { read_clock_khr::<{ Scope::Subgroup as u32 }>() };

let clock_time_uvec2: UVec2 =
unsafe { read_clock_uvec2_khr::<_, { Scope::Subgroup as u32 }>() };
}
2 changes: 2 additions & 0 deletions tests/ui/dis/asm_op_decorate.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ OpCapability Int16
OpCapability Int64
OpCapability Int8
OpCapability RuntimeDescriptorArray
OpCapability ShaderClockKHR
OpCapability Shader
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_shader_clock"
OpMemoryModel Logical Simple
OpEntryPoint Fragment %1 "main"
OpExecutionMode %1 OriginUpperLeft
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/dis/custom_entry_point.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ OpCapability Float64
OpCapability Int16
OpCapability Int64
OpCapability Int8
OpCapability ShaderClockKHR
OpCapability Shader
OpExtension "SPV_KHR_shader_clock"
OpMemoryModel Logical Simple
OpEntryPoint Fragment %1 "hello_world"
OpExecutionMode %1 OriginUpperLeft
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/dis/generic-fn-op-name.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ OpCapability Float64
OpCapability Int16
OpCapability Int64
OpCapability Int8
OpCapability ShaderClockKHR
OpCapability Shader
OpExtension "SPV_KHR_shader_clock"
OpMemoryModel Logical Simple
OpEntryPoint Fragment %1 "main"
OpExecutionMode %1 OriginUpperLeft
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/dis/issue-723-indirect-input.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ OpCapability Float64
OpCapability Int16
OpCapability Int64
OpCapability Int8
OpCapability ShaderClockKHR
OpCapability Shader
OpExtension "SPV_KHR_shader_clock"
OpMemoryModel Logical Simple
OpEntryPoint Fragment %1 "main" %2
OpExecutionMode %1 OriginUpperLeft
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/dis/issue-723-output.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ OpCapability Float64
OpCapability Int16
OpCapability Int64
OpCapability Int8
OpCapability ShaderClockKHR
OpCapability Shader
OpExtension "SPV_KHR_shader_clock"
OpMemoryModel Logical Simple
OpEntryPoint Fragment %1 "main" %2
OpExecutionMode %1 OriginUpperLeft
Expand Down