summaryrefslogtreecommitdiff
path: root/src/control/crtc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/control/crtc.rs')
-rw-r--r--src/control/crtc.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/control/crtc.rs b/src/control/crtc.rs
new file mode 100644
index 0000000..0827043
--- /dev/null
+++ b/src/control/crtc.rs
@@ -0,0 +1,90 @@
+//! # CRTC
+//!
+//! A CRTC is a display controller provided by your device. It's primary job is
+//! to take pixel data and send it to a connector with the proper resolution and
+//! frequencies.
+//!
+//! Specific CRTCs can only be attached to connectors that have an encoder it
+//! supports. For example, you can have a CRTC that can not output to analog
+//! connectors. These are built in hardware limitations.
+//!
+//! Each CRTC has a built in plane, which can have a framebuffer attached to it,
+//! but they can also use pixel data from other planes to perform hardware
+//! compositing.
+
+use crate::control;
+use drm_ffi as ffi;
+
+/// A handle to a specific CRTC
+#[repr(transparent)]
+#[derive(Copy, Clone, Hash, PartialEq, Eq)]
+pub struct Handle(control::RawResourceHandle);
+
+// Safety: Handle is repr(transparent) over NonZeroU32
+unsafe impl bytemuck::ZeroableInOption for Handle {}
+unsafe impl bytemuck::PodInOption for Handle {}
+
+impl From<Handle> for control::RawResourceHandle {
+ fn from(handle: Handle) -> Self {
+ handle.0
+ }
+}
+
+impl From<Handle> for u32 {
+ fn from(handle: Handle) -> Self {
+ handle.0.into()
+ }
+}
+
+impl From<control::RawResourceHandle> for Handle {
+ fn from(handle: control::RawResourceHandle) -> Self {
+ Handle(handle)
+ }
+}
+
+impl control::ResourceHandle for Handle {
+ const FFI_TYPE: u32 = ffi::DRM_MODE_OBJECT_CRTC;
+}
+
+impl std::fmt::Debug for Handle {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ f.debug_tuple("crtc::Handle").field(&self.0).finish()
+ }
+}
+
+/// Information about a specific CRTC
+#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
+pub struct Info {
+ pub(crate) handle: Handle,
+ pub(crate) position: (u32, u32),
+ pub(crate) mode: Option<control::Mode>,
+ pub(crate) fb: Option<control::framebuffer::Handle>,
+ pub(crate) gamma_length: u32,
+}
+
+impl Info {
+ /// Returns the handle to this CRTC.
+ pub fn handle(&self) -> Handle {
+ self.handle
+ }
+
+ /// Returns the position of the CRTC.
+ pub fn position(&self) -> (u32, u32) {
+ self.position
+ }
+
+ /// Returns the current mode of the CRTC.
+ pub fn mode(&self) -> Option<control::Mode> {
+ self.mode
+ }
+
+ /// Returns the framebuffer currently attached to this CRTC.
+ pub fn framebuffer(&self) -> Option<control::framebuffer::Handle> {
+ self.fb
+ }
+
+ /// Returns the size of the gamma LUT.
+ pub fn gamma_length(&self) -> u32 {
+ self.gamma_length
+ }
+}