Coverage Report

Created: 2026-06-30 06:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}