From: Kostya Shishkov Date: Fri, 20 Oct 2023 16:33:27 +0000 (+0200) Subject: nihed-cros-libva: rework UsageHint and drop bitflags dependency X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=379fea7e311111ee1dfefba1526979e69073c650;p=nihav-player.git nihed-cros-libva: rework UsageHint and drop bitflags dependency --- diff --git a/nihed-cros-libva/Cargo.toml b/nihed-cros-libva/Cargo.toml index cc5096b..c265e88 100644 --- a/nihed-cros-libva/Cargo.toml +++ b/nihed-cros-libva/Cargo.toml @@ -6,9 +6,6 @@ description = "Safe bindings over libva" authors = ["The Chromium OS Authors", "random nobody"] edition = "2021" -[dependencies] -bitflags = "1.3" - [build-dependencies] pkg-config = "0.3.26" diff --git a/nihed-cros-libva/src/display.rs b/nihed-cros-libva/src/display.rs index f5a5b66..9e7c3e0 100644 --- a/nihed-cros-libva/src/display.rs +++ b/nihed-cros-libva/src/display.rs @@ -14,7 +14,7 @@ use crate::config::Config; use crate::context::Context; use crate::status::*; use crate::surface::Surface; -use crate::UsageHint; +use crate::UsageHints; /// Iterates over existing DRM devices. /// @@ -242,7 +242,7 @@ impl Display { va_fourcc: Option, width: u32, height: u32, - usage_hint: Option, + usage_hints: Option, num_surfaces: u32, ) -> VAResult> { Surface::new( @@ -251,7 +251,7 @@ impl Display { va_fourcc, width, height, - usage_hint, + usage_hints, num_surfaces, ) } diff --git a/nihed-cros-libva/src/surface.rs b/nihed-cros-libva/src/surface.rs index d16fedc..ddc1f15 100644 --- a/nihed-cros-libva/src/surface.rs +++ b/nihed-cros-libva/src/surface.rs @@ -7,7 +7,7 @@ use std::rc::Rc; use crate::bindings; use crate::display::Display; use crate::status::*; -use crate::UsageHint; +use crate::UsageHints; /// An owned VA surface that is tied to the lifetime of a particular VADisplay pub struct Surface { @@ -26,19 +26,19 @@ impl Surface { va_fourcc: Option, width: u32, height: u32, - usage_hint: Option, + usage_hints: Option, num_surfaces: u32, ) -> VAResult> { let mut attrs = vec![]; - if let Some(usage_hint) = usage_hint { + if let Some(usage_hints) = usage_hints { let attr = bindings::VASurfaceAttrib { type_: bindings::VASurfaceAttribType::VASurfaceAttribUsageHint, flags: bindings::constants::VA_SURFACE_ATTRIB_SETTABLE, value: bindings::VAGenericValue { type_: bindings::VAGenericValueType::VAGenericValueTypeInteger, value: bindings::_VAGenericValue__bindgen_ty_1 { - i: usage_hint.bits() as i32, + i: usage_hints.bits() as i32, }, }, }; diff --git a/nihed-cros-libva/src/usage_hint.rs b/nihed-cros-libva/src/usage_hint.rs dissimilarity index 86% index 1e15968..6654945 100644 --- a/nihed-cros-libva/src/usage_hint.rs +++ b/nihed-cros-libva/src/usage_hint.rs @@ -1,27 +1,98 @@ -// Copyright 2022 The ChromiumOS Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -use bitflags::bitflags; - -use crate::constants; - -bitflags! { - /// Gives the driver a hint of intended usage to optimize allocation (e.g. tiling). - pub struct UsageHint: u32 { - /// Surface usage not indicated. - const USAGE_HINT_GENERIC = constants::VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC; - /// Surface used by video decoder. - const USAGE_HINT_DECODER = constants::VA_SURFACE_ATTRIB_USAGE_HINT_DECODER; - /// Surface used by video encoder. - const USAGE_HINT_ENCODER = constants::VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER; - /// Surface read by video post-processing. - const USAGE_HINT_VPP_READ = constants::VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ; - /// Surface written by video post-processing. - const USAGE_HINT_VPP_WRITE = constants::VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE; - /// Surface used for display. - const USAGE_HINT_DISPLAY = constants::VA_SURFACE_ATTRIB_USAGE_HINT_DISPLAY; - /// Surface used for export to third-party APIs, e.g. via `vaExportSurfaceHandle()`. - const USAGE_HINT_EXPORT = constants::VA_SURFACE_ATTRIB_USAGE_HINT_EXPORT; - } -} +// Copyright 2022 The ChromiumOS Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign}; + +use crate::constants; + +/// Usage hint flags structure. +#[derive(Default, Clone, Copy, Debug, PartialEq)] +pub struct UsageHints(u32); + +impl UsageHints { + /// Returns usage hint flags value as 32-bit integer. + pub fn bits(self) -> u32 { + self.0 + } +} + +impl BitOr for UsageHints { + type Output = Self; + + fn bitor(self, rhs: UsageHint) -> Self { + Self(self.0 | rhs.bits()) + } +} + +impl BitOrAssign for UsageHints { + fn bitor_assign(&mut self, rhs: UsageHint) { + self.0 |= rhs.bits(); + } +} + +impl BitXor for UsageHints { + type Output = Self; + + fn bitxor(self, rhs: UsageHint) -> Self { + Self(self.0 ^ rhs.bits()) + } +} + +impl BitXorAssign for UsageHints { + fn bitxor_assign(&mut self, rhs: UsageHint) { + self.0 ^= rhs.bits(); + } +} + +impl BitAnd for UsageHints { + type Output = Self; + + fn bitand(self, rhs: UsageHint) -> Self { + Self(self.0 & rhs.bits()) + } +} + +impl BitAndAssign for UsageHints { + fn bitand_assign(&mut self, rhs: UsageHint) { + self.0 &= rhs.bits(); + } +} + +/// Gives the driver a hint of intended usage to optimize allocation (e.g. tiling). +#[repr(u32)] +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum UsageHint { + /// Surface usage not indicated. + Generic = constants::VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, + /// Surface used by video decoder. + Decoder = constants::VA_SURFACE_ATTRIB_USAGE_HINT_DECODER, + /// Surface used by video encoder. + Encoder = constants::VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER, + /// Surface read by video post-processing. + VppRead = constants::VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ, + /// Surface written by video post-processing. + VppWrite = constants::VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE, + /// Surface used for display. + Display = constants::VA_SURFACE_ATTRIB_USAGE_HINT_DISPLAY, + /// Surface used for export to third-party APIs, e.g. via `vaExportSurfaceHandle()`. + Export = constants::VA_SURFACE_ATTRIB_USAGE_HINT_EXPORT, +} + +impl From for UsageHints { + fn from(val: UsageHint) -> Self { + Self(val.bits()) + } +} + +impl From for u32 { + fn from(val: UsageHint) -> u32 { + val.bits() + } +} + +impl UsageHint { + pub(crate) fn bits(self) -> u32 { + self as u32 + } +}