]> git.sesse.net Git - ffmpeg/commitdiff
lavfi/vulkan: use dedicated allocation for buffers when necessary
authorLynne <dev@lynne.ee>
Mon, 25 May 2020 14:36:41 +0000 (15:36 +0100)
committerLynne <dev@lynne.ee>
Tue, 26 May 2020 09:52:11 +0000 (10:52 +0100)
libavfilter/vulkan.c

index 301ee4354fbc8a523ad75bca8241fe61fe79f2bb..c3badaee29a57d233c75d7d1fd9155406eef1554 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);
+
+    /* 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, flags, NULL, &buf->flags, &buf->mem);
+    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;