diff --git a/adapters/fparkan-render-vulkan/src/ffi/smoke.rs b/adapters/fparkan-render-vulkan/src/ffi/smoke.rs index 5ddfae6..11c3377 100644 --- a/adapters/fparkan-render-vulkan/src/ffi/smoke.rs +++ b/adapters/fparkan-render-vulkan/src/ffi/smoke.rs @@ -242,6 +242,7 @@ impl VulkanSmokeRenderer { enabled_extension_count: 0, swapchain_extent: (0, 0), swapchain_image_count: 0, + swapchain_image_format: 0, swapchain_image_usage: 0, readback_copy_count: 0, readback_byte_count: 0, @@ -273,6 +274,7 @@ impl VulkanSmokeRenderer { .unwrap_or(u32::MAX), swapchain_extent: swapchain_ref.report.plan.extent, swapchain_image_count: swapchain_ref.report.image_count, + swapchain_image_format: swapchain_ref.report.plan.format.format, swapchain_image_usage: swapchain_ref.report.plan.image_usage, readback_copy_count: 0, readback_byte_count: 0, @@ -589,6 +591,7 @@ impl VulkanSmokeRenderer { self.frame_sync = frame_sync; self.report.swapchain_extent = swapchain_extent; self.report.swapchain_image_count = swapchain_image_count; + self.report.swapchain_image_format = self.swapchain_ref()?.report.plan.format.format; self.report.swapchain_image_usage = swapchain_image_usage; self.swapchain_resources = Some(resources); Ok(()) diff --git a/adapters/fparkan-render-vulkan/src/ffi/smoke_types.rs b/adapters/fparkan-render-vulkan/src/ffi/smoke_types.rs index 60f86e2..b94e460 100644 --- a/adapters/fparkan-render-vulkan/src/ffi/smoke_types.rs +++ b/adapters/fparkan-render-vulkan/src/ffi/smoke_types.rs @@ -457,6 +457,8 @@ pub struct VulkanSmokeRendererReport { pub swapchain_extent: (u32, u32), /// Current swapchain image count. pub swapchain_image_count: u32, + /// Current swapchain image format as a raw Vulkan enum value. + pub swapchain_image_format: i32, /// Current swapchain image-usage flags as raw Vulkan bits. pub swapchain_image_usage: u32, /// Number of submitted swapchain image-to-buffer copy commands. diff --git a/apps/fparkan-vulkan-smoke/src/main.rs b/apps/fparkan-vulkan-smoke/src/main.rs index 0fbd843..95a19d7 100644 --- a/apps/fparkan-vulkan-smoke/src/main.rs +++ b/apps/fparkan-vulkan-smoke/src/main.rs @@ -639,7 +639,7 @@ impl SmokeApp { let path = self .options .out - .with_file_name(format!("{stem}.readback-b8g8r8a8.raw")); + .with_file_name(format!("{stem}.readback-vkformat-{}.raw", artifact.format)); std::fs::write(&path, &artifact.bytes).map_err(|err| format!("{}: {err}", path.display())) } @@ -795,6 +795,9 @@ impl SmokeApp { vulkan_swapchain_image_count: renderer .as_ref() .map_or(0, |snapshot| snapshot.report.swapchain_image_count), + vulkan_swapchain_image_format: renderer + .as_ref() + .map_or(0, |snapshot| snapshot.report.swapchain_image_format), vulkan_swapchain_image_usage: renderer .as_ref() .map_or(0, |snapshot| snapshot.report.swapchain_image_usage), @@ -1020,6 +1023,7 @@ fn render_timeout_failure_report( vulkan_swapchain_width: 0, vulkan_swapchain_height: 0, vulkan_swapchain_image_count: 0, + vulkan_swapchain_image_format: 0, vulkan_swapchain_image_usage: 0, vulkan_readback_copy_count: 0, vulkan_readback_byte_count: 0, @@ -1244,6 +1248,7 @@ struct SmokeReport<'a> { vulkan_swapchain_width: u32, vulkan_swapchain_height: u32, vulkan_swapchain_image_count: u32, + vulkan_swapchain_image_format: i32, vulkan_swapchain_image_usage: u32, vulkan_readback_copy_count: u64, vulkan_readback_byte_count: u64, @@ -1751,6 +1756,7 @@ mod tests { vulkan_swapchain_width: 960, vulkan_swapchain_height: 540, vulkan_swapchain_image_count: 3, + vulkan_swapchain_image_format: 50, vulkan_swapchain_image_usage: 17, vulkan_readback_copy_count: 300, vulkan_readback_byte_count: 4_147_200, diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 6bc1915..3b96351 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -895,10 +895,10 @@ static viewer. Он ещё не захватывает original DirectDraw frame fixed original camera и не сравнивает два изображения, поэтому pixel-parity acceptance остаётся blocked. -Smoke также сохраняет raw artifact рядом с JSON: `.readback-b8g8r8a8.raw`. +Smoke также сохраняет raw artifact рядом с JSON: `.readback-vkformat-.raw`. Это concatenated current-swapchain images in Vulkan order, каждый с dimensions из JSON и четырьмя bytes per pixel; format намеренно указан в имени файла, -потому что bytes не перекодируются. GOG proof produced a 4,147,200-byte file +потому что bytes не перекодируются; JSON содержит actual raw enum. GOG selected `50` and produced a 4,147,200-byte file for two 960x540 images. Артефакт остаётся локальным output и не попадает в Git. `Land.msh` использует отдельный geometry-only bridge: validated `TerrainFace28`