output: decouple identity from wayland output
This commit is contained in:
parent
59e4e6dfb7
commit
a20deb0628
13 changed files with 110 additions and 113 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
|
@ -745,6 +745,7 @@ dependencies = [
|
||||||
"jay-libinput",
|
"jay-libinput",
|
||||||
"jay-logger",
|
"jay-logger",
|
||||||
"jay-output-schedule",
|
"jay-output-schedule",
|
||||||
|
"jay-output-types",
|
||||||
"jay-pango",
|
"jay-pango",
|
||||||
"jay-pr-caps",
|
"jay-pr-caps",
|
||||||
"jay-sighand",
|
"jay-sighand",
|
||||||
|
|
@ -995,6 +996,13 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jay-output-types"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"blake3",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jay-pango"
|
name = "jay-pango"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ members = [
|
||||||
"bugs",
|
"bugs",
|
||||||
"logger",
|
"logger",
|
||||||
"video-types",
|
"video-types",
|
||||||
|
"output-types",
|
||||||
"input-types",
|
"input-types",
|
||||||
"keyboard",
|
"keyboard",
|
||||||
"gfx-types",
|
"gfx-types",
|
||||||
|
|
@ -99,6 +100,7 @@ jay-pr-caps = { version = "0.1.0", path = "pr-caps" }
|
||||||
jay-bugs = { version = "0.1.0", path = "bugs" }
|
jay-bugs = { version = "0.1.0", path = "bugs" }
|
||||||
jay-logger = { version = "0.1.0", path = "logger" }
|
jay-logger = { version = "0.1.0", path = "logger" }
|
||||||
jay-video-types = { version = "0.1.0", path = "video-types" }
|
jay-video-types = { version = "0.1.0", path = "video-types" }
|
||||||
|
jay-output-types = { version = "0.1.0", path = "output-types" }
|
||||||
jay-input-types = { version = "0.1.0", path = "input-types" }
|
jay-input-types = { version = "0.1.0", path = "input-types" }
|
||||||
jay-keyboard = { version = "0.1.0", path = "keyboard" }
|
jay-keyboard = { version = "0.1.0", path = "keyboard" }
|
||||||
jay-gfx-types = { version = "0.1.0", path = "gfx-types" }
|
jay-gfx-types = { version = "0.1.0", path = "gfx-types" }
|
||||||
|
|
|
||||||
10
output-types/Cargo.toml
Normal file
10
output-types/Cargo.toml
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
[package]
|
||||||
|
name = "jay-output-types"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
license = "GPL-3.0-only"
|
||||||
|
description = "Output identity types for the Jay compositor"
|
||||||
|
repository = "https://github.com/mahkoh/jay"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
blake3 = "1.8.2"
|
||||||
77
output-types/src/lib.rs
Normal file
77
output-types/src/lib.rs
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
use {
|
||||||
|
std::{
|
||||||
|
hash::{Hash, Hasher},
|
||||||
|
rc::Rc,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
|
||||||
|
pub struct OutputIdHash(pub [u8; 32]);
|
||||||
|
|
||||||
|
impl OutputIdHash {
|
||||||
|
pub fn hash(t: impl AsRef<[u8]>) -> Self {
|
||||||
|
Self(*blake3::hash(t.as_ref()).as_bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, Debug)]
|
||||||
|
pub struct OutputId {
|
||||||
|
pub _connector: Option<String>,
|
||||||
|
pub manufacturer: String,
|
||||||
|
pub model: String,
|
||||||
|
pub serial_number: String,
|
||||||
|
pub hash: OutputIdHash,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq for OutputId {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.hash == other.hash
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Hash for OutputId {
|
||||||
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
self.hash.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OutputId {
|
||||||
|
pub fn new(
|
||||||
|
connector: impl Into<String>,
|
||||||
|
manufacturer: impl Into<String>,
|
||||||
|
model: impl Into<String>,
|
||||||
|
serial_number: impl Into<String>,
|
||||||
|
) -> Rc<Self> {
|
||||||
|
let connector = connector.into();
|
||||||
|
let manufacturer = manufacturer.into();
|
||||||
|
let model = model.into();
|
||||||
|
let serial_number = serial_number.into();
|
||||||
|
Self::new_(connector, manufacturer, model, serial_number)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_(
|
||||||
|
connector: String,
|
||||||
|
manufacturer: String,
|
||||||
|
model: String,
|
||||||
|
serial_number: String,
|
||||||
|
) -> Rc<Self> {
|
||||||
|
let connector = serial_number.is_empty().then_some(connector);
|
||||||
|
let mut hasher = blake3::Hasher::new();
|
||||||
|
hasher.update(&[connector.is_some() as u8]);
|
||||||
|
let mut hash = |s: &str| {
|
||||||
|
hasher.update(&(s.len() as u64).to_le_bytes());
|
||||||
|
hasher.update(s.as_bytes());
|
||||||
|
};
|
||||||
|
connector.as_deref().map(&mut hash);
|
||||||
|
hash(&manufacturer);
|
||||||
|
hash(&model);
|
||||||
|
hash(&serial_number);
|
||||||
|
Rc::new(Self {
|
||||||
|
_connector: connector,
|
||||||
|
manufacturer,
|
||||||
|
model,
|
||||||
|
serial_number,
|
||||||
|
hash: OutputIdHash(*hasher.finalize().as_bytes()),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,7 +10,6 @@ use {
|
||||||
fixed::Fixed,
|
fixed::Fixed,
|
||||||
format::Format,
|
format::Format,
|
||||||
gfx_api::{FdSync, GfxApi, GfxFramebuffer},
|
gfx_api::{FdSync, GfxApi, GfxFramebuffer},
|
||||||
ifs::wl_output::OutputId,
|
|
||||||
libinput::consts::DeviceCapability,
|
libinput::consts::DeviceCapability,
|
||||||
utils::static_text::StaticText,
|
utils::static_text::StaticText,
|
||||||
video::drm::{
|
video::drm::{
|
||||||
|
|
@ -33,6 +32,8 @@ use {
|
||||||
|
|
||||||
pub mod transaction;
|
pub mod transaction;
|
||||||
|
|
||||||
|
pub use jay_output_types::OutputId;
|
||||||
|
|
||||||
pub use jay_input_types::{
|
pub use jay_input_types::{
|
||||||
AXIS_120, AxisSource, ButtonState, InputDeviceAccelProfile, InputDeviceClickMethod,
|
AXIS_120, AxisSource, ButtonState, InputDeviceAccelProfile, InputDeviceClickMethod,
|
||||||
InputDeviceGroupId, InputDeviceGroupIds, KeyState, Leds, PadButtonState, ScrollAxis, TabletId,
|
InputDeviceGroupId, InputDeviceGroupIds, KeyState, Leds, PadButtonState, ScrollAxis, TabletId,
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ use {
|
||||||
backend::{
|
backend::{
|
||||||
Backend, ButtonState, InputDevice, InputDeviceAccelProfile, InputDeviceCapability,
|
Backend, ButtonState, InputDevice, InputDeviceAccelProfile, InputDeviceCapability,
|
||||||
InputDeviceClickMethod, InputDeviceGroupId, InputDeviceId, InputEvent, KeyState, Leds,
|
InputDeviceClickMethod, InputDeviceGroupId, InputDeviceId, InputEvent, KeyState, Leds,
|
||||||
TabletId, TabletInit, TabletPadGroupInit, TabletPadId, TabletPadInit, TransformMatrix,
|
OutputId, TabletId, TabletInit, TabletPadGroupInit, TabletPadId, TabletPadInit,
|
||||||
transaction::BackendConnectorTransactionError,
|
TransformMatrix, transaction::BackendConnectorTransactionError,
|
||||||
},
|
},
|
||||||
backends::metal::{
|
backends::metal::{
|
||||||
allocator::{RenderBufferError, ScanoutBufferError, ScanoutBufferErrors},
|
allocator::{RenderBufferError, ScanoutBufferError, ScanoutBufferErrors},
|
||||||
|
|
@ -24,7 +24,6 @@ use {
|
||||||
dbus::{DbusError, SignalHandler},
|
dbus::{DbusError, SignalHandler},
|
||||||
drm_feedback::DrmFeedback,
|
drm_feedback::DrmFeedback,
|
||||||
gfx_api::{GfxError, SyncFile},
|
gfx_api::{GfxError, SyncFile},
|
||||||
ifs::wl_output::OutputId,
|
|
||||||
libinput::{
|
libinput::{
|
||||||
LibInput, LibInputAdapter, LibInputError,
|
LibInput, LibInputAdapter, LibInputError,
|
||||||
consts::{
|
consts::{
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use {
|
||||||
BackendDrmLessee, BackendEotfs, BackendEvent, BackendGammaLut, BackendGammaLutElement,
|
BackendDrmLessee, BackendEotfs, BackendEvent, BackendGammaLut, BackendGammaLutElement,
|
||||||
BackendLuminance, CONCAP_CONNECTOR, CONCAP_MODE_SETTING, CONCAP_PHYSICAL_DISPLAY,
|
BackendLuminance, CONCAP_CONNECTOR, CONCAP_MODE_SETTING, CONCAP_PHYSICAL_DISPLAY,
|
||||||
Connector, ConnectorCaps, ConnectorEvent, ConnectorId, ConnectorKernelId, DrmDeviceId,
|
Connector, ConnectorCaps, ConnectorEvent, ConnectorId, ConnectorKernelId, DrmDeviceId,
|
||||||
HardwareCursor, HardwareCursorUpdate, Mode, MonitorInfo,
|
HardwareCursor, HardwareCursorUpdate, Mode, MonitorInfo, OutputId,
|
||||||
transaction::{
|
transaction::{
|
||||||
BackendConnectorTransaction, BackendConnectorTransactionError,
|
BackendConnectorTransaction, BackendConnectorTransactionError,
|
||||||
BackendConnectorTransactionType, BackendConnectorTransactionTypeDyn,
|
BackendConnectorTransactionType, BackendConnectorTransactionTypeDyn,
|
||||||
|
|
@ -27,10 +27,7 @@ use {
|
||||||
edid::{CtaDataBlock, Descriptor, EdidExtension},
|
edid::{CtaDataBlock, Descriptor, EdidExtension},
|
||||||
format::{Format, XRGB8888},
|
format::{Format, XRGB8888},
|
||||||
gfx_api::{FdSync, GfxApi, GfxContext, GfxFramebuffer},
|
gfx_api::{FdSync, GfxApi, GfxContext, GfxFramebuffer},
|
||||||
ifs::{
|
ifs::wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC, KIND_ZERO_COPY},
|
||||||
wl_output::OutputId,
|
|
||||||
wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC, KIND_ZERO_COPY},
|
|
||||||
},
|
|
||||||
state::State,
|
state::State,
|
||||||
tree::OutputNode,
|
tree::OutputNode,
|
||||||
udev::UdevDevice,
|
udev::UdevDevice,
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use {
|
||||||
ButtonState, Connector, ConnectorEvent, ConnectorId, ConnectorKernelId, DrmDeviceId,
|
ButtonState, Connector, ConnectorEvent, ConnectorId, ConnectorKernelId, DrmDeviceId,
|
||||||
DrmEvent, InputDevice, InputDeviceAccelProfile, InputDeviceCapability,
|
DrmEvent, InputDevice, InputDeviceAccelProfile, InputDeviceCapability,
|
||||||
InputDeviceClickMethod, InputDeviceId, InputEvent, KeyState, Mode, MonitorInfo,
|
InputDeviceClickMethod, InputDeviceId, InputEvent, KeyState, Mode, MonitorInfo,
|
||||||
ScrollAxis, TransformMatrix,
|
OutputId, ScrollAxis, TransformMatrix,
|
||||||
transaction::{
|
transaction::{
|
||||||
BackendAppliedConnectorTransaction, BackendConnectorTransaction,
|
BackendAppliedConnectorTransaction, BackendConnectorTransaction,
|
||||||
BackendConnectorTransactionError, BackendConnectorTransactionType,
|
BackendConnectorTransactionError, BackendConnectorTransactionType,
|
||||||
|
|
@ -20,7 +20,6 @@ use {
|
||||||
gfx_api::{
|
gfx_api::{
|
||||||
AcquireSync, GfxApi, GfxContext, GfxError, GfxFramebuffer, GfxTexture, ReleaseSync,
|
AcquireSync, GfxApi, GfxContext, GfxError, GfxFramebuffer, GfxTexture, ReleaseSync,
|
||||||
},
|
},
|
||||||
ifs::wl_output::OutputId,
|
|
||||||
state::State,
|
state::State,
|
||||||
time::Time,
|
time::Time,
|
||||||
utils::{
|
utils::{
|
||||||
|
|
|
||||||
|
|
@ -33,12 +33,13 @@ use {
|
||||||
std::{
|
std::{
|
||||||
cell::{Cell, RefCell},
|
cell::{Cell, RefCell},
|
||||||
collections::hash_map::Entry,
|
collections::hash_map::Entry,
|
||||||
hash::{Hash, Hasher},
|
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
},
|
},
|
||||||
thiserror::Error,
|
thiserror::Error,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub use jay_output_types::OutputId;
|
||||||
|
|
||||||
const SP_UNKNOWN: i32 = 0;
|
const SP_UNKNOWN: i32 = 0;
|
||||||
#[expect(dead_code)]
|
#[expect(dead_code)]
|
||||||
const SP_NONE: i32 = 1;
|
const SP_NONE: i32 = 1;
|
||||||
|
|
@ -173,70 +174,6 @@ impl Default for PersistentOutputState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Eq, Debug)]
|
|
||||||
pub struct OutputId {
|
|
||||||
pub _connector: Option<String>,
|
|
||||||
pub manufacturer: String,
|
|
||||||
pub model: String,
|
|
||||||
pub serial_number: String,
|
|
||||||
pub hash: OutputIdHash,
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_type!(OutputIdHash);
|
|
||||||
|
|
||||||
impl PartialEq for OutputId {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
self.hash == other.hash
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Hash for OutputId {
|
|
||||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
|
||||||
self.hash.hash(state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl OutputId {
|
|
||||||
pub fn new(
|
|
||||||
connector: impl Into<String>,
|
|
||||||
manufacturer: impl Into<String>,
|
|
||||||
model: impl Into<String>,
|
|
||||||
serial_number: impl Into<String>,
|
|
||||||
) -> Rc<Self> {
|
|
||||||
let connector = connector.into();
|
|
||||||
let manufacturer = manufacturer.into();
|
|
||||||
let model = model.into();
|
|
||||||
let serial_number = serial_number.into();
|
|
||||||
Self::new_(connector, manufacturer, model, serial_number)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn new_(
|
|
||||||
connector: String,
|
|
||||||
manufacturer: String,
|
|
||||||
model: String,
|
|
||||||
serial_number: String,
|
|
||||||
) -> Rc<Self> {
|
|
||||||
let connector = serial_number.is_empty().then_some(connector);
|
|
||||||
let mut hasher = blake3::Hasher::new();
|
|
||||||
hasher.update(&[connector.is_some() as u8]);
|
|
||||||
let mut hash = |s: &str| {
|
|
||||||
hasher.update(&(s.len() as u64).to_le_bytes());
|
|
||||||
hasher.update(s.as_bytes());
|
|
||||||
};
|
|
||||||
connector.as_deref().map(&mut hash);
|
|
||||||
hash(&manufacturer);
|
|
||||||
hash(&model);
|
|
||||||
hash(&serial_number);
|
|
||||||
Rc::new(Self {
|
|
||||||
_connector: connector,
|
|
||||||
manufacturer,
|
|
||||||
model,
|
|
||||||
serial_number,
|
|
||||||
hash: OutputIdHash(*hasher.finalize().as_bytes()),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl WlOutputGlobal {
|
impl WlOutputGlobal {
|
||||||
pub fn clear(&self) {
|
pub fn clear(&self) {
|
||||||
self.opt.clear();
|
self.opt.clear();
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use {
|
||||||
AxisSource, Backend, BackendConnectorState, BackendEvent, ButtonState, Connector,
|
AxisSource, Backend, BackendConnectorState, BackendEvent, ButtonState, Connector,
|
||||||
ConnectorEvent, ConnectorId, ConnectorKernelId, DrmDeviceId, InputDevice,
|
ConnectorEvent, ConnectorId, ConnectorKernelId, DrmDeviceId, InputDevice,
|
||||||
InputDeviceAccelProfile, InputDeviceCapability, InputDeviceClickMethod, InputDeviceId,
|
InputDeviceAccelProfile, InputDeviceCapability, InputDeviceClickMethod, InputDeviceId,
|
||||||
InputEvent, KeyState, Mode, MonitorInfo, ScrollAxis, TransformMatrix,
|
InputEvent, KeyState, Mode, MonitorInfo, OutputId, ScrollAxis, TransformMatrix,
|
||||||
transaction::{
|
transaction::{
|
||||||
BackendAppliedConnectorTransaction, BackendConnectorTransaction,
|
BackendAppliedConnectorTransaction, BackendConnectorTransaction,
|
||||||
BackendConnectorTransactionError, BackendConnectorTransactionType,
|
BackendConnectorTransactionError, BackendConnectorTransactionType,
|
||||||
|
|
@ -20,7 +20,6 @@ use {
|
||||||
format::XRGB8888,
|
format::XRGB8888,
|
||||||
gfx_api::GfxError,
|
gfx_api::GfxError,
|
||||||
gfx_apis::create_vulkan_allocator,
|
gfx_apis::create_vulkan_allocator,
|
||||||
ifs::wl_output::OutputId,
|
|
||||||
it::{
|
it::{
|
||||||
test_error::TestResult, test_gfx_api::TestGfxCtx, test_utils::test_expected_event::TEEH,
|
test_error::TestResult, test_gfx_api::TestGfxCtx, test_utils::test_expected_event::TEEH,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ use {
|
||||||
crate::{
|
crate::{
|
||||||
backend::{
|
backend::{
|
||||||
BackendConnectorState, BackendEvent, ConnectorEvent, ConnectorKernelId, MonitorInfo,
|
BackendConnectorState, BackendEvent, ConnectorEvent, ConnectorKernelId, MonitorInfo,
|
||||||
|
OutputId,
|
||||||
},
|
},
|
||||||
cmm::cmm_primaries::Primaries,
|
cmm::cmm_primaries::Primaries,
|
||||||
format::XRGB8888,
|
format::XRGB8888,
|
||||||
ifs::wl_output::OutputId,
|
|
||||||
it::{test_backend::TestConnector, test_error::TestResult, testrun::TestRun},
|
it::{test_backend::TestConnector, test_error::TestResult, testrun::TestRun},
|
||||||
utils::numcell::NumCell,
|
utils::numcell::NumCell,
|
||||||
video::drm::ConnectorType,
|
video::drm::ConnectorType,
|
||||||
|
|
|
||||||
|
|
@ -830,35 +830,3 @@ macro_rules! opaque {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! hash_type {
|
|
||||||
($name:ident) => {
|
|
||||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
|
|
||||||
pub struct $name(pub [u8; 32]);
|
|
||||||
|
|
||||||
impl $name {
|
|
||||||
#[allow(clippy::allow_attributes, dead_code)]
|
|
||||||
pub fn hash(t: impl AsRef<[u8]>) -> Self {
|
|
||||||
Self(*blake3::hash(t.as_ref()).as_bytes())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl serde::Serialize for $name {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: serde::Serializer,
|
|
||||||
{
|
|
||||||
self.0.serialize(serializer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> serde::Deserialize<'de> for $name {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: serde::Deserializer<'de>,
|
|
||||||
{
|
|
||||||
<[u8; 32]>::deserialize(deserializer).map(Self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use {
|
||||||
async_engine::{Phase, SpawnedFuture},
|
async_engine::{Phase, SpawnedFuture},
|
||||||
backend::{
|
backend::{
|
||||||
BackendConnectorState, Connector, ConnectorEvent, ConnectorId, ConnectorKernelId,
|
BackendConnectorState, Connector, ConnectorEvent, ConnectorId, ConnectorKernelId,
|
||||||
DrmDeviceId, HardwareCursor, HardwareCursorUpdate, Mode, MonitorInfo,
|
DrmDeviceId, HardwareCursor, HardwareCursorUpdate, Mode, MonitorInfo, OutputId,
|
||||||
transaction::{
|
transaction::{
|
||||||
BackendAppliedConnectorTransaction, BackendConnectorTransaction,
|
BackendAppliedConnectorTransaction, BackendConnectorTransaction,
|
||||||
BackendConnectorTransactionError, BackendConnectorTransactionType,
|
BackendConnectorTransactionError, BackendConnectorTransactionType,
|
||||||
|
|
@ -18,7 +18,7 @@ use {
|
||||||
GfxError, GfxFramebuffer, GfxRenderPass, GfxTexture, ReleaseSync, create_render_pass,
|
GfxError, GfxFramebuffer, GfxRenderPass, GfxTexture, ReleaseSync, create_render_pass,
|
||||||
},
|
},
|
||||||
ifs::{
|
ifs::{
|
||||||
wl_output::{BlendSpace, OutputId},
|
wl_output::BlendSpace,
|
||||||
wp_presentation_feedback::{
|
wp_presentation_feedback::{
|
||||||
KIND_HW_CLOCK, KIND_HW_COMPLETION, KIND_VSYNC, KIND_ZERO_COPY,
|
KIND_HW_CLOCK, KIND_HW_COMPLETION, KIND_VSYNC, KIND_ZERO_COPY,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue