use crate::dsl::{
ir::{Scope, Synchronization},
unexpanded,
};
pub fn workgroup_uniform_load<E: crate::dsl::frontend::RudaPrimitive>(_value: &E) -> E {
unexpanded!()
}
pub mod workgroup_uniform_load {
use super::*;
use crate::dsl::frontend::{NativeExpand, RudaPrimitive};
use ruda_core::ir::{Instruction, PointerOp};
pub fn expand<E: RudaPrimitive>(scope: &mut Scope, value: NativeExpand<E>) -> NativeExpand<E> {
let pointer = scope.reference_pointer(*value.expand).expect("uniform load requires an address-preserving reference");
let out = scope.create_local(pointer.ty.pointer_type().expect("reference pointer").pointee());
let operation = PointerOp::UniformLoad { pointer };
operation.validate(Some(*out)).expect("uniform load requires a matching shared-memory pointee");
scope.register(Instruction::new(operation, *out));
out.into()
}
}
pub fn workgroup_uniform_load_atomic<E: crate::dsl::frontend::RudaPrimitive<Scalar: crate::dsl::frontend::Numeric>>(
_value: &crate::dsl::frontend::Atomic<E>,
) -> E {
unexpanded!()
}
pub mod workgroup_uniform_load_atomic {
use super::*;
use crate::dsl::frontend::{Atomic, NativeExpand, Numeric, RudaPrimitive};
use ruda_core::ir::{Instruction, PointerOp};
pub fn expand<E: RudaPrimitive<Scalar: Numeric>>(
scope: &mut Scope, value: NativeExpand<Atomic<E>>,
) -> NativeExpand<E> {
let pointer = scope.reference_pointer(*value.expand).expect("uniform atomic load requires an address-preserving reference");
let pointee = pointer.ty.pointer_type().expect("reference pointer").pointee();
let out = scope.create_local(ruda_core::ir::Type::scalar(pointee.elem_type()).with_vector_size(pointee.vector_size()));
let operation = PointerOp::UniformLoad { pointer };
operation.validate(Some(*out)).expect("uniform atomic load requires a matching shared-memory atomic pointee");
scope.register(Instruction::new(operation, *out));
out.into()
}
}
pub fn sync_ruda() {}
pub mod sync_ruda {
use super::*;
pub fn expand(scope: &mut Scope) {
scope.register(Synchronization::SyncRuda)
}
}
pub fn sync_plane() {
unexpanded!()
}
pub mod sync_plane {
use super::*;
pub fn expand(scope: &mut Scope) {
scope.register(Synchronization::SyncPlane);
}
}
pub fn sync_storage() {}
pub mod sync_storage {
use super::*;
pub fn expand(scope: &mut Scope) {
scope.register(Synchronization::SyncStorage)
}
}
pub fn sync_async_proxy_shared() {
unexpanded!()
}
pub mod sync_async_proxy_shared {
use super::*;
pub fn expand(scope: &mut Scope) {
scope.register(Synchronization::SyncAsyncProxyShared)
}
}