Skip to content

Commit 0b39811

Browse files
committed
layers: Add VK_EXT_external_semaphore_drm_syncobj
1 parent 8a33931 commit 0b39811

22 files changed

Lines changed: 232 additions & 14 deletions

layers/core_checks/cc_external_object.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,18 @@ bool CoreChecks::PreCallValidateImportSemaphoreFdKHR(VkDevice device, const VkIm
9191
}
9292
}
9393

94+
if (pImportSemaphoreFdInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_DRM_SYNCOBJ_BIT_EXT) {
95+
if (!enabled_features.externalSemaphoreDrmSyncobj) {
96+
skip |= LogError("VUID-VkImportSemaphoreFdInfoKHR-handleType-XXXXX1", device, info_loc.dot(Field::handleType),
97+
"is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_DRM_SYNCOBJ_BIT_EXT, but externalSemaphoreDrmSyncobj feature "
98+
"was not enabled.");
99+
}
100+
if (sem_state->type != VK_SEMAPHORE_TYPE_TIMELINE) {
101+
skip |= LogError("VUID-VkImportSemaphoreFdInfoKHR-handleType-XXXXX2", device, info_loc.dot(Field::handleType),
102+
"semaphoreType is %s.", string_VkSemaphoreType(sem_state->type));
103+
}
104+
}
105+
94106
return skip;
95107
}
96108

layers/core_checks/cc_synchronization.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,19 @@ bool CoreChecks::PreCallValidateCreateSemaphore(VkDevice device, const VkSemapho
758758
string_VkExternalSemaphoreHandleTypeFlags(sem_export_info->handleTypes).c_str(),
759759
string_VkExternalSemaphoreHandleTypeFlags(external_properties.compatibleHandleTypes).c_str());
760760
}
761+
if ((sem_export_info->handleTypes & VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_DRM_SYNCOBJ_BIT_EXT) != 0) {
762+
if (!enabled_features.externalSemaphoreDrmSyncobj) {
763+
skip |= LogError("VUID-VkExportSemaphoreCreateInfo-handleTypes-XXXXX3", device,
764+
create_info_loc.pNext(Struct::VkExportSemaphoreCreateInfo, Field::handleTypes),
765+
"contains VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_DRM_SYNCOBJ_BIT_EXT, but externalSemaphoreDrmSyncobj "
766+
"feature was not enabled.");
767+
}
768+
if (semaphoreType != VK_SEMAPHORE_TYPE_TIMELINE) {
769+
skip |= LogError("VUID-VkExportSemaphoreCreateInfo-handleTypes-XXXXX4", device,
770+
create_info_loc.pNext(Struct::VkExportSemaphoreCreateInfo, Field::handleTypes),
771+
"semaphoreType is %s.", string_VkSemaphoreType(semaphoreType));
772+
}
773+
}
761774
}
762775

763776
return skip;

layers/stateless/sl_external_object.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ bool Device::ValidateExternalFenceHandleType(VkFence fence, const char* vuid, co
7878
return skip;
7979
}
8080

81-
static constexpr VkExternalSemaphoreHandleTypeFlags kSemFdHandleTypes =
82-
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
81+
static constexpr VkExternalSemaphoreHandleTypeFlags kSemFdHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT |
82+
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT |
83+
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_DRM_SYNCOBJ_BIT_EXT;
8384

