History

vulkan: add support for the atomic float ops extension

Lynne committed 3 years ago

Commit dfff3871 parent 88e2cca5 files · +33 −1Browse files

Unified · Split

5 files
  1. libavutil/hwcontext_vulkan.c +14 −1
  2. libavutil/vulkan.c +13 −0
  3. libavutil/vulkan.h +4 −0
  4. libavutil/vulkan_functions.h +1 −0
  5. libavutil/vulkan_loader.h +1 −0
libavutil/hwcontext_vulkan.c+14−1
@@ -96,6 +96,7 @@ typedef struct VulkanDevicePriv { · 95 unmodified lines
96 VkPhysicalDeviceVulkan12Features device_features_1_2;96 VkPhysicalDeviceVulkan12Features device_features_1_2;
97 VkPhysicalDeviceVulkan13Features device_features_1_3;97 VkPhysicalDeviceVulkan13Features device_features_1_3;
98 VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features;98 VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features;
99 VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_features;
99 100
100 /* Queues */101 /* Queues */
101 pthread_mutex_t **qf_mutex;102 pthread_mutex_t **qf_mutex;
@@ -401,6 +402,7 @@ static const VulkanOptExtension optional_device_exts[] = { · 299 unmodified lines
401 { VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },402 { VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
402 { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },403 { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },
403 { VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, FF_VK_EXT_DEVICE_DRM },404 { VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, FF_VK_EXT_DEVICE_DRM },
405 { VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, FF_VK_EXT_ATOMIC_FLOAT },
404 406
405 /* Imports/exports */407 /* Imports/exports */
406 { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_FD_MEMORY },408 { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_FD_MEMORY },
@@ -1195,9 +1197,13 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, · 788 unmodified lines
1195 VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = {1197 VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = {
1196 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,1198 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
1197 };1199 };
1200 VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_features = {
1201 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT,
1202 .pNext = &timeline_features,
1203 };
1198 VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features = {1204 VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features = {
1199 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,1205 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,
1200 .pNext = &timeline_features,1206 .pNext = &atomic_float_features,
1201 };1207 };
1202 VkPhysicalDeviceVulkan13Features dev_features_1_3 = {1208 VkPhysicalDeviceVulkan13Features dev_features_1_3 = {
1203 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,1209 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
@@ -1229,6 +1235,10 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, · 25 unmodified lines
1229 p->device_features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;1235 p->device_features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
1230 p->device_features_1_3.pNext = &p->desc_buf_features;1236 p->device_features_1_3.pNext = &p->desc_buf_features;
1231 p->desc_buf_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;1237 p->desc_buf_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
1238 p->desc_buf_features.pNext = &p->atomic_float_features;
1239 p->atomic_float_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
1240 p->atomic_float_features.pNext = NULL;
1241
1232 ctx->free = vulkan_device_free;1242 ctx->free = vulkan_device_free;
1233 1243
1234 /* Create an instance if not given one */1244 /* Create an instance if not given one */
@@ -1286,6 +1296,9 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, · 51 unmodified lines
1286 p->desc_buf_features.descriptorBuffer = desc_buf_features.descriptorBuffer;1296 p->desc_buf_features.descriptorBuffer = desc_buf_features.descriptorBuffer;
1287 p->desc_buf_features.descriptorBufferPushDescriptors = desc_buf_features.descriptorBufferPushDescriptors;1297 p->desc_buf_features.descriptorBufferPushDescriptors = desc_buf_features.descriptorBufferPushDescriptors;
1288 1298
1299 p->atomic_float_features.shaderBufferFloat32Atomics = atomic_float_features.shaderBufferFloat32Atomics;
1300 p->atomic_float_features.shaderBufferFloat32AtomicAdd = atomic_float_features.shaderBufferFloat32AtomicAdd;
1301
1289 dev_info.pNext = &hwctx->device_features;1302 dev_info.pNext = &hwctx->device_features;
1290 1303
1291 /* Setup queue family */1304 /* Setup queue family */
libavutil/vulkan.c+13−0
@@ -107,8 +107,21 @@ int ff_vk_load_props(FFVulkanContext *s) · 106 unmodified lines
107 .pNext = &s->driver_props,107 .pNext = &s->driver_props,
108 };108 };
109 109
110 s->atomic_float_feats = (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT) {
111 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT,
112 };
113 s->feats_12 = (VkPhysicalDeviceVulkan12Features) {
114 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
115 .pNext = &s->atomic_float_feats,
116 };
117 s->feats = (VkPhysicalDeviceFeatures2) {
118 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
119 .pNext = &s->feats_12,
120 };
121
110 vk->GetPhysicalDeviceProperties2(s->hwctx->phys_dev, &s->props);122 vk->GetPhysicalDeviceProperties2(s->hwctx->phys_dev, &s->props);
111 vk->GetPhysicalDeviceMemoryProperties(s->hwctx->phys_dev, &s->mprops);123 vk->GetPhysicalDeviceMemoryProperties(s->hwctx->phys_dev, &s->mprops);
124 vk->GetPhysicalDeviceFeatures2(s->hwctx->phys_dev, &s->feats);
112 125
113 if (s->qf_props)126 if (s->qf_props)
114 return 0;127 return 0;
libavutil/vulkan.h+4−0
@@ -240,6 +240,10 @@ typedef struct FFVulkanContext { · 239 unmodified lines
240 VkQueueFamilyProperties2 *qf_props;240 VkQueueFamilyProperties2 *qf_props;
241 int tot_nb_qfs;241 int tot_nb_qfs;
242 242
243 VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats;
244 VkPhysicalDeviceVulkan12Features feats_12;
245 VkPhysicalDeviceFeatures2 feats;
246
243 AVHWDeviceContext *device;247 AVHWDeviceContext *device;
244 AVVulkanDeviceContext *hwctx;248 AVVulkanDeviceContext *hwctx;
245 249
libavutil/vulkan_functions.h+1−0
@@ -44,6 +44,7 @@ typedef enum FFVulkanExtensions { · 43 unmodified lines
44 FF_VK_EXT_VIDEO_DECODE_H264 = 1ULL << 12, /* VK_EXT_video_decode_h264 */44 FF_VK_EXT_VIDEO_DECODE_H264 = 1ULL << 12, /* VK_EXT_video_decode_h264 */
45 FF_VK_EXT_VIDEO_DECODE_H265 = 1ULL << 13, /* VK_EXT_video_decode_h265 */45 FF_VK_EXT_VIDEO_DECODE_H265 = 1ULL << 13, /* VK_EXT_video_decode_h265 */
46 FF_VK_EXT_VIDEO_DECODE_AV1 = 1ULL << 14, /* VK_MESA_video_decode_av1 */46 FF_VK_EXT_VIDEO_DECODE_AV1 = 1ULL << 14, /* VK_MESA_video_decode_av1 */
47 FF_VK_EXT_ATOMIC_FLOAT = 1ULL << 15, /* VK_EXT_shader_atomic_float */
47 48
48 FF_VK_EXT_NO_FLAG = 1ULL << 31,49 FF_VK_EXT_NO_FLAG = 1ULL << 31,
49} FFVulkanExtensions;50} FFVulkanExtensions;
libavutil/vulkan_loader.h+1−0
@@ -45,6 +45,7 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions, · 44 unmodified lines
45 { VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_HOST_MEMORY },45 { VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_HOST_MEMORY },
46 { VK_EXT_DEBUG_UTILS_EXTENSION_NAME, FF_VK_EXT_DEBUG_UTILS },46 { VK_EXT_DEBUG_UTILS_EXTENSION_NAME, FF_VK_EXT_DEBUG_UTILS },
47 { VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, FF_VK_EXT_DEVICE_DRM },47 { VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, FF_VK_EXT_DEVICE_DRM },
48 { VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, FF_VK_EXT_ATOMIC_FLOAT },
48#ifdef _WIN3249#ifdef _WIN32
49 { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_MEMORY },50 { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_MEMORY },
50 { VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_SEM },51 { VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_SEM },

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t