Stateless

3D: Low Level

Vulkan - 2016, DirectX12 - 2015 and Metal - 2014

Low Level API's that aim fit the current GPU systems better then the old graphic API's such as OpenGL/DirectX. This is done by getting rid of most of the state management and handing that responsibility over to the application instead.

Immutable objects

Many objects are created in full before they are used. It makes it possible to verify everything at creation time. Create functions take a structure with everything there is to know about the new object. In DirectX12 the structures are namned *_DESC and in Vulkan *CreateInfo.

Command Buffers

The API is used by the CPU to write commands to memory. The memory area is called a command buffer. Only the driver know the exact format of the commands as they depend on the GPU. Once we are done building the command buffer we submitt or queue it for execution. The CPU can then start building a new command buffer and the GPU will begin reading and processing commands from the completed buffer when it reach it in the queue. Command buffers can be recorded at the same time on more then one thread. The GPU always consume in the order submitted to a queue but there can be more then one queue available.

    • Free-threaded record/submit. There is no global context but you need to make sure to not access a object at the same time as another thread.
    • No state inheritance across buffers.
    • D3D12: ID3D12CommandList and ID3D12CommandQuueue
    • Metal: MTLCommandBuffer and MTLCommandQueue
    • Vulkan: VkCmdBuffer and VkCmdQueue
    • Command buffers for multi-threaded rendering - 2019

Pipeline State Objects

A PSO is a single object that encapsulates almost the entire GPU state. Instead of micromanaging state changes one switch the whole state directly. The PSO contain the shaders for all the stages so one PSO is needed for every combination of shaders. Resource bindings such as vertex/index/constants buffers and textures are not part of the PSO.

    • D3D12: ID3D12PipelineState

Memory

Introducing Low-Level GPU Virtual Memory Management - 2020

GPU Memory Aliasing - 2020

Curing Amnesia and Other GPU Maladies With AMD Developer Tools - 2020

Differences in memory management between Direct3D 12 and Vulkan - 2019

Device Memory Management - 2018

New Techniques for Accurate Real-Time Reflections & Memory Management in Vulkan and DX12 - 2018

Performance Tweets Series: Streaming & Memory Management - 2016

Sync

Breaking Down Barriers - GDC 2019

Breaking Down Barriers - 2018 : Part 1, part 2, part 3 , part 4. , Part 5 and Part 6.

Reference

A Review of GPUOpen Effects - Video / Slides - 2020

Thoughts on graphics APIs and libraries - 2019

Vertex Formats: Part1 and Part 2 - 2018

Porting your engine to Vulkan or DX12 - video from my talk - 2018

Choosing a binding model - 2017

Vulkan and NVIDIA The Essentials (presented by NVIDIA) - 2016

D3D12 & Vulkan: Lessons Learned - 2016

Performance Tweets Series: Shaders, Threading, Compiling - 2016

Performance Tweets Series: Rendering and Optimizations - 2016

An Overview of Next-Generation Graphics APIs - 2015

Lower-Level Graphics API - What Does It Mean - 2015

Thoughts on graphics APIs and libraries - 2019