feat: degrade-don't-panic render path (tech-debt #17b) #117

Closed
akadmin wants to merge 0 commits from feat/render-degrade into main
Owner

The per-frame GPU path no longer aborts the process on a vulkano error:
render_offscreen (incl. mesh upload), wait_for_slot, signal_frame_boundary,
resize, upload_ibl, and texture upload return Result<_, String> via a small
VkErr extension trait; the descriptor-set/upload builders in gpu_types.rs
propagate instead of unwrapping. Both binaries' render layers log once per
distinct message (renderer::LogOnce, cleared on a successful frame) and skip
the frame: swapchain-acquire failures recreate the swapchain and retry
(replacing both panic! sites), a failed render presents the slot's previous
contents (Scene::idle_future), broken texture files cache a magenta 1x1
fallback, and a failed resize/upload_ibl keeps the previous images intact.

Init-time paths keep unwrap/expect deliberately (fail-fast at startup);
Scene::new call sites use .expect with context. Swapchain failure modes are
not unit-testable without a GPU harness — verified by cargo test (492 green)
plus the LogOnce state tests; manual resize/minimize spam still recommended
before merge.

Roadmap item 35 (Tier 1), second half of debt #17.

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

The per-frame GPU path no longer aborts the process on a vulkano error: render_offscreen (incl. mesh upload), wait_for_slot, signal_frame_boundary, resize, upload_ibl, and texture upload return Result<_, String> via a small VkErr extension trait; the descriptor-set/upload builders in gpu_types.rs propagate instead of unwrapping. Both binaries' render layers log once per distinct message (renderer::LogOnce, cleared on a successful frame) and skip the frame: swapchain-acquire failures recreate the swapchain and retry (replacing both panic! sites), a failed render presents the slot's previous contents (Scene::idle_future), broken texture files cache a magenta 1x1 fallback, and a failed resize/upload_ibl keeps the previous images intact. Init-time paths keep unwrap/expect deliberately (fail-fast at startup); Scene::new call sites use .expect with context. Swapchain failure modes are not unit-testable without a GPU harness — verified by cargo test (492 green) plus the LogOnce state tests; manual resize/minimize spam still recommended before merge. Roadmap item 35 (Tier 1), second half of debt #17. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat: degrade-don't-panic render path (tech-debt #17b)
All checks were successful
CI / build (pull_request) Successful in 4m29s
af24b5a56d
The per-frame GPU path no longer aborts the process on a vulkano error:
render_offscreen (incl. mesh upload), wait_for_slot, signal_frame_boundary,
resize, upload_ibl, and texture upload return Result<_, String> via a small
VkErr extension trait; the descriptor-set/upload builders in gpu_types.rs
propagate instead of unwrapping. Both binaries' render layers log once per
distinct message (renderer::LogOnce, cleared on a successful frame) and skip
the frame: swapchain-acquire failures recreate the swapchain and retry
(replacing both panic! sites), a failed render presents the slot's previous
contents (Scene::idle_future), broken texture files cache a magenta 1x1
fallback, and a failed resize/upload_ibl keeps the previous images intact.

Init-time paths keep unwrap/expect deliberately (fail-fast at startup);
Scene::new call sites use .expect with context. Swapchain failure modes are
not unit-testable without a GPU harness — verified by cargo test (492 green)
plus the LogOnce state tests; manual resize/minimize spam still recommended
before merge.

Roadmap item 35 (Tier 1), second half of debt #17.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
akadmin closed this pull request 2026-07-13 01:22:24 +00:00
All checks were successful
CI / build (pull_request) Successful in 4m29s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
akadmin/NemesisEngine!117
No description provided.