MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / vulkan_map_to_drm

Function vulkan_map_to_drm

libavutil/hwcontext_vulkan.c:4131–4246  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4129}
4130
4131static 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;

Callers 2

vulkan_map_to_vaapiFunction · 0.85
vulkan_map_fromFunction · 0.85

Calls 9

ff_vk_count_imagesFunction · 0.85
prepare_frameFunction · 0.85
ff_hwframe_map_createFunction · 0.85
av_logFunction · 0.85
vulkan_fmt_to_drmFunction · 0.85
plane_index_to_aspectFunction · 0.85
av_malloczFunction · 0.70
av_vkfmt_from_pixfmtFunction · 0.70
av_freeFunction · 0.70

Tested by

no test coverage detected