/rust/registry/src/index.crates.io-1949cf8c6b5b557f/rutabaga_gfx-0.1.76-alpha.0/src/handle.rs
Line | Count | Source |
1 | | // Copyright 2025 Google |
2 | | // SPDX-License-Identifier: BSD-3-Clause |
3 | | |
4 | | use mesa3d_util::MesaError; |
5 | | use mesa3d_util::MesaHandle; |
6 | | use mesa3d_util::OwnedDescriptor; |
7 | | |
8 | | use crate::rutabaga_utils::RutabagaResult; |
9 | | |
10 | | pub struct AhbInfo { |
11 | | pub fds: Vec<OwnedDescriptor>, |
12 | | pub metadata: Vec<u8>, |
13 | | } |
14 | | |
15 | | impl AhbInfo { |
16 | 0 | pub fn try_clone(&self) -> RutabagaResult<AhbInfo> { |
17 | 0 | let cloned_fds = self |
18 | 0 | .fds |
19 | 0 | .iter() |
20 | 0 | .map(|fd| fd.try_clone()) |
21 | 0 | .collect::<Result<Vec<_>, _>>() |
22 | 0 | .map_err(|_| MesaError::InvalidMesaHandle)?; |
23 | | |
24 | 0 | Ok(AhbInfo { |
25 | 0 | fds: cloned_fds, |
26 | 0 | metadata: self.metadata.clone(), |
27 | 0 | }) |
28 | 0 | } |
29 | | } |
30 | | |
31 | | pub enum RutabagaHandle { |
32 | | MesaHandle(MesaHandle), |
33 | | AhbInfo(AhbInfo), |
34 | | } |
35 | | |
36 | | impl From<MesaHandle> for RutabagaHandle { |
37 | 0 | fn from(value: MesaHandle) -> Self { |
38 | 0 | RutabagaHandle::MesaHandle(value) |
39 | 0 | } |
40 | | } |
41 | | |
42 | | impl TryFrom<RutabagaHandle> for MesaHandle { |
43 | | type Error = MesaError; |
44 | | |
45 | 0 | fn try_from(handle: RutabagaHandle) -> Result<Self, Self::Error> { |
46 | 0 | match handle { |
47 | 0 | RutabagaHandle::MesaHandle(h) => Ok(h), |
48 | 0 | _ => Err(MesaError::InvalidMesaHandle), |
49 | | } |
50 | 0 | } |
51 | | } |
52 | | |
53 | | impl From<AhbInfo> for RutabagaHandle { |
54 | 0 | fn from(value: AhbInfo) -> Self { |
55 | 0 | RutabagaHandle::AhbInfo(value) |
56 | 0 | } |
57 | | } |
58 | | |
59 | | impl TryFrom<RutabagaHandle> for AhbInfo { |
60 | | type Error = MesaError; |
61 | | |
62 | 0 | fn try_from(handle: RutabagaHandle) -> Result<Self, Self::Error> { |
63 | 0 | match handle { |
64 | 0 | RutabagaHandle::AhbInfo(h) => Ok(h), |
65 | 0 | _ => Err(MesaError::InvalidMesaHandle), |
66 | | } |
67 | 0 | } |
68 | | } |
69 | | |
70 | | impl RutabagaHandle { |
71 | | /// Clones the RutabagaHandle, duplicating any underlying file descriptors. |
72 | 0 | pub fn try_clone(&self) -> RutabagaResult<RutabagaHandle> { |
73 | 0 | match self { |
74 | 0 | RutabagaHandle::MesaHandle(handle) => { |
75 | 0 | Ok(RutabagaHandle::MesaHandle(handle.try_clone()?)) |
76 | | } |
77 | 0 | RutabagaHandle::AhbInfo(info) => Ok(RutabagaHandle::AhbInfo(info.try_clone()?)), |
78 | | } |
79 | 0 | } |
80 | | |
81 | | /// Returns a reference to the inner `MesaHandle` if this is a `MesaHandle` variant. |
82 | 0 | pub fn as_mesa_handle(&self) -> Option<&MesaHandle> { |
83 | 0 | match self { |
84 | 0 | RutabagaHandle::MesaHandle(handle) => Some(handle), |
85 | 0 | _ => None, |
86 | | } |
87 | 0 | } |
88 | | } |