| 4129 | } |
| 4130 | |
| 4131 | static int vulkan_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst, |
| 4132 | const AVFrame *src, int flags) |
| 4133 | { |
| 4134 | int err = 0; |
| 4135 | VkResult ret; |
| 4136 | AVVkFrame *f = (AVVkFrame *)src->data[0]; |
| 4137 | VulkanDevicePriv *p = hwfc->device_ctx->hwctx; |
| 4138 | AVVulkanDeviceContext *hwctx = &p->p; |
| 4139 | FFVulkanFunctions *vk = &p->vkctx.vkfn; |
| 4140 | VulkanFramesPriv *fp = hwfc->hwctx; |
| 4141 | const int nb_images = ff_vk_count_images(f); |
| 4142 | VkImageDrmFormatModifierPropertiesEXT drm_mod = { |
| 4143 | .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT, |
| 4144 | }; |
| 4145 | VkSemaphoreWaitInfo wait_info = { |
| 4146 | .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, |
| 4147 | .flags = 0x0, |
| 4148 | .semaphoreCount = nb_images, |
| 4149 | }; |
| 4150 | |
| 4151 | AVDRMFrameDescriptor *drm_desc = av_mallocz(sizeof(*drm_desc)); |
| 4152 | if (!drm_desc) |
| 4153 | return AVERROR(ENOMEM); |
| 4154 | |
| 4155 | err = prepare_frame(hwfc, &fp->compute_exec, f, PREP_MODE_EXTERNAL_EXPORT); |
| 4156 | if (err < 0) |
| 4157 | goto end; |
| 4158 | |
| 4159 | /* Wait for the operation to finish so we can cleanly export it. */ |
| 4160 | wait_info.pSemaphores = f->sem; |
| 4161 | wait_info.pValues = f->sem_value; |
| 4162 | |
| 4163 | vk->WaitSemaphores(hwctx->act_dev, &wait_info, UINT64_MAX); |
| 4164 | |
| 4165 | err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, &vulkan_unmap_to_drm, drm_desc); |
| 4166 | if (err < 0) |
| 4167 | goto end; |
| 4168 | |
| 4169 | ret = vk->GetImageDrmFormatModifierPropertiesEXT(hwctx->act_dev, f->img[0], |
| 4170 | &drm_mod); |
| 4171 | if (ret != VK_SUCCESS) { |
| 4172 | av_log(hwfc, AV_LOG_ERROR, "Failed to retrieve DRM format modifier!\n"); |
| 4173 | err = AVERROR_EXTERNAL; |
| 4174 | goto end; |
| 4175 | } |
| 4176 | |
| 4177 | for (int i = 0; (i < nb_images) && (f->mem[i]); i++) { |
| 4178 | VkMemoryGetFdInfoKHR export_info = { |
| 4179 | .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, |
| 4180 | .memory = f->mem[i], |
| 4181 | .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, |
| 4182 | }; |
| 4183 | |
| 4184 | ret = vk->GetMemoryFdKHR(hwctx->act_dev, &export_info, |
| 4185 | &drm_desc->objects[i].fd); |
| 4186 | if (ret != VK_SUCCESS) { |
| 4187 | av_log(hwfc, AV_LOG_ERROR, "Unable to export the image as a FD!\n"); |
| 4188 | err = AVERROR_EXTERNAL; |
no test coverage detected