xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/rusticl/core/version.rs (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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