Async Compute: Overlap Post-Processing & Geometry
This article provides an overview of how modern game engines leverage asynchronous compute to execute compute-heavy post-processing tasks simultaneously with traditional geometry rendering passes. By running independent workloads concurrently on separate GPU queues, developers can saturate underutilized hardware units, eliminate rendering bubbles, and significantly reduce total frame times without sacrificing visual fidelity.
In traditional synchronous rendering pipelines, the GPU executes tasks in a strictly serial sequence: geometry passes (such as shadow map generation, depth pre-passes, or G-buffer rendering) finish completely before post-processing effects (such as bloom, depth of field, screen-space ambient occlusion, and motion blur) begin. This linear execution introduces significant hardware underutilization. Geometry passes heavily rely on fixed-function hardware—such as vertex fetchers, rasterizers, and primitive setup units—often leaving the GPU’s arithmetic logic units (ALUs) and compute cores idle. Conversely, post-processing effects are compute- and bandwidth-intensive, keeping the ALUs fully engaged while the fixed-function rasterization hardware remains completely unused.
Asynchronous compute addresses this inefficiency by allowing developers to submit commands across multiple hardware queues simultaneously. Modern graphics APIs, such as DirectX 12, Vulkan, and console-specific APIs, expose a direct graphics queue alongside independent compute and copy queues. The GPU’s hardware scheduler can then interleave and execute work from both queues on the same physical compute units (CUs or SMs).
To overlap post-processing with geometry, engines typically employ one of two scheduling strategies:
Intra-frame Overlapping: Independent compute tasks from the current frame are scheduled during early geometry passes. For example, compute-based screen-space reflections (SSR) or ambient occlusion (SSAO) that depend only on the depth and normal buffers can be kicked off on the async compute queue while the main graphics queue begins rendering transparent objects or non-dependent shadow maps.
Inter-frame Overlapping: The post-processing stack of frame N is processed concurrently with the early geometry passes of frame N+1. Because post-processing requires fully shaded source buffers, it cannot run in parallel with the lighting passes that produce them. However, while the main queue renders frame N+1’s shadow maps and depth pre-pass, the async compute queue consumes frame N’s completed lighting buffer to process tone mapping, temporal anti-aliasing (TAA), color grading, and bloom.
Effective implementation relies heavily on fine-grained synchronization. Developers use cross-queue hardware fences and resource barriers to ensure data integrity. The async compute queue must wait for the main queue to signal that the input buffers are completely written, and the swap chain presentation for frame N must wait until the compute-based post-processing is fully complete. If dependencies are not mapped carefully, resource contention on memory caches (such as L2 cache) and memory bandwidth can offset the benefits of parallel execution.
When implemented correctly, asynchronous compute fills the hardware "bubbles" inherent to geometry-only workloads. By pairing ALU-light, raster-heavy passes with compute-heavy, raster-free post-processing, game engines achieve near-maximum GPU hardware utilization, resulting in smoother frame rates and lower latency.