pub struct DumbBuffer { /* private fields */ }
Implementations§
Source§impl DumbBuffer
impl DumbBuffer
pub fn buffer(&self) -> &[u8] ⓘ
Sourcepub fn buffer_mut(&mut self) -> &mut [u8] ⓘ
pub fn buffer_mut(&mut self) -> &mut [u8] ⓘ
Examples found in repository?
examples/modesetting.rs (line 72)
57fn display_demo(card: &mut Card) -> Result<(), Error> {
58 let mut outputs = prepare_outputs(&card)?;
59 for output in &mut outputs {
60 println!("preparing output {output:#?}");
61 let conn = card.connector_state(output.conn_id)?;
62
63 let mode = &output.mode;
64 let mode_name = String::from_utf8_lossy(&mode.name);
65 println!(
66 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
67 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
68 );
69
70 let rows = output.db.height() as usize;
71 let pitch = output.db.pitch() as usize;
72 let data = output.db.buffer_mut();
73 for i in 0..rows {
74 if (i % 8) > 3 {
75 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
76 row.fill(0xff);
77 }
78 }
79
80 println!(
81 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connection {:?}",
82 output.crtc_id,
83 output.db.framebuffer_id(),
84 conn.id
85 );
86 card.set_crtc_dumb_buffer(output.crtc_id, &output.db, mode, &[output.conn_id])?;
87 card.crtc_page_flip_dumb_buffer(output.crtc_id, &output.db, PageFlipFlags::EVENT)?;
88 }
89
90 let mut evt_buf = vec![0_u8; 1024];
91 loop {
92 println!("waiting for events (send SIGINT to exit)");
93 for evt in card.read_events(&mut evt_buf)? {
94 println!("event {evt:?}");
95 match evt {
96 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
97 // In a real program this would be a time place to draw the next frame
98 // for the reported crtc.
99 }
100 _ => {
101 // Ignore any unrecognized event types.
102 }
103 }
104 }
105 }
106}
More examples
examples/modesetting-atomic.rs (line 77)
60fn display_demo(card: &mut Card) -> Result<(), Error> {
61 let mut outputs = prepare_outputs(&card)?;
62 let mut req = linux_drm::modeset::AtomicRequest::new();
63
64 for output in &mut outputs {
65 println!("preparing output {output:#?}");
66 let conn = card.connector_state(output.conn_id)?;
67
68 let mode = &output.mode;
69 let mode_name = String::from_utf8_lossy(&mode.name);
70 println!(
71 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
72 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
73 );
74
75 let rows = output.db.height() as usize;
76 let pitch = output.db.pitch() as usize;
77 let data = output.db.buffer_mut();
78 for i in 0..rows {
79 if (i % 8) > 3 {
80 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
81 row.fill(0xff);
82 }
83 }
84
85 println!(
86 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connector {:?}",
87 output.crtc_id,
88 output.db.framebuffer_id(),
89 conn.id
90 );
91
92 req.set_property(
93 ObjectId::Connector(output.conn_id),
94 output.conn_prop_ids.crtc_id,
95 output.crtc_id,
96 );
97 req.set_property(
98 ObjectId::Crtc(output.crtc_id),
99 output.crtc_prop_ids.active,
100 true,
101 );
102 req.set_property(
103 ObjectId::Plane(output.plane_id),
104 output.plane_prop_ids.fb_id,
105 output.db.framebuffer_id(),
106 );
107 req.set_property(
108 ObjectId::Plane(output.plane_id),
109 output.plane_prop_ids.crtc_id,
110 output.crtc_id,
111 );
112 req.set_property(
113 ObjectId::Plane(output.plane_id),
114 output.plane_prop_ids.crtc_x,
115 0,
116 );
117 req.set_property(
118 ObjectId::Plane(output.plane_id),
119 output.plane_prop_ids.crtc_y,
120 0,
121 );
122 req.set_property(
123 ObjectId::Plane(output.plane_id),
124 output.plane_prop_ids.crtc_w,
125 output.db.width(),
126 );
127 req.set_property(
128 ObjectId::Plane(output.plane_id),
129 output.plane_prop_ids.crtc_h,
130 output.db.height(),
131 );
132 req.set_property(
133 ObjectId::Plane(output.plane_id),
134 output.plane_prop_ids.src_x,
135 0,
136 );
137 req.set_property(
138 ObjectId::Plane(output.plane_id),
139 output.plane_prop_ids.src_y,
140 0,
141 );
142 req.set_property(
143 ObjectId::Plane(output.plane_id),
144 output.plane_prop_ids.src_w,
145 (output.db.width() as u64) << 16,
146 );
147 req.set_property(
148 ObjectId::Plane(output.plane_id),
149 output.plane_prop_ids.src_h,
150 (output.db.height() as u64) << 16,
151 );
152 }
153
154 println!("atomic commit {req:#?}");
155 card.atomic_commit(
156 &req,
157 AtomicCommitFlags::ALLOW_MODESET | AtomicCommitFlags::PAGE_FLIP_EVENT,
158 0,
159 )?;
160
161 let mut evt_buf = vec![0_u8; 1024];
162 loop {
163 println!("waiting for events (send SIGINT to exit)");
164 for evt in card.read_events(&mut evt_buf)? {
165 println!("event {evt:?}");
166 match evt {
167 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
168 // In a real program this would be a time place to draw the next frame
169 // for the reported crtc.
170 }
171 _ => {
172 // Ignore any unrecognized event types.
173 }
174 }
175 }
176 }
177}
Sourcepub fn width(&self) -> u32
pub fn width(&self) -> u32
Examples found in repository?
examples/modesetting-atomic.rs (line 125)
60fn display_demo(card: &mut Card) -> Result<(), Error> {
61 let mut outputs = prepare_outputs(&card)?;
62 let mut req = linux_drm::modeset::AtomicRequest::new();
63
64 for output in &mut outputs {
65 println!("preparing output {output:#?}");
66 let conn = card.connector_state(output.conn_id)?;
67
68 let mode = &output.mode;
69 let mode_name = String::from_utf8_lossy(&mode.name);
70 println!(
71 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
72 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
73 );
74
75 let rows = output.db.height() as usize;
76 let pitch = output.db.pitch() as usize;
77 let data = output.db.buffer_mut();
78 for i in 0..rows {
79 if (i % 8) > 3 {
80 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
81 row.fill(0xff);
82 }
83 }
84
85 println!(
86 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connector {:?}",
87 output.crtc_id,
88 output.db.framebuffer_id(),
89 conn.id
90 );
91
92 req.set_property(
93 ObjectId::Connector(output.conn_id),
94 output.conn_prop_ids.crtc_id,
95 output.crtc_id,
96 );
97 req.set_property(
98 ObjectId::Crtc(output.crtc_id),
99 output.crtc_prop_ids.active,
100 true,
101 );
102 req.set_property(
103 ObjectId::Plane(output.plane_id),
104 output.plane_prop_ids.fb_id,
105 output.db.framebuffer_id(),
106 );
107 req.set_property(
108 ObjectId::Plane(output.plane_id),
109 output.plane_prop_ids.crtc_id,
110 output.crtc_id,
111 );
112 req.set_property(
113 ObjectId::Plane(output.plane_id),
114 output.plane_prop_ids.crtc_x,
115 0,
116 );
117 req.set_property(
118 ObjectId::Plane(output.plane_id),
119 output.plane_prop_ids.crtc_y,
120 0,
121 );
122 req.set_property(
123 ObjectId::Plane(output.plane_id),
124 output.plane_prop_ids.crtc_w,
125 output.db.width(),
126 );
127 req.set_property(
128 ObjectId::Plane(output.plane_id),
129 output.plane_prop_ids.crtc_h,
130 output.db.height(),
131 );
132 req.set_property(
133 ObjectId::Plane(output.plane_id),
134 output.plane_prop_ids.src_x,
135 0,
136 );
137 req.set_property(
138 ObjectId::Plane(output.plane_id),
139 output.plane_prop_ids.src_y,
140 0,
141 );
142 req.set_property(
143 ObjectId::Plane(output.plane_id),
144 output.plane_prop_ids.src_w,
145 (output.db.width() as u64) << 16,
146 );
147 req.set_property(
148 ObjectId::Plane(output.plane_id),
149 output.plane_prop_ids.src_h,
150 (output.db.height() as u64) << 16,
151 );
152 }
153
154 println!("atomic commit {req:#?}");
155 card.atomic_commit(
156 &req,
157 AtomicCommitFlags::ALLOW_MODESET | AtomicCommitFlags::PAGE_FLIP_EVENT,
158 0,
159 )?;
160
161 let mut evt_buf = vec![0_u8; 1024];
162 loop {
163 println!("waiting for events (send SIGINT to exit)");
164 for evt in card.read_events(&mut evt_buf)? {
165 println!("event {evt:?}");
166 match evt {
167 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
168 // In a real program this would be a time place to draw the next frame
169 // for the reported crtc.
170 }
171 _ => {
172 // Ignore any unrecognized event types.
173 }
174 }
175 }
176 }
177}
Sourcepub fn height(&self) -> u32
pub fn height(&self) -> u32
Examples found in repository?
examples/modesetting.rs (line 70)
57fn display_demo(card: &mut Card) -> Result<(), Error> {
58 let mut outputs = prepare_outputs(&card)?;
59 for output in &mut outputs {
60 println!("preparing output {output:#?}");
61 let conn = card.connector_state(output.conn_id)?;
62
63 let mode = &output.mode;
64 let mode_name = String::from_utf8_lossy(&mode.name);
65 println!(
66 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
67 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
68 );
69
70 let rows = output.db.height() as usize;
71 let pitch = output.db.pitch() as usize;
72 let data = output.db.buffer_mut();
73 for i in 0..rows {
74 if (i % 8) > 3 {
75 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
76 row.fill(0xff);
77 }
78 }
79
80 println!(
81 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connection {:?}",
82 output.crtc_id,
83 output.db.framebuffer_id(),
84 conn.id
85 );
86 card.set_crtc_dumb_buffer(output.crtc_id, &output.db, mode, &[output.conn_id])?;
87 card.crtc_page_flip_dumb_buffer(output.crtc_id, &output.db, PageFlipFlags::EVENT)?;
88 }
89
90 let mut evt_buf = vec![0_u8; 1024];
91 loop {
92 println!("waiting for events (send SIGINT to exit)");
93 for evt in card.read_events(&mut evt_buf)? {
94 println!("event {evt:?}");
95 match evt {
96 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
97 // In a real program this would be a time place to draw the next frame
98 // for the reported crtc.
99 }
100 _ => {
101 // Ignore any unrecognized event types.
102 }
103 }
104 }
105 }
106}
More examples
examples/modesetting-atomic.rs (line 75)
60fn display_demo(card: &mut Card) -> Result<(), Error> {
61 let mut outputs = prepare_outputs(&card)?;
62 let mut req = linux_drm::modeset::AtomicRequest::new();
63
64 for output in &mut outputs {
65 println!("preparing output {output:#?}");
66 let conn = card.connector_state(output.conn_id)?;
67
68 let mode = &output.mode;
69 let mode_name = String::from_utf8_lossy(&mode.name);
70 println!(
71 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
72 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
73 );
74
75 let rows = output.db.height() as usize;
76 let pitch = output.db.pitch() as usize;
77 let data = output.db.buffer_mut();
78 for i in 0..rows {
79 if (i % 8) > 3 {
80 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
81 row.fill(0xff);
82 }
83 }
84
85 println!(
86 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connector {:?}",
87 output.crtc_id,
88 output.db.framebuffer_id(),
89 conn.id
90 );
91
92 req.set_property(
93 ObjectId::Connector(output.conn_id),
94 output.conn_prop_ids.crtc_id,
95 output.crtc_id,
96 );
97 req.set_property(
98 ObjectId::Crtc(output.crtc_id),
99 output.crtc_prop_ids.active,
100 true,
101 );
102 req.set_property(
103 ObjectId::Plane(output.plane_id),
104 output.plane_prop_ids.fb_id,
105 output.db.framebuffer_id(),
106 );
107 req.set_property(
108 ObjectId::Plane(output.plane_id),
109 output.plane_prop_ids.crtc_id,
110 output.crtc_id,
111 );
112 req.set_property(
113 ObjectId::Plane(output.plane_id),
114 output.plane_prop_ids.crtc_x,
115 0,
116 );
117 req.set_property(
118 ObjectId::Plane(output.plane_id),
119 output.plane_prop_ids.crtc_y,
120 0,
121 );
122 req.set_property(
123 ObjectId::Plane(output.plane_id),
124 output.plane_prop_ids.crtc_w,
125 output.db.width(),
126 );
127 req.set_property(
128 ObjectId::Plane(output.plane_id),
129 output.plane_prop_ids.crtc_h,
130 output.db.height(),
131 );
132 req.set_property(
133 ObjectId::Plane(output.plane_id),
134 output.plane_prop_ids.src_x,
135 0,
136 );
137 req.set_property(
138 ObjectId::Plane(output.plane_id),
139 output.plane_prop_ids.src_y,
140 0,
141 );
142 req.set_property(
143 ObjectId::Plane(output.plane_id),
144 output.plane_prop_ids.src_w,
145 (output.db.width() as u64) << 16,
146 );
147 req.set_property(
148 ObjectId::Plane(output.plane_id),
149 output.plane_prop_ids.src_h,
150 (output.db.height() as u64) << 16,
151 );
152 }
153
154 println!("atomic commit {req:#?}");
155 card.atomic_commit(
156 &req,
157 AtomicCommitFlags::ALLOW_MODESET | AtomicCommitFlags::PAGE_FLIP_EVENT,
158 0,
159 )?;
160
161 let mut evt_buf = vec![0_u8; 1024];
162 loop {
163 println!("waiting for events (send SIGINT to exit)");
164 for evt in card.read_events(&mut evt_buf)? {
165 println!("event {evt:?}");
166 match evt {
167 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
168 // In a real program this would be a time place to draw the next frame
169 // for the reported crtc.
170 }
171 _ => {
172 // Ignore any unrecognized event types.
173 }
174 }
175 }
176 }
177}
Sourcepub fn pitch(&self) -> u32
pub fn pitch(&self) -> u32
Examples found in repository?
examples/modesetting.rs (line 71)
57fn display_demo(card: &mut Card) -> Result<(), Error> {
58 let mut outputs = prepare_outputs(&card)?;
59 for output in &mut outputs {
60 println!("preparing output {output:#?}");
61 let conn = card.connector_state(output.conn_id)?;
62
63 let mode = &output.mode;
64 let mode_name = String::from_utf8_lossy(&mode.name);
65 println!(
66 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
67 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
68 );
69
70 let rows = output.db.height() as usize;
71 let pitch = output.db.pitch() as usize;
72 let data = output.db.buffer_mut();
73 for i in 0..rows {
74 if (i % 8) > 3 {
75 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
76 row.fill(0xff);
77 }
78 }
79
80 println!(
81 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connection {:?}",
82 output.crtc_id,
83 output.db.framebuffer_id(),
84 conn.id
85 );
86 card.set_crtc_dumb_buffer(output.crtc_id, &output.db, mode, &[output.conn_id])?;
87 card.crtc_page_flip_dumb_buffer(output.crtc_id, &output.db, PageFlipFlags::EVENT)?;
88 }
89
90 let mut evt_buf = vec![0_u8; 1024];
91 loop {
92 println!("waiting for events (send SIGINT to exit)");
93 for evt in card.read_events(&mut evt_buf)? {
94 println!("event {evt:?}");
95 match evt {
96 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
97 // In a real program this would be a time place to draw the next frame
98 // for the reported crtc.
99 }
100 _ => {
101 // Ignore any unrecognized event types.
102 }
103 }
104 }
105 }
106}
More examples
examples/modesetting-atomic.rs (line 76)
60fn display_demo(card: &mut Card) -> Result<(), Error> {
61 let mut outputs = prepare_outputs(&card)?;
62 let mut req = linux_drm::modeset::AtomicRequest::new();
63
64 for output in &mut outputs {
65 println!("preparing output {output:#?}");
66 let conn = card.connector_state(output.conn_id)?;
67
68 let mode = &output.mode;
69 let mode_name = String::from_utf8_lossy(&mode.name);
70 println!(
71 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
72 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
73 );
74
75 let rows = output.db.height() as usize;
76 let pitch = output.db.pitch() as usize;
77 let data = output.db.buffer_mut();
78 for i in 0..rows {
79 if (i % 8) > 3 {
80 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
81 row.fill(0xff);
82 }
83 }
84
85 println!(
86 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connector {:?}",
87 output.crtc_id,
88 output.db.framebuffer_id(),
89 conn.id
90 );
91
92 req.set_property(
93 ObjectId::Connector(output.conn_id),
94 output.conn_prop_ids.crtc_id,
95 output.crtc_id,
96 );
97 req.set_property(
98 ObjectId::Crtc(output.crtc_id),
99 output.crtc_prop_ids.active,
100 true,
101 );
102 req.set_property(
103 ObjectId::Plane(output.plane_id),
104 output.plane_prop_ids.fb_id,
105 output.db.framebuffer_id(),
106 );
107 req.set_property(
108 ObjectId::Plane(output.plane_id),
109 output.plane_prop_ids.crtc_id,
110 output.crtc_id,
111 );
112 req.set_property(
113 ObjectId::Plane(output.plane_id),
114 output.plane_prop_ids.crtc_x,
115 0,
116 );
117 req.set_property(
118 ObjectId::Plane(output.plane_id),
119 output.plane_prop_ids.crtc_y,
120 0,
121 );
122 req.set_property(
123 ObjectId::Plane(output.plane_id),
124 output.plane_prop_ids.crtc_w,
125 output.db.width(),
126 );
127 req.set_property(
128 ObjectId::Plane(output.plane_id),
129 output.plane_prop_ids.crtc_h,
130 output.db.height(),
131 );
132 req.set_property(
133 ObjectId::Plane(output.plane_id),
134 output.plane_prop_ids.src_x,
135 0,
136 );
137 req.set_property(
138 ObjectId::Plane(output.plane_id),
139 output.plane_prop_ids.src_y,
140 0,
141 );
142 req.set_property(
143 ObjectId::Plane(output.plane_id),
144 output.plane_prop_ids.src_w,
145 (output.db.width() as u64) << 16,
146 );
147 req.set_property(
148 ObjectId::Plane(output.plane_id),
149 output.plane_prop_ids.src_h,
150 (output.db.height() as u64) << 16,
151 );
152 }
153
154 println!("atomic commit {req:#?}");
155 card.atomic_commit(
156 &req,
157 AtomicCommitFlags::ALLOW_MODESET | AtomicCommitFlags::PAGE_FLIP_EVENT,
158 0,
159 )?;
160
161 let mut evt_buf = vec![0_u8; 1024];
162 loop {
163 println!("waiting for events (send SIGINT to exit)");
164 for evt in card.read_events(&mut evt_buf)? {
165 println!("event {evt:?}");
166 match evt {
167 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
168 // In a real program this would be a time place to draw the next frame
169 // for the reported crtc.
170 }
171 _ => {
172 // Ignore any unrecognized event types.
173 }
174 }
175 }
176 }
177}
pub fn bpp(&self) -> u32
Sourcepub fn framebuffer_id(&self) -> FramebufferId
pub fn framebuffer_id(&self) -> FramebufferId
Examples found in repository?
examples/modesetting.rs (line 83)
57fn display_demo(card: &mut Card) -> Result<(), Error> {
58 let mut outputs = prepare_outputs(&card)?;
59 for output in &mut outputs {
60 println!("preparing output {output:#?}");
61 let conn = card.connector_state(output.conn_id)?;
62
63 let mode = &output.mode;
64 let mode_name = String::from_utf8_lossy(&mode.name);
65 println!(
66 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
67 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
68 );
69
70 let rows = output.db.height() as usize;
71 let pitch = output.db.pitch() as usize;
72 let data = output.db.buffer_mut();
73 for i in 0..rows {
74 if (i % 8) > 3 {
75 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
76 row.fill(0xff);
77 }
78 }
79
80 println!(
81 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connection {:?}",
82 output.crtc_id,
83 output.db.framebuffer_id(),
84 conn.id
85 );
86 card.set_crtc_dumb_buffer(output.crtc_id, &output.db, mode, &[output.conn_id])?;
87 card.crtc_page_flip_dumb_buffer(output.crtc_id, &output.db, PageFlipFlags::EVENT)?;
88 }
89
90 let mut evt_buf = vec![0_u8; 1024];
91 loop {
92 println!("waiting for events (send SIGINT to exit)");
93 for evt in card.read_events(&mut evt_buf)? {
94 println!("event {evt:?}");
95 match evt {
96 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
97 // In a real program this would be a time place to draw the next frame
98 // for the reported crtc.
99 }
100 _ => {
101 // Ignore any unrecognized event types.
102 }
103 }
104 }
105 }
106}
More examples
examples/modesetting-atomic.rs (line 88)
60fn display_demo(card: &mut Card) -> Result<(), Error> {
61 let mut outputs = prepare_outputs(&card)?;
62 let mut req = linux_drm::modeset::AtomicRequest::new();
63
64 for output in &mut outputs {
65 println!("preparing output {output:#?}");
66 let conn = card.connector_state(output.conn_id)?;
67
68 let mode = &output.mode;
69 let mode_name = String::from_utf8_lossy(&mode.name);
70 println!(
71 "{:?} connector uses {mode_name} ({}x{}@{}Hz)",
72 conn.connector_type, mode.hdisplay, mode.vdisplay, mode.vrefresh,
73 );
74
75 let rows = output.db.height() as usize;
76 let pitch = output.db.pitch() as usize;
77 let data = output.db.buffer_mut();
78 for i in 0..rows {
79 if (i % 8) > 3 {
80 let row = &mut data[(i * pitch)..(i * pitch) + pitch];
81 row.fill(0xff);
82 }
83 }
84
85 println!(
86 "configuring CRTC {:?} for framebuffer {:?} and mode {mode_name} on connector {:?}",
87 output.crtc_id,
88 output.db.framebuffer_id(),
89 conn.id
90 );
91
92 req.set_property(
93 ObjectId::Connector(output.conn_id),
94 output.conn_prop_ids.crtc_id,
95 output.crtc_id,
96 );
97 req.set_property(
98 ObjectId::Crtc(output.crtc_id),
99 output.crtc_prop_ids.active,
100 true,
101 );
102 req.set_property(
103 ObjectId::Plane(output.plane_id),
104 output.plane_prop_ids.fb_id,
105 output.db.framebuffer_id(),
106 );
107 req.set_property(
108 ObjectId::Plane(output.plane_id),
109 output.plane_prop_ids.crtc_id,
110 output.crtc_id,
111 );
112 req.set_property(
113 ObjectId::Plane(output.plane_id),
114 output.plane_prop_ids.crtc_x,
115 0,
116 );
117 req.set_property(
118 ObjectId::Plane(output.plane_id),
119 output.plane_prop_ids.crtc_y,
120 0,
121 );
122 req.set_property(
123 ObjectId::Plane(output.plane_id),
124 output.plane_prop_ids.crtc_w,
125 output.db.width(),
126 );
127 req.set_property(
128 ObjectId::Plane(output.plane_id),
129 output.plane_prop_ids.crtc_h,
130 output.db.height(),
131 );
132 req.set_property(
133 ObjectId::Plane(output.plane_id),
134 output.plane_prop_ids.src_x,
135 0,
136 );
137 req.set_property(
138 ObjectId::Plane(output.plane_id),
139 output.plane_prop_ids.src_y,
140 0,
141 );
142 req.set_property(
143 ObjectId::Plane(output.plane_id),
144 output.plane_prop_ids.src_w,
145 (output.db.width() as u64) << 16,
146 );
147 req.set_property(
148 ObjectId::Plane(output.plane_id),
149 output.plane_prop_ids.src_h,
150 (output.db.height() as u64) << 16,
151 );
152 }
153
154 println!("atomic commit {req:#?}");
155 card.atomic_commit(
156 &req,
157 AtomicCommitFlags::ALLOW_MODESET | AtomicCommitFlags::PAGE_FLIP_EVENT,
158 0,
159 )?;
160
161 let mut evt_buf = vec![0_u8; 1024];
162 loop {
163 println!("waiting for events (send SIGINT to exit)");
164 for evt in card.read_events(&mut evt_buf)? {
165 println!("event {evt:?}");
166 match evt {
167 DrmEvent::Generic(GenericDrmEvent::FlipComplete(_)) => {
168 // In a real program this would be a time place to draw the next frame
169 // for the reported crtc.
170 }
171 _ => {
172 // Ignore any unrecognized event types.
173 }
174 }
175 }
176 }
177}
pub fn pixel_idx(&self, x: u32, y: u32) -> Option<usize>
pub fn clear_to_zero(&mut self)
Trait Implementations§
Source§impl Debug for DumbBuffer
impl Debug for DumbBuffer
Auto Trait Implementations§
impl Freeze for DumbBuffer
impl RefUnwindSafe for DumbBuffer
impl !Send for DumbBuffer
impl !Sync for DumbBuffer
impl Unpin for DumbBuffer
impl UnwindSafe for DumbBuffer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more