Skip to content

Commit

Permalink
[dxvk] Add feature check for external semaphores
Browse files Browse the repository at this point in the history
  • Loading branch information
doitsujin committed Aug 2, 2022
1 parent 73b27a7 commit 257b075
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 10 deletions.
41 changes: 31 additions & 10 deletions src/dxvk/dxvk_fence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,25 @@ namespace dxvk {
VkExportSemaphoreCreateInfo exportInfo = { VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO };
exportInfo.handleTypes = info.sharedType;

if (info.sharedType != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM)
typeInfo.pNext = &exportInfo;
VkExternalSemaphoreFeatureFlags externalFeatures = 0;

if (info.sharedType != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM) {
auto vki = device->adapter()->vki();

VkPhysicalDeviceExternalSemaphoreInfo externalInfo = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, &typeInfo };
externalInfo.handleType = info.sharedType;

VkExternalSemaphoreProperties externalProperties = { };
vki->vkGetPhysicalDeviceExternalSemaphoreProperties(
device->adapter()->handle(), &externalInfo, &externalProperties);

externalFeatures = externalProperties.externalSemaphoreFeatures;

if (externalFeatures & VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT)
typeInfo.pNext = &exportInfo;
else
Logger::warn(str::format("Exporting semaphores of type ", info.sharedType, " not supported by device"));
}

VkSemaphoreCreateInfo semaphoreInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &typeInfo };

Expand All @@ -29,14 +46,18 @@ namespace dxvk {
throw DxvkError("Failed to create timeline semaphore");

if (info.sharedHandle != INVALID_HANDLE_VALUE) {
VkImportSemaphoreWin32HandleInfoKHR importInfo = { VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR };
importInfo.semaphore = m_semaphore;
importInfo.handleType = info.sharedType;
importInfo.handle = info.sharedHandle;

vr = m_vkd->vkImportSemaphoreWin32HandleKHR(m_vkd->device(), &importInfo);
if (vr != VK_SUCCESS)
throw DxvkError("Failed to import timeline semaphore");
if (externalFeatures & VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT) {
VkImportSemaphoreWin32HandleInfoKHR importInfo = { VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR };
importInfo.semaphore = m_semaphore;
importInfo.handleType = info.sharedType;
importInfo.handle = info.sharedHandle;

vr = m_vkd->vkImportSemaphoreWin32HandleKHR(m_vkd->device(), &importInfo);
if (vr != VK_SUCCESS)
throw DxvkError("Failed to import timeline semaphore");
} else {
Logger::warn(str::format("Importing semaphores of type ", info.sharedType, " not supported by device"));
}
}

m_thread = dxvk::thread([this] { run(); });
Expand Down
1 change: 1 addition & 0 deletions src/vulkan/vulkan_loader.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ namespace dxvk::vk {
VULKAN_FN(vkDestroyInstance);
VULKAN_FN(vkEnumerateDeviceExtensionProperties);
VULKAN_FN(vkEnumeratePhysicalDevices);
VULKAN_FN(vkGetPhysicalDeviceExternalSemaphoreProperties);
VULKAN_FN(vkGetPhysicalDeviceFeatures);
VULKAN_FN(vkGetPhysicalDeviceFeatures2);
VULKAN_FN(vkGetPhysicalDeviceFormatProperties);
Expand Down

0 comments on commit 257b075

Please sign in to comment.