Skip to content

Commit 0c23494

Browse files
hoshinolinajannau
authored andcommitted
drm/asahi: queue/render,compute: Plumb through timestamps extension
Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent d56f299 commit 0c23494

2 files changed

Lines changed: 89 additions & 0 deletions

File tree

drivers/gpu/drm/asahi/queue/compute.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,54 @@ impl super::QueueInner::ver {
7777

7878
let mut user_timestamps: fw::job::UserTimestamps = Default::default();
7979

80+
let mut ext_ptr = cmdbuf.extensions;
81+
while ext_ptr != 0 {
82+
let ext_type = u32::from_ne_bytes(
83+
unsafe { UserSlicePtr::new(ext_ptr as usize as *mut _, 4) }
84+
.read_all()?
85+
.try_into()
86+
.or(Err(EINVAL))?,
87+
);
88+
89+
match ext_type {
90+
uapi::ASAHI_COMPUTE_EXT_TIMESTAMPS => {
91+
let mut ext_user_timestamps: uapi::drm_asahi_cmd_compute_user_timestamps =
92+
Default::default();
93+
94+
let mut ext_reader = unsafe {
95+
UserSlicePtr::new(
96+
ext_ptr as usize as *mut _,
97+
core::mem::size_of::<uapi::drm_asahi_cmd_compute_user_timestamps>(),
98+
)
99+
.reader()
100+
};
101+
unsafe {
102+
ext_reader.read_raw(
103+
&mut ext_user_timestamps as *mut _ as *mut u8,
104+
core::mem::size_of::<uapi::drm_asahi_cmd_compute_user_timestamps>(),
105+
)?;
106+
}
107+
108+
user_timestamps.start = common::get_timestamp_object(
109+
objects,
110+
ext_user_timestamps.start_handle,
111+
ext_user_timestamps.start_offset,
112+
)?;
113+
user_timestamps.end = common::get_timestamp_object(
114+
objects,
115+
ext_user_timestamps.end_handle,
116+
ext_user_timestamps.end_offset,
117+
)?;
118+
119+
ext_ptr = ext_user_timestamps.next;
120+
}
121+
_ => {
122+
cls_pr_debug!(Errors, "Unknown extension {}\n", ext_type);
123+
return Err(EINVAL);
124+
}
125+
}
126+
}
127+
80128
// This sequence number increases per new client/VM? assigned to some slot,
81129
// but it's unclear *which* slot...
82130
let slot_client_seq: u8 = (self.id & 0xff) as u8;

drivers/gpu/drm/asahi/queue/render.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,47 @@ impl super::QueueInner::ver {
311311

312312
ext_ptr = unks.next;
313313
}
314+
uapi::ASAHI_RENDER_EXT_TIMESTAMPS => {
315+
let mut ext_user_timestamps: uapi::drm_asahi_cmd_render_user_timestamps =
316+
Default::default();
317+
318+
let mut ext_reader = unsafe {
319+
UserSlicePtr::new(
320+
ext_ptr as usize as *mut _,
321+
core::mem::size_of::<uapi::drm_asahi_cmd_render_user_timestamps>(),
322+
)
323+
.reader()
324+
};
325+
unsafe {
326+
ext_reader.read_raw(
327+
&mut ext_user_timestamps as *mut _ as *mut u8,
328+
core::mem::size_of::<uapi::drm_asahi_cmd_render_user_timestamps>(),
329+
)?;
330+
}
331+
332+
vtx_user_timestamps.start = common::get_timestamp_object(
333+
objects,
334+
ext_user_timestamps.vtx_start_handle,
335+
ext_user_timestamps.vtx_start_offset,
336+
)?;
337+
vtx_user_timestamps.end = common::get_timestamp_object(
338+
objects,
339+
ext_user_timestamps.vtx_end_handle,
340+
ext_user_timestamps.vtx_end_offset,
341+
)?;
342+
frg_user_timestamps.start = common::get_timestamp_object(
343+
objects,
344+
ext_user_timestamps.frg_start_handle,
345+
ext_user_timestamps.frg_start_offset,
346+
)?;
347+
frg_user_timestamps.end = common::get_timestamp_object(
348+
objects,
349+
ext_user_timestamps.frg_end_handle,
350+
ext_user_timestamps.frg_end_offset,
351+
)?;
352+
353+
ext_ptr = ext_user_timestamps.next;
354+
}
314355
_ => {
315356
cls_pr_debug!(Errors, "Unknown extension {}\n", ext_type);
316357
return Err(EINVAL);

0 commit comments

Comments
 (0)