]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/vulkan.c
avutil/buffer: Switch AVBuffer API to size_t
[ffmpeg] / libavfilter / vulkan.c
index 301ee4354fbc8a523ad75bca8241fe61fe79f2bb..0ac5711182ecac40c4c911c7857648cd54394c86 100644 (file)
@@ -152,7 +152,7 @@ int ff_vk_create_buf(AVFilterContext *avctx, FFVkBuffer *buf, size_t size,
 {
     int err;
     VkResult ret;
-    VkMemoryRequirements req;
+    int use_ded_mem;
     VulkanFilterContext *s = avctx->priv;
 
     VkBufferCreateInfo buf_spawn = {
@@ -164,6 +164,21 @@ int ff_vk_create_buf(AVFilterContext *avctx, FFVkBuffer *buf, size_t size,
                                 but should be ok */
     };
 
+    VkBufferMemoryRequirementsInfo2 req_desc = {
+        .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
+    };
+    VkMemoryDedicatedAllocateInfo ded_alloc = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+        .pNext = NULL,
+    };
+    VkMemoryDedicatedRequirements ded_req = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
+    };
+    VkMemoryRequirements2 req = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
+        .pNext = &ded_req,
+    };
+
     ret = vkCreateBuffer(s->hwctx->act_dev, &buf_spawn, NULL, &buf->buf);
     if (ret != VK_SUCCESS) {
         av_log(avctx, AV_LOG_ERROR, "Failed to create buffer: %s\n",
@@ -171,9 +186,19 @@ int ff_vk_create_buf(AVFilterContext *avctx, FFVkBuffer *buf, size_t size,
         return AVERROR_EXTERNAL;
     }
 
-    vkGetBufferMemoryRequirements(s->hwctx->act_dev, buf->buf, &req);
+    req_desc.buffer = buf->buf;
+
+    vkGetBufferMemoryRequirements2(s->hwctx->act_dev, &req_desc, &req);
 
-    err = vk_alloc_mem(avctx, &req, flags, NULL, &buf->flags, &buf->mem);
+    /* In case the implementation prefers/requires dedicated allocation */
+    use_ded_mem = ded_req.prefersDedicatedAllocation |
+                  ded_req.requiresDedicatedAllocation;
+    if (use_ded_mem)
+        ded_alloc.buffer = buf->buf;
+
+    err = vk_alloc_mem(avctx, &req.memoryRequirements, flags,
+                       use_ded_mem ? &ded_alloc : (void *)ded_alloc.pNext,
+                       &buf->flags, &buf->mem);
     if (err)
         return err;
 
@@ -1138,7 +1163,7 @@ void ff_vk_update_descriptor_set(AVFilterContext *avctx, VulkanPipeline *pl,
     VulkanFilterContext *s = avctx->priv;
 
     vkUpdateDescriptorSetWithTemplate(s->hwctx->act_dev,
-                                      pl->desc_set[set_id * s->cur_queue_idx],
+                                      pl->desc_set[s->cur_queue_idx * pl->desc_layout_num + set_id],
                                       pl->desc_template[set_id],
                                       s);
 }
@@ -1157,9 +1182,7 @@ int ff_vk_init_pipeline_layout(AVFilterContext *avctx, VulkanPipeline *pl)
     VkResult ret;
     VulkanFilterContext *s = avctx->priv;
 
-    int queues_count = 1;
-
-    pl->descriptor_sets_num = pl->desc_layout_num * queues_count;
+    pl->descriptor_sets_num = pl->desc_layout_num * s->queue_count;
 
     { /* Init descriptor set pool */
         VkDescriptorPoolCreateInfo pool_create_info = {