Attempt to load Vulkan Loader
Populate instance functions
Create instance and enumerate devices
Obtain physical device properities
Get API version from device
Check version is >= 1.0.11
dlopen(“libVulkan.so”)
vkCreateInstance
vkEnumeratePhysicalDevices
vkGetInstanceProcAddr
vkGetPhysicalDeviceProperties
physDevProp.apiVersion & 0xfff >= 11
physDevProp.apiVersion
FIFO
Presentable Images
#0 #1 #2
Internal queue
X*
vkAcquireNextImage
vkQueuePresent
vkAcquireNextImage
vkQueuePresent
vkAcquireNextImage
vkQueuePresent
#0 X=#0
#1 Y=#1
#2 Z=#2
VBLANK
Swaps #0 stored in X with the backbuffer
Latency
Y* Z*
MAILBOX
Presentable Images
#0 #1 #2
Internal queue (implementation dependent)
X*
vkAcquireNextImage
vkQueuePresent
vkAcquireNextImage
vkQueuePresent
vkAcquireNextImage
vkQueuePresent
#0 X=#0
#1 X=#1
#2 X=#2
VBLANK
Display controller will read from #1
Latency
• TL;DR: Use triple-buffered FIFO unless there’s a good reason not to!
VK_PRESENT_MODE_MAILBOX_KHR VK_PRESENT_MODE_FIFO_KHR
.RGB_888VK_FORMAT_R8G8B8_UNORM
Java SurfaceView
Vulkan Surface
Vulkan Swapchain
N+2
FRAME 1 FRAME 2 FRAME 3 FRAME 4
VkCommandBuffer #A VkCommandBuffer #B VkCommandBuffer #C VkCommandBuffer #A
Create VkPipeline #0~#9
Use VkPipeline #0~#9
Use VkPipeline #0~#9
Use VkPipeline #5~#9
Destroy VkPipeline #0~#4
N
0 1 2 3 4
5 6 7 8 9
N+1
0 1 2 3 4
5 6 7 8 9
Use VkPipeline #5~#9
5 6 7 8 9
N+2
FRAME 1 FRAME 2 FRAME 3 FRAME 4
VkCommandBuffer #A VkCommandBuffer #B VkCommandBuffer #C VkCommandBuffer #A
Create VkPipeline #0~#9
Use VkPipeline #0~#9
Use VkPipeline #0~#9
Use VkPipeline #5~#9
Destroy VkPipeline #0~#4
N
0 1 2 3 4
5 6 7 8 9
N+1
0 1 2 3 4
5 6 7 8 9
Use VkPipeline #5~#9
5 6 7 8 9
Crash!
FRAME 1 FRAME 2 FRAME 3 FRAME 4
VkCommandBuffer #A VkCommandBuffer #B VkCommandBuffer #C VkCommandBuffer #A
Create VkPipeline #0~#9
Check VkPipeline #0~#4
Use VkPipeline #0~#9
Use VkPipeline #0~#9
Use VkPipeline #5~#9
FRAME 5
VkCommandBuffer #B
Destroy VkPipeline #0~#4
Check VkPipeline #0~#4
Check VkPipeline #0~#4
Use VkPipeline #5~#9
N+2 N
0 1 2 3 4
5 6 7 8 9
N+1
0 1 2 3 4
5 6 7 8 9 5 6 7 8 9
layout(set=0, binding=0) uniform buf1{
float _unif1; // #0 vec3 _unif2; // #1 vec2 _unif3; // #2 }
#2
#1
#0
#2 #1 #0
• glslangValidator applies std140 layout by default • Need to explicitly specify layout in shader code OR make sure
buffer layout matches the glslang default!
VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
VkDeviceMemory vec2 vec2 float float
N N N N
N N N N
N N N+1 N+1
N = N Frame MVP Matrix
N+1 = N+1 Frame MVP Matrix(Changed)
Swapchain
VkImage #0
VkImage #1
VkImage #2
VkCommandBuffer #0
VkCommandBuffer #1
VkCommandBuffer #2
UB #0
Swapchain
VkImage #0
VkImage #1
VkImage #2
VkCommandBuffer #0
VkCommandBuffer #1
VkCommandBuffer #2
UB #0 UB #1 UB #2
Swapchain
VkImage #0
VkImage #1
VkImage #2
VkCommandBuffer #0
VkCommandBuffer #1
VkCommandBuffer #2
UB #0
dynamicOffset
Original data
SHADER
OpenGL ES Driver
Driver type conversion
Original data
SHADER
Vulkan Driver
uint32 x 4
vec4
uvec4 vec4
uint32 x 4
vec4
vec4
Original data
SHADER
Vulkan Driver
uint32 x 4
uvec4
uvec4
Empty Please use correct
type of input.
VK_IMAGE_LAYOUT_GENERAL
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
// Get Image Format Property VkFormatProperties formatProperty; vkGetPhysicalDeviceFormatProperties(physicalDevice, imageFormat, &formatProperty); if (formatProperty.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) /**/; else if (formatProperty.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) /**/;
vkCmdCopyBufferToImage
VkImage with VK_TILING_OPTIMAL
VkBuffer& stagingBuffer = getStagingBuffer(imageBufferSize); VkBufferImageCopy region = getRegionFromImage(image); fillBuffer(stagingBuffer, pImageData); vkCmdCopyBufferToImage(commandBuffer, stagingBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
DO NOT use VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT with
VK_TILING_OPTIMAL.
?
Image Data Fill image data into the VkBuffer
VkBuffer
VkCommandBuffer
Without Geometry Sorting
With Geometry Sorting
OpenGL ES 2.0 (ETC1) Vulkan (ASTC)
APK size 599 MB 521 MB
Memory (run-time) 1115 MB 557 MB
August 2016
Vulkan + ASTC vs OpenGL ES + ETC1
Performance Normal 4 %
Throttling 30 %
Power usage 5 %
Memory usage 25 %