@@ -513,6 +513,7 @@ Error RenderingDeviceDriverVulkan::_initialize_device_extensions() {
513
513
_register_requested_device_extension (VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, false );
514
514
_register_requested_device_extension (VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false );
515
515
_register_requested_device_extension (VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, false );
516
+ _register_requested_device_extension (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, false );
516
517
517
518
if (Engine::get_singleton ()->is_generate_spirv_debug_info_enabled ()) {
518
519
_register_requested_device_extension (VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true );
@@ -730,6 +731,7 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
730
731
void *next_features = nullptr ;
731
732
VkPhysicalDeviceVulkan12Features device_features_vk_1_2 = {};
732
733
VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_features = {};
734
+ VkPhysicalDeviceBufferDeviceAddressFeaturesKHR buffer_device_address_features = {};
733
735
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
734
736
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {};
735
737
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
@@ -740,10 +742,17 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
740
742
device_features_vk_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
741
743
device_features_vk_1_2.pNext = next_features;
742
744
next_features = &device_features_vk_1_2;
743
- } else if (enabled_device_extension_names.has (VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
744
- shader_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR;
745
- shader_features.pNext = next_features;
746
- next_features = &shader_features;
745
+ } else {
746
+ if (enabled_device_extension_names.has (VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
747
+ shader_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR;
748
+ shader_features.pNext = next_features;
749
+ next_features = &shader_features;
750
+ }
751
+ if (enabled_device_extension_names.has (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
752
+ buffer_device_address_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR;
753
+ buffer_device_address_features.pNext = next_features;
754
+ next_features = &buffer_device_address_features;
755
+ }
747
756
}
748
757
749
758
if (enabled_device_extension_names.has (VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
@@ -783,11 +792,17 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
783
792
shader_capabilities.shader_float16_is_supported = device_features_vk_1_2.shaderFloat16 ;
784
793
shader_capabilities.shader_int8_is_supported = device_features_vk_1_2.shaderInt8 ;
785
794
}
795
+ if (enabled_device_extension_names.has (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
796
+ buffer_device_address_support = device_features_vk_1_2.bufferDeviceAddress ;
797
+ }
786
798
} else {
787
799
if (enabled_device_extension_names.has (VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
788
800
shader_capabilities.shader_float16_is_supported = shader_features.shaderFloat16 ;
789
801
shader_capabilities.shader_int8_is_supported = shader_features.shaderInt8 ;
790
802
}
803
+ if (enabled_device_extension_names.has (VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
804
+ buffer_device_address_support = buffer_device_address_features.bufferDeviceAddress ;
805
+ }
791
806
}
792
807
793
808
if (enabled_device_extension_names.has (VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
@@ -971,6 +986,14 @@ Error RenderingDeviceDriverVulkan::_initialize_device(const LocalVector<VkDevice
971
986
shader_features.shaderInt8 = shader_capabilities.shader_int8_is_supported ;
972
987
create_info_next = &shader_features;
973
988
989
+ VkPhysicalDeviceBufferDeviceAddressFeaturesKHR buffer_device_address_features = {};
990
+ if (buffer_device_address_support) {
991
+ buffer_device_address_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR;
992
+ buffer_device_address_features.pNext = create_info_next;
993
+ buffer_device_address_features.bufferDeviceAddress = buffer_device_address_support;
994
+ create_info_next = &buffer_device_address_features;
995
+ }
996
+
974
997
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
975
998
if (vrs_capabilities.pipeline_vrs_supported || vrs_capabilities.primitive_vrs_supported || vrs_capabilities.attachment_vrs_supported ) {
976
999
vrs_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
@@ -1112,6 +1135,9 @@ Error RenderingDeviceDriverVulkan::_initialize_allocator() {
1112
1135
if (use_1_3_features) {
1113
1136
allocator_info.flags |= VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT;
1114
1137
}
1138
+ if (buffer_device_address_support) {
1139
+ allocator_info.flags |= VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT;
1140
+ }
1115
1141
VkResult err = vmaCreateAllocator (&allocator_info, &allocator);
1116
1142
ERR_FAIL_COND_V_MSG (err, ERR_CANT_CREATE, " vmaCreateAllocator failed with error " + itos (err) + " ." );
1117
1143
@@ -1487,6 +1513,7 @@ static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_STORAGE_BIT, VK_BUFFER_USAGE_
1487
1513
static_assert (ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_INDEX_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT));
1488
1514
static_assert (ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_VERTEX_BIT, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
1489
1515
static_assert (ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_INDIRECT_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT));
1516
+ static_assert (ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT));
1490
1517
1491
1518
RDD::BufferID RenderingDeviceDriverVulkan::buffer_create (uint64_t p_size, BitField<BufferUsageBits> p_usage, MemoryAllocationType p_allocation_type) {
1492
1519
VkBufferCreateInfo create_info = {};
@@ -1588,6 +1615,15 @@ void RenderingDeviceDriverVulkan::buffer_unmap(BufferID p_buffer) {
1588
1615
vmaUnmapMemory (allocator, buf_info->allocation .handle );
1589
1616
}
1590
1617
1618
+ uint64_t RenderingDeviceDriverVulkan::buffer_get_device_address (BufferID p_buffer) {
1619
+ const BufferInfo *buf_info = (const BufferInfo *)p_buffer.id ;
1620
+ VkBufferDeviceAddressInfo address_info = {};
1621
+ address_info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
1622
+ address_info.pNext = nullptr ;
1623
+ address_info.buffer = buf_info->vk_buffer ;
1624
+ return vkGetBufferDeviceAddress (vk_device, &address_info);
1625
+ }
1626
+
1591
1627
/* ****************/
1592
1628
/* *** TEXTURE ****/
1593
1629
/* ****************/
@@ -5874,6 +5910,8 @@ bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) {
5874
5910
return vrs_capabilities.attachment_vrs_supported && physical_device_features.shaderStorageImageExtendedFormats ;
5875
5911
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
5876
5912
return true ;
5913
+ case SUPPORTS_BUFFER_DEVICE_ADDRESS:
5914
+ return buffer_device_address_support;
5877
5915
default :
5878
5916
return false ;
5879
5917
}
0 commit comments