As more extensions move towards the GPU, the objective is to ensure tools like GPU-Assisted Validation are utilized.
In reality, every tool occupies a specific spot on the debugging spectrum. A tool designed to simply “print out” GPU information was missing, so GPU Dump was added.
The goal is to provide a tool similar to API Dump, but with several key differences:
VkBuffer at the moment the command buffer is recorded.The options for all extensions are available in VkConfig (and are also available as a preset).
It is very valid to update the memory after recording a command buffer, this means GPU Dump will never be 100% accurate, that will require a more expensive GPU-AV to get that information.
The goal of GPU Dump was to provide a fast/lite tool that can still provide a lot of useful information.
It can be viewed as a glorified printf aimmed at extension, such as VK_EXT_descriptor_heap, where there is a lot of information to keep track of.
GPU Dump will never give an error, but it will give both warning and info level messages
By turning off info, but leaving on warning you can use GPU Dump to provide warnings where it noticed at command buffer recording time a potential issue will occur.
If both both warning and info level messages are on, all the info will be printed.
VK_EXT_descriptor_heapVK_LAYER_GPU_DUMP_DESCRIPTORS/gpu_dump_descriptorsVK_EXT_descriptor_bufferVK_LAYER_GPU_DUMP_DESCRIPTORS/gpu_dump_descriptorsVK_KHR_copy_memory_indirectVK_LAYER_GPU_DUMP_COPY_MEMORY_INDIRECT/gpu_dump_copy_memory_indirectVK_EXT_device_generated_commandsVK_LAYER_GPU_DUMP_DEVICE_GENERATED_COMMANDS/gpu_dump_device_generated_commandsThere is currently a VK_LAYER_GPU_DUMP_TO_STDOUT option to allow printing directly to stdout incase you don't want to use the debug callback.
We are very happy to hear from people of additional options they feel would be helpful!
Using the “GPU Dump Descriptor” setting:
export VK_LAYER_GPU_DUMP_DESCRIPTORS=1 # optional export VK_LAYER_GPU_DUMP_TO_STDOUT=1
In this example, the dispatch shader will look this:
layout (set = 0, binding = 0) buffer SSBO_0 { uint data; } ssbo[8];
When performing a draw with VK_EXT_descriptor_heap, you will see output such as:
Validation Warning: [ GPU-DUMP ] | MessageID = 0xe5c5edc1
vkCmdDispatch(): [Dump Descriptor] (VkCommandBuffer 0x5ae561283160, VkPipeline 0x1e000000001e)
- vkCmdBindResourceHeapEXT last bound the resource heap to [0x300000000, 0x300000100) (no reserved range)
- VkBuffer 0x30000000003, size: 256 bytes, range: [0x300000000, 0x300000100)
- Last bound pipeline: VkPipeline 0x1e000000001e (VK_PIPELINE_BIND_POINT_COMPUTE)
- Shader descriptors:
[VK_SHADER_STAGE_COMPUTE_BIT] VkShaderModule 0x1c000000001c
- SPIR-V Set 0:
- SPIR-V Binding 0 ["ssbo"]
- specified in pMappings[0] - VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT
- heapOffset: 0x0, heapArrayStride: 64
- Resource Heap address: 0x300000000 + (descriptor_index * 64)
The final descriptor index at [8] will access [0x3000001c0, 0x300000200)
- Descriptor size: 64 (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
- [WARNING] OUT OF BOUNDS - descriptor has an array length of [8] but any element accessed starting at [4] will be OOB of the heap and invalid if accessed
GPU Dump prints the mapping of where the heap will be read from, but it also issues a warning:
[WARNING] OUT OF BOUNDS - descriptor has an array length of [8] but any element accessed starting at [4] will be OOB of the heap and invalid if accessed
This helps catch errors where, if the user accesses ssbo[4], it will actually be out of bounds of the bound descriptor heap memory.
This time if we update it to be a runtime descriptor array such as
layout (set = 0, binding = 0) buffer SSBO_0 {
uint data;
} ssbo[];
GPU Dump will help print the specific range that is valid for your runtime descriptor arrays.
Validation Information: [ GPU-DUMP ] | MessageID = 0xe5c5edc1
vkCmdDispatch(): [Dump Descriptor] (VkCommandBuffer 0x5ae561283160, VkPipeline 0xc000000000c)
- vkCmdBindResourceHeapEXT last bound the resource heap to [0x300000000, 0x300000100) (no reserved range)
- VkBuffer 0x30000000003, size: 256 bytes, range: [0x300000000, 0x300000100)
- Last bound pipeline: VkPipeline 0xc000000000c (VK_PIPELINE_BIND_POINT_COMPUTE)
- Shader descriptors:
[VK_SHADER_STAGE_COMPUTE_BIT] VkShaderModule 0xa000000000a
- SPIR-V Set 0:
- SPIR-V Binding 0 ["ssbo"]
- specified in pMappings[0] - VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT
- heapOffset: 0x0, heapArrayStride: 64
- Resource Heap address: 0x300000000 + (descriptor_index * 64)
The final descriptor index at [3] is the last index in bounds of the heap buffer and will access [0x3000000c0, 0x300000100)
- Descriptor size: 64 (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)