Skip to content

Implement Phase 1 (amortization) async loading for Vulkan#10092

Open
z3moon wants to merge 1 commit into
mainfrom
zm/async-op-vulkan
Open

Implement Phase 1 (amortization) async loading for Vulkan#10092
z3moon wants to merge 1 commit into
mainfrom
zm/async-op-vulkan

Conversation

@z3moon

@z3moon z3moon commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

The Vulkan backend had all async method stubs defined but unimplemented. This change wires them up using the shared JobQueue + AmortizationWorker infrastructure, mirroring the OpenGL backend's behavior.

In this Phase 1, deliver the full async API surface--job ordering, cancellation, completion callbacks, and deferred destruction--without taking on any threading complexity. Vulkan has no shared-context model, so true CPU/GPU parallelism is deferred to Phase 2. Phase 1 decouples "we have a working async API" from "we have parallel uploads": all async jobs are time-sliced on the backend thread during tick(), so the device-capability question never blocks landing async loading.

In Phase 2, will add a ThreadWorker that offloads the amortizable work--staging fill, vkCmdCopy* recording, and layout barriers--into a thread own command pool, while resource allocation and vkQueueSubmit stay on the backend thread (kept synchronous here precisely so this is additive). The backend thread gathers the worker's command buffers into its own submit, or the worker submits to a dedicated transfer queue and signals a semaphore. This will require thread-safe VMA, StagePool, and BufferCache, plus queue-ownership transfer between different queues.

The Vulkan backend had all async method stubs defined but unimplemented.
This change wires them up using the shared JobQueue + AmortizationWorker
infrastructure, mirroring the OpenGL backend's behavior.

In this Phase 1, deliver the full async API surface--job ordering,
cancellation, completion callbacks, and deferred destruction--without
taking on any threading complexity. Vulkan has no shared-context model,
so true CPU/GPU parallelism is deferred to Phase 2. Phase 1 decouples
"we have a working async API" from "we have parallel uploads": all async
jobs are time-sliced on the backend thread during tick(), so the
device-capability question never blocks landing async loading.

In Phase 2, will add a ThreadWorker that offloads the amortizable
work--staging fill, vkCmdCopy* recording, and layout barriers--into a
thread own command pool, while resource allocation and vkQueueSubmit
stay on the backend thread (kept synchronous here precisely so this is
additive). The backend thread gathers the worker's command buffers into
its own submit, or the worker submits to a dedicated transfer queue and
signals a semaphore. This will require thread-safe VMA, StagePool, and
BufferCache, plus queue-ownership transfer between different queues.
@z3moon z3moon added the internal Issue/PR does not affect clients label Jun 6, 2026
@z3moon z3moon marked this pull request as ready for review June 6, 2026 16:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Issue/PR does not affect clients

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant