0% found this document useful (0 votes)
30 views46 pages

4 Vulkan Getting Explicit How Hard Is Vulkan Really GDC Mar18

Uploaded by

pulp noir
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
30 views46 pages

4 Vulkan Getting Explicit How Hard Is Vulkan Really GDC Mar18

Uploaded by

pulp noir
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 46

Getting Explicit

How hard is Vulkan Really?


“Vulkan is not a good first-step path to
learning graphics. It’s maintainers will tell you
to start out by learning OpenGL or DX11.”
– Internet Person
“To be fair to Vulkan, it was designed to be
used by somebody who knew what they
were doing.” – Another Internet Person
“Eh I would say Vulkan decreases
reliability. Precisely because Vulkan
drivers are much thinner and do no error
checking, … “ – Also an Internet Person
“I thought about the Vulkan programming guide,
but ended up deciding modern OpenGL would be
an easier starting point...

… In a twist of fate, the SuperBible example code


only supports OpenGL 4.0+ and my primary
computer is stuck at 3.3.” – Same Internet Person
“So at the end of the day, Vulkan is about giving
graphics developers foot-guns in order to reduce CPU
overhead. That was explicitly its mission statement
from the beginning!” – Proud Internet Person
Background

• 2005: Started in web services.


• 2008-2011: Contract to hire Quake Live
• 2011-2013: Dev Services
• 2013-Present: Generalist idTech
• 8yrs QuakeCon Support
!= Graphics Programmer

• Occasional day-to-day fixes.


• Wrote a handful of shaders.
• Played with ShaderToy, OpenCV, Processing, etc
• Read Peter Shirley’s “Ray Tracing in One Weekend”

• More capable hands at id.


• Tiago, Billy, Axel, Jean, etc
• Great talks given at previous events regarding state of graphics in idTech.
• Great work on Wolfenstein II. Hopefully talk about that soon.
Dawn of Vulkan at id

• 2015 – Breaking the ice.


• Q1 2016 – Began work in earnest
close to DOOM2016 launch.
• Q3 2016 – DOOM2016 Vulkan binary
released to the wild.

• Clear benefits
• Solidifying marriage with idTech
• Eager for others to Adopt
Early Public Perceptions

• HARD
• A LOT of Code
• Graphics++ for developers at the bleeding edge.
Hobbyists and beginners need not apply.
• Expensive investment to refactor. ( 4 – 6mo, $$$$ )
• “Unpacking” the driver revealed more
responsibilities.
The Early Days – Body of Information

Top 10 %
Expert

Middle
???

Bottom 10-20 %
Intro
Evangelizing the id way – Open Source

• VkQuake:
• Author: Axel Gneiting
• Developed: Q2 2016
• Released: Q3 2016
• Link: https://github.com/Novum/vkQuake

• VkDOOM3:
• Author: Dustin Land
• Developed: Q3 2016
• Released: Q3 2017
• Link: https://github.com/DustinHLand/vkDOOM3
Blog - I Am Graphics And So Can You

• 7 Part series articulating my


experience with the port.
• Thought I’d get 3x dozen views TOTAL.
• ~30,000 views first month. ( broke
squarespace’s analytics report )
• Average ~1,000 view every month
after.
• Handful of conversations every
month; mostly with beginners.
• Considerable interest in Vulkan

https://www.fasterthan.life/
Impetus for Porting DOOM 3 BFG

• Expanding Skillset
• Explicit APIs are a nice inflection point.
• Everyone still learning.
• Good Fit
• Manageable by a single person.
• Familiar with idTech.
• Open Source
• Fixed Assets. ( actually a problem later on )
• Evangelizing
• OpenGL -> Vulkan a nice example of old to new.
• Partners asking how to make Vulkan more approachable.
Video
Port Effort

• Code:
• Commits: 718
• LoC: ~5,000
• GLSL LoC: ~3,000
• Time:
• Total: 4x full time months.
• Regularity: Waxed and Waned
• When: 10pm – 3am
Renderer Lines of Code

12000
10000
8000
6000
4000
2000
0
Frontend OpenGL Vulkan GLSL
Vulkan Lines of Code

2500

2000

1500

1000

500

0
Allocator Staging Renderer Pipelines Buffers Images
Vulkan Summoning Ritual – Step 1: Stopping For Intuition
Commercial Break

RenderDoc
Intuition Begins And Ends In Understanding How Data Is
Transformed

Author: Baldur Karlsson


Link: https://renderdoc.org/
GitHub: https://github.com/baldurk/renderdoc
RenderDoc – Dynamic Shadows
RenderDoc – Color Channels
RenderDoc – Post Processing
Vulkan Summoning Ritual – Step 2: The First 1,000 LoC
The First 1,000 LoC – “An” Entry Trajectory Into Creating Vulkan Applications

Create
Create Create Render
Swapchain &
Instance Pass(es)
Get Images

For Each Swapchain Image


Create Surface Create Pools
Create Command
Buffer

Create
Allocate Your
Create Logical Frame Objects
Synchronization
Select Suitable Primitives
Device & Get
Physical Device
Queues
Create Frame
Buffer
The First 1,000 LoC - RenderPass

• Area of interest for Vulkan adopters.


• Doesn’t have to be complicated. ( Can be if you’re into that. )
• vkDOOM3 has 1x RenderPass with 1x subpass and 3x attachments.
• Manually transition layout to PRESENT_SRC_KHR.

Depth Color Resolve - MSAA


Vulkan Summoning Ritual – Step 3: Resources Take Center Stage
Resources Take Center Stage

• Buffers in vkDOOM3
• Static Geo (DEVICE_LOCAL)
• Dynamic Geo double buffered.
(HOST_VISIBLE)
• UBOs for skinning and render parms.
• idBuffer treats range as discrete
• Images in vkDOOM3
• 12x Formats
• All DEVICE_LOCAL.
• Track VkImageLayout for descriptor
updates.
• TRANSFER_DST ->
SHADER_READ_ONLY
Resources Take Center Stage - Allocator

• There are options.


• Simple Apps – Just use the API directly.
Watch your numbers.
• Small to Medium Apps – Simple block
allocator. Be cognizant of the rules.
• Medium to Large – You really need to
invest in something serious.

https://vulkan.gpuinfo.org/
Resources Take Center Stage - What I did for allocations

VkResult ret = vkCreateBuffer( struct vulkanAllocation_t {


vkcontext.device, idVulkanBlock * block;
&bufferCreateInfo, uint32 id;
NULL, VkDeviceMemory deviceMemory;
&m_apiObject ); VkDeviceSize offset;
VkDeviceSize size;
VkMemoryRequirements memoryRequirements;
byte * data;
vkGetBufferMemoryRequirements(
};
vkcontext.device,
m_apiObject,
&memoryRequirements );

// determine mem usage

m_allocation = vulkanAllocator.Allocate(
memoryRequirements.size,
memoryRequirements.alignment,
memoryRequirements.memoryTypeBits,
memUsage,
VULKAN_ALLOCATION_TYPE_BUFFER );
Resources Take Center Stage - Allocator Breakdown

Get Heap Index

Allocate Block Chain Per Heap

Don’t shoot yourself in the face. Subdivide On Allocation


Only 120/600 LoC header/source.

Merge On Free
VMA – Vulkan Memory Awards
Commercial Break

Vulkan Memory
Allocator
Author: Adam Sawicki
Link: https://gpuopen.com/
GitHub: https://github.com/GPUOpen-
LibrariesAndSDKs/VulkanMemoryAllocator
Vulkan Summoning Ritual – Step 4: Coupling to idTech 4
Coupling to idTech 4

• Long history with OpenGL pedigree. ( 2000 –


Present )
• GL code had “grown roots”. Present in 18x
files. Not bad, but still leaky
• PS3 and 360 code had gone down a different
path.
• Wanted to keep OpenGL working side-by-side
for comparison.
• Large part of port effort was “putting the
beast back in its cage”.
• In the end, GL code sequestered to 8x files.
Coupling to idTech 4 – State Tracking

