Thin Vulkan 1.3 abstraction. Does not hide Vulkan —
it codifies the patterns mjolnir relies on (bindless texture array,
slab-allocated mesh buffers, dynamic rendering, frame-in-flight
semaphores). Most user code never touches this directly; it exists for
render and as an escape hatch.
VkRenderPass / VkFramebuffer objects.
Attachments come from begin_rendering per pass.TextureManager); every mesh goes
through one vertex / index / skinning buffer (MeshManager).
Draw calls pass indices, not descriptor sets.ALL_CAPS constants so
pipelines compose declaratively instead of repeating boilerplate.GPUContext — instance, device, queues, descriptor pool,
command pools. One per engine.Swapchain — frames-in-flight fences and semaphores,
presentation.TextureManager — bindless arena for 2D + cube textures.
Allocations return a Texture2DHandle /
TextureCubeHandle (a generational index into the descriptor
array).MeshManager — three immutable GPU buffers (vertex /
index / skinning) sub-allocated via slab allocators. Mesh allocation
returns stable byte offsets that draw-indirect commands reference
directly.MutableBuffer(T) / ImmutableBuffer(T) —
typed wrappers around host-visible vs device-local memory.
MutableBuffer is mapped for CPU writes;
ImmutableBuffer.write uploads via a one-shot staging
buffer.FRAMES_IN_FLIGHT = 2 by default. Per-frame resources
(semaphores, per-camera attachments, staging buffers) are indexed by
frame_index % FRAMES_IN_FLIGHT. Anything the GPU might
still be reading must outlive that window — see architecture for the staging-age rule.