Skip to content

Commit 384b62d

Browse files
committed
const generics: impl const generic intrinsics with generic_const_exprs feature, failing
1 parent 9456109 commit 384b62d

4 files changed

Lines changed: 279 additions & 0 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
mod atomics;
2+
mod barrier;
3+
4+
// name overwritten functions explicitly to overrule glob import of the rest
5+
pub use atomics::{
6+
atomic_compare_exchange, atomic_exchange, atomic_f_add, atomic_f_max, atomic_f_min,
7+
atomic_i_add, atomic_i_decrement, atomic_i_increment, atomic_i_sub, atomic_load, atomic_s_max,
8+
atomic_s_min, atomic_store, atomic_u_max, atomic_u_min,
9+
};
10+
pub use barrier::{control_barrier, memory_barrier};
11+
pub use spirv_std::arch::*;
12+
13+
use crate::glam::UVec2;
14+
use spirv_std::memory::Scope;
15+
16+
/// See [`spirv_std::arch::read_clock_khr`]
17+
#[spirv_std_macros::gpu_only]
18+
#[doc(alias = "OpReadClockKHR")]
19+
pub fn read_clock_khr<const SCOPE: Scope>() -> u64 {
20+
spirv_std::arch::read_clock_khr::<{ SCOPE as u32 }>()
21+
}
22+
23+
/// See [`spirv_std::arch::read_clock_uvec2_khr`]
24+
#[spirv_std_macros::gpu_only]
25+
#[doc(alias = "OpReadClockKHR")]
26+
pub fn read_clock_uvec2_khr<const SCOPE: Scope>() -> UVec2 {
27+
spirv_std::arch::read_clock_uvec2_khr::<{ SCOPE as u32 }>()
28+
}
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
use crate::memory::{Scope, Semantics};
2+
use crate::{Float, Integer, Number, SignedInteger, UnsignedInteger};
3+
4+
/// See [`spirv_std::arch::atomic_load`]
5+
#[spirv_std_macros::gpu_only]
6+
#[doc(alias = "OpAtomicLoad")]
7+
#[inline]
8+
pub unsafe fn atomic_load<N: Number, const SCOPE: Scope, const SEMANTICS: Semantics>(ptr: &N) -> N {
9+
const { SEMANTICS.assert_valid() }
10+
spirv_std::arch::atomic_load::<N, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr)
11+
}
12+
13+
/// See [`spirv_std::arch::atomic_store`]
14+
#[spirv_std_macros::gpu_only]
15+
#[doc(alias = "OpAtomicStore")]
16+
#[inline]
17+
pub unsafe fn atomic_store<N: Number, const SCOPE: Scope, const SEMANTICS: Semantics>(
18+
ptr: &mut N,
19+
value: N,
20+
) {
21+
const { SEMANTICS.assert_valid() }
22+
spirv_std::arch::atomic_store::<N, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
23+
}
24+
25+
/// See [`spirv_std::arch::atomic_exchange`]
26+
#[spirv_std_macros::gpu_only]
27+
#[doc(alias = "OpAtomicExchange")]
28+
#[inline]
29+
pub unsafe fn atomic_exchange<N: Number, const SCOPE: Scope, const SEMANTICS: Semantics>(
30+
ptr: &mut N,
31+
value: N,
32+
) -> N {
33+
const { SEMANTICS.assert_valid() }
34+
spirv_std::arch::atomic_exchange::<N, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
35+
}
36+
37+
/// See [`spirv_std::arch::atomic_compare_exchange`]
38+
#[spirv_std_macros::gpu_only]
39+
#[doc(alias = "OpAtomicCompareExchange")]
40+
#[inline]
41+
pub unsafe fn atomic_compare_exchange<
42+
I: Integer,
43+
const SCOPE: Scope,
44+
const EQUAL: Semantics,
45+
const UNEQUAL: Semantics,
46+
>(
47+
ptr: &mut I,
48+
value: I,
49+
comparator: I,
50+
) -> I {
51+
const {
52+
EQUAL.assert_valid();
53+
UNEQUAL.assert_valid();
54+
}
55+
spirv_std::arch::atomic_compare_exchange::<
56+
I,
57+
{ SCOPE as u32 },
58+
{ EQUAL as u32 },
59+
{ UNEQUAL as u32 },
60+
>(ptr, value, comparator)
61+
}
62+
63+
/// See [`spirv_std::arch::atomic_i_increment`]
64+
#[spirv_std_macros::gpu_only]
65+
#[doc(alias = "OpAtomicIIncrement")]
66+
#[inline]
67+
pub unsafe fn atomic_i_increment<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
68+
ptr: &mut I,
69+
) -> I {
70+
const { SEMANTICS.assert_valid() }
71+
spirv_std::arch::atomic_i_increment::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr)
72+
}
73+
74+
/// See [`spirv_std::arch::atomic_i_decrement`]
75+
#[spirv_std_macros::gpu_only]
76+
#[doc(alias = "OpAtomicIDecrement")]
77+
#[inline]
78+
pub unsafe fn atomic_i_decrement<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
79+
ptr: &mut I,
80+
) -> I {
81+
const { SEMANTICS.assert_valid() }
82+
spirv_std::arch::atomic_i_decrement::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr)
83+
}
84+
85+
/// See [`spirv_std::arch::atomic_i_add`]
86+
#[spirv_std_macros::gpu_only]
87+
#[doc(alias = "OpAtomicIAdd")]
88+
#[inline]
89+
pub unsafe fn atomic_i_add<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
90+
ptr: &mut I,
91+
value: I,
92+
) -> I {
93+
const { SEMANTICS.assert_valid() }
94+
spirv_std::arch::atomic_i_add::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
95+
}
96+
97+
/// See [`spirv_std::arch::atomic_i_sub`]
98+
#[spirv_std_macros::gpu_only]
99+
#[doc(alias = "OpAtomicISub")]
100+
#[inline]
101+
pub unsafe fn atomic_i_sub<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
102+
ptr: &mut I,
103+
value: I,
104+
) -> I {
105+
const { SEMANTICS.assert_valid() }
106+
spirv_std::arch::atomic_i_sub::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
107+
}
108+
109+
/// See [`spirv_std::arch::atomic_s_min`]
110+
#[spirv_std_macros::gpu_only]
111+
#[doc(alias = "OpAtomicSMin")]
112+
#[inline]
113+
pub unsafe fn atomic_s_min<S: SignedInteger, const SCOPE: Scope, const SEMANTICS: Semantics>(
114+
ptr: &mut S,
115+
value: S,
116+
) -> S {
117+
const { SEMANTICS.assert_valid() }
118+
spirv_std::arch::atomic_s_min::<S, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
119+
}
120+
121+
/// See [`spirv_std::arch::atomic_u_min`]
122+
#[spirv_std_macros::gpu_only]
123+
#[doc(alias = "OpAtomicUMin")]
124+
#[inline]
125+
pub unsafe fn atomic_u_min<U: UnsignedInteger, const SCOPE: Scope, const SEMANTICS: Semantics>(
126+
ptr: &mut U,
127+
value: U,
128+
) -> U {
129+
const { SEMANTICS.assert_valid() }
130+
spirv_std::arch::atomic_u_min::<U, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
131+
}
132+
133+
/// See [`spirv_std::arch::atomic_s_max`]
134+
#[spirv_std_macros::gpu_only]
135+
#[doc(alias = "OpAtomicSMax")]
136+
#[inline]
137+
pub unsafe fn atomic_s_max<S: SignedInteger, const SCOPE: Scope, const SEMANTICS: Semantics>(
138+
ptr: &mut S,
139+
value: S,
140+
) -> S {
141+
const { SEMANTICS.assert_valid() }
142+
spirv_std::arch::atomic_s_max::<S, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
143+
}
144+
145+
/// See [`spirv_std::arch::atomic_u_max`]
146+
#[spirv_std_macros::gpu_only]
147+
#[doc(alias = "OpAtomicUMax")]
148+
#[inline]
149+
pub unsafe fn atomic_u_max<U: UnsignedInteger, const SCOPE: Scope, const SEMANTICS: Semantics>(
150+
ptr: &mut U,
151+
value: U,
152+
) -> U {
153+
const { SEMANTICS.assert_valid() }
154+
spirv_std::arch::atomic_u_max::<U, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
155+
}
156+
157+
/// See [`spirv_std::arch::atomic_and`]
158+
#[spirv_std_macros::gpu_only]
159+
#[doc(alias = "OpAtomicAnd")]
160+
#[inline]
161+
pub unsafe fn atomic_and<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
162+
ptr: &mut I,
163+
value: I,
164+
) -> I {
165+
const { SEMANTICS.assert_valid() }
166+
spirv_std::arch::atomic_and::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
167+
}
168+
169+
/// See [`spirv_std::arch::atomic_or`]
170+
#[spirv_std_macros::gpu_only]
171+
#[doc(alias = "OpAtomicOr")]
172+
#[inline]
173+
pub unsafe fn atomic_or<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
174+
ptr: &mut I,
175+
value: I,
176+
) -> I {
177+
const { SEMANTICS.assert_valid() }
178+
spirv_std::arch::atomic_or::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
179+
}
180+
181+
/// See [`spirv_std::arch::atomic_xor`]
182+
#[spirv_std_macros::gpu_only]
183+
#[doc(alias = "OpAtomicXor")]
184+
#[inline]
185+
pub unsafe fn atomic_xor<I: Integer, const SCOPE: Scope, const SEMANTICS: Semantics>(
186+
ptr: &mut I,
187+
value: I,
188+
) -> I {
189+
const { SEMANTICS.assert_valid() }
190+
spirv_std::arch::atomic_xor::<I, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
191+
}
192+
193+
/// See [`spirv_std::arch::atomic_f_min`]
194+
#[spirv_std_macros::gpu_only]
195+
#[doc(alias = "OpAtomicFMinEXT")]
196+
#[inline]
197+
pub unsafe fn atomic_f_min<F: Float, const SCOPE: Scope, const SEMANTICS: Semantics>(
198+
ptr: &mut F,
199+
value: F,
200+
) -> F {
201+
const { SEMANTICS.assert_valid() }
202+
spirv_std::arch::atomic_f_min::<F, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
203+
}
204+
205+
/// See [`spirv_std::arch::atomic_f_max`]
206+
#[spirv_std_macros::gpu_only]
207+
#[doc(alias = "OpAtomicFMaxEXT")]
208+
#[inline]
209+
pub unsafe fn atomic_f_max<F: Float, const SCOPE: Scope, const SEMANTICS: Semantics>(
210+
ptr: &mut F,
211+
value: F,
212+
) -> F {
213+
const { SEMANTICS.assert_valid() }
214+
spirv_std::arch::atomic_f_max::<F, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
215+
}
216+
217+
/// See [`spirv_std::arch::atomic_f_add`]
218+
#[spirv_std_macros::gpu_only]
219+
#[doc(alias = "OpAtomicFAddEXT")]
220+
#[inline]
221+
pub unsafe fn atomic_f_add<F: Float, const SCOPE: Scope, const SEMANTICS: Semantics>(
222+
ptr: &mut F,
223+
value: F,
224+
) -> F {
225+
const { SEMANTICS.assert_valid() }
226+
spirv_std::arch::atomic_f_add::<F, { SCOPE as u32 }, { SEMANTICS.bits() }>(ptr, value)
227+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use spirv_std::memory::{Scope, Semantics};
2+
3+
/// See [`spirv_std::arch::control_barrier`]
4+
#[spirv_std_macros::gpu_only]
5+
#[doc(alias = "OpControlBarrier")]
6+
#[inline]
7+
pub fn control_barrier<const EXECUTION: Scope, const MEMORY: Scope, const SEMANTICS: Semantics>() {
8+
const { SEMANTICS.assert_valid() }
9+
spirv_std::arch::control_barrier::<{ EXECUTION as u32 }, { MEMORY as u32 }, { SEMANTICS.bits() }>(
10+
)
11+
}
12+
13+
/// See [`spirv_std::arch::memory_barrier`]
14+
#[spirv_std_macros::gpu_only]
15+
#[doc(alias = "OpMemoryBarrier")]
16+
#[inline]
17+
pub fn memory_barrier<const MEMORY: Scope, const SEMANTICS: Semantics>() {
18+
const { SEMANTICS.assert_valid() }
19+
spirv_std::arch::memory_barrier::<{ MEMORY as u32 }, { SEMANTICS.bits() }>()
20+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
#![no_std]
2+
#![feature(adt_const_params)]
3+
#![feature(generic_const_exprs)]
4+
5+
pub mod arch;
26
pub use spirv_std::*;

0 commit comments

Comments
 (0)