2020-11-08 20:28:21 +01:00
|
|
|
use crate::api::icd::*;
|
2023-05-18 08:04:12 -06:00
|
|
|
use crate::api::types::IdpAccelProps;
|
2020-11-08 20:28:21 +01:00
|
|
|
use crate::api::util::*;
|
|
|
|
|
use crate::core::device::*;
|
2023-04-04 00:50:16 +02:00
|
|
|
use crate::core::platform::*;
|
2022-09-05 17:22:56 +02:00
|
|
|
use crate::core::version::*;
|
2020-11-08 20:28:21 +01:00
|
|
|
|
2022-05-06 00:27:32 +02:00
|
|
|
use mesa_rust_gen::*;
|
2022-04-16 13:55:50 +02:00
|
|
|
use mesa_rust_util::ptr::*;
|
|
|
|
|
use rusticl_opencl_gen::*;
|
2023-06-03 15:07:18 +02:00
|
|
|
use rusticl_proc_macros::cl_entrypoint;
|
|
|
|
|
use rusticl_proc_macros::cl_info_entrypoint;
|
2020-11-08 20:28:21 +01:00
|
|
|
|
|
|
|
|
use std::cmp::min;
|
2022-05-06 00:27:32 +02:00
|
|
|
use std::ffi::CStr;
|
2023-06-14 09:02:53 +02:00
|
|
|
use std::mem::{size_of, MaybeUninit};
|
2020-11-08 20:28:21 +01:00
|
|
|
use std::ptr;
|
|
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
2022-09-05 17:22:56 +02:00
|
|
|
const SPIRV_SUPPORT_STRING: &str = "SPIR-V_1.0 SPIR-V_1.1 SPIR-V_1.2 SPIR-V_1.3 SPIR-V_1.4";
|
|
|
|
|
const SPIRV_SUPPORT: [cl_name_version; 5] = [
|
|
|
|
|
mk_cl_version_ext(1, 0, 0, "SPIR-V"),
|
|
|
|
|
mk_cl_version_ext(1, 1, 0, "SPIR-V"),
|
|
|
|
|
mk_cl_version_ext(1, 2, 0, "SPIR-V"),
|
|
|
|
|
mk_cl_version_ext(1, 3, 0, "SPIR-V"),
|
|
|
|
|
mk_cl_version_ext(1, 4, 0, "SPIR-V"),
|
2022-04-23 03:05:09 +02:00
|
|
|
];
|
2023-05-18 08:04:12 -06:00
|
|
|
type ClDevIdpAccelProps = cl_device_integer_dot_product_acceleration_properties_khr;
|
2023-06-03 15:07:18 +02:00
|
|
|
|
|
|
|
|
#[cl_info_entrypoint(cl_get_device_info)]
|
2020-11-08 20:28:21 +01:00
|
|
|
impl CLInfo<cl_device_info> for cl_device_id {
|
2023-06-14 09:02:53 +02:00
|
|
|
fn query(&self, q: cl_device_info, _: &[u8]) -> CLResult<Vec<MaybeUninit<u8>>> {
|
2020-11-08 20:28:21 +01:00
|
|
|
let dev = self.get_ref()?;
|
2023-05-18 08:04:12 -06:00
|
|
|
|
|
|
|
|
// curses you CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_4x8BIT_PACKED_KHR
|
|
|
|
|
#[allow(non_upper_case_globals)]
|
2020-11-08 20:28:21 +01:00
|
|
|
Ok(match q {
|
|
|
|
|
CL_DEVICE_ADDRESS_BITS => cl_prop::<cl_uint>(dev.address_bits()),
|
2022-03-18 01:29:16 +01:00
|
|
|
CL_DEVICE_ATOMIC_FENCE_CAPABILITIES => cl_prop::<cl_device_atomic_capabilities>(
|
|
|
|
|
(CL_DEVICE_ATOMIC_ORDER_RELAXED
|
|
|
|
|
| CL_DEVICE_ATOMIC_ORDER_ACQ_REL
|
|
|
|
|
| CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP)
|
|
|
|
|
as cl_device_atomic_capabilities,
|
|
|
|
|
),
|
|
|
|
|
CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES => cl_prop::<cl_device_atomic_capabilities>(
|
|
|
|
|
(CL_DEVICE_ATOMIC_ORDER_RELAXED | CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP)
|
|
|
|
|
as cl_device_atomic_capabilities,
|
|
|
|
|
),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_AVAILABLE => cl_prop::<bool>(true),
|
|
|
|
|
CL_DEVICE_BUILT_IN_KERNELS => cl_prop::<&str>(""),
|
|
|
|
|
CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION => cl_prop::<Vec<cl_name_version>>(Vec::new()),
|
|
|
|
|
CL_DEVICE_COMPILER_AVAILABLE => cl_prop::<bool>(true),
|
2023-06-16 23:26:12 +02:00
|
|
|
CL_DEVICE_CROSS_DEVICE_SHARED_MEM_CAPABILITIES_INTEL => {
|
|
|
|
|
cl_prop::<cl_device_device_enqueue_capabilities>(0)
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES => {
|
|
|
|
|
cl_prop::<cl_device_device_enqueue_capabilities>(0)
|
|
|
|
|
}
|
2023-06-16 23:26:12 +02:00
|
|
|
CL_DEVICE_DEVICE_MEM_CAPABILITIES_INTEL => {
|
|
|
|
|
cl_prop::<cl_device_unified_shared_memory_capabilities_intel>(0)
|
|
|
|
|
}
|
2023-04-24 12:54:59 +02:00
|
|
|
CL_DEVICE_DOUBLE_FP_CONFIG => cl_prop::<cl_device_fp_config>(
|
2023-06-17 21:54:42 +02:00
|
|
|
if dev.fp64_supported() {
|
2023-04-24 12:54:59 +02:00
|
|
|
let mut fp64_config = CL_FP_FMA
|
2022-03-18 01:21:48 +01:00
|
|
|
| CL_FP_ROUND_TO_NEAREST
|
|
|
|
|
| CL_FP_ROUND_TO_ZERO
|
|
|
|
|
| CL_FP_ROUND_TO_INF
|
|
|
|
|
| CL_FP_INF_NAN
|
2023-04-24 12:54:59 +02:00
|
|
|
| CL_FP_DENORM;
|
2023-06-17 21:54:42 +02:00
|
|
|
if dev.fp64_is_softfp() {
|
2023-04-24 12:54:59 +02:00
|
|
|
fp64_config |= CL_FP_SOFT_FLOAT;
|
|
|
|
|
}
|
|
|
|
|
fp64_config
|
2022-03-18 01:21:48 +01:00
|
|
|
} else {
|
|
|
|
|
0
|
2023-04-24 12:54:59 +02:00
|
|
|
}
|
|
|
|
|
.into(),
|
|
|
|
|
),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_ENDIAN_LITTLE => cl_prop::<bool>(dev.little_endian()),
|
|
|
|
|
CL_DEVICE_ERROR_CORRECTION_SUPPORT => cl_prop::<bool>(false),
|
|
|
|
|
CL_DEVICE_EXECUTION_CAPABILITIES => {
|
|
|
|
|
cl_prop::<cl_device_exec_capabilities>(CL_EXEC_KERNEL.into())
|
|
|
|
|
}
|
|
|
|
|
CL_DEVICE_EXTENSIONS => cl_prop::<&str>(&dev.extension_string),
|
|
|
|
|
CL_DEVICE_EXTENSIONS_WITH_VERSION => cl_prop::<&Vec<cl_name_version>>(&dev.extensions),
|
|
|
|
|
CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT => cl_prop::<bool>(false),
|
|
|
|
|
CL_DEVICE_GLOBAL_MEM_CACHE_TYPE => cl_prop::<cl_device_mem_cache_type>(CL_NONE),
|
|
|
|
|
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE => cl_prop::<cl_ulong>(0),
|
|
|
|
|
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_GLOBAL_MEM_SIZE => cl_prop::<cl_ulong>(dev.global_mem_size()),
|
|
|
|
|
CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE => cl_prop::<usize>(0),
|
2023-06-17 22:15:58 +02:00
|
|
|
CL_DEVICE_HALF_FP_CONFIG => cl_prop::<cl_device_fp_config>(
|
|
|
|
|
if dev.fp16_supported() {
|
|
|
|
|
CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN
|
|
|
|
|
} else {
|
|
|
|
|
0
|
|
|
|
|
}
|
|
|
|
|
.into(),
|
|
|
|
|
),
|
2023-06-16 23:26:12 +02:00
|
|
|
CL_DEVICE_HOST_MEM_CAPABILITIES_INTEL => {
|
|
|
|
|
cl_prop::<cl_device_unified_shared_memory_capabilities_intel>(0)
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_HOST_UNIFIED_MEMORY => cl_prop::<bool>(dev.unified_memory()),
|
2022-04-23 03:05:09 +02:00
|
|
|
CL_DEVICE_IL_VERSION => cl_prop::<&str>(SPIRV_SUPPORT_STRING),
|
|
|
|
|
CL_DEVICE_ILS_WITH_VERSION => cl_prop::<Vec<cl_name_version>>(SPIRV_SUPPORT.to_vec()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT => {
|
|
|
|
|
cl_prop::<cl_uint>(dev.image_base_address_alignment())
|
|
|
|
|
}
|
|
|
|
|
CL_DEVICE_IMAGE_MAX_ARRAY_SIZE => cl_prop::<usize>(dev.image_array_size()),
|
|
|
|
|
CL_DEVICE_IMAGE_MAX_BUFFER_SIZE => cl_prop::<usize>(dev.image_buffer_size()),
|
2023-01-06 23:54:04 -03:00
|
|
|
CL_DEVICE_IMAGE_PITCH_ALIGNMENT => cl_prop::<cl_uint>(dev.image_pitch_alignment()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_IMAGE_SUPPORT => cl_prop::<bool>(dev.image_supported()),
|
|
|
|
|
CL_DEVICE_IMAGE2D_MAX_HEIGHT => cl_prop::<usize>(dev.image_2d_size()),
|
|
|
|
|
CL_DEVICE_IMAGE2D_MAX_WIDTH => cl_prop::<usize>(dev.image_2d_size()),
|
|
|
|
|
CL_DEVICE_IMAGE3D_MAX_HEIGHT => cl_prop::<usize>(dev.image_3d_size()),
|
|
|
|
|
CL_DEVICE_IMAGE3D_MAX_WIDTH => cl_prop::<usize>(dev.image_3d_size()),
|
|
|
|
|
CL_DEVICE_IMAGE3D_MAX_DEPTH => cl_prop::<usize>(dev.image_3d_size()),
|
2023-05-18 08:04:12 -06:00
|
|
|
CL_DEVICE_INTEGER_DOT_PRODUCT_CAPABILITIES_KHR => {
|
|
|
|
|
cl_prop::<cl_device_integer_dot_product_capabilities_khr>(
|
|
|
|
|
(CL_DEVICE_INTEGER_DOT_PRODUCT_INPUT_4x8BIT_PACKED_KHR
|
|
|
|
|
| CL_DEVICE_INTEGER_DOT_PRODUCT_INPUT_4x8BIT_KHR)
|
|
|
|
|
.into(),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR => {
|
|
|
|
|
cl_prop::<ClDevIdpAccelProps>({
|
|
|
|
|
let pack = dev.pack_32_4x8_supported();
|
|
|
|
|
let sdot = dev.sdot_4x8_supported() && pack;
|
|
|
|
|
let udot = dev.udot_4x8_supported() && pack;
|
|
|
|
|
let sudot = dev.sudot_4x8_supported() && pack;
|
|
|
|
|
IdpAccelProps::new(
|
|
|
|
|
sdot.into(),
|
|
|
|
|
udot.into(),
|
|
|
|
|
sudot.into(),
|
|
|
|
|
sdot.into(),
|
|
|
|
|
udot.into(),
|
|
|
|
|
sudot.into(),
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_4x8BIT_PACKED_KHR => {
|
|
|
|
|
cl_prop::<ClDevIdpAccelProps>({
|
|
|
|
|
IdpAccelProps::new(
|
|
|
|
|
dev.sdot_4x8_supported().into(),
|
|
|
|
|
dev.udot_4x8_supported().into(),
|
|
|
|
|
dev.sudot_4x8_supported().into(),
|
|
|
|
|
dev.sdot_4x8_supported().into(),
|
|
|
|
|
dev.udot_4x8_supported().into(),
|
|
|
|
|
dev.sudot_4x8_supported().into(),
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-12 17:10:59 +01:00
|
|
|
CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED => {
|
|
|
|
|
cl_prop::<&CStr>(dev.screen().cl_cts_version())
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_LINKER_AVAILABLE => cl_prop::<bool>(true),
|
|
|
|
|
CL_DEVICE_LOCAL_MEM_SIZE => cl_prop::<cl_ulong>(dev.local_mem_size()),
|
|
|
|
|
// TODO add query for CL_LOCAL vs CL_GLOBAL
|
|
|
|
|
CL_DEVICE_LOCAL_MEM_TYPE => cl_prop::<cl_device_local_mem_type>(CL_GLOBAL),
|
2023-05-20 09:06:02 -06:00
|
|
|
CL_DEVICE_LUID_KHR => cl_prop::<[cl_uchar; CL_LUID_SIZE_KHR as usize]>(
|
|
|
|
|
dev.screen().device_luid().unwrap_or_default(),
|
|
|
|
|
),
|
|
|
|
|
CL_DEVICE_LUID_VALID_KHR => {
|
|
|
|
|
cl_prop::<cl_bool>(dev.screen().device_luid().is_some().into())
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_MAX_CLOCK_FREQUENCY => cl_prop::<cl_uint>(dev.max_clock_freq()),
|
|
|
|
|
CL_DEVICE_MAX_COMPUTE_UNITS => cl_prop::<cl_uint>(dev.max_compute_units()),
|
|
|
|
|
// TODO atm implemented as mem_const
|
2023-02-16 15:46:30 +01:00
|
|
|
CL_DEVICE_MAX_CONSTANT_ARGS => cl_prop::<cl_uint>(dev.const_max_count()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE => cl_prop::<cl_ulong>(dev.const_max_size()),
|
|
|
|
|
CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE => cl_prop::<usize>(0),
|
|
|
|
|
CL_DEVICE_MAX_MEM_ALLOC_SIZE => cl_prop::<cl_ulong>(dev.max_mem_alloc()),
|
|
|
|
|
CL_DEVICE_MAX_NUM_SUB_GROUPS => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_MAX_ON_DEVICE_EVENTS => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_MAX_ON_DEVICE_QUEUES => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_MAX_PARAMETER_SIZE => cl_prop::<usize>(dev.param_max_size()),
|
|
|
|
|
CL_DEVICE_MAX_PIPE_ARGS => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_MAX_READ_IMAGE_ARGS => cl_prop::<cl_uint>(dev.image_read_count()),
|
2022-04-27 21:19:15 +02:00
|
|
|
CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS => {
|
|
|
|
|
cl_prop::<cl_uint>(if dev.image_read_write_supported() {
|
|
|
|
|
dev.image_write_count()
|
|
|
|
|
} else {
|
|
|
|
|
0
|
|
|
|
|
})
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_MAX_SAMPLERS => cl_prop::<cl_uint>(dev.max_samplers()),
|
|
|
|
|
CL_DEVICE_MAX_WORK_GROUP_SIZE => cl_prop::<usize>(dev.max_threads_per_block()),
|
|
|
|
|
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS => cl_prop::<cl_uint>(dev.max_grid_dimensions()),
|
|
|
|
|
CL_DEVICE_MAX_WORK_ITEM_SIZES => cl_prop::<Vec<usize>>(dev.max_block_sizes()),
|
|
|
|
|
CL_DEVICE_MAX_WRITE_IMAGE_ARGS => cl_prop::<cl_uint>(dev.image_write_count()),
|
|
|
|
|
// TODO proper retrival from devices
|
|
|
|
|
CL_DEVICE_MEM_BASE_ADDR_ALIGN => cl_prop::<cl_uint>(0x1000),
|
|
|
|
|
CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE => {
|
|
|
|
|
cl_prop::<cl_uint>(size_of::<cl_ulong16>() as cl_uint)
|
|
|
|
|
}
|
2023-06-14 08:16:40 +02:00
|
|
|
CL_DEVICE_NAME => cl_prop::<&str>(&dev.screen().name()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR => cl_prop::<cl_uint>(1),
|
2023-04-24 12:54:59 +02:00
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE => {
|
2023-06-17 21:54:42 +02:00
|
|
|
cl_prop::<cl_uint>(if dev.fp64_supported() { 1 } else { 0 })
|
2023-04-24 12:54:59 +02:00
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT => cl_prop::<cl_uint>(1),
|
2023-06-17 22:15:58 +02:00
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF => {
|
|
|
|
|
cl_prop::<cl_uint>(if dev.fp16_supported() { 1 } else { 0 })
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_INT => cl_prop::<cl_uint>(1),
|
|
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG => cl_prop::<cl_uint>(1),
|
|
|
|
|
CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT => cl_prop::<cl_uint>(1),
|
2023-05-20 09:06:02 -06:00
|
|
|
CL_DEVICE_NODE_MASK_KHR => {
|
|
|
|
|
cl_prop::<cl_uint>(dev.screen().device_node_mask().unwrap_or_default())
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT => cl_prop::<bool>(false),
|
2023-06-17 21:43:40 +02:00
|
|
|
CL_DEVICE_NUMERIC_VERSION => cl_prop::<cl_version>(dev.cl_version.into()),
|
2023-06-17 21:28:55 +02:00
|
|
|
CL_DEVICE_OPENCL_C_ALL_VERSIONS => cl_prop::<&Vec<cl_name_version>>(&dev.clc_versions),
|
|
|
|
|
CL_DEVICE_OPENCL_C_FEATURES => cl_prop::<&Vec<cl_name_version>>(&dev.clc_features),
|
2023-06-17 21:44:30 +02:00
|
|
|
CL_DEVICE_OPENCL_C_NUMERIC_VERSION_KHR => {
|
|
|
|
|
cl_prop::<cl_version_khr>(dev.clc_version.into())
|
|
|
|
|
}
|
2023-06-17 21:28:55 +02:00
|
|
|
CL_DEVICE_OPENCL_C_VERSION => {
|
|
|
|
|
cl_prop::<&str>(&format!("OpenCL C {} ", dev.clc_version.api_str()))
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
// TODO subdevice support
|
|
|
|
|
CL_DEVICE_PARENT_DEVICE => cl_prop::<cl_device_id>(cl_device_id::from_ptr(ptr::null())),
|
|
|
|
|
CL_DEVICE_PARTITION_AFFINITY_DOMAIN => cl_prop::<cl_device_affinity_domain>(0),
|
|
|
|
|
CL_DEVICE_PARTITION_MAX_SUB_DEVICES => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_PARTITION_PROPERTIES => cl_prop::<Vec<cl_device_partition_property>>(vec![0]),
|
|
|
|
|
CL_DEVICE_PARTITION_TYPE => cl_prop::<Vec<cl_device_partition_property>>(Vec::new()),
|
2023-05-15 05:20:16 -06:00
|
|
|
CL_DEVICE_PCI_BUS_INFO_KHR => {
|
|
|
|
|
cl_prop::<cl_device_pci_bus_info_khr>(dev.pci_info().ok_or(CL_INVALID_VALUE)?)
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_PIPE_MAX_PACKET_SIZE => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_PIPE_SUPPORT => cl_prop::<bool>(false),
|
2023-04-04 02:38:31 +02:00
|
|
|
CL_DEVICE_PLATFORM => cl_prop::<cl_platform_id>(Platform::get().as_ptr()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_PREFERRED_INTEROP_USER_SYNC => cl_prop::<bool>(true),
|
|
|
|
|
CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR => cl_prop::<cl_uint>(1),
|
2023-06-02 14:34:15 +02:00
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE => {
|
2023-06-17 21:54:42 +02:00
|
|
|
cl_prop::<cl_uint>(if dev.fp64_supported() { 1 } else { 0 })
|
2023-06-02 14:34:15 +02:00
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT => cl_prop::<cl_uint>(1),
|
2023-06-17 22:15:58 +02:00
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF => {
|
|
|
|
|
cl_prop::<cl_uint>(if dev.fp16_supported() { 1 } else { 0 })
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT => cl_prop::<cl_uint>(1),
|
|
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG => cl_prop::<cl_uint>(1),
|
|
|
|
|
CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT => cl_prop::<cl_uint>(1),
|
2022-04-29 03:20:25 +02:00
|
|
|
CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE => {
|
|
|
|
|
cl_prop::<usize>(dev.subgroups() as usize)
|
|
|
|
|
}
|
2022-03-18 18:30:14 +01:00
|
|
|
CL_DEVICE_PRINTF_BUFFER_SIZE => cl_prop::<usize>(dev.printf_buffer_size()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_PROFILE => cl_prop(if dev.embedded {
|
|
|
|
|
"EMBEDDED_PROFILE"
|
|
|
|
|
} else {
|
|
|
|
|
"FULL_PROFILE"
|
|
|
|
|
}),
|
2023-06-25 17:22:29 +01:00
|
|
|
CL_DEVICE_PROFILING_TIMER_RESOLUTION => cl_prop::<usize>(dev.timer_resolution()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE => cl_prop::<cl_uint>(0),
|
|
|
|
|
CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES => cl_prop::<cl_command_queue_properties>(0),
|
|
|
|
|
CL_DEVICE_QUEUE_ON_HOST_PROPERTIES => {
|
|
|
|
|
cl_prop::<cl_command_queue_properties>(CL_QUEUE_PROFILING_ENABLE.into())
|
|
|
|
|
}
|
|
|
|
|
CL_DEVICE_REFERENCE_COUNT => cl_prop::<cl_uint>(1),
|
2023-06-16 23:26:12 +02:00
|
|
|
CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL => {
|
|
|
|
|
cl_prop::<cl_device_unified_shared_memory_capabilities_intel>(0)
|
|
|
|
|
}
|
|
|
|
|
CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL => {
|
|
|
|
|
cl_prop::<cl_device_unified_shared_memory_capabilities_intel>(0)
|
|
|
|
|
}
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_SINGLE_FP_CONFIG => cl_prop::<cl_device_fp_config>(
|
|
|
|
|
(CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN) as cl_device_fp_config,
|
|
|
|
|
),
|
|
|
|
|
CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS => cl_prop::<bool>(false),
|
2022-11-05 13:33:45 +01:00
|
|
|
CL_DEVICE_SVM_CAPABILITIES | CL_DEVICE_SVM_CAPABILITIES_ARM => {
|
|
|
|
|
cl_prop::<cl_device_svm_capabilities>(
|
|
|
|
|
if dev.svm_supported() {
|
|
|
|
|
CL_DEVICE_SVM_COARSE_GRAIN_BUFFER
|
|
|
|
|
| CL_DEVICE_SVM_FINE_GRAIN_BUFFER
|
|
|
|
|
| CL_DEVICE_SVM_FINE_GRAIN_SYSTEM
|
|
|
|
|
} else {
|
|
|
|
|
0
|
|
|
|
|
}
|
|
|
|
|
.into(),
|
|
|
|
|
)
|
|
|
|
|
}
|
2022-04-21 02:10:13 +02:00
|
|
|
CL_DEVICE_TYPE => cl_prop::<cl_device_type>(dev.device_type(false)),
|
2023-05-20 09:06:02 -06:00
|
|
|
CL_DEVICE_UUID_KHR => cl_prop::<[cl_uchar; CL_UUID_SIZE_KHR as usize]>(
|
|
|
|
|
dev.screen().device_uuid().unwrap_or_default(),
|
|
|
|
|
),
|
2023-06-14 08:16:40 +02:00
|
|
|
CL_DEVICE_VENDOR => cl_prop::<&str>(&dev.screen().device_vendor()),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_VENDOR_ID => cl_prop::<cl_uint>(dev.vendor_id()),
|
2023-06-14 08:16:40 +02:00
|
|
|
CL_DEVICE_VERSION => cl_prop::<&str>(&format!("OpenCL {} ", dev.cl_version.api_str())),
|
2023-05-20 09:06:02 -06:00
|
|
|
CL_DRIVER_UUID_KHR => cl_prop::<[cl_char; CL_UUID_SIZE_KHR as usize]>(
|
|
|
|
|
dev.screen().driver_uuid().unwrap_or_default(),
|
|
|
|
|
),
|
2022-05-06 00:27:32 +02:00
|
|
|
CL_DRIVER_VERSION => cl_prop::<&CStr>(unsafe { CStr::from_ptr(mesa_version_string()) }),
|
2020-11-08 20:28:21 +01:00
|
|
|
CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT => cl_prop::<bool>(false),
|
|
|
|
|
// CL_INVALID_VALUE if param_name is not one of the supported values
|
|
|
|
|
// CL_INVALID_VALUE [...] if param_name is a value that is available as an extension and the corresponding extension is not supported by the device.
|
|
|
|
|
_ => return Err(CL_INVALID_VALUE),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn devs() -> &'static Vec<Arc<Device>> {
|
2023-04-04 02:40:36 +02:00
|
|
|
&Platform::get().devs
|
2020-11-08 20:28:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn get_devs_for_type(device_type: cl_device_type) -> Vec<&'static Arc<Device>> {
|
|
|
|
|
devs()
|
|
|
|
|
.iter()
|
2022-04-21 02:10:13 +02:00
|
|
|
.filter(|d| device_type & d.device_type(true) != 0)
|
2020-11-08 20:28:21 +01:00
|
|
|
.collect()
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-03 15:07:18 +02:00
|
|
|
#[cl_entrypoint]
|
|
|
|
|
fn get_device_ids(
|
2020-11-08 20:28:21 +01:00
|
|
|
platform: cl_platform_id,
|
|
|
|
|
device_type: cl_device_type,
|
|
|
|
|
num_entries: cl_uint,
|
|
|
|
|
devices: *mut cl_device_id,
|
|
|
|
|
num_devices: *mut cl_uint,
|
|
|
|
|
) -> CLResult<()> {
|
|
|
|
|
// CL_INVALID_PLATFORM if platform is not a valid platform.
|
|
|
|
|
platform.get_ref()?;
|
|
|
|
|
|
|
|
|
|
// CL_INVALID_DEVICE_TYPE if device_type is not a valid value.
|
|
|
|
|
check_cl_device_type(device_type)?;
|
|
|
|
|
|
|
|
|
|
// CL_INVALID_VALUE if num_entries is equal to zero and devices is not NULL
|
|
|
|
|
if num_entries == 0 && !devices.is_null() {
|
|
|
|
|
return Err(CL_INVALID_VALUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CL_INVALID_VALUE [...] if both num_devices and devices are NULL.
|
|
|
|
|
if num_devices.is_null() && devices.is_null() {
|
|
|
|
|
return Err(CL_INVALID_VALUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let devs = get_devs_for_type(device_type);
|
|
|
|
|
// CL_DEVICE_NOT_FOUND if no OpenCL devices that matched device_type were found
|
|
|
|
|
if devs.is_empty() {
|
|
|
|
|
return Err(CL_DEVICE_NOT_FOUND);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// num_devices returns the number of OpenCL devices available that match device_type. If
|
|
|
|
|
// num_devices is NULL, this argument is ignored.
|
|
|
|
|
num_devices.write_checked(devs.len() as cl_uint);
|
|
|
|
|
|
|
|
|
|
if !devices.is_null() {
|
|
|
|
|
let n = min(num_entries as usize, devs.len());
|
|
|
|
|
|
|
|
|
|
#[allow(clippy::needless_range_loop)]
|
|
|
|
|
for i in 0..n {
|
|
|
|
|
unsafe {
|
|
|
|
|
// Note we use as_ptr here which doesn't increase the reference count.
|
|
|
|
|
*devices.add(i) = cl_device_id::from_ptr(Arc::as_ptr(devs[i]));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
2022-04-12 12:50:37 +02:00
|
|
|
|
2023-06-03 15:07:18 +02:00
|
|
|
#[cl_entrypoint]
|
|
|
|
|
fn retain_device(_device: cl_device_id) -> CLResult<()> {
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cl_entrypoint]
|
|
|
|
|
fn release_device(_device: cl_device_id) -> CLResult<()> {
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cl_entrypoint]
|
|
|
|
|
fn get_device_and_host_timer(
|
2023-06-14 01:31:29 +01:00
|
|
|
device: cl_device_id,
|
|
|
|
|
device_timestamp: *mut cl_ulong,
|
|
|
|
|
host_timestamp: *mut cl_ulong,
|
2022-04-12 12:50:37 +02:00
|
|
|
) -> CLResult<()> {
|
2023-06-14 01:31:29 +01:00
|
|
|
if device_timestamp.is_null() {
|
|
|
|
|
// CL_INVALID_VALUE if host_timestamp or device_timestamp is NULL
|
|
|
|
|
return Err(CL_INVALID_VALUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get_host_timer(device, host_timestamp)?;
|
|
|
|
|
// There is a requirement that the two timestamps
|
|
|
|
|
// are synchronised, but don't need to be the same,
|
|
|
|
|
// but as it is, the same timestamp is the best to
|
|
|
|
|
// use for both
|
|
|
|
|
|
|
|
|
|
// Safe because null check on device_timestamp above
|
|
|
|
|
// and host_timestamp null check in get_host_timer
|
|
|
|
|
unsafe {
|
|
|
|
|
*device_timestamp = *host_timestamp;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Ok(())
|
2022-04-12 12:50:37 +02:00
|
|
|
}
|
|
|
|
|
|
2023-06-03 15:07:18 +02:00
|
|
|
#[cl_entrypoint]
|
2023-06-14 01:31:29 +01:00
|
|
|
fn get_host_timer(device_id: cl_device_id, host_timestamp: *mut cl_ulong) -> CLResult<()> {
|
|
|
|
|
if host_timestamp.is_null() {
|
|
|
|
|
// CL_INVALID_VALUE if host_timestamp is NULL
|
|
|
|
|
return Err(CL_INVALID_VALUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let device = device_id.get_ref()?;
|
|
|
|
|
|
|
|
|
|
if !device.has_timestamp {
|
|
|
|
|
// CL_INVALID_OPERATION if the platform associated with device does not support device and host timer synchronization
|
|
|
|
|
return Err(CL_INVALID_OPERATION);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Currently the best clock we have for the host_timestamp
|
|
|
|
|
host_timestamp.write_checked(device.screen().get_timestamp());
|
|
|
|
|
|
|
|
|
|
Ok(())
|
2022-04-12 12:50:37 +02:00
|
|
|
}
|
2022-04-12 14:52:57 +02:00
|
|
|
|
2023-06-03 15:07:18 +02:00
|
|
|
#[cl_entrypoint]
|
|
|
|
|
fn set_default_device_command_queue(
|
2022-04-12 14:52:57 +02:00
|
|
|
_context: cl_context,
|
|
|
|
|
_device: cl_device_id,
|
|
|
|
|
_command_queue: cl_command_queue,
|
|
|
|
|
) -> CLResult<()> {
|
|
|
|
|
Err(CL_INVALID_OPERATION)
|
|
|
|
|
}
|