feat(render): expose completed frame readback
Docs Deploy / Build and Deploy MkDocs (push) Successful in 33s

This commit is contained in:
Valentin Popov committed 2026-10-18 12:04:09 +04:00
1 parent e98876e4c3
commit e7b02c879a
2 files changed
+31 -3

No files matched your search

@@ -1252,6 +1252,34 @@ impl VulkanSmokeRenderer {
self.shutdown_inner()
}
/// Returns the latest submitted frame using the existing optional readback copy.
///
/// This synchronizes the device before mapping the host-coherent buffer, so
/// callers should use it only for bounded diagnostic captures.
pub fn readback_last_submitted_frame(
&self,
) -> Result<Option<VulkanReadbackArtifact>, VulkanSmokeRendererError> {
let device = self.device_ref()?;
// SAFETY: The renderer owns this device and all submitted work; idling
// prevents the last readback transfer from racing the host buffer map.
unsafe { device.device().device_wait_idle() }.map_err(|error| {
VulkanSmokeRendererError::VulkanOperation {
context: "vkDeviceWaitIdle(readback frame)",
result: error,
}
})?;
let Some(bytes) = self.completed_readback(device)? else {
return Ok(None);
};
let format = self.swapchain_ref()?.report.plan.format.format;
Ok(Some(VulkanReadbackArtifact {
format,
width: self.report.swapchain_extent.0,
height: self.report.swapchain_extent.1,
bytes,
}))
}
/// Requests swapchain recreation for a new drawable extent.
pub fn request_resize(&mut self, extent: (u32, u32)) {
self.pending_extent = Some(extent);
@@ -1295,7 +1295,7 @@ pub struct VulkanValidationReport {
pub vuids: Vec<String>,
}
/// CPU-owned copy of the final completed swapchain image readback.
/// CPU-owned copy of a completed swapchain image readback.
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct VulkanReadbackArtifact {
/// Vulkan swapchain format as a raw enum value.
@@ -1304,8 +1304,8 @@ pub struct VulkanReadbackArtifact {
pub width: u32,
/// Height of each image in pixels.
pub height: u32,
/// One raw four-byte-per-pixel image: the last successfully submitted
/// swapchain image before synchronized teardown.
/// One raw four-byte-per-pixel image from the last successfully submitted
/// swapchain image at the synchronization point.
pub bytes: Vec<u8>,
}