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::sync::atomic::{AtomicU32, Ordering};
use std::sync::Mutex;
use std::time::{SystemTime, UNIX_EPOCH};
/// Minimum Vulkan API version accepted by the Stage 0 backend.
pub const MIN_VULKAN_API_VERSION: u32 = vk::API_VERSION_1_1;
const KHR_SWAPCHAIN_EXTENSION: &str = "VK_KHR_swapchain";
@@ -3599,7 +3597,7 @@ fn render_shader_tool_json(tool: &VulkanShaderToolManifest) -> String {
/// Vulkan backend migration readiness.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum VulkanBackendState {
pub enum VulkanPlanningBackendState {
/// Adapter prepared and able to accept commands.
Ready,
/// Adapter is tracking a recoverable runtime surface/depth pipeline fault.
@@ -3608,7 +3606,7 @@ pub enum VulkanBackendState {
Error,
}
impl Default for VulkanBackendState {
impl Default for VulkanPlanningBackendState {
fn default() -> Self {
Self::Degraded
}
@@ -4283,16 +4281,14 @@ fn push_json_string(out: &mut String, value: &str) {
/// Diagnostics for Vulkan planning backend setup and frame progression.
#[derive(Clone, Debug, PartialEq)]
pub struct VulkanPlanningBackendReport {
/// Unix time at initialization.
pub initialized_at: u64,
/// Total frames executed.
pub frames_executed: u64,
/// Total command submissions.
pub submissions: u64,
/// Last command-capture byte size.
pub last_capture_size: usize,
/// Number of simulated present calls.
pub presents: u64,
/// Number of simulated present calls issued by the planning facade.
pub simulated_presents: u64,
/// Number of resize-driven surface plan refreshes.
pub resize_rebuilds: u64,
/// Last render request observed.
@@ -4304,13 +4300,10 @@ pub struct VulkanPlanningBackendReport {
impl Default for VulkanPlanningBackendReport {
fn default() -> Self {
Self {
initialized_at: SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |duration| duration.as_secs()),
frames_executed: 0,
submissions: 0,
last_capture_size: 0,
presents: 0,
simulated_presents: 0,
resize_rebuilds: 0,
request: RenderRequest::conservative(),
last_frame_submission: None,
@@ -4321,7 +4314,7 @@ impl Default for VulkanPlanningBackendReport {
/// Vulkan planning backend façade used by the game entrypoint.
#[derive(Debug)]
pub struct VulkanPlanningBackend {
state: VulkanBackendState,
state: VulkanPlanningBackendState,
report: VulkanPlanningBackendReport,
swapchain_plan: VulkanSwapchainPlan,
}
@@ -4337,7 +4330,7 @@ impl VulkanPlanningBackend {
#[must_use]
pub fn new() -> Self {
Self {
state: VulkanBackendState::Ready,
state: VulkanPlanningBackendState::Ready,
report: VulkanPlanningBackendReport::default(),
swapchain_plan: default_stage0_swapchain_plan(),
}
@@ -4368,7 +4361,7 @@ impl VulkanPlanningBackend {
/// Returns adapter state.
#[must_use]
pub const fn state(&self) -> VulkanBackendState {
pub const fn state(&self) -> VulkanPlanningBackendState {
self.state
}
@@ -4379,7 +4372,7 @@ impl VulkanPlanningBackend {
}
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> {
if !matches!(
self.state,
VulkanBackendState::Ready | VulkanBackendState::Degraded
VulkanPlanningBackendState::Ready | VulkanPlanningBackendState::Degraded
) {
return Err(RenderError::InvalidRange);
}
@@ -4423,7 +4416,7 @@ mod tests {
};
#[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 request = RenderRequest::conservative();
backend.set_render_request(request);
@@ -4448,10 +4441,10 @@ mod tests {
};
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().submissions, 1);
assert_eq!(backend.report().presents, 1);
assert_eq!(backend.report().simulated_presents, 1);
assert!(backend.report().last_capture_size > 0);
assert_eq!(
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-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-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-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
@@ -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-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-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-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
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