[FFmpeg-cvslog] hwcontext_vulkan: use dedicated allocation for buffers when necessary

Lynne git at videolan.org
Tue May 26 12:58:26 EEST 2020


ffmpeg | branch: master | Lynne <dev at lynne.ee> | Tue May 26 10:34:31 2020 +0100| [6bb718aabd648d9e2cb166364f9efae2ac245ecd] | committer: Lynne

hwcontext_vulkan: use dedicated allocation for buffers when necessary

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6bb718aabd648d9e2cb166364f9efae2ac245ecd
---

 libavutil/hwcontext_vulkan.c | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 95c874a466..5976e33f03 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -2663,7 +2663,7 @@ static int create_buf(AVHWDeviceContext *ctx, AVBufferRef **buf, size_t imp_size
 {
     int err;
     VkResult ret;
-    VkMemoryRequirements req;
+    int use_ded_mem;
     AVVulkanDeviceContext *hwctx = ctx->hwctx;
     VulkanDevicePriv *p = ctx->internal->priv;
 
@@ -2674,6 +2674,21 @@ static int create_buf(AVHWDeviceContext *ctx, AVBufferRef **buf, size_t imp_size
         .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
     };
 
+    VkBufferMemoryRequirementsInfo2 req_desc = {
+        .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
+    };
+    VkMemoryDedicatedAllocateInfo ded_alloc = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+        .pNext = alloc_pnext,
+    };
+    VkMemoryDedicatedRequirements ded_req = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
+    };
+    VkMemoryRequirements2 req = {
+        .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
+        .pNext = &ded_req,
+    };
+
     ImageBuffer *vkbuf = av_mallocz(sizeof(*vkbuf));
     if (!vkbuf)
         return AVERROR(ENOMEM);
@@ -2695,9 +2710,19 @@ static int create_buf(AVHWDeviceContext *ctx, AVBufferRef **buf, size_t imp_size
         return AVERROR_EXTERNAL;
     }
 
-    vkGetBufferMemoryRequirements(hwctx->act_dev, vkbuf->buf, &req);
+    req_desc.buffer = vkbuf->buf;
+
+    vkGetBufferMemoryRequirements2(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 = vkbuf->buf;
 
-    err = alloc_mem(ctx, &req, flags, alloc_pnext, &vkbuf->flags, &vkbuf->mem);
+    err = alloc_mem(ctx, &req.memoryRequirements, flags,
+                    use_ded_mem ? &ded_alloc : (void *)ded_alloc.pNext,
+                    &vkbuf->flags, &vkbuf->mem);
     if (err)
         return err;
 



More information about the ffmpeg-cvslog mailing list