diff --git a/adapters/fparkan-render-vulkan/src/ffi.rs b/adapters/fparkan-render-vulkan/src/ffi.rs
index eef9fc1..7b53c92 100644
--- a/adapters/fparkan-render-vulkan/src/ffi.rs
+++ b/adapters/fparkan-render-vulkan/src/ffi.rs
@@ -66,11 +66,11 @@ pub use self::runtime::{
VulkanLogicalDeviceError, VulkanLogicalDeviceProbe, VulkanLogicalDeviceReport,
};
pub use self::smoke_types::{
- VulkanSmokeBootstrapProgress, VulkanSmokeBootstrapSnapshot, VulkanSmokeFrameOutcome,
- VulkanSmokeRenderer, VulkanSmokeRendererCreateInfo, VulkanSmokeRendererError,
- VulkanSmokeRendererReport, VulkanSmokeShutdownReport, VulkanStaticDrawRange,
- VulkanStaticMaterial, VulkanStaticMesh, VulkanStaticTexture, VulkanStaticVertex,
- VulkanValidationReport,
+ VulkanReadbackArtifact, VulkanSmokeBootstrapProgress, VulkanSmokeBootstrapSnapshot,
+ VulkanSmokeFrameOutcome, VulkanSmokeRenderer, VulkanSmokeRendererCreateInfo,
+ VulkanSmokeRendererError, VulkanSmokeRendererReport, VulkanSmokeShutdownReport,
+ VulkanStaticDrawRange, VulkanStaticMaterial, VulkanStaticMesh, VulkanStaticTexture,
+ VulkanStaticVertex, VulkanValidationReport,
};
#[cfg(test)]
use self::surface::extension_name;
diff --git a/adapters/fparkan-render-vulkan/src/ffi/smoke.rs b/adapters/fparkan-render-vulkan/src/ffi/smoke.rs
index eee2f06..5ddfae6 100644
--- a/adapters/fparkan-render-vulkan/src/ffi/smoke.rs
+++ b/adapters/fparkan-render-vulkan/src/ffi/smoke.rs
@@ -10,10 +10,11 @@ use super::{
create_vulkan_logical_device_probe_for_request, create_vulkan_surface_probe,
create_vulkan_swapchain_probe_for_extent, destroy_allocated_buffer, destroy_allocated_image,
destroy_swapchain_resources, plan_vulkan_surface, readback_buffer_bytes, VulkanAllocatedBuffer,
- VulkanInstanceConfig, VulkanInstanceProbe, VulkanLogicalDeviceProbe, VulkanSmokeFrameOutcome,
- VulkanSmokeRenderer, VulkanSmokeRendererCreateInfo, VulkanSmokeRendererError,
- VulkanSmokeRendererReport, VulkanSmokeShutdownReport, VulkanSurfaceProbe, VulkanSwapchainProbe,
- VulkanSwapchainResources, VulkanValidationMessenger, VulkanValidationReport,
+ VulkanInstanceConfig, VulkanInstanceProbe, VulkanLogicalDeviceProbe, VulkanReadbackArtifact,
+ VulkanSmokeFrameOutcome, VulkanSmokeRenderer, VulkanSmokeRendererCreateInfo,
+ VulkanSmokeRendererError, VulkanSmokeRendererReport, VulkanSmokeShutdownReport,
+ VulkanSurfaceProbe, VulkanSwapchainProbe, VulkanSwapchainResources, VulkanValidationMessenger,
+ VulkanValidationReport,
};
use crate::policy::KHR_PORTABILITY_SUBSET_EXTENSION;
use crate::shader_manifest::{triangle_shader_manifest, validate_shader_manifest};
@@ -845,10 +846,18 @@ impl VulkanSmokeRenderer {
} else {
None
};
- if let Some((byte_count, hash)) = completed_readback {
- self.report.readback_byte_count = byte_count;
- self.report.readback_fnv1a64 = hash;
- }
+ let readback_artifact = completed_readback.map(|bytes| {
+ self.report.readback_byte_count = u64::try_from(bytes.len()).unwrap_or(u64::MAX);
+ self.report.readback_fnv1a64 = fnv1a64(&bytes);
+ VulkanReadbackArtifact {
+ format: self
+ .swapchain_ref()
+ .map_or(0, |swapchain| swapchain.report.plan.format.format),
+ width: self.report.swapchain_extent.0,
+ height: self.report.swapchain_extent.1,
+ bytes,
+ }
+ });
self.destroy_device_owned_resources();
let validation = take_runtime_children_with_validation_snapshot(
&mut self.surface,
@@ -862,6 +871,7 @@ impl VulkanSmokeRenderer {
self.instance.take();
Ok(VulkanSmokeShutdownReport {
renderer_report: self.report.clone(),
+ readback_artifact,
swapchain_recreate_count: self.swapchain_recreate_count,
validation,
})
@@ -870,7 +880,7 @@ impl VulkanSmokeRenderer {
fn completed_readback(
&self,
device: &VulkanLogicalDeviceProbe,
- ) -> Result