• Designed to change state “immediately”. ( // example snippet


take that driver ) static const uint64
static const uint64
GLS_SRCBLEND_ONE
GLS_SRCBLEND_ZERO
=
=
0
1
<<
<<
0;
0;
• GL_State static const uint64 GLS_SRCBLEND_DST_COLOR = 2 << 0;
• GL_SelectTexture / GL_BindTexture static const uint64
static const uint64
GLS_SRCBLEND_ONE_MINUS_DST_COLOR
GLS_SRCBLEND_SRC_ALPHA
=
=
3
4
<<
<<
0;
0;
• GL_Clear static const uint64
static const uint64
GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA
GLS_SRCBLEND_DST_ALPHA
=
=
5
6
<<
<<
0;
0;

• Required state tracking till data could be static const uint64


static const uint64
GLS_SRCBLEND_ONE_MINUS_DST_ALPHA
GLS_SRCBLEND_BITS
=
=
7
7
<<
<<
0;
0;
used at appropriate times.
• Descriptor Set Updates
• Pipeline Creation / Selection // In StencilShadowPass
• Current state saved to GLS bits, but not GL_State(
glState |
the data. ( uint64_t ) GLS_STENCIL_OP_FAIL_KEEP |
• Blend Ops/Functions GLS_STENCIL_OP_ZFAIL_KEEP |
• Depth State GLS_STENCIL_OP_PASS_INCR |
GLS_STENCIL_MAKE_REF( STENCIL_SHADOW_TEST_VALUE ) |
• Cull Mode GLS_STENCIL_MAKE_MASK( STENCIL_SHADOW_MASK_VALUE ) |
• Stencil State GLS_POLYGON_OFFSET |
GLS_CULL_TWOSIDED );
• etc
Coupling to idTech 4 – State Tracking Example

OpenGL::GL_State() Vulkan::GL_State()
• 210 LoC • 5 LoC
• glEnable/glDisable
• Save off GLS bits
• glCullFace
• glDepthFunc • Submitted at pipeline creation
• glDepthMask
• glBlendFunc
• glColorMask
• glPolygonMode
• glPolygonOffset
• glStencilOp
Vulkan Summoning Ritual – Step 5: Pixels & Pipelines
Pixels & Pipelines

• Surface based drawing - two routines


• Main lighting
• Stencil shadows
• Steps
• Find offsets into index / vertex
buffers.
• Set joint cache handle if we’re
skinning.
• renderProgManager.CommitCurrent(
GLS bits )
• vkCmdBindIndexBuffer
• vkCmdBindVertexBuffer
• vkCmdDrawIndexed
• Profit
Pixels & Pipelines - CommitCurrent

• Backend sets a current “render prog” index. ::BindProgram( int index )


• CommitCurrent uses index to retrieve render prog which has a list of viable
pipelines.
• Lookup pipeline using GLS bits.
• If one doesn’t exist, create it.
• No noticeable perf hit, so didn’t bother with pipeline cache.
• Desc Set – Brute force approach, but still quite fast.
• Allocate a DescSet
• Update it using preallocated UBO and bound textures.
• Bind
• Bind Pipeline
Pixels & Pipelines – Graphics Is a Series of Tubes

Create Built-In Shaders

Create Descriptor Set Layouts

Create Vertex Descriptions

28 built in shaders + change


Create Descriptor Pools
Under 100 pipelines total at runtime.

Preallocate UBOs For Render Parms


Summoning Complete
In Closing - Views On Process Work Load

Legacy Explicit Lite Explicit

Init Setup Frame 1 Frame 2 Frame 3 Frame 4 Frame 5


Special Thanks
Blog Readers
Axel Gneiting – vkQuake, Advice
Tiago Sousa – Talk Review, Advice
Stephanie Hurlburt – Encouragement
John Carmack – Open Source
OG & BFG DOOM 3 Teams

Jan Paul van Waveren Steven Serafin


Getting Explicit:
How hard is Vulkan Really?
Panel Discussion
Khronos Dev Day – GDC 2018
Copyright ©2018 The Khronos™ Group Inc. - Page 47
Getting Explicit: How hard is Vulkan Really?
Panelists:
• Matthäus Chajdas, AMD
@NIV_Anteru
• Arseny Kapoulkine, Roblox
@zeuxcg
• Dustin Land, id Software
@DustinHLand
Chair:
• Alon Or-bach, Samsung Electronics
@alonorbach

Copyright ©2018 The Khronos™ Group Inc. - Page 48

You might also like