refactor(vulkan-plan): clarify planning backend telemetry
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
|
Reference in New Issue
Block a user