1 use rusticl_opencl_gen::*;
2
3 use std::convert::TryFrom;
4 use std::os::raw::c_char;
5
6 pub const CL1_0_VER: cl_version = mk_cl_version(1, 0, 0);
7 pub const CL1_1_VER: cl_version = mk_cl_version(1, 1, 0);
8 pub const CL1_2_VER: cl_version = mk_cl_version(1, 2, 0);
9 pub const CL2_0_VER: cl_version = mk_cl_version(2, 0, 0);
10 pub const CL2_1_VER: cl_version = mk_cl_version(2, 1, 0);
11 pub const CL2_2_VER: cl_version = mk_cl_version(2, 2, 0);
12 pub const CL3_0_VER: cl_version = mk_cl_version(3, 0, 0);
13
14 #[repr(u32)]
15 #[derive(Copy, Clone, Eq, Hash, PartialEq, PartialOrd, Ord)]
16 pub enum CLVersion {
17 Cl1_0 = CL1_0_VER,
18 Cl1_1 = CL1_1_VER,
19 Cl1_2 = CL1_2_VER,
20 Cl2_0 = CL2_0_VER,
21 Cl2_1 = CL2_1_VER,
22 Cl2_2 = CL2_2_VER,
23 Cl3_0 = CL3_0_VER,
24 }
25
mk_cl_version_ext(major: u32, minor: u32, patch: u32, ext: &str) -> cl_name_version26 pub const fn mk_cl_version_ext(major: u32, minor: u32, patch: u32, ext: &str) -> cl_name_version {
27 let mut name: [c_char; 64] = [0; 64];
28 let ext = ext.as_bytes();
29
30 let mut i = 0;
31 while i < ext.len() {
32 name[i] = ext[i] as c_char;
33 i += 1;
34 }
35
36 cl_name_version {
37 version: mk_cl_version(major, minor, patch),
38 name,
39 }
40 }
41
mk_cl_version(major: u32, minor: u32, patch: u32) -> u3242 pub const fn mk_cl_version(major: u32, minor: u32, patch: u32) -> u32 {
43 ((major & CL_VERSION_MAJOR_MASK) << (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS))
44 | ((minor & CL_VERSION_MINOR_MASK) << CL_VERSION_PATCH_BITS)
45 | (patch & CL_VERSION_PATCH_MASK)
46 }
47
48 impl CLVersion {
api_str(&self) -> &'static str49 pub fn api_str(&self) -> &'static str {
50 match self {
51 CLVersion::Cl1_0 => "1.0",
52 CLVersion::Cl1_1 => "1.1",
53 CLVersion::Cl1_2 => "1.2",
54 CLVersion::Cl2_0 => "2.0",
55 CLVersion::Cl2_1 => "2.1",
56 CLVersion::Cl2_2 => "2.2",
57 CLVersion::Cl3_0 => "3.0",
58 }
59 }
60
clc_str(&self) -> &'static str61 pub fn clc_str(&self) -> &'static str {
62 match self {
63 CLVersion::Cl1_0 => "100",
64 CLVersion::Cl1_1 => "110",
65 CLVersion::Cl1_2 => "120",
66 CLVersion::Cl2_0 => "200",
67 CLVersion::Cl2_1 => "210",
68 CLVersion::Cl2_2 => "220",
69 CLVersion::Cl3_0 => "300",
70 }
71 }
72 }
73
74 impl From<CLVersion> for cl_version {
from(cl_version: CLVersion) -> Self75 fn from(cl_version: CLVersion) -> Self {
76 cl_version as Self
77 }
78 }
79
80 impl TryFrom<cl_version> for CLVersion {
81 type Error = cl_int;
82
try_from(value: cl_version) -> Result<Self, Self::Error>83 fn try_from(value: cl_version) -> Result<Self, Self::Error> {
84 Ok(match value {
85 CL1_0_VER => CLVersion::Cl1_0,
86 CL1_1_VER => CLVersion::Cl1_1,
87 CL1_2_VER => CLVersion::Cl1_2,
88 CL2_0_VER => CLVersion::Cl2_0,
89 CL2_1_VER => CLVersion::Cl2_1,
90 CL2_2_VER => CLVersion::Cl2_2,
91 CL3_0_VER => CLVersion::Cl3_0,
92 _ => return Err(CL_INVALID_VALUE),
93 })
94 }
95 }
96