8485
bool Device::manual_PreCallValidateGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd,
8586
const Context& context) const {

layers/vulkan/generated/device_features.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,6 +2070,12 @@ void GetEnabledDeviceFeatures(const VkDeviceCreateInfo* pCreateInfo, DeviceFeatu
20702070
features->dataGraphNeuralAcceleratorStatistics |= enabled->dataGraphNeuralAcceleratorStatistics == VK_TRUE;
20712071
break;
20722072
}
2073+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_DRM_SYNCOBJ_FEATURES_EXT: {
2074+
const VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT* enabled =
2075+
reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT*>(pNext);
2076+
features->externalSemaphoreDrmSyncobj |= enabled->externalSemaphoreDrmSyncobj == VK_TRUE;
2077+
break;
2078+
}
20732079
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT: {
20742080
const VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT* enabled =
20752081
reinterpret_cast<const VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT*>(pNext);

layers/vulkan/generated/device_features.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,8 @@ struct DeviceFeatures {
358358
bool externalMemoryRDMA;
359359
// VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX
360360
bool screenBufferImport;
361+
// VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT
362+
bool externalSemaphoreDrmSyncobj;
361363
// VkPhysicalDeviceFaultFeaturesEXT, VkPhysicalDeviceFaultFeaturesKHR
362364
bool deviceFault;
363365
// VkPhysicalDeviceFaultFeaturesEXT, VkPhysicalDeviceFaultFeaturesKHR

layers/vulkan/generated/enum_flag_bits.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const VkRenderPassCreateFlags AllVkRenderPassCreateFlagBits = VK_RENDER_PASS_CRE
6363
const VkMemoryAllocateFlags AllVkMemoryAllocateFlagBits = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT|VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT|VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT|VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT;
6464
const VkExternalMemoryHandleTypeFlags AllVkExternalMemoryHandleTypeFlagBits = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID|VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA|VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OH_NATIVE_BUFFER_BIT_OHOS|VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX|VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLTEXTURE_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT;
6565
const VkExternalFenceHandleTypeFlags AllVkExternalFenceHandleTypeFlagBits = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT;
66-
const VkExternalSemaphoreHandleTypeFlags AllVkExternalSemaphoreHandleTypeFlagBits = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
66+
const VkExternalSemaphoreHandleTypeFlags AllVkExternalSemaphoreHandleTypeFlagBits = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_DRM_SYNCOBJ_BIT_EXT;
6767
const VkSemaphoreWaitFlags AllVkSemaphoreWaitFlagBits = VK_SEMAPHORE_WAIT_ANY_BIT;
6868
const VkDescriptorBindingFlags AllVkDescriptorBindingFlagBits = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT|VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT|VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT|VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT;
6969
const VkResolveModeFlags AllVkResolveModeFlagBits = VK_RESOLVE_MODE_NONE|VK_RESOLVE_MODE_SAMPLE_ZERO_BIT|VK_RESOLVE_MODE_AVERAGE_BIT|VK_RESOLVE_MODE_MIN_BIT|VK_RESOLVE_MODE_MAX_BIT|VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID|VK_RESOLVE_MODE_CUSTOM_BIT_EXT;

layers/vulkan/generated/error_location_helper.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,6 +1577,7 @@ const char* String(Struct structure) {
15771577
{"VkPhysicalDeviceExternalMemoryHostPropertiesEXT", 48},
15781578
{"VkPhysicalDeviceExternalMemoryRDMAFeaturesNV", 45},
15791579
{"VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX", 54},
1580+
{"VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT", 55},
15801581
{"VkPhysicalDeviceExternalSemaphoreInfo", 38},
15811582
{"VkPhysicalDeviceExternalTensorInfoARM", 38},
15821583
{"VkPhysicalDeviceFaultFeaturesEXT", 33},
@@ -2962,6 +2963,7 @@ const char* String(Field field) {
29622963
{"externalMemoryProperties", 25},
29632964
{"externalMemoryRDMA", 19},
29642965
{"externalQueue", 14},
2966+
{"externalSemaphoreDrmSyncobj", 28},
29652967
{"externalSemaphoreFeatures", 26},
29662968
{"extraCount", 11},
29672969
{"extraPrimitiveOverestimationSize", 33},
@@ -6114,6 +6116,7 @@ const char* String(Extension extension) {
61146116
{"VK_EXT_external_memory_dma_buf", 31},
61156117
{"VK_EXT_external_memory_host", 28},
61166118
{"VK_EXT_external_memory_metal", 29},
6119+
{"VK_EXT_external_semaphore_drm_syncobj", 38},
61176120
{"VK_EXT_filter_cubic", 20},
61186121
{"VK_EXT_fragment_density_map", 28},
61196122
{"VK_EXT_fragment_density_map2", 29},
@@ -9567,6 +9570,8 @@ Struct StypeToStruct(VkStructureType stype) {
95679570
return Struct::VkDataGraphPipelineNeuralStatisticsCreateInfoARM;
95689571
case VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_NEURAL_STATISTICS_CREATE_INFO_ARM:
95699572
return Struct::VkDataGraphPipelineSessionNeuralStatisticsCreateInfoARM;
9573+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_DRM_SYNCOBJ_FEATURES_EXT:
9574+
return Struct::VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT;
95709575
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT:
95719576
return Struct::VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT;
95729577
case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR:

layers/vulkan/generated/error_location_helper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,7 @@ enum class Struct {
15711571
VkPhysicalDeviceExternalMemoryHostPropertiesEXT,
15721572
VkPhysicalDeviceExternalMemoryRDMAFeaturesNV,
15731573
VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX,
1574+
VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT,
15741575
VkPhysicalDeviceExternalSemaphoreInfo,
15751576
VkPhysicalDeviceExternalTensorInfoARM,
15761577
VkPhysicalDeviceFaultFeaturesEXT,
@@ -2953,6 +2954,7 @@ enum class Field {
29532954
externalMemoryProperties,
29542955
externalMemoryRDMA,
29552956
externalQueue,
2957+
externalSemaphoreDrmSyncobj,
29562958
externalSemaphoreFeatures,
29572959
extraCount,
29582960
extraPrimitiveOverestimationSize,
@@ -6096,6 +6098,7 @@ enum class Extension {
60966098
_VK_EXT_external_memory_dma_buf,
60976099
_VK_EXT_external_memory_host,
60986100
_VK_EXT_external_memory_metal,
6101+
_VK_EXT_external_semaphore_drm_syncobj,
60996102
_VK_EXT_filter_cubic,
61006103
_VK_EXT_fragment_density_map,
61016104
_VK_EXT_fragment_density_map2,

layers/vulkan/generated/feature_not_present.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,17 @@ void DispatchInstance::ReportErrorFeatureNotPresent(VkPhysicalDevice gpu, const
13701370
break;
13711371
}
13721372
#endif // VK_USE_PLATFORM_SCREEN_QNX
1373+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_DRM_SYNCOBJ_FEATURES_EXT: {
1374+
VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT supported = vku::InitStructHelper();
1375+
features_2.pNext = &supported;
1376+
DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
1377+
const VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT* enabling =
1378+
reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT*>(current);
1379+
if (enabling->externalSemaphoreDrmSyncobj && !supported.externalSemaphoreDrmSyncobj) {
1380+
ss << "VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT::externalSemaphoreDrmSyncobj is not supported\n";
1381+
}
1382+
break;
1383+
}
13731384
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT: {
13741385
VkPhysicalDeviceFaultFeaturesEXT supported = vku::InitStructHelper();
13751386
features_2.pNext = &supported;

layers/vulkan/generated/feature_requirements_helper.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,6 +2983,22 @@ FeatureAndName AddFeature(APIVersion api_version, vkt::Feature feature, void** i
29832983
}
29842984
#endif // VK_USE_PLATFORM_SCREEN_QNX
29852985

2986+
case Feature::externalSemaphoreDrmSyncobj: {
2987+
auto vk_struct = const_cast<VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT*>(
2988+
vku::FindStructInPNextChain<VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT>(*inout_pnext_chain));
2989+
if (!vk_struct) {
2990+
vk_struct = new VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT;
2991+
*vk_struct = vku::InitStructHelper();
2992+
if (*inout_pnext_chain) {
2993+
vvl::PnextChainAdd(*inout_pnext_chain, vk_struct);
2994+
} else {
2995+
*inout_pnext_chain = vk_struct;
2996+
}
2997+
}
2998+
return {&vk_struct->externalSemaphoreDrmSyncobj,
2999+
"VkPhysicalDeviceExternalSemaphoreDrmSyncobjFeaturesEXT::externalSemaphoreDrmSyncobj"};
3000+
}
3001+
29863002
case Feature::deviceFault: {
29873003
auto vk_struct = const_cast<VkPhysicalDeviceFaultFeaturesKHR*>(
29883004
vku::FindStructInPNextChain<VkPhysicalDeviceFaultFeaturesKHR>(*inout_pnext_chain));

0 commit comments

Comments
 (0)