@ -2332,9 +2332,10 @@ static int vulkan_map_frame_to_mem(AVHWFramesContext *hwfc, AVFrame *dst,
const AVFrame * src , int flags )
{
VkResult ret ;
int err , mapped_mem_count = 0 ;
int err , mapped_mem_count = 0 , mem_planes = 0 ;
AVVkFrame * f = ( AVVkFrame * ) src - > data [ 0 ] ;
AVVulkanDeviceContext * hwctx = hwfc - > device_ctx - > hwctx ;
AVVulkanFramesContext * hwfctx = hwfc - > hwctx ;
const int planes = av_pix_fmt_count_planes ( hwfc - > sw_format ) ;
VulkanDevicePriv * p = hwfc - > device_ctx - > internal - > priv ;
FFVulkanFunctions * vk = & p - > vkfn ;
@ -2361,7 +2362,8 @@ static int vulkan_map_frame_to_mem(AVHWFramesContext *hwfc, AVFrame *dst,
dst - > width = src - > width ;
dst - > height = src - > height ;
for ( int i = 0 ; i < planes ; i + + ) {
mem_planes = hwfctx - > flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY ? 1 : planes ;
for ( int i = 0 ; i < mem_planes ; i + + ) {
ret = vk - > MapMemory ( hwctx - > act_dev , f - > mem [ i ] , 0 ,
VK_WHOLE_SIZE , 0 , ( void * * ) & dst - > data [ i ] ) ;
if ( ret ! = VK_SUCCESS ) {
@ -2373,6 +2375,11 @@ static int vulkan_map_frame_to_mem(AVHWFramesContext *hwfc, AVFrame *dst,
mapped_mem_count + + ;
}
if ( hwfctx - > flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY ) {
for ( int i = 0 ; i < planes ; i + + )
dst - > data [ i ] = dst - > data [ 0 ] + f - > offset [ i ] ;
}
/* Check if the memory contents matter */
if ( ( ( flags & AV_HWFRAME_MAP_READ ) | | ! ( flags & AV_HWFRAME_MAP_OVERWRITE ) ) & &
! ( f - > flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT ) ) {