powerpoint presentation - khronos group...powerpoint presentation author microsoft office user...
TRANSCRIPT
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 %