| @@ -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; | |||||
| 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) | if (err) | ||||
| return err; | return err; | ||||