This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit e3a96a69cb0deea8418db1117738dde700dc07ce Author: Lynne <[email protected]> AuthorDate: Mon Jan 19 11:51:30 2026 +0100 Commit: Lynne <[email protected]> CommitDate: Mon Jan 19 16:37:17 2026 +0100 vulkan_dpx: remove host image upload path The main reason this was written was due to Nvidia. Nvidia always has a fickle upload path, and seemed to have a shortcut for the host image upload path. This seems to have been patched out of recent driver versions. This upload path relies on the driver keeping the same layout, down to the stride for the images. Which is an assumption that's not portable. Rather than relying on this fickle upload path, what we'd like when we want pure bandwidth is to decouple uploads to a separate queue, and let the GPU pull the data from RAM via uploads. It'll be slower with a single-threaded decoder, but currently all of our compute-based decoders and the decoders that sit underneath them support frame threading. --- libavcodec/vulkan_dpx.c | 103 ------------------------------------------------ 1 file changed, 103 deletions(-) diff --git a/libavcodec/vulkan_dpx.c b/libavcodec/vulkan_dpx.c index cf53a0f4df..17f91c6ce4 100644 --- a/libavcodec/vulkan_dpx.c +++ b/libavcodec/vulkan_dpx.c @@ -54,106 +54,6 @@ typedef struct DecodePushData { int shift; } DecodePushData; -static int host_upload_image(AVCodecContext *avctx, - FFVulkanDecodeContext *dec, DPXDecContext *dpx, - const uint8_t *src, uint32_t size) -{ - int err; - VkImage temp; - - FFVulkanDecodeShared *ctx = dec->shared_ctx; - DPXVulkanDecodeContext *dxv = ctx->sd_ctx; - VkPhysicalDeviceLimits *limits = &ctx->s.props.properties.limits; - FFVulkanFunctions *vk = &ctx->s.vkfn; - - DPXVulkanDecodePicture *pp = dpx->hwaccel_picture_private; - FFVulkanDecodePicture *vp = &pp->vp; - - int unpack = (avctx->bits_per_raw_sample == 12 && !dpx->packing) || - avctx->bits_per_raw_sample == 10; - if (unpack) - return 0; - - VkImageCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .imageType = VK_IMAGE_TYPE_2D, - .format = avctx->bits_per_raw_sample == 8 ? VK_FORMAT_R8_UINT : - avctx->bits_per_raw_sample == 32 ? VK_FORMAT_R32_UINT : - VK_FORMAT_R16_UINT, - .extent.width = dpx->frame->width*dpx->components, - .extent.height = dpx->frame->height, - .extent.depth = 1, - .mipLevels = 1, - .arrayLayers = 1, - .tiling = VK_IMAGE_TILING_LINEAR, - .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .usage = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT, - .samples = VK_SAMPLE_COUNT_1_BIT, - .pQueueFamilyIndices = &ctx->qf[0].idx, - .queueFamilyIndexCount = 1, - .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - }; - - if (create_info.extent.width >= limits->maxImageDimension2D || - create_info.extent.height >= limits->maxImageDimension2D) - return 0; - - vk->CreateImage(ctx->s.hwctx->act_dev, &create_info, ctx->s.hwctx->alloc, - &temp); - - err = ff_vk_get_pooled_buffer(&ctx->s, &dxv->frame_data_pool, - &vp->slices_buf, - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | - VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, - NULL, size, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); - if (err < 0) - return err; - - FFVkBuffer *vkb = (FFVkBuffer *)vp->slices_buf->data; - VkBindImageMemoryInfo bind_info = { - .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, - .image = temp, - .memory = vkb->mem, - }; - vk->BindImageMemory2(ctx->s.hwctx->act_dev, 1, &bind_info); - - VkHostImageLayoutTransitionInfo layout_change = { - .sType = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO, - .image = temp, - .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .subresourceRange.layerCount = 1, - .subresourceRange.levelCount = 1, - }; - vk->TransitionImageLayoutEXT(ctx->s.hwctx->act_dev, 1, &layout_change); - - VkMemoryToImageCopy copy_region = { - .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY, - .pHostPointer = src, - .imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .imageSubresource.layerCount = 1, - .imageExtent = (VkExtent3D){ dpx->frame->width*dpx->components, - dpx->frame->height, - 1 }, - }; - VkCopyMemoryToImageInfo copy_info = { - .sType = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO, - .flags = VK_HOST_IMAGE_COPY_MEMCPY_EXT, - .dstImage = temp, - .dstImageLayout = VK_IMAGE_LAYOUT_GENERAL, - .regionCount = 1, - .pRegions = ©_region, - }; - vk->CopyMemoryToImageEXT(ctx->s.hwctx->act_dev, ©_info); - - vk->DestroyImage(ctx->s.hwctx->act_dev, temp, ctx->s.hwctx->alloc); - - return 0; -} - static int vk_dpx_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, @@ -167,9 +67,6 @@ static int vk_dpx_start_frame(AVCodecContext *avctx, DPXVulkanDecodePicture *pp = dpx->hwaccel_picture_private; FFVulkanDecodePicture *vp = &pp->vp; - if (ctx->s.extensions & FF_VK_EXT_HOST_IMAGE_COPY) - host_upload_image(avctx, dec, dpx, buffer, size); - /* Host map the frame data if supported */ if (!vp->slices_buf && ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
