use super::Result;
#[allow(unused_imports)]
use cl3::d3d10;
#[allow(unused_imports)]
use cl3::d3d11;
use cl3::device;
#[allow(unused_imports)]
use cl3::dx9_media_sharing;
#[allow(unused_imports)]
use cl3::ext;
#[allow(unused_imports)]
use cl3::ffi::cl_d3d10::{cl_d3d10_device_set_khr, cl_d3d10_device_source_khr};
#[allow(unused_imports)]
use cl3::ffi::cl_d3d11::{cl_d3d11_device_set_khr, cl_d3d11_device_source_khr};
#[allow(unused_imports)]
use cl3::ffi::cl_dx9_media_sharing::{
cl_dx9_device_set_intel, cl_dx9_device_source_intel, cl_dx9_media_adapter_set_khr,
cl_dx9_media_adapter_type_khr,
};
use cl3::platform;
use cl3::program;
#[allow(unused_imports)]
use cl3::types::{
cl_device_id, cl_device_type, cl_name_version, cl_platform_id, cl_uint, cl_ulong, cl_version,
};
#[allow(unused_imports)]
use libc::{c_void, intptr_t};
#[derive(Copy, Clone, Debug)]
pub struct Platform {
id: intptr_t,
}
unsafe impl Send for Platform {}
unsafe impl Sync for Platform {}
impl Platform {
pub fn new(id: cl_platform_id) -> Platform {
Platform { id: id as intptr_t }
}
pub fn id(&self) -> cl_platform_id {
self.id as cl_platform_id
}
pub fn get_devices(&self, device_type: cl_device_type) -> Result<Vec<cl_device_id>> {
Ok(device::get_device_ids(self.id(), device_type)?)
}
#[cfg(feature = "cl_khr_dx9_media_sharing")]
pub fn get_devices_from_dx9_media_adapter_khr(
&self,
media_adapter_type: &[cl_dx9_media_adapter_type_khr],
media_adapters: &[c_void],
media_adapter_set: cl_dx9_media_adapter_set_khr,
) -> Result<Vec<cl_device_id>> {
Ok(
dx9_media_sharing::get_device_ids_from_dx9_media_adapter_khr(
self.id(),
media_adapters.len() as cl_uint,
media_adapter_type.as_ptr() as *mut cl_dx9_media_adapter_type_khr,
media_adapters.as_ptr() as *mut c_void,
media_adapter_set,
)?,
)
}
#[cfg(feature = "cl_khr_dx9_media_sharing")]
pub fn get_device_ids_from_dx9_intel(
&self,
dx9_device_source: cl_dx9_device_source_intel,
dx9_object: *mut c_void,
dx9_device_set: cl_dx9_device_set_intel,
) -> Result<Vec<cl_device_id>> {
Ok(dx9_media_sharing::get_device_ids_from_dx9_intel(
self.id(),
dx9_device_source,
dx9_object,
dx9_device_set,
)?)
}
#[cfg(feature = "cl_khr_d3d10_sharing")]
pub fn get_devices_from_dx3d10_khr(
&self,
d3d_device_source: cl_d3d10_device_source_khr,
d3d_object: *mut c_void,
d3d_device_set: cl_d3d10_device_set_khr,
) -> Result<Vec<cl_device_id>> {
Ok(d3d10::get_device_ids_from_dx3d10_khr(
self.id(),
d3d_device_source,
d3d_object,
d3d_device_set,
)?)
}
#[cfg(feature = "cl_khr_d3d11_sharing")]
pub fn get_devices_from_dx3d11_khr(
&self,
d3d_device_source: cl_d3d11_device_source_khr,
d3d_object: *mut c_void,
d3d_device_set: cl_d3d11_device_set_khr,
) -> Result<Vec<cl_device_id>> {
Ok(d3d11::get_device_ids_from_dx3d11_khr(
self.id(),
d3d_device_source,
d3d_object,
d3d_device_set,
)?)
}
pub fn profile(&self) -> Result<String> {
Ok(
platform::get_platform_info(self.id(), platform::PlatformInfo::CL_PLATFORM_PROFILE)?
.to_string(),
)
}
pub fn version(&self) -> Result<String> {
Ok(
platform::get_platform_info(self.id(), platform::PlatformInfo::CL_PLATFORM_VERSION)?
.to_string(),
)
}
pub fn name(&self) -> Result<String> {
Ok(
platform::get_platform_info(self.id(), platform::PlatformInfo::CL_PLATFORM_NAME)?
.to_string(),
)
}
pub fn vendor(&self) -> Result<String> {
Ok(
platform::get_platform_info(self.id(), platform::PlatformInfo::CL_PLATFORM_VENDOR)?
.to_string(),
)
}
pub fn extensions(&self) -> Result<String> {
Ok(
platform::get_platform_info(self.id(), platform::PlatformInfo::CL_PLATFORM_EXTENSIONS)?
.to_string(),
)
}
pub fn host_timer_resolution(&self) -> Result<cl_ulong> {
Ok(platform::get_platform_info(
self.id(),
platform::PlatformInfo::CL_PLATFORM_HOST_TIMER_RESOLUTION,
)?
.to_ulong())
}
pub fn numeric_version(&self) -> Result<cl_version> {
Ok(platform::get_platform_info(
self.id(),
platform::PlatformInfo::CL_PLATFORM_NUMERIC_VERSION,
)?
.to_uint())
}
pub fn extensions_with_version(&self) -> Result<Vec<cl_name_version>> {
Ok(platform::get_platform_info(
self.id(),
platform::PlatformInfo::CL_PLATFORM_EXTENSIONS_WITH_VERSION,
)?
.to_vec_name_version())
}
pub fn unload_compiler(&self) -> Result<()> {
Ok(program::unload_platform_compiler(self.id())?)
}
}
pub fn get_platforms() -> Result<Vec<Platform>> {
let platform_ids = platform::get_platform_ids()?;
Ok(platform_ids
.iter()
.map(|id| Platform::new(*id))
.collect::<Vec<Platform>>())
}
#[cfg(feature = "cl_khr_icd")]
pub fn icd_get_platform_ids_khr() -> Result<Vec<Platform>> {
let platform_ids = ext::icd_get_platform_ids_khr()?;
Ok(platform_ids
.iter()
.map(|id| Platform::new(*id))
.collect::<Vec<Platform>>())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_platforms() {
let platforms = get_platforms().unwrap();
println!("Number of platforms: {}", platforms.len());
assert!(0 < platforms.len());
for platform in platforms {
println!("Platform Debug Trait: {:?}", platform);
println!("CL_PLATFORM_NAME: {}", platform.name().unwrap());
println!("CL_PLATFORM_PROFILE: {}", platform.profile().unwrap());
let value = platform.version().unwrap();
println!("CL_PLATFORM_VERSION: {:?}", value);
println!("CL_PLATFORM_VENDOR: {}", platform.vendor().unwrap());
println!(
"CL_PLATFORM_EXTENSIONS: {:?}",
platform.extensions().unwrap()
);
match platform.host_timer_resolution() {
Ok(value) => {
println!("CL_PLATFORM_HOST_TIMER_RESOLUTION: {}", value)
}
Err(e) => println!(
"OpenCL error, CL_PLATFORM_HOST_TIMER_RESOLUTION: {:?}, {}",
e, e
),
};
println!("");
}
}
}