refactor(vulkan-plan): clarify planning backend telemetry

This commit is contained in:
2026-06-25 05:06:13 +04:00
parent ec6645a21f
commit 6a6393038e
2 changed files with 15 additions and 22 deletions
+13 -20
View File
@@ -42,8 +42,6 @@ use std::ffi::{CStr, CString};
use std::os::raw::c_char; use std::os::raw::c_char;
use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::atomic::{AtomicU32, Ordering};
use std::sync::Mutex; use std::sync::Mutex;
use std::time::{SystemTime, UNIX_EPOCH};
/// Minimum Vulkan API version accepted by the Stage 0 backend. /// Minimum Vulkan API version accepted by the Stage 0 backend.
pub const MIN_VULKAN_API_VERSION: u32 = vk::API_VERSION_1_1; pub const MIN_VULKAN_API_VERSION: u32 = vk::API_VERSION_1_1;
const KHR_SWAPCHAIN_EXTENSION: &str = "VK_KHR_swapchain"; const KHR_SWAPCHAIN_EXTENSION: &str = "VK_KHR_swapchain";
@@ -3599,7 +3597,7 @@ fn render_shader_tool_json(tool: &VulkanShaderToolManifest) -> String {
/// Vulkan backend migration readiness. /// Vulkan backend migration readiness.
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum VulkanBackendState { pub enum VulkanPlanningBackendState {
/// Adapter prepared and able to accept commands. /// Adapter prepared and able to accept commands.
Ready, Ready,
/// Adapter is tracking a recoverable runtime surface/depth pipeline fault. /// Adapter is tracking a recoverable runtime surface/depth pipeline fault.
@@ -3608,7 +3606,7 @@ pub enum VulkanBackendState {
Error, Error,
} }
impl Default for VulkanBackendState { impl Default for VulkanPlanningBackendState {
fn default() -> Self { fn default() -> Self {
Self::Degraded Self::Degraded
} }
@@ -4283,16 +4281,14 @@ fn push_json_string(out: &mut String, value: &str) {
/// Diagnostics for Vulkan planning backend setup and frame progression. /// Diagnostics for Vulkan planning backend setup and frame progression.
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
pub struct VulkanPlanningBackendReport { pub struct VulkanPlanningBackendReport {
/// Unix time at initialization.
pub initialized_at: u64,
/// Total frames executed. /// Total frames executed.
pub frames_executed: u64, pub frames_executed: u64,
/// Total command submissions. /// Total command submissions.
pub submissions: u64, pub submissions: u64,
/// Last command-capture byte size. /// Last command-capture byte size.
pub last_capture_size: usize, pub last_capture_size: usize,
/// Number of simulated present calls. /// Number of simulated present calls issued by the planning facade.
pub presents: u64, pub simulated_presents: u64,
/// Number of resize-driven surface plan refreshes. /// Number of resize-driven surface plan refreshes.
pub resize_rebuilds: u64, pub resize_rebuilds: u64,
/// Last render request observed. /// Last render request observed.
@@ -4304,13 +4300,10 @@ pub struct VulkanPlanningBackendReport {
impl Default for VulkanPlanningBackendReport { impl Default for VulkanPlanningBackendReport {
fn default() -> Self { fn default() -> Self {
Self { Self {
initialized_at: SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |duration| duration.as_secs()),
frames_executed: 0, frames_executed: 0,
submissions: 0, submissions: 0,
last_capture_size: 0, last_capture_size: 0,
presents: 0, simulated_presents: 0,
resize_rebuilds: 0, resize_rebuilds: 0,
request: RenderRequest::conservative(), request: RenderRequest::conservative(),
last_frame_submission: None, last_frame_submission: None,
@@ -4321,7 +4314,7 @@ impl Default for VulkanPlanningBackendReport {
/// Vulkan planning backend façade used by the game entrypoint. /// Vulkan planning backend façade used by the game entrypoint.
#[derive(Debug)] #[derive(Debug)]
pub struct VulkanPlanningBackend { pub struct VulkanPlanningBackend {
state: VulkanBackendState, state: VulkanPlanningBackendState,
report: VulkanPlanningBackendReport, report: VulkanPlanningBackendReport,
swapchain_plan: VulkanSwapchainPlan, swapchain_plan: VulkanSwapchainPlan,
} }
@@ -4337,7 +4330,7 @@ impl VulkanPlanningBackend {
#[must_use] #[must_use]
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
state: VulkanBackendState::Ready, state: VulkanPlanningBackendState::Ready,
report: VulkanPlanningBackendReport::default(), report: VulkanPlanningBackendReport::default(),
swapchain_plan: default_stage0_swapchain_plan(), swapchain_plan: default_stage0_swapchain_plan(),
} }
@@ -4368,7 +4361,7 @@ impl VulkanPlanningBackend {
/// Returns adapter state. /// Returns adapter state.
#[must_use] #[must_use]
pub const fn state(&self) -> VulkanBackendState { pub const fn state(&self) -> VulkanPlanningBackendState {
self.state self.state
} }
@@ -4379,7 +4372,7 @@ impl VulkanPlanningBackend {
} }
fn simulate_present(&mut self) { fn simulate_present(&mut self) {
self.report.presents = self.report.presents.saturating_add(1); self.report.simulated_presents = self.report.simulated_presents.saturating_add(1);
} }
} }
@@ -4387,7 +4380,7 @@ impl RenderBackend for VulkanPlanningBackend {
fn execute(&mut self, commands: &RenderCommandList) -> Result<FrameOutput, RenderError> { fn execute(&mut self, commands: &RenderCommandList) -> Result<FrameOutput, RenderError> {
if !matches!( if !matches!(
self.state, self.state,
VulkanBackendState::Ready | VulkanBackendState::Degraded VulkanPlanningBackendState::Ready | VulkanPlanningBackendState::Degraded
) { ) {
return Err(RenderError::InvalidRange); return Err(RenderError::InvalidRange);
} }
@@ -4423,7 +4416,7 @@ mod tests {
}; };
#[test] #[test]
fn backend_tracks_render_request_and_presents() -> Result<(), RenderError> { fn planning_backend_tracks_render_request_and_simulated_present() -> Result<(), RenderError> {
let mut backend = VulkanPlanningBackend::new(); let mut backend = VulkanPlanningBackend::new();
let request = RenderRequest::conservative(); let request = RenderRequest::conservative();
backend.set_render_request(request); backend.set_render_request(request);
@@ -4448,10 +4441,10 @@ mod tests {
}; };
backend.execute(&commands)?; backend.execute(&commands)?;
assert_eq!(backend.state(), VulkanBackendState::Ready); assert_eq!(backend.state(), VulkanPlanningBackendState::Ready);
assert_eq!(backend.report().frames_executed, 1); assert_eq!(backend.report().frames_executed, 1);
assert_eq!(backend.report().submissions, 1); assert_eq!(backend.report().submissions, 1);
assert_eq!(backend.report().presents, 1); assert_eq!(backend.report().simulated_presents, 1);
assert!(backend.report().last_capture_size > 0); assert!(backend.report().last_capture_size > 0);
assert_eq!( assert_eq!(
backend.report().last_frame_submission, backend.report().last_frame_submission,
+2 -2
View File
@@ -30,7 +30,7 @@ S0-PLAT-001 covered cargo test -p fparkan-platform-winit --offline window_port_r
S0-PLAT-002 covered cargo clippy -p fparkan-platform -p fparkan-platform-winit --all-targets --all-features --locked -- -D warnings S0-PLAT-002 covered cargo clippy -p fparkan-platform -p fparkan-platform-winit --all-targets --all-features --locked -- -D warnings
S0-PLAT-003 covered cargo test -p fparkan-platform-winit --offline smoke_window_plan_requires_native_handles_and_nonzero_extent smoke_window_plan_rejects_zero_extent S0-PLAT-003 covered cargo test -p fparkan-platform-winit --offline smoke_window_plan_requires_native_handles_and_nonzero_extent smoke_window_plan_rejects_zero_extent
S0-PLAT-004 covered cargo test -p fparkan-platform-winit --offline smoke_window_app_requires_created_native_window smoke_window_app_rejects_synthetic_window_without_native_handles S0-PLAT-004 covered cargo test -p fparkan-platform-winit --offline smoke_window_app_requires_created_native_window smoke_window_app_rejects_synthetic_window_without_native_handles
S0-VK-001 covered cargo test -p fparkan-render-vulkan --offline backend_tracks_render_request_and_presents S0-VK-001 covered cargo test -p fparkan-render-vulkan --offline planning_backend_tracks_render_request_and_simulated_present
S0-VK-002 covered cargo test -p fparkan-render-vulkan --offline device_scoring_is_deterministic_and_prefers_discrete_unified_queue S0-VK-002 covered cargo test -p fparkan-render-vulkan --offline device_scoring_is_deterministic_and_prefers_discrete_unified_queue
S0-VK-003 covered cargo test -p fparkan-render-vulkan --offline portability_subset_is_reported_and_enabled_when_exposed S0-VK-003 covered cargo test -p fparkan-render-vulkan --offline portability_subset_is_reported_and_enabled_when_exposed
S0-VK-004 covered cargo test -p fparkan-render-vulkan --offline rejects_missing_graphics_present_swapchain_and_format S0-VK-004 covered cargo test -p fparkan-render-vulkan --offline rejects_missing_graphics_present_swapchain_and_format
@@ -51,7 +51,7 @@ S0-VK-018 covered cargo test -p fparkan-render-vulkan --offline triangle_shader_
S0-VK-019 covered cargo test -p fparkan-render-vulkan --offline shader_manifest_report_json_is_stable S0-VK-019 covered cargo test -p fparkan-render-vulkan --offline shader_manifest_report_json_is_stable
S0-VK-020 covered cargo test -p fparkan-render-vulkan --offline shader_manifest_rejects_invalid_spirv_containers S0-VK-020 covered cargo test -p fparkan-render-vulkan --offline shader_manifest_rejects_invalid_spirv_containers
S0-VK-021 covered cargo test -p fparkan-render-vulkan --offline frame_submission_plan_json_is_stable S0-VK-021 covered cargo test -p fparkan-render-vulkan --offline frame_submission_plan_json_is_stable
S0-VK-022 covered cargo test -p fparkan-render-vulkan --offline backend_tracks_render_request_and_presents S0-VK-022 covered cargo test -p fparkan-render-vulkan --offline planning_backend_tracks_render_request_and_simulated_present
S0-VK-023 covered cargo test -p fparkan-vulkan-smoke --offline rejects_false_pass_without_full_evidence blocked_report_includes_shader_manifest_and_bootstrap_status S0-VK-023 covered cargo test -p fparkan-vulkan-smoke --offline rejects_false_pass_without_full_evidence blocked_report_includes_shader_manifest_and_bootstrap_status
S0-VK-024 covered cargo test -p fparkan-vulkan-smoke --offline rejects_passed_without_loader_probe formats_vulkan_api_version S0-VK-024 covered cargo test -p fparkan-vulkan-smoke --offline rejects_passed_without_loader_probe formats_vulkan_api_version
S0-VK-025 covered cargo test -p fparkan-vulkan-smoke --offline rejects_passed_without_instance_probe parses_instance_probe_as_loader_probe S0-VK-025 covered cargo test -p fparkan-vulkan-smoke --offline rejects_passed_without_instance_probe parses_instance_probe_as_loader_probe
1 # Acceptance coverage manifest.
30 S0-PLAT-002
31 S0-PLAT-003
32 S0-PLAT-004
33 S0-VK-001
34 S0-VK-002
35 S0-VK-003
36 S0-VK-004
51 S0-VK-019
52 S0-VK-020
53 S0-VK-021
54 S0-VK-022
55 S0-VK-023
56 S0-VK-024
57 S0-VK-025