mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-09-01 14:06:45 +02:00
hwcontext_vulkan: use dedicated allocation for buffers when necessary
This commit is contained in:
parent
4dcb50c58a
commit
6bb718aabd
@ -2663,7 +2663,7 @@ static int create_buf(AVHWDeviceContext *ctx, AVBufferRef **buf, size_t imp_size
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
VkResult ret;
|
VkResult ret;
|
||||||
VkMemoryRequirements req;
|
int use_ded_mem;
|
||||||
AVVulkanDeviceContext *hwctx = ctx->hwctx;
|
AVVulkanDeviceContext *hwctx = ctx->hwctx;
|
||||||
VulkanDevicePriv *p = ctx->internal->priv;
|
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,
|
.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));
|
ImageBuffer *vkbuf = av_mallocz(sizeof(*vkbuf));
|
||||||
if (!vkbuf)
|
if (!vkbuf)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
@ -2695,9 +2710,19 @@ static int create_buf(AVHWDeviceContext *ctx, AVBufferRef **buf, size_t imp_size
|
|||||||
return AVERROR_EXTERNAL;
|
return AVERROR_EXTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vkGetBufferMemoryRequirements(hwctx->act_dev, vkbuf->buf, &req);
|
req_desc.buffer = vkbuf->buf;
|
||||||
|
|
||||||
err = alloc_mem(ctx, &req, flags, alloc_pnext, &vkbuf->flags, &vkbuf->mem);
|
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.memoryRequirements, flags,
|
||||||
|
use_ded_mem ? &ded_alloc : (void *)ded_alloc.pNext,
|
||||||
|
&vkbuf->flags, &vkbuf->mem);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user