Subset of Vulkan needed to be implemented:
vkAcquireNextImageKHR
vkAllocateCommandBuffers
vkAllocateDescriptorSets
vkAllocateMemory
vkBeginCommandBuffer
vkBindBufferMemory
vkBindImageMemory
vkCmdBeginDebugUtilsLabelEXT
vkCmdEndDebugUtilsLabelEXT
vkCmdInsertDebugUtilsLabelEXT
vkCreateBuffer
vkCreateBufferView
vkCreateCommandPool
vkCreateComputePipelines
vkCreateCuFunctionNVX
vkCreateCuModuleNVX
vkCreateDescriptorPool
vkCreateDescriptorSetLayout
vkCreateDescriptorUpdateTemplate
vkCreateDevice
vkCreateEvent
vkCreateFence
vkCreateFramebuffer
vkCreateGraphicsPipelines
vkCreateImage
vkCreateImageView
vkCreateInstance
vkCreatePipelineCache
vkCreatePipelineLayout
vkCreateQueryPool
vkCreateRenderPass
vkCreateRenderPass2KHR
vkCreateSampler
vkCreateSemaphore
vkCreateShaderModule
vkCreateSwapchainKHR
vkCreateWin32SurfaceKHR
vkDestroyBuffer
vkDestroyBufferView
vkDestroyCommandPool
vkDestroyCuFunctionNVX
vkDestroyCuModuleNVX
vkDestroyDescriptorPool
vkDestroyDescriptorSetLayout
vkDestroyDescriptorUpdateTemplate
vkDestroyDevice
vkDestroyEvent
vkDestroyFence
vkDestroyFramebuffer
vkDestroyImage
vkDestroyImageView
vkDestroyInstance
vkDestroyPipeline
vkDestroyPipelineCache
vkDestroyPipelineLayout
vkDestroyQueryPool
vkDestroyRenderPass
vkDestroySampler
vkDestroySemaphore
vkDestroyShaderModule
vkDestroySurfaceKHR
vkDestroySwapchainKHR
vkDeviceWaitIdle
vkEndCommandBuffer
vkEnumerateDeviceExtensionProperties
vkEnumerateInstanceExtensionProperties
vkEnumerateInstanceLayerProperties
vkEnumeratePhysicalDevices
vkFreeMemory
vkGetBufferDeviceAddressKHR
vkGetBufferMemoryRequirements
vkGetDeviceQueue
vkGetEventStatus
vkGetImageMemoryRequirements
vkGetImageViewAddressNVX
vkGetImageViewHandleNVX
vkGetPhysicalDeviceFeatures2KHR
vkGetPhysicalDeviceFormatProperties
vkGetPhysicalDeviceImageFormatProperties
vkGetPhysicalDeviceMemoryProperties
vkGetPhysicalDeviceMemoryProperties2
vkGetPhysicalDeviceProperties
vkGetPhysicalDeviceProperties2KHR
vkGetPhysicalDeviceQueueFamilyProperties
vkGetPhysicalDeviceSurfaceCapabilitiesKHR
vkGetPhysicalDeviceSurfaceFormats2KHR
vkGetPhysicalDeviceSurfaceFormatsKHR
vkGetPhysicalDeviceSurfacePresentModes2EXT
vkGetPhysicalDeviceSurfacePresentModesKHR
vkGetPhysicalDeviceSurfaceSupportKHR
vkGetQueryPoolResults
vkGetSwapchainImagesKHR
vkMapMemory
vkQueuePresentKHR
vkQueueSubmit
vkResetCommandPool
vkResetDescriptorPool
vkResetEvent
vkResetFences
vkWaitForFences
Obtained with this script (dxvk-native/src
):
rgrep --include \*.cpp -Poh "[ >.]vk[A-Z][^: -]+\("|grep -o "[^>( ]*"|sort|uniq
This is a prototype library implementing Vulkan Portability Initiative using gfx-hal. See gfx-rs meta issue for backend limitations and further details.
Platform support:
- macOS/Metal (lib, icd)
- iOS/Metal (lib, icd)
- Windows/DX12 (lib, icd)
- UWP/DX12 (lib)
For those interested in performance, we did a comprehensive benchmarks of Dota2 and Dolphin Emulator on macOS. Results were published to gfx-rs blog here and there.
For the extension support, see INSTANCE_EXTENSIONS
and DEVICE_EXTENSIONS
in the code.
Despite the fact it's written in Rust, the produced binaries have standard linking interface compatible with any program (written in the language of your choice). There are multiple ways to link to gfx-portability.
Typically, you'd need to create a symbolic link with a name that a target application expects, e.g. libvulkan.dylib -> libportability.dylib
.
Check out and build:
git clone --recursive https://github.com/gfx-rs/portability && cd portability
cargo build --manifest-path libportability/Cargo.toml --features <vulkan|dx12|metal>
gfx-portability can be used with Vulkan loader like any other Vulkan driver. In order to use it this way, you need to build libportability-icd
and point to it from an ICD json file:
VK_ICD_FILENAMES=portability/libportability-icd/portability-macos-debug.json <some_vulkan_app>
For C, you'd need to add crate-type = ["cdylib"]
to libportability-gfx/Cargo.toml
and build it with the backend of your choice. Note: features of this library are fully-qualified crate names, e.g. features gfx-backend-metal
. For rust, just point the cargo dependency to libportability-gfx
.
After building portability
as shown above, grab a copy from https://github.com/LunarG/VulkanSamples.
Manually override the VULKAN_LOADER
variable and set it to the portability library.
set (VULKAN_LOADER "path/to/portability/library")
Then proceed with the normal build instructions.
Please visit our wiki for CTS hookup instructions. Once everything is set, you can generate the new results by calling make cts
on Unix systems. When investigating a particular failure, it's handy to do make cts debug=<test_name>
, which runs a single test under system debugger (gdb/lldb). For simply inspecting the log output, one can also do make cts pick=<test_name>
.