The Vulkan Differences Between AMDGPU-PRO, RADV & SteamVR's RADV Drivers
With Valve having published a binary-only RADV Radeon Vulkan driver build for their beta of SteamVR on Linux, I did some poking out of curiosity to see the differences to the mainline RADV driver in Mesa. Out of curiosity I also did a comparison to see how the Vulkan capabilities compare to the proprietary AMDGPU-PRO Vulkan driver.
Using the vulkaninfo output on a Radeon RX 470 I compared AMDGPU-PRO 16.60, Mesa 17.1-dev Git master with RADV, and the libvulkan_radeon binary provided by Valve for SteamVR on Linux. With our first SteamVR Linux tests coming this week, I was curious about the modifications Valve made to RADV in order for it to handle Vulkan VR on Linux.
The differences that RADV provided by Valve have in their patched Vulkan driver over what's currently in mainline Mesa include these extensions: VK_NV_dedicated_allocation, VK_KHX_external_memory_capabilities, VK_KHX_external_memory, and VK_KHX_external_memory_fd. So it looks like those are among the VR requirements.
VK_NV_dedicated_allocation has been around since last summer and is described as: "This extension allows device memory to be allocated for a particular buffer or image resource, which on some devices can significantly improve the performance of that resource. Normal device memory allocations must support memory aliasing and sparse binding, which could interfere with optimizations like framebuffer compression or efficient page table usage. This is important for render targets and very large resources, but need not (and probably should not) be used for smaller resources that can benefit from suballocation." So VK_NV_dedicated_allocation is important for performance of VR.
VK_KHX_external_memory_capabilities, VK_KHX_external_memory, and VK_KHX_external_memory_fd are not currently publicly documented. These undocumented extensions were also what was added to NVIDIA's Vulkan beta driver and also aren't part of the mainline NVIDIA Linux driver at this time.
These yet-to-be-documented Vulkan extensions are presumably why Valve hasn't published the source to their RADV modifications for VR yet. The Khronos Group could be rolling out Vulkan-Next / Vulkan 1.1 perhaps coming up at GDC? Could be interesting and quite likely... Anyhow, these are the extensions (among others) needed for VR to work on Linux due to the Vulkan requirement. Once these extensions debut in a Vulkan version, Valve will most presumably land them in mainline Mesa.
These Vulkan extensions also aren't yet supported by the AMDGPU-PRO 16.60 driver. Extensions supported in AMDGPU-PRO 16.60 but not yet in RADV include: VK_AMD_rasterization_order, VK_AMD_shader_ballot, VK_AMD_shader_trinary_minmax, VK_AMD_shader_explicit_vertex_parameter, VK_AMD_gcn_shader, VK_AMD_negative_viewport_height, and VK_AMD_gpu_shader_half_float.
While Vulkan extensions present in RADV but not in AMDGPU-PRO Vulkan include VK_KHR_maintenance1, VK_KHR_get_physical_device_properties2, and VK_KHR_shader_draw_parameters. The AMDGPU-PRO Vulkan driver exposes v1.0.33 while RADV shows v1.0.5.
Other AMDGPU-PRO vs. RADV Vulkan differences also include a lower maxImageDimension3D device limit with RADV (8192 vs. 2048) and a variety of other device limit differences, some of which are higher with RADV while others with -PRO hybrid. RADV also doesn't yet support tessellation shaders, sample rate shading, pipeline statistics query, shader storage image multi-sample, int64, variable multi-sample rate, inherited queries, and sparse memory support.
Using the vulkaninfo output on a Radeon RX 470 I compared AMDGPU-PRO 16.60, Mesa 17.1-dev Git master with RADV, and the libvulkan_radeon binary provided by Valve for SteamVR on Linux. With our first SteamVR Linux tests coming this week, I was curious about the modifications Valve made to RADV in order for it to handle Vulkan VR on Linux.
The differences that RADV provided by Valve have in their patched Vulkan driver over what's currently in mainline Mesa include these extensions: VK_NV_dedicated_allocation, VK_KHX_external_memory_capabilities, VK_KHX_external_memory, and VK_KHX_external_memory_fd. So it looks like those are among the VR requirements.
VK_NV_dedicated_allocation has been around since last summer and is described as: "This extension allows device memory to be allocated for a particular buffer or image resource, which on some devices can significantly improve the performance of that resource. Normal device memory allocations must support memory aliasing and sparse binding, which could interfere with optimizations like framebuffer compression or efficient page table usage. This is important for render targets and very large resources, but need not (and probably should not) be used for smaller resources that can benefit from suballocation." So VK_NV_dedicated_allocation is important for performance of VR.
VK_KHX_external_memory_capabilities, VK_KHX_external_memory, and VK_KHX_external_memory_fd are not currently publicly documented. These undocumented extensions were also what was added to NVIDIA's Vulkan beta driver and also aren't part of the mainline NVIDIA Linux driver at this time.
These yet-to-be-documented Vulkan extensions are presumably why Valve hasn't published the source to their RADV modifications for VR yet. The Khronos Group could be rolling out Vulkan-Next / Vulkan 1.1 perhaps coming up at GDC? Could be interesting and quite likely... Anyhow, these are the extensions (among others) needed for VR to work on Linux due to the Vulkan requirement. Once these extensions debut in a Vulkan version, Valve will most presumably land them in mainline Mesa.
These Vulkan extensions also aren't yet supported by the AMDGPU-PRO 16.60 driver. Extensions supported in AMDGPU-PRO 16.60 but not yet in RADV include: VK_AMD_rasterization_order, VK_AMD_shader_ballot, VK_AMD_shader_trinary_minmax, VK_AMD_shader_explicit_vertex_parameter, VK_AMD_gcn_shader, VK_AMD_negative_viewport_height, and VK_AMD_gpu_shader_half_float.
While Vulkan extensions present in RADV but not in AMDGPU-PRO Vulkan include VK_KHR_maintenance1, VK_KHR_get_physical_device_properties2, and VK_KHR_shader_draw_parameters. The AMDGPU-PRO Vulkan driver exposes v1.0.33 while RADV shows v1.0.5.
Other AMDGPU-PRO vs. RADV Vulkan differences also include a lower maxImageDimension3D device limit with RADV (8192 vs. 2048) and a variety of other device limit differences, some of which are higher with RADV while others with -PRO hybrid. RADV also doesn't yet support tessellation shaders, sample rate shading, pipeline statistics query, shader storage image multi-sample, int64, variable multi-sample rate, inherited queries, and sparse memory support.
17 Comments