From bca61e565f3238f89f24019380830b6c89837b41 Mon Sep 17 00:00:00 2001 From: "Xu, Zhengguo" Date: Tue, 9 Apr 2024 14:17:05 +0800 Subject: [PATCH 1/5] [DON'T merge, TEST only] remove heap mutex and use rw lock to protect heap only --- media_driver/linux/common/ddi/media_libva.cpp | 99 ++++++++++--------- .../linux/common/ddi/media_libva_common.cpp | 43 ++++---- .../linux/common/ddi/media_libva_util.cpp | 9 ++ .../common/ddi/media_libva_common_next.h | 3 + 4 files changed, 91 insertions(+), 63 deletions(-) diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index 20b6619614..ea540378cf 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -300,12 +300,12 @@ static uint32_t DdiMedia_CreateRenderTarget( int memType ) { - DdiMediaUtil_LockMutex(&mediaDrvCtx->SurfaceMutex); + //DdiMediaUtil_LockMutex(&mediaDrvCtx->SurfaceMutex); PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = DdiMediaUtil_AllocPMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap); if (nullptr == surfaceElement) { - DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); return VA_INVALID_ID; } @@ -313,7 +313,7 @@ static uint32_t DdiMedia_CreateRenderTarget( if (nullptr == surfaceElement->pSurface) { DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap, surfaceElement->uiVaSurfaceID); - DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); return VA_INVALID_ID; } @@ -331,13 +331,13 @@ static uint32_t DdiMedia_CreateRenderTarget( { MOS_FreeMemory(surfaceElement->pSurface); DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap, surfaceElement->uiVaSurfaceID); - DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); return VA_INVALID_ID; } mediaDrvCtx->uiNumSurfaces++; uint32_t surfaceID = surfaceElement->uiVaSurfaceID; - DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); return surfaceID; } @@ -999,11 +999,13 @@ void* DdiMedia_GetCtxFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID buf uint32_t i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", nullptr); - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + mediaCtx->pBufferHeap->lock.lock_shared(); PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; void *temp = bufHeapElement->pCtx; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + mediaCtx->pBufferHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return temp; } @@ -1025,11 +1027,13 @@ uint32_t DdiMedia_GetCtxTypeFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABuffe uint32_t i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", DDI_MEDIA_CONTEXT_TYPE_NONE); - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + mediaCtx->pBufferHeap->lock.lock_shared(); PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; uint32_t ctxType = bufHeapElement->uiCtxType; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + mediaCtx->pBufferHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return ctxType; @@ -1335,14 +1339,14 @@ VAStatus DdiMedia_MediaMemoryDecompress(PDDI_MEDIA_CONTEXT mediaCtx, DDI_MEDIA_S } else { - DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); - DdiMediaUtil_LockMutex(&mediaCtx->MemDecompMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->MemDecompMutex); DdiMedia_MediaSurfaceToMosResource(mediaSurface, &surface); DdiMedia_MediaMemoryDecompressInternal(&mosCtx, &surface); - DdiMediaUtil_UnLockMutex(&mediaCtx->MemDecompMutex); - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->MemDecompMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); if (pCpDdiInterface) { @@ -2552,12 +2556,12 @@ VAStatus DdiMedia_DestroySurfaces ( MOS_TraceEventExt(EVENT_VA_SYNC, EVENT_TYPE_END, nullptr, 0, nullptr, 0); } - DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); DdiMediaUtil_FreeSurface(surface); MOS_FreeMemory(surface); DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaCtx->pSurfaceHeap, (uint32_t)surfaces[i]); mediaCtx->uiNumSurfaces--; - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); } MOS_TraceEventExt(EVENT_VA_FREE_SURFACE, EVENT_TYPE_END, nullptr, 0, nullptr, 0); @@ -3216,6 +3220,7 @@ VAStatus DdiMedia_CreateContext ( vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; } + //printf(">>>>>>>>>>>>>>>>>>create va ctx id = %d\n", *context); return vaStatus; } @@ -3274,7 +3279,7 @@ VAStatus DdiMedia_CreateBuffer ( *bufId = VA_INVALID_ID; - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); VAStatus va = VA_STATUS_SUCCESS; switch (ctxType) { @@ -3294,7 +3299,7 @@ VAStatus DdiMedia_CreateBuffer ( va = VA_STATUS_ERROR_INVALID_CONTEXT; } - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_TraceEventExt(EVENT_VA_BUFFER, EVENT_TYPE_END, bufId, sizeof(bufId), nullptr, 0); return va; } @@ -3571,9 +3576,9 @@ VAStatus DdiMedia_MapBufferInternal ( *pbuf = (void *)(buf->pData + buf->uiOffset); break; case VAEncMacroblockMapBufferType: - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); *pbuf = DdiMediaUtil_LockBuffer(buf, flag); - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_TraceEventExt(EVENT_VA_MAP, EVENT_TYPE_END, nullptr, 0, nullptr, 0); if (nullptr == (*pbuf)) { @@ -3601,7 +3606,7 @@ VAStatus DdiMedia_MapBufferInternal ( default: if((buf->format != Media_Format_CPU) && (DdiMedia_MediaFormatToOsFormat(buf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT)) { - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); // A critical section starts. // Make sure not to bailout with a return until the section ends. @@ -3621,7 +3626,7 @@ VAStatus DdiMedia_MapBufferInternal ( } // The critical section ends. - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); } else { @@ -3731,9 +3736,9 @@ VAStatus DdiMedia_UnmapBuffer ( default: if((buf->format != Media_Format_CPU) &&(DdiMedia_MediaFormatToOsFormat(buf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT)) { - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); DdiMediaUtil_UnlockBuffer(buf); - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); } break; } @@ -3932,12 +3937,14 @@ VAStatus DdiMedia_DestroyBuffer ( return VA_STATUS_SUCCESS; } +//#include VAStatus DdiMedia_BeginPicture ( VADriverContextP ctx, VAContextID context, VASurfaceID render_target ) { + //printf(">>>>>>>>>>>>>>>>>>begine pic: thread: %lx, va ctx id = %d\n", pthread_self(), context); DDI_FUNCTION_ENTER(); DDI_CHK_NULL(ctx, "nullptr ctx", VA_STATUS_ERROR_INVALID_CONTEXT); @@ -3956,14 +3963,14 @@ VAStatus DdiMedia_BeginPicture ( PDDI_MEDIA_SURFACE surface = DdiMedia_GetSurfaceFromVASurfaceID(mediaCtx, render_target); DDI_CHK_NULL(surface, "nullptr surface", VA_STATUS_ERROR_INVALID_SURFACE); - DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); surface->curCtxType = ctxType; surface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_PENDING; if(ctxType == DDI_MEDIA_CONTEXT_TYPE_VP) { surface->curStatusReport.vpp.status = VPREP_NOTAVAILABLE; } - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); switch (ctxType) { @@ -4071,7 +4078,7 @@ static VAStatus DdiMedia_StatusCheck ( PDDI_DECODE_CONTEXT decCtx = (PDDI_DECODE_CONTEXT)surface->pDecCtx; if (decCtx && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) { - DdiMediaUtil_LockGuard guard(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_LockGuard guard(&mediaCtx->SurfaceMutex); Codechal *codecHal = decCtx->pCodecHal; //return success just avoid vaDestroyContext is ahead of vaSyncSurface @@ -4411,7 +4418,7 @@ VAStatus DdiMedia_QuerySurfaceError( VAStatus vaStatus = VA_STATUS_SUCCESS; - DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); if (surface->curStatusReportQueryState == DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED) { if (error_status != -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) @@ -4430,7 +4437,7 @@ VAStatus DdiMedia_QuerySurfaceError( surfaceErrors[0].decode_error_type = VADecodeMBError; #endif *error_info = surfaceErrors; - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } #if VA_CHECK_VERSION(1, 20, 0) @@ -4442,7 +4449,7 @@ VAStatus DdiMedia_QuerySurfaceError( surfaceErrors[0].status = 1; surfaceErrors[0].decode_error_type = VADecodeReset; *error_info = surfaceErrors; - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } #endif @@ -4470,20 +4477,20 @@ VAStatus DdiMedia_QuerySurfaceError( } } - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return vaStatus; } if (surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_VP && surface->curStatusReport.vpp.status == CODECHAL_STATUS_ERROR) { - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } } surfaceErrors[0].status = -1; - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } @@ -4755,12 +4762,12 @@ VAStatus DdiMedia_CreateImage( } buf->TileType = TILING_NONE; - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufferHeapElement = DdiMediaUtil_AllocPMediaBufferFromHeap(mediaCtx->pBufferHeap); if (nullptr == bufferHeapElement) { - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_FreeMemory(vaimg); DdiMediaUtil_FreeBuffer(buf); MOS_FreeMemory(buf); @@ -4773,7 +4780,7 @@ VAStatus DdiMedia_CreateImage( vaimg->buf = bufferHeapElement->uiVaBufferID; mediaCtx->uiNumBufs++; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); DdiMediaUtil_LockMutex(&mediaCtx->ImageMutex); PDDI_MEDIA_IMAGE_HEAP_ELEMENT imageHeapElement = DdiMediaUtil_AllocPVAImageFromHeap(mediaCtx->pImageHeap); @@ -5078,12 +5085,12 @@ VAStatus DdiMedia_DeriveImage ( buf->pSurface = mediaSurface; mos_bo_reference(mediaSurface->bo); - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufferHeapElement = DdiMediaUtil_AllocPMediaBufferFromHeap(mediaCtx->pBufferHeap); if (nullptr == bufferHeapElement) { - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_FreeMemory(vaimg); MOS_FreeMemory(buf); return VA_STATUS_ERROR_MAX_NUM_EXCEEDED; @@ -5094,7 +5101,7 @@ VAStatus DdiMedia_DeriveImage ( vaimg->buf = bufferHeapElement->uiVaBufferID; mediaCtx->uiNumBufs++; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); *image = *vaimg; @@ -6805,14 +6812,14 @@ VAStatus DdiMedia_AcquireBufferHandle( return VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE; } - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); // already acquired? if (buf->uiExportcount) { // yes, already acquired // can't provide access thru another memtype if (buf->uiMemtype != buf_info->mem_type) { - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_PARAMETER; } } @@ -6823,7 +6830,7 @@ VAStatus DdiMedia_AcquireBufferHandle( uint32_t flink = 0; if (mos_bo_flink(buf->bo, &flink) != 0) { - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_BUFFER; } buf->handle = (intptr_t)flink; @@ -6833,7 +6840,7 @@ VAStatus DdiMedia_AcquireBufferHandle( int32_t prime_fd = 0; if (mos_bo_export_to_prime(buf->bo, &prime_fd) != 0) { - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_BUFFER; } @@ -6852,7 +6859,7 @@ VAStatus DdiMedia_AcquireBufferHandle( buf_info->handle = buf->handle; buf_info->mem_size = buf->uiNumElements * buf->iSize; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_SUCCESS; } @@ -6882,10 +6889,10 @@ VAStatus DdiMedia_ReleaseBufferHandle( DDI_CHK_NULL(buf, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); DDI_CHK_NULL(buf->bo, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); if (!buf->uiMemtype || !buf->uiExportcount) { - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_SUCCESS; } mos_bo_unreference(buf->bo); @@ -6900,7 +6907,7 @@ VAStatus DdiMedia_ReleaseBufferHandle( } buf->uiMemtype = 0; } - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); if (!buf->uiExportcount && buf->bPostponedBufFree) { MOS_FreeMemory(buf); diff --git a/media_driver/linux/common/ddi/media_libva_common.cpp b/media_driver/linux/common/ddi/media_libva_common.cpp index bea8b673e8..b082bd8a69 100644 --- a/media_driver/linux/common/ddi/media_libva_common.cpp +++ b/media_driver/linux/common/ddi/media_libva_common.cpp @@ -143,11 +143,13 @@ DDI_MEDIA_SURFACE* DdiMedia_GetSurfaceFromVASurfaceID (PDDI_MEDIA_CONTEXT mediaC if(validSurface) { DDI_CHK_LESS(i, mediaCtx->pSurfaceHeap->uiAllocatedHeapElements, "invalid surface id", nullptr); - DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + mediaCtx->pSurfaceHeap->lock.lock_shared(); + //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; surfaceElement += i; surface = surfaceElement->pSurface; - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + mediaCtx->pSurfaceHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); } return surface; @@ -219,7 +221,8 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa } //lock surface heap - DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + mediaCtx->pSurfaceHeap->lock.lock_shared(); uint32_t i; //get current element heap and index for(i = 0; i < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; i ++) @@ -233,7 +236,8 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa //if cant find if(i == surface->pMediaCtx->pSurfaceHeap->uiAllocatedHeapElements) { - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + mediaCtx->pSurfaceHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); if(dstSurface->pShadowBuffer) { MOS_FreeMemory(dstSurface->pShadowBuffer->pGmmResourceInfo); @@ -249,7 +253,8 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa DdiMediaUtil_FreeSurface(surface); MOS_FreeMemory(surface); - DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); + mediaCtx->pSurfaceHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return dstSurface; } @@ -274,16 +279,18 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithVariant(PDDI_MEDIA_SURFACE surface return nullptr; } - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + surface->pMediaCtx->pSurfaceHeap->lock.lock_shared(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surface->pMediaCtx->pSurfaceHeap->pHeapBase; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + surface->pMediaCtx->pSurfaceHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); if (nullptr == surfaceElement) { return nullptr; } - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); surfaceElement += vaID; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); aligned_format = surface->format; switch (surface->format) @@ -348,11 +355,11 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithVariant(PDDI_MEDIA_SURFACE surface return surface; } //replace the surface - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surface->pMediaCtx->pSurfaceHeap->pHeapBase; surfaceElement += vaID; surfaceElement->pSurface = dstSurface; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); //FreeSurface DdiMediaUtil_FreeSurface(surface); MOS_FreeMemory(surface); @@ -368,21 +375,23 @@ DDI_MEDIA_BUFFER* DdiMedia_GetBufferFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", nullptr); - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + mediaCtx->pBufferHeap->lock.lock_shared(); bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; buf = bufHeapElement->pBuffer; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + mediaCtx->pBufferHeap->lock.unlock_shared(); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return buf; } bool DdiMedia_DestroyBufFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID bufferID) { - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); DdiMediaUtil_ReleasePMediaBufferFromHeap(mediaCtx->pBufferHeap, bufferID); mediaCtx->uiNumBufs--; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return true; } @@ -394,11 +403,11 @@ void* DdiMedia_GetContextFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", nullptr); - DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += bufferID; ctx = bufHeapElement->pCtx; - DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return ctx; } diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp index a4e12edfae..fe4e0e5c1b 100755 --- a/media_driver/linux/common/ddi/media_libva_util.cpp +++ b/media_driver/linux/common/ddi/media_libva_util.cpp @@ -1660,12 +1660,14 @@ PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMediaUtil_AllocPMediaSurfaceFromHeap(PDDI_MED PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = nullptr; + surfaceHeap->lock.lock(); if (nullptr == surfaceHeap->pFirstFreeHeapElement) { void *newHeapBase = MOS_ReallocMemory(surfaceHeap->pHeapBase, (surfaceHeap->uiAllocatedHeapElements + DDI_MEDIA_HEAP_INCREMENTAL_SIZE) * sizeof(DDI_MEDIA_SURFACE_HEAP_ELEMENT)); if (nullptr == newHeapBase) { + surfaceHeap->lock.unlock(); DDI_ASSERTMESSAGE("DDI: realloc failed."); return nullptr; } @@ -1684,6 +1686,7 @@ PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMediaUtil_AllocPMediaSurfaceFromHeap(PDDI_MED mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surfaceHeap->pFirstFreeHeapElement; surfaceHeap->pFirstFreeHeapElement = mediaSurfaceHeapElmt->pNextFree; + surfaceHeap->lock.unlock(); return mediaSurfaceHeapElmt; } @@ -1697,12 +1700,14 @@ void DdiMediaUtil_ReleasePMediaSurfaceFromHeap(PDDI_MEDIA_HEAP surfaceHeap, uint PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapBase = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surfaceHeap->pHeapBase; DDI_CHK_NULL(mediaSurfaceHeapBase, "nullptr mediaSurfaceHeapBase", ); + surfaceHeap->lock.lock(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = &mediaSurfaceHeapBase[vaSurfaceID]; DDI_CHK_NULL(mediaSurfaceHeapElmt->pSurface, "surface is already released", ); void *firstFree = surfaceHeap->pFirstFreeHeapElement; surfaceHeap->pFirstFreeHeapElement = (void*)mediaSurfaceHeapElmt; mediaSurfaceHeapElmt->pNextFree = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)firstFree; mediaSurfaceHeapElmt->pSurface = nullptr; + surfaceHeap->lock.unlock(); } @@ -1711,6 +1716,7 @@ PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMediaUtil_AllocPMediaBufferFromHeap(PDDI_MEDIA DDI_CHK_NULL(bufferHeap, "nullptr bufferHeap", nullptr); PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapElmt = nullptr; + bufferHeap->lock.lock(); if (nullptr == bufferHeap->pFirstFreeHeapElement) { void *newHeapBase = MOS_ReallocMemory(bufferHeap->pHeapBase, (bufferHeap->uiAllocatedHeapElements + DDI_MEDIA_HEAP_INCREMENTAL_SIZE) * sizeof(DDI_MEDIA_BUFFER_HEAP_ELEMENT)); @@ -1733,6 +1739,7 @@ PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMediaUtil_AllocPMediaBufferFromHeap(PDDI_MEDIA mediaBufferHeapElmt = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)bufferHeap->pFirstFreeHeapElement; bufferHeap->pFirstFreeHeapElement = mediaBufferHeapElmt->pNextFree; + bufferHeap->lock.unlock(); return mediaBufferHeapElmt; } @@ -1742,6 +1749,7 @@ void DdiMediaUtil_ReleasePMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap, uint32 DDI_CHK_NULL(bufferHeap, "nullptr bufferHeap", ); DDI_CHK_LESS(vaBufferID, bufferHeap->uiAllocatedHeapElements, "invalid buffer id", ); + bufferHeap->lock.lock(); PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapBase = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)bufferHeap->pHeapBase; PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapElmt = &mediaBufferHeapBase[vaBufferID]; DDI_CHK_NULL(mediaBufferHeapElmt->pBuffer, "buffer is already released", ); @@ -1749,6 +1757,7 @@ void DdiMediaUtil_ReleasePMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap, uint32 bufferHeap->pFirstFreeHeapElement = (void*)mediaBufferHeapElmt; mediaBufferHeapElmt->pNextFree = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)firstFree; mediaBufferHeapElmt->pBuffer = nullptr; + bufferHeap->lock.unlock(); } PDDI_MEDIA_IMAGE_HEAP_ELEMENT DdiMediaUtil_AllocPVAImageFromHeap(PDDI_MEDIA_HEAP imageHeap) diff --git a/media_softlet/linux/common/ddi/media_libva_common_next.h b/media_softlet/linux/common/ddi/media_libva_common_next.h index f4736fbb11..1f32c4cbca 100644 --- a/media_softlet/linux/common/ddi/media_libva_common_next.h +++ b/media_softlet/linux/common/ddi/media_libva_common_next.h @@ -34,6 +34,8 @@ #include "GmmLib.h" #include "mos_bufmgr_api.h" #include "mos_defs_specific.h" +//#include +#include #define DDI_MEDIA_MAX_SURFACE_NUMBER_CONTEXT 127 #define DDI_MEDIA_MAX_INSTANCE_NUMBER 0x0FFFFFFF @@ -327,6 +329,7 @@ typedef struct _DDI_MEDIA_HEAP uint32_t uiHeapElementSize; uint32_t uiAllocatedHeapElements; void *pFirstFreeHeapElement; + std::shared_timed_mutex lock; }DDI_MEDIA_HEAP, *PDDI_MEDIA_HEAP; #ifndef ANDROID From 1ad70707075b50febbf466cb98dc765e8e5f8496 Mon Sep 17 00:00:00 2001 From: "Xu, Zhengguo" Date: Thu, 18 Apr 2024 14:18:52 +0800 Subject: [PATCH 2/5] [Decode] Add mutex to protect element in surface heap --- .../common/codec/ddi/media_libva_decoder.cpp | 4 +++ media_driver/linux/common/ddi/media_libva.cpp | 31 ++++++++++++++++--- .../linux/common/ddi/media_libva_common.cpp | 17 ++++++++-- .../linux/common/ddi/media_libva_common.h | 13 ++++++++ .../linux/common/ddi/media_libva_util.h | 14 +++++++++ .../common/ddi/media_libva_common_next.h | 2 ++ 6 files changed, 75 insertions(+), 6 deletions(-) diff --git a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp index f6dba1902f..230840cc43 100755 --- a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp +++ b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp @@ -408,6 +408,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec (tempNewReport.m_codecStatus == CODECHAL_STATUS_INCOMPLETE) || (tempNewReport.m_codecStatus == CODECHAL_STATUS_RESET)) { + mediaCtx->pSurfaceHeap->lock.lock_shared(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; uint32_t j = 0; @@ -422,6 +423,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec break; } } + mediaCtx->pSurfaceHeap->lock.unlock_shared(); } else { @@ -488,6 +490,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt (tempNewReport.codecStatus == CODECHAL_STATUS_INCOMPLETE) || (tempNewReport.codecStatus == CODECHAL_STATUS_RESET)) { + mediaCtx->pSurfaceHeap->lock.lock_shared(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; uint32_t j = 0; @@ -502,6 +505,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt break; } } + mediaCtx->pSurfaceHeap->lock.unlock_shared(); } else { diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index ea540378cf..a76e6c3da1 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -309,11 +309,13 @@ static uint32_t DdiMedia_CreateRenderTarget( return VA_INVALID_ID; } + surfaceElement->lock.lock(); surfaceElement->pSurface = (DDI_MEDIA_SURFACE *)MOS_AllocAndZeroMemory(sizeof(DDI_MEDIA_SURFACE)); if (nullptr == surfaceElement->pSurface) { DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap, surfaceElement->uiVaSurfaceID); //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); + surfaceElement->lock.unlock(); return VA_INVALID_ID; } @@ -332,11 +334,13 @@ static uint32_t DdiMedia_CreateRenderTarget( MOS_FreeMemory(surfaceElement->pSurface); DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap, surfaceElement->uiVaSurfaceID); //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); + surfaceElement->lock.unlock(); return VA_INVALID_ID; } mediaDrvCtx->uiNumSurfaces++; uint32_t surfaceID = surfaceElement->uiVaSurfaceID; + surfaceElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); return surfaceID; } @@ -1342,9 +1346,9 @@ VAStatus DdiMedia_MediaMemoryDecompress(PDDI_MEDIA_CONTEXT mediaCtx, DDI_MEDIA_S //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); //DdiMediaUtil_LockMutex(&mediaCtx->MemDecompMutex); + //Note: find surfaceElement from pSurface and surfaceElement->lock.lock_shared(); DdiMedia_MediaSurfaceToMosResource(mediaSurface, &surface); DdiMedia_MediaMemoryDecompressInternal(&mosCtx, &surface); - //DdiMediaUtil_UnLockMutex(&mediaCtx->MemDecompMutex); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); @@ -2520,7 +2524,9 @@ VAStatus DdiMedia_DestroySurfaces ( for(int32_t i = 0; i < num_surfaces; i++) { DDI_CHK_LESS((uint32_t)surfaces[i], mediaCtx->pSurfaceHeap->uiAllocatedHeapElements, "Invalid surfaces", VA_STATUS_ERROR_INVALID_SURFACE); - surface = DdiMedia_GetSurfaceFromVASurfaceID(mediaCtx, surfaces[i]); + PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = DdiMedia_GetSurfaceElementFromVASurfaceID (mediaCtx, surfaces[i]); + DDI_CHK_NULL(surfaceElement, "nullptr surfaceElement", VA_STATUS_ERROR_INVALID_SURFACE); + surface = surfaceElement->pSurface; DDI_CHK_NULL(surface, "nullptr surface", VA_STATUS_ERROR_INVALID_SURFACE); if(surface->pCurrentFrameSemaphore) { @@ -2557,10 +2563,12 @@ VAStatus DdiMedia_DestroySurfaces ( } //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + surfaceElement->lock.lock(); DdiMediaUtil_FreeSurface(surface); MOS_FreeMemory(surface); DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaCtx->pSurfaceHeap, (uint32_t)surfaces[i]); mediaCtx->uiNumSurfaces--; + surfaceElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); } @@ -3960,16 +3968,20 @@ VAStatus DdiMedia_BeginPicture ( uint32_t event[] = {(uint32_t)context, ctxType, (uint32_t)render_target}; MOS_TraceEventExt(EVENT_VA_PICTURE, EVENT_TYPE_START, event, sizeof(event), nullptr, 0); - PDDI_MEDIA_SURFACE surface = DdiMedia_GetSurfaceFromVASurfaceID(mediaCtx, render_target); + PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = DdiMedia_GetSurfaceElementFromVASurfaceID (mediaCtx, render_target); + DDI_CHK_NULL(surfaceElement, "nullptr surfaceElement", VA_STATUS_ERROR_INVALID_SURFACE); + PDDI_MEDIA_SURFACE surface = surfaceElement->pSurface; DDI_CHK_NULL(surface, "nullptr surface", VA_STATUS_ERROR_INVALID_SURFACE); //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + surfaceElement->lock.lock(); surface->curCtxType = ctxType; surface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_PENDING; if(ctxType == DDI_MEDIA_CONTEXT_TYPE_VP) { surface->curStatusReport.vpp.status = VPREP_NOTAVAILABLE; } + surfaceElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); switch (ctxType) @@ -4078,7 +4090,10 @@ static VAStatus DdiMedia_StatusCheck ( PDDI_DECODE_CONTEXT decCtx = (PDDI_DECODE_CONTEXT)surface->pDecCtx; if (decCtx && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) { + PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = DdiMedia_GetSurfaceElementFromVASurfaceID (mediaCtx, surface_id); + DDI_CHK_NULL(surfaceElement , "nullptr surfaceElement", VA_STATUS_ERROR_INVALID_SURFACE); //DdiMediaUtil_LockGuard guard(&mediaCtx->SurfaceMutex); + DdiMediaUtil_LockGuard2 guard(&surfaceElement->lock); Codechal *codecHal = decCtx->pCodecHal; //return success just avoid vaDestroyContext is ahead of vaSyncSurface @@ -4407,7 +4422,9 @@ VAStatus DdiMedia_QuerySurfaceError( PDDI_MEDIA_CONTEXT mediaCtx = DdiMedia_GetMediaContext(ctx); DDI_CHK_NULL( mediaCtx, "nullptr mediaCtx", VA_STATUS_ERROR_INVALID_CONTEXT); - DDI_MEDIA_SURFACE *surface = DdiMedia_GetSurfaceFromVASurfaceID(mediaCtx, render_target); + PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = DdiMedia_GetSurfaceElementFromVASurfaceID (mediaCtx, render_target); + DDI_CHK_NULL(surfaceElement, "nullptr surfaceElement", VA_STATUS_ERROR_INVALID_SURFACE); + DDI_MEDIA_SURFACE *surface = surfaceElement->pSurface; DDI_CHK_NULL(surface, "nullptr surface", VA_STATUS_ERROR_INVALID_SURFACE); PDDI_DECODE_CONTEXT decCtx = (PDDI_DECODE_CONTEXT)surface->pDecCtx; @@ -4419,6 +4436,7 @@ VAStatus DdiMedia_QuerySurfaceError( VAStatus vaStatus = VA_STATUS_SUCCESS; //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); + surfaceElement->lock.lock_shared(); if (surface->curStatusReportQueryState == DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED) { if (error_status != -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) @@ -4437,6 +4455,7 @@ VAStatus DdiMedia_QuerySurfaceError( surfaceErrors[0].decode_error_type = VADecodeMBError; #endif *error_info = surfaceErrors; + surfaceElement->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } @@ -4449,6 +4468,7 @@ VAStatus DdiMedia_QuerySurfaceError( surfaceErrors[0].status = 1; surfaceErrors[0].decode_error_type = VADecodeReset; *error_info = surfaceErrors; + surfaceElement->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } @@ -4477,6 +4497,7 @@ VAStatus DdiMedia_QuerySurfaceError( } } + surfaceElement->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return vaStatus; } @@ -4484,12 +4505,14 @@ VAStatus DdiMedia_QuerySurfaceError( if (surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_VP && surface->curStatusReport.vpp.status == CODECHAL_STATUS_ERROR) { + surfaceElement->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } } surfaceErrors[0].status = -1; + surfaceElement->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } diff --git a/media_driver/linux/common/ddi/media_libva_common.cpp b/media_driver/linux/common/ddi/media_libva_common.cpp index b082bd8a69..795ed13591 100644 --- a/media_driver/linux/common/ddi/media_libva_common.cpp +++ b/media_driver/linux/common/ddi/media_libva_common.cpp @@ -130,7 +130,7 @@ void* DdiMedia_GetContextFromContextID (VADriverContextP ctx, VAContextID vaCtxI } -DDI_MEDIA_SURFACE* DdiMedia_GetSurfaceFromVASurfaceID (PDDI_MEDIA_CONTEXT mediaCtx, VASurfaceID surfaceID) +PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMedia_GetSurfaceElementFromVASurfaceID (PDDI_MEDIA_CONTEXT mediaCtx, VASurfaceID surfaceID) { uint32_t i = 0; PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = nullptr; @@ -147,11 +147,21 @@ DDI_MEDIA_SURFACE* DdiMedia_GetSurfaceFromVASurfaceID (PDDI_MEDIA_CONTEXT mediaC //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; surfaceElement += i; - surface = surfaceElement->pSurface; mediaCtx->pSurfaceHeap->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); } + return surfaceElement; +} + +DDI_MEDIA_SURFACE* DdiMedia_GetSurfaceFromVASurfaceID (PDDI_MEDIA_CONTEXT mediaCtx, VASurfaceID surfaceID) +{ + PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = nullptr; + PDDI_MEDIA_SURFACE surface = nullptr; + + surfaceElement = DdiMedia_GetSurfaceElementFromVASurfaceID(mediaCtx, surfaceID); + surface = surfaceElement != nullptr ? surfaceElement->pSurface : nullptr; + return surface; } @@ -159,15 +169,18 @@ VASurfaceID DdiMedia_GetVASurfaceIDFromSurface(PDDI_MEDIA_SURFACE surface) { DDI_CHK_NULL(surface, "nullptr surface", VA_INVALID_SURFACE); + surface->pMediaCtx->pSurfaceHeap->lock.lock_shared(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surface->pMediaCtx->pSurfaceHeap->pHeapBase; for(uint32_t i = 0; i < surface->pMediaCtx->pSurfaceHeap->uiAllocatedHeapElements; i ++) { if(surface == surfaceElement->pSurface) { + surface->pMediaCtx->pSurfaceHeap->lock.unlock_shared(); return surfaceElement->uiVaSurfaceID; } surfaceElement ++; } + surface->pMediaCtx->pSurfaceHeap->lock.unlock_shared(); return VA_INVALID_SURFACE; } diff --git a/media_driver/linux/common/ddi/media_libva_common.h b/media_driver/linux/common/ddi/media_libva_common.h index 4a9b653b1a..44db4a1c89 100644 --- a/media_driver/linux/common/ddi/media_libva_common.h +++ b/media_driver/linux/common/ddi/media_libva_common.h @@ -156,6 +156,19 @@ void DdiMedia_MediaBufferToMosResource(DDI_MEDIA_BUFFER *mediaBuffer, MOS_RESOUR //! void* DdiMedia_GetContextFromContextID (VADriverContextP ctx, VAContextID vaCtxID, uint32_t *ctxType); +//! +//! \brief Get surface element from VA surface ID +//! +//! \param [in] mediaCtx +//! Pointer to ddi media context +//! \param [in] surfaceID +//! VA surface ID +//! +//! \return PDDI_MEDIA_SURFACE_HEAP_ELEMENT +//! Pointer to ddi media surface element +//! +PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMedia_GetSurfaceElementFromVASurfaceID (PDDI_MEDIA_CONTEXT mediaCtx, VASurfaceID surfaceID); + //! //! \brief Get surface from VA surface ID //! diff --git a/media_driver/linux/common/ddi/media_libva_util.h b/media_driver/linux/common/ddi/media_libva_util.h index 8f434859bc..1e326ec6b3 100644 --- a/media_driver/linux/common/ddi/media_libva_util.h +++ b/media_driver/linux/common/ddi/media_libva_util.h @@ -195,6 +195,20 @@ class DdiMediaUtil_LockGuard { } }; +class DdiMediaUtil_LockGuard2 { +private: + std::shared_timed_mutex *m_pLock; +public: + DdiMediaUtil_LockGuard2(std::shared_timed_mutex *pLock):m_pLock(pLock) + { + m_pLock->lock(); + } + ~DdiMediaUtil_LockGuard2() + { + m_pLock->unlock(); + } +}; + //! //! \brief Destroy semaphore //! diff --git a/media_softlet/linux/common/ddi/media_libva_common_next.h b/media_softlet/linux/common/ddi/media_libva_common_next.h index 1f32c4cbca..575b6d9819 100644 --- a/media_softlet/linux/common/ddi/media_libva_common_next.h +++ b/media_softlet/linux/common/ddi/media_libva_common_next.h @@ -298,6 +298,7 @@ typedef struct _DDI_MEDIA_SURFACE_HEAP_ELEMENT PDDI_MEDIA_SURFACE pSurface; uint32_t uiVaSurfaceID; struct _DDI_MEDIA_SURFACE_HEAP_ELEMENT *pNextFree; + std::shared_timed_mutex lock; }DDI_MEDIA_SURFACE_HEAP_ELEMENT, *PDDI_MEDIA_SURFACE_HEAP_ELEMENT; typedef struct _DDI_MEDIA_BUFFER_HEAP_ELEMENT @@ -307,6 +308,7 @@ typedef struct _DDI_MEDIA_BUFFER_HEAP_ELEMENT uint32_t uiCtxType; uint32_t uiVaBufferID; struct _DDI_MEDIA_BUFFER_HEAP_ELEMENT *pNextFree; + std::shared_timed_mutex lock; }DDI_MEDIA_BUFFER_HEAP_ELEMENT, *PDDI_MEDIA_BUFFER_HEAP_ELEMENT; typedef struct _DDI_MEDIA_IMAGE_HEAP_ELEMENT From 4166a645d1313bd7d43507fdb5876bdd6a5351de Mon Sep 17 00:00:00 2001 From: "Xu, Zhengguo" Date: Thu, 18 Apr 2024 14:52:14 +0800 Subject: [PATCH 3/5] [Decode] add mutex to protect element in buffer heap --- media_driver/linux/common/ddi/media_libva.cpp | 34 ++++++++++++++++--- .../linux/common/ddi/media_libva_common.cpp | 16 +++++++-- .../linux/common/ddi/media_libva_common.h | 13 +++++++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index a76e6c3da1..c31cd033e0 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -3386,7 +3386,9 @@ VAStatus DdiMedia_MapBufferInternal ( DDI_CHK_NULL(mediaCtx->pBufferHeap, "nullptr mediaCtx->pBufferHeap", VA_STATUS_ERROR_INVALID_CONTEXT); DDI_CHK_LESS((uint32_t)buf_id, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "Invalid bufferId", VA_STATUS_ERROR_INVALID_CONTEXT); - DDI_MEDIA_BUFFER *buf = DdiMedia_GetBufferFromVABufferID(mediaCtx, buf_id); + PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = DdiMedia_GetBufferElementFromVABufferID(mediaCtx, buf_id); + DDI_CHK_NULL(bufHeapElement, "nullptr bufHeapElement", VA_STATUS_ERROR_INVALID_BUFFER); + DDI_MEDIA_BUFFER *buf = bufHeapElement->pBuffer; DDI_CHK_NULL(buf, "nullptr buf", VA_STATUS_ERROR_INVALID_BUFFER); // The context is nullptr when the buffer is created from DdiMedia_DeriveImage @@ -3585,7 +3587,9 @@ VAStatus DdiMedia_MapBufferInternal ( break; case VAEncMacroblockMapBufferType: //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + bufHeapElement->lock.lock(); *pbuf = DdiMediaUtil_LockBuffer(buf, flag); + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_TraceEventExt(EVENT_VA_MAP, EVENT_TYPE_END, nullptr, 0, nullptr, 0); if (nullptr == (*pbuf)) @@ -3615,6 +3619,7 @@ VAStatus DdiMedia_MapBufferInternal ( if((buf->format != Media_Format_CPU) && (DdiMedia_MediaFormatToOsFormat(buf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT)) { //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + bufHeapElement->lock.lock(); // A critical section starts. // Make sure not to bailout with a return until the section ends. @@ -3634,6 +3639,7 @@ VAStatus DdiMedia_MapBufferInternal ( } // The critical section ends. + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); } else @@ -3672,7 +3678,9 @@ VAStatus DdiMedia_UnmapBuffer ( DDI_CHK_NULL( mediaCtx->pBufferHeap, "nullptr mediaCtx->pBufferHeap", VA_STATUS_ERROR_INVALID_CONTEXT); DDI_CHK_LESS((uint32_t)buf_id, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "Invalid buf_id", VA_STATUS_ERROR_INVALID_BUFFER); - DDI_MEDIA_BUFFER *buf = DdiMedia_GetBufferFromVABufferID(mediaCtx, buf_id); + PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = DdiMedia_GetBufferElementFromVABufferID(mediaCtx, buf_id); + DDI_CHK_NULL(bufHeapElement, "nullptr buf", VA_STATUS_ERROR_INVALID_BUFFER); + DDI_MEDIA_BUFFER *buf = bufHeapElement->pBuffer; DDI_CHK_NULL(buf, "nullptr buf", VA_STATUS_ERROR_INVALID_BUFFER); // The context is nullptr when the buffer is created from DdiMedia_DeriveImage @@ -3745,7 +3753,9 @@ VAStatus DdiMedia_UnmapBuffer ( if((buf->format != Media_Format_CPU) &&(DdiMedia_MediaFormatToOsFormat(buf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT)) { //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + bufHeapElement->lock.lock(); DdiMediaUtil_UnlockBuffer(buf); + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); } break; @@ -4797,12 +4807,14 @@ VAStatus DdiMedia_CreateImage( return VA_STATUS_ERROR_MAX_NUM_EXCEEDED; } + bufferHeapElement->lock.lock(); bufferHeapElement->pBuffer = buf; bufferHeapElement->pCtx = nullptr; bufferHeapElement->uiCtxType = DDI_MEDIA_CONTEXT_TYPE_MEDIA; vaimg->buf = bufferHeapElement->uiVaBufferID; mediaCtx->uiNumBufs++; + bufferHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); DdiMediaUtil_LockMutex(&mediaCtx->ImageMutex); @@ -5118,12 +5130,14 @@ VAStatus DdiMedia_DeriveImage ( MOS_FreeMemory(buf); return VA_STATUS_ERROR_MAX_NUM_EXCEEDED; } + bufferHeapElement->lock.lock(); bufferHeapElement->pBuffer = buf; bufferHeapElement->pCtx = nullptr; bufferHeapElement->uiCtxType = DDI_MEDIA_CONTEXT_TYPE_MEDIA; vaimg->buf = bufferHeapElement->uiVaBufferID; mediaCtx->uiNumBufs++; + bufferHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); *image = *vaimg; @@ -6819,7 +6833,9 @@ VAStatus DdiMedia_AcquireBufferHandle( PDDI_MEDIA_CONTEXT mediaCtx = DdiMedia_GetMediaContext(ctx); DDI_CHK_NULL(mediaCtx, "Invalid Media ctx", VA_STATUS_ERROR_INVALID_CONTEXT); - DDI_MEDIA_BUFFER *buf = DdiMedia_GetBufferFromVABufferID(mediaCtx, buf_id); + PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = DdiMedia_GetBufferElementFromVABufferID(mediaCtx, buf_id); + DDI_CHK_NULL(bufHeapElement, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); + DDI_MEDIA_BUFFER *buf = bufHeapElement->pBuffer; DDI_CHK_NULL(buf, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); DDI_CHK_NULL(buf->bo, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); @@ -6836,12 +6852,14 @@ VAStatus DdiMedia_AcquireBufferHandle( } //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + bufHeapElement->lock.lock(); // already acquired? if (buf->uiExportcount) { // yes, already acquired // can't provide access thru another memtype if (buf->uiMemtype != buf_info->mem_type) { + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_PARAMETER; } @@ -6853,6 +6871,7 @@ VAStatus DdiMedia_AcquireBufferHandle( uint32_t flink = 0; if (mos_bo_flink(buf->bo, &flink) != 0) { + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_BUFFER; } @@ -6863,6 +6882,7 @@ VAStatus DdiMedia_AcquireBufferHandle( int32_t prime_fd = 0; if (mos_bo_export_to_prime(buf->bo, &prime_fd) != 0) { + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_BUFFER; } @@ -6882,6 +6902,7 @@ VAStatus DdiMedia_AcquireBufferHandle( buf_info->handle = buf->handle; buf_info->mem_size = buf->uiNumElements * buf->iSize; + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_SUCCESS; } @@ -6908,13 +6929,17 @@ VAStatus DdiMedia_ReleaseBufferHandle( PDDI_MEDIA_CONTEXT mediaCtx = DdiMedia_GetMediaContext(ctx); DDI_CHK_NULL(mediaCtx, "Invalid Media ctx", VA_STATUS_ERROR_INVALID_CONTEXT); - DDI_MEDIA_BUFFER *buf = DdiMedia_GetBufferFromVABufferID(mediaCtx, buf_id); + PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = DdiMedia_GetBufferElementFromVABufferID(mediaCtx, buf_id); + DDI_CHK_NULL(bufHeapElement, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); + DDI_MEDIA_BUFFER *buf = bufHeapElement->pBuffer; DDI_CHK_NULL(buf, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); DDI_CHK_NULL(buf->bo, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); + bufHeapElement->lock.lock(); if (!buf->uiMemtype || !buf->uiExportcount) { + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_SUCCESS; } @@ -6930,6 +6955,7 @@ VAStatus DdiMedia_ReleaseBufferHandle( } buf->uiMemtype = 0; } + bufHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); if (!buf->uiExportcount && buf->bPostponedBufFree) { diff --git a/media_driver/linux/common/ddi/media_libva_common.cpp b/media_driver/linux/common/ddi/media_libva_common.cpp index 795ed13591..cc5b2b6a95 100644 --- a/media_driver/linux/common/ddi/media_libva_common.cpp +++ b/media_driver/linux/common/ddi/media_libva_common.cpp @@ -380,11 +380,10 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithVariant(PDDI_MEDIA_SURFACE surface return dstSurface; } -DDI_MEDIA_BUFFER* DdiMedia_GetBufferFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID bufferID) +PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMedia_GetBufferElementFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID bufferID) { uint32_t i = 0; PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = nullptr; - PDDI_MEDIA_BUFFER buf = nullptr; i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", nullptr); @@ -392,10 +391,21 @@ DDI_MEDIA_BUFFER* DdiMedia_GetBufferFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, mediaCtx->pBufferHeap->lock.lock_shared(); bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; - buf = bufHeapElement->pBuffer; mediaCtx->pBufferHeap->lock.unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); + return bufHeapElement; +} + + +DDI_MEDIA_BUFFER* DdiMedia_GetBufferFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID bufferID) +{ + PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = nullptr; + PDDI_MEDIA_BUFFER buf = nullptr; + + bufHeapElement = DdiMedia_GetBufferElementFromVABufferID(mediaCtx, bufferID); + buf = bufHeapElement != nullptr? bufHeapElement->pBuffer : nullptr; + return buf; } diff --git a/media_driver/linux/common/ddi/media_libva_common.h b/media_driver/linux/common/ddi/media_libva_common.h index 44db4a1c89..650edf838f 100644 --- a/media_driver/linux/common/ddi/media_libva_common.h +++ b/media_driver/linux/common/ddi/media_libva_common.h @@ -217,6 +217,19 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithVariant(PDDI_MEDIA_SURFACE surface //! VASurfaceID DdiMedia_GetVASurfaceIDFromSurface(PDDI_MEDIA_SURFACE surface); +//! +//! \brief Get buffer element from VA buffer ID +//! +//! \param [in] mediaCtx +//! Pointer to ddi media context +//! \param [in] bufferID +//! VA buffer ID +//! +//! \return PDDI_MEDIA_BUFFER_HEAP_ELEMENT +//! Pointer to ddi media buffer element +//! +PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMedia_GetBufferElementFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID bufferID); + //! //! \brief Get buffer from VA buffer ID //! From 8c6858bea64333917fb34545d66162284a789fca Mon Sep 17 00:00:00 2001 From: "Xu, Zhengguo" Date: Tue, 23 Apr 2024 15:21:06 +0800 Subject: [PATCH 4/5] [Decode] move lock from element to pSurface/ pBuffer Signed-off-by: Xu, Zhengguo --- .../codec/ddi/media_ddi_decode_base.cpp | 2 + .../codec/ddi/media_ddi_encode_base.cpp | 1 + .../common/codec/ddi/media_libva_decoder.cpp | 8 +- media_driver/linux/common/ddi/media_libva.cpp | 97 +++++++++++-------- .../linux/common/ddi/media_libva_common.cpp | 24 ++--- .../linux/common/ddi/media_libva_util.cpp | 38 ++++++-- .../linux/common/vp/ddi/media_libva_vp.c | 1 + .../common/ddi/media_libva_common_next.h | 7 +- 8 files changed, 110 insertions(+), 68 deletions(-) diff --git a/media_driver/linux/common/codec/ddi/media_ddi_decode_base.cpp b/media_driver/linux/common/codec/ddi/media_ddi_decode_base.cpp index ed98570fee..fa1ce7d8e9 100644 --- a/media_driver/linux/common/codec/ddi/media_ddi_decode_base.cpp +++ b/media_driver/linux/common/codec/ddi/media_ddi_decode_base.cpp @@ -994,6 +994,7 @@ VAStatus DdiMediaDecode::CreateBuffer( buf->uiOffset = 0; buf->bCFlushReq = false; buf->pMediaCtx = m_ddiDecodeCtx->pMediaCtx; + buf->lock = MOS_New(std::shared_timed_mutex); switch ((int32_t)type) { @@ -1122,6 +1123,7 @@ VAStatus DdiMediaDecode::CreateBuffer( if(buf) { MOS_FreeMemory(buf->pData); + MOS_Delete(buf->lock); MOS_FreeMemory(buf); } return va; diff --git a/media_driver/linux/common/codec/ddi/media_ddi_encode_base.cpp b/media_driver/linux/common/codec/ddi/media_ddi_encode_base.cpp index a600f0e8b6..6f57ad9dc4 100644 --- a/media_driver/linux/common/codec/ddi/media_ddi_encode_base.cpp +++ b/media_driver/linux/common/codec/ddi/media_ddi_encode_base.cpp @@ -917,6 +917,7 @@ VAStatus DdiEncodeBase::CreateBuffer( buf->uiNumElements = elementsNum; buf->uiType = type; buf->uiOffset = 0; + buf->lock = MOS_New(std::shared_timed_mutex); uint32_t bufSize = 0; uint32_t expectedSize = 0xffffffff; diff --git a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp index 230840cc43..f656c6c4ef 100755 --- a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp +++ b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp @@ -408,7 +408,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec (tempNewReport.m_codecStatus == CODECHAL_STATUS_INCOMPLETE) || (tempNewReport.m_codecStatus == CODECHAL_STATUS_RESET)) { - mediaCtx->pSurfaceHeap->lock.lock_shared(); + mediaCtx->pSurfaceHeap->lock->lock_shared(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; uint32_t j = 0; @@ -423,7 +423,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec break; } } - mediaCtx->pSurfaceHeap->lock.unlock_shared(); + mediaCtx->pSurfaceHeap->lock->unlock_shared(); } else { @@ -490,7 +490,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt (tempNewReport.codecStatus == CODECHAL_STATUS_INCOMPLETE) || (tempNewReport.codecStatus == CODECHAL_STATUS_RESET)) { - mediaCtx->pSurfaceHeap->lock.lock_shared(); + mediaCtx->pSurfaceHeap->lock->lock_shared(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; uint32_t j = 0; @@ -505,7 +505,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt break; } } - mediaCtx->pSurfaceHeap->lock.unlock_shared(); + mediaCtx->pSurfaceHeap->lock->unlock_shared(); } else { diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index c31cd033e0..302fa48e89 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -309,13 +309,11 @@ static uint32_t DdiMedia_CreateRenderTarget( return VA_INVALID_ID; } - surfaceElement->lock.lock(); surfaceElement->pSurface = (DDI_MEDIA_SURFACE *)MOS_AllocAndZeroMemory(sizeof(DDI_MEDIA_SURFACE)); if (nullptr == surfaceElement->pSurface) { DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap, surfaceElement->uiVaSurfaceID); //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); - surfaceElement->lock.unlock(); return VA_INVALID_ID; } @@ -328,19 +326,19 @@ static uint32_t DdiMedia_CreateRenderTarget( surfaceElement->pSurface->uiLockedImageID = VA_INVALID_ID; surfaceElement->pSurface->surfaceUsageHint= surfaceUsageHint; surfaceElement->pSurface->memType = memType; + surfaceElement->pSurface->lock = MOS_New(std::shared_timed_mutex); if(DdiMediaUtil_CreateSurface(surfaceElement->pSurface, mediaDrvCtx)!= VA_STATUS_SUCCESS) { + MOS_Delete(surfaceElement->pSurface->lock); MOS_FreeMemory(surfaceElement->pSurface); DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaDrvCtx->pSurfaceHeap, surfaceElement->uiVaSurfaceID); //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); - surfaceElement->lock.unlock(); return VA_INVALID_ID; } mediaDrvCtx->uiNumSurfaces++; uint32_t surfaceID = surfaceElement->uiVaSurfaceID; - surfaceElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaDrvCtx->SurfaceMutex); return surfaceID; } @@ -1004,11 +1002,11 @@ void* DdiMedia_GetCtxFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABufferID buf uint32_t i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", nullptr); //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - mediaCtx->pBufferHeap->lock.lock_shared(); + mediaCtx->pBufferHeap->lock->lock_shared(); PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; void *temp = bufHeapElement->pCtx; - mediaCtx->pBufferHeap->lock.unlock_shared(); + mediaCtx->pBufferHeap->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return temp; @@ -1032,11 +1030,11 @@ uint32_t DdiMedia_GetCtxTypeFromVABufferID (PDDI_MEDIA_CONTEXT mediaCtx, VABuffe uint32_t i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", DDI_MEDIA_CONTEXT_TYPE_NONE); //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - mediaCtx->pBufferHeap->lock.lock_shared(); + mediaCtx->pBufferHeap->lock->lock_shared(); PDDI_MEDIA_BUFFER_HEAP_ELEMENT bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; uint32_t ctxType = bufHeapElement->uiCtxType; - mediaCtx->pBufferHeap->lock.unlock_shared(); + mediaCtx->pBufferHeap->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return ctxType; @@ -1344,12 +1342,14 @@ VAStatus DdiMedia_MediaMemoryDecompress(PDDI_MEDIA_CONTEXT mediaCtx, DDI_MEDIA_S else { //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); - //DdiMediaUtil_LockMutex(&mediaCtx->MemDecompMutex); + mediaSurface->lock->lock(); + DdiMediaUtil_LockMutex(&mediaCtx->MemDecompMutex); - //Note: find surfaceElement from pSurface and surfaceElement->lock.lock_shared(); + //Note: find surfaceElement from pSurface and surfaceElement->lock->lock_shared(); DdiMedia_MediaSurfaceToMosResource(mediaSurface, &surface); DdiMedia_MediaMemoryDecompressInternal(&mosCtx, &surface); - //DdiMediaUtil_UnLockMutex(&mediaCtx->MemDecompMutex); + DdiMediaUtil_UnLockMutex(&mediaCtx->MemDecompMutex); + mediaSurface->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); if (pCpDdiInterface) @@ -1392,10 +1392,12 @@ static VAStatus DdiMedia_HeapInitialize( mediaCtx->pSurfaceHeap = (DDI_MEDIA_HEAP *)MOS_AllocAndZeroMemory(sizeof(DDI_MEDIA_HEAP)); DDI_CHK_NULL(mediaCtx->pSurfaceHeap, "nullptr pSurfaceHeap", VA_STATUS_ERROR_ALLOCATION_FAILED); mediaCtx->pSurfaceHeap->uiHeapElementSize = sizeof(DDI_MEDIA_SURFACE_HEAP_ELEMENT); + mediaCtx->pSurfaceHeap->lock = MOS_New(std::shared_timed_mutex); mediaCtx->pBufferHeap = (DDI_MEDIA_HEAP *)MOS_AllocAndZeroMemory(sizeof(DDI_MEDIA_HEAP)); DDI_CHK_NULL(mediaCtx->pBufferHeap, "nullptr BufferHeap", VA_STATUS_ERROR_ALLOCATION_FAILED); mediaCtx->pBufferHeap->uiHeapElementSize = sizeof(DDI_MEDIA_BUFFER_HEAP_ELEMENT); + mediaCtx->pBufferHeap->lock = MOS_New(std::shared_timed_mutex); mediaCtx->pImageHeap = (DDI_MEDIA_HEAP *)MOS_AllocAndZeroMemory(sizeof(DDI_MEDIA_HEAP)); DDI_CHK_NULL(mediaCtx->pImageHeap, "nullptr ImageHeap", VA_STATUS_ERROR_ALLOCATION_FAILED); @@ -1453,9 +1455,17 @@ static VAStatus DdiMedia_HeapDestroy( { DDI_CHK_NULL(mediaCtx, "nullptr ctx", VA_STATUS_ERROR_INVALID_CONTEXT); // destroy heaps + if (mediaCtx->pSurfaceHeap->lock) + { + MOS_Delete(mediaCtx->pSurfaceHeap->lock); + } MOS_FreeMemory(mediaCtx->pSurfaceHeap->pHeapBase); MOS_FreeMemory(mediaCtx->pSurfaceHeap); + if (mediaCtx->pBufferHeap->lock) + { + MOS_Delete(mediaCtx->pBufferHeap->lock); + } MOS_FreeMemory(mediaCtx->pBufferHeap->pHeapBase); MOS_FreeMemory(mediaCtx->pBufferHeap); @@ -2563,12 +2573,13 @@ VAStatus DdiMedia_DestroySurfaces ( } //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); - surfaceElement->lock.lock(); + //surface->lock->lock(); DdiMediaUtil_FreeSurface(surface); + //surface->lock->unlock(); + //MOS_Delete(surface->lock); MOS_FreeMemory(surface); DdiMediaUtil_ReleasePMediaSurfaceFromHeap(mediaCtx->pSurfaceHeap, (uint32_t)surfaces[i]); mediaCtx->uiNumSurfaces--; - surfaceElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); } @@ -3587,9 +3598,9 @@ VAStatus DdiMedia_MapBufferInternal ( break; case VAEncMacroblockMapBufferType: //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - bufHeapElement->lock.lock(); + buf->lock->lock(); *pbuf = DdiMediaUtil_LockBuffer(buf, flag); - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_TraceEventExt(EVENT_VA_MAP, EVENT_TYPE_END, nullptr, 0, nullptr, 0); if (nullptr == (*pbuf)) @@ -3619,13 +3630,15 @@ VAStatus DdiMedia_MapBufferInternal ( if((buf->format != Media_Format_CPU) && (DdiMedia_MediaFormatToOsFormat(buf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT)) { //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - bufHeapElement->lock.lock(); + buf->lock->lock(); // A critical section starts. // Make sure not to bailout with a return until the section ends. if (nullptr != buf->pSurface && Media_Format_CPU != buf->format) { + buf->pSurface->lock->lock(); vaStatus = DdiMedia_MediaMemoryDecompress(mediaCtx, buf->pSurface); + buf->pSurface->lock->unlock(); } if (VA_STATUS_SUCCESS == vaStatus) @@ -3639,7 +3652,7 @@ VAStatus DdiMedia_MapBufferInternal ( } // The critical section ends. - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); } else @@ -3659,6 +3672,7 @@ VAStatus DdiMedia_MapBuffer ( void **pbuf ) { + //printf(">>>>>>>vaMap buf: %d\n", buf_id); return DdiMedia_MapBufferInternal(ctx, buf_id, pbuf, MOS_LOCKFLAG_READONLY | MOS_LOCKFLAG_WRITEONLY); } @@ -3753,9 +3767,9 @@ VAStatus DdiMedia_UnmapBuffer ( if((buf->format != Media_Format_CPU) &&(DdiMedia_MediaFormatToOsFormat(buf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT)) { //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - bufHeapElement->lock.lock(); + buf->lock->lock(); DdiMediaUtil_UnlockBuffer(buf); - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); } break; @@ -3770,6 +3784,7 @@ VAStatus DdiMedia_DestroyBuffer ( VABufferID buffer_id ) { + //printf(">>>>>>>vaDestroy buf: %d\n", buffer_id); DDI_FUNCTION_ENTER(); MOS_TraceEventExt(EVENT_VA_FREE_BUFFER, EVENT_TYPE_START, &buffer_id, sizeof(buffer_id), nullptr, 0); @@ -3984,14 +3999,14 @@ VAStatus DdiMedia_BeginPicture ( DDI_CHK_NULL(surface, "nullptr surface", VA_STATUS_ERROR_INVALID_SURFACE); //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); - surfaceElement->lock.lock(); + surface->lock->lock(); surface->curCtxType = ctxType; surface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_PENDING; if(ctxType == DDI_MEDIA_CONTEXT_TYPE_VP) { surface->curStatusReport.vpp.status = VPREP_NOTAVAILABLE; } - surfaceElement->lock.unlock(); + surface->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); switch (ctxType) @@ -4103,7 +4118,7 @@ static VAStatus DdiMedia_StatusCheck ( PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = DdiMedia_GetSurfaceElementFromVASurfaceID (mediaCtx, surface_id); DDI_CHK_NULL(surfaceElement , "nullptr surfaceElement", VA_STATUS_ERROR_INVALID_SURFACE); //DdiMediaUtil_LockGuard guard(&mediaCtx->SurfaceMutex); - DdiMediaUtil_LockGuard2 guard(&surfaceElement->lock); + DdiMediaUtil_LockGuard2 guard(surface->lock); Codechal *codecHal = decCtx->pCodecHal; //return success just avoid vaDestroyContext is ahead of vaSyncSurface @@ -4446,7 +4461,7 @@ VAStatus DdiMedia_QuerySurfaceError( VAStatus vaStatus = VA_STATUS_SUCCESS; //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); - surfaceElement->lock.lock_shared(); + surface->lock->lock_shared(); if (surface->curStatusReportQueryState == DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED) { if (error_status != -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) @@ -4465,7 +4480,7 @@ VAStatus DdiMedia_QuerySurfaceError( surfaceErrors[0].decode_error_type = VADecodeMBError; #endif *error_info = surfaceErrors; - surfaceElement->lock.unlock_shared(); + surface->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } @@ -4478,7 +4493,7 @@ VAStatus DdiMedia_QuerySurfaceError( surfaceErrors[0].status = 1; surfaceErrors[0].decode_error_type = VADecodeReset; *error_info = surfaceErrors; - surfaceElement->lock.unlock_shared(); + surface->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } @@ -4507,7 +4522,7 @@ VAStatus DdiMedia_QuerySurfaceError( } } - surfaceElement->lock.unlock_shared(); + surface->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return vaStatus; } @@ -4515,14 +4530,14 @@ VAStatus DdiMedia_QuerySurfaceError( if (surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_VP && surface->curStatusReport.vpp.status == CODECHAL_STATUS_ERROR) { - surfaceElement->lock.unlock_shared(); + surface->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } } surfaceErrors[0].status = -1; - surfaceElement->lock.unlock_shared(); + surface->lock->unlock_shared(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } @@ -4784,12 +4799,14 @@ VAStatus DdiMedia_CreateImage( buf->format = Media_Format_CPU;//DdiCodec_OsFormatToMediaFormat(vaimg->format.fourcc); //Media_Format_Buffer; buf->uiOffset = 0; buf->pMediaCtx = mediaCtx; + buf->lock = MOS_New(std::shared_timed_mutex); //Put Image in untiled buffer for better CPU access? VAStatus status= DdiMediaUtil_CreateBuffer(buf, mediaCtx->pDrmBufMgr); if((status != VA_STATUS_SUCCESS)) { MOS_FreeMemory(vaimg); + MOS_Delete(buf->lock); MOS_FreeMemory(buf); return status; } @@ -4803,18 +4820,17 @@ VAStatus DdiMedia_CreateImage( //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_FreeMemory(vaimg); DdiMediaUtil_FreeBuffer(buf); + //MOS_Delete(buf->lock); MOS_FreeMemory(buf); return VA_STATUS_ERROR_MAX_NUM_EXCEEDED; } - bufferHeapElement->lock.lock(); bufferHeapElement->pBuffer = buf; bufferHeapElement->pCtx = nullptr; bufferHeapElement->uiCtxType = DDI_MEDIA_CONTEXT_TYPE_MEDIA; vaimg->buf = bufferHeapElement->uiVaBufferID; mediaCtx->uiNumBufs++; - bufferHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); DdiMediaUtil_LockMutex(&mediaCtx->ImageMutex); @@ -5118,6 +5134,8 @@ VAStatus DdiMedia_DeriveImage ( buf->format = mediaSurface->format; buf->TileType = mediaSurface->TileType; buf->pSurface = mediaSurface; + buf->lock = MOS_New(std::shared_timed_mutex); + //buf->lock = mediaSurface->lock; mos_bo_reference(mediaSurface->bo); //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); @@ -5127,17 +5145,16 @@ VAStatus DdiMedia_DeriveImage ( { //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); MOS_FreeMemory(vaimg); + MOS_Delete(buf->lock); MOS_FreeMemory(buf); return VA_STATUS_ERROR_MAX_NUM_EXCEEDED; } - bufferHeapElement->lock.lock(); bufferHeapElement->pBuffer = buf; bufferHeapElement->pCtx = nullptr; bufferHeapElement->uiCtxType = DDI_MEDIA_CONTEXT_TYPE_MEDIA; vaimg->buf = bufferHeapElement->uiVaBufferID; mediaCtx->uiNumBufs++; - bufferHeapElement->lock.unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); *image = *vaimg; @@ -6852,14 +6869,14 @@ VAStatus DdiMedia_AcquireBufferHandle( } //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - bufHeapElement->lock.lock(); + buf->lock->lock(); // already acquired? if (buf->uiExportcount) { // yes, already acquired // can't provide access thru another memtype if (buf->uiMemtype != buf_info->mem_type) { - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_PARAMETER; } @@ -6871,7 +6888,7 @@ VAStatus DdiMedia_AcquireBufferHandle( uint32_t flink = 0; if (mos_bo_flink(buf->bo, &flink) != 0) { - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_BUFFER; } @@ -6882,7 +6899,7 @@ VAStatus DdiMedia_AcquireBufferHandle( int32_t prime_fd = 0; if (mos_bo_export_to_prime(buf->bo, &prime_fd) != 0) { - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_ERROR_INVALID_BUFFER; } @@ -6902,7 +6919,7 @@ VAStatus DdiMedia_AcquireBufferHandle( buf_info->handle = buf->handle; buf_info->mem_size = buf->uiNumElements * buf->iSize; - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_SUCCESS; } @@ -6936,10 +6953,10 @@ VAStatus DdiMedia_ReleaseBufferHandle( DDI_CHK_NULL(buf->bo, "Invalid Media Buffer", VA_STATUS_ERROR_INVALID_BUFFER); //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - bufHeapElement->lock.lock(); + buf->lock->lock(); if (!buf->uiMemtype || !buf->uiExportcount) { - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return VA_STATUS_SUCCESS; } @@ -6955,7 +6972,7 @@ VAStatus DdiMedia_ReleaseBufferHandle( } buf->uiMemtype = 0; } - bufHeapElement->lock.unlock(); + buf->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); if (!buf->uiExportcount && buf->bPostponedBufFree) { diff --git a/media_driver/linux/common/ddi/media_libva_common.cpp b/media_driver/linux/common/ddi/media_libva_common.cpp index cc5b2b6a95..6378dd4e9f 100644 --- a/media_driver/linux/common/ddi/media_libva_common.cpp +++ b/media_driver/linux/common/ddi/media_libva_common.cpp @@ -143,11 +143,11 @@ PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMedia_GetSurfaceElementFromVASurfaceID (PDDI_ if(validSurface) { DDI_CHK_LESS(i, mediaCtx->pSurfaceHeap->uiAllocatedHeapElements, "invalid surface id", nullptr); - mediaCtx->pSurfaceHeap->lock.lock_shared(); + mediaCtx->pSurfaceHeap->lock->lock(); //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; surfaceElement += i; - mediaCtx->pSurfaceHeap->lock.unlock_shared(); + mediaCtx->pSurfaceHeap->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); } @@ -169,18 +169,18 @@ VASurfaceID DdiMedia_GetVASurfaceIDFromSurface(PDDI_MEDIA_SURFACE surface) { DDI_CHK_NULL(surface, "nullptr surface", VA_INVALID_SURFACE); - surface->pMediaCtx->pSurfaceHeap->lock.lock_shared(); + surface->pMediaCtx->pSurfaceHeap->lock->lock(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surface->pMediaCtx->pSurfaceHeap->pHeapBase; for(uint32_t i = 0; i < surface->pMediaCtx->pSurfaceHeap->uiAllocatedHeapElements; i ++) { if(surface == surfaceElement->pSurface) { - surface->pMediaCtx->pSurfaceHeap->lock.unlock_shared(); + surface->pMediaCtx->pSurfaceHeap->lock->unlock(); return surfaceElement->uiVaSurfaceID; } surfaceElement ++; } - surface->pMediaCtx->pSurfaceHeap->lock.unlock_shared(); + surface->pMediaCtx->pSurfaceHeap->lock->unlock(); return VA_INVALID_SURFACE; } @@ -235,7 +235,7 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa //lock surface heap //DdiMediaUtil_LockMutex(&mediaCtx->SurfaceMutex); - mediaCtx->pSurfaceHeap->lock.lock_shared(); + mediaCtx->pSurfaceHeap->lock->lock(); uint32_t i; //get current element heap and index for(i = 0; i < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; i ++) @@ -249,7 +249,7 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa //if cant find if(i == surface->pMediaCtx->pSurfaceHeap->uiAllocatedHeapElements) { - mediaCtx->pSurfaceHeap->lock.unlock_shared(); + mediaCtx->pSurfaceHeap->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); if(dstSurface->pShadowBuffer) { @@ -266,7 +266,7 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa DdiMediaUtil_FreeSurface(surface); MOS_FreeMemory(surface); - mediaCtx->pSurfaceHeap->lock.unlock_shared(); + mediaCtx->pSurfaceHeap->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return dstSurface; @@ -293,9 +293,9 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithVariant(PDDI_MEDIA_SURFACE surface } //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - surface->pMediaCtx->pSurfaceHeap->lock.lock_shared(); + surface->pMediaCtx->pSurfaceHeap->lock->lock(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surface->pMediaCtx->pSurfaceHeap->pHeapBase; - surface->pMediaCtx->pSurfaceHeap->lock.unlock_shared(); + surface->pMediaCtx->pSurfaceHeap->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); if (nullptr == surfaceElement) { @@ -388,10 +388,10 @@ PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMedia_GetBufferElementFromVABufferID (PDDI_MED i = (uint32_t)bufferID; DDI_CHK_LESS(i, mediaCtx->pBufferHeap->uiAllocatedHeapElements, "invalid buffer id", nullptr); //DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex); - mediaCtx->pBufferHeap->lock.lock_shared(); + mediaCtx->pBufferHeap->lock->lock(); bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase; bufHeapElement += i; - mediaCtx->pBufferHeap->lock.unlock_shared(); + mediaCtx->pBufferHeap->lock->unlock(); //DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex); return bufHeapElement; diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp index fe4e0e5c1b..e6f7b34131 100755 --- a/media_driver/linux/common/ddi/media_libva_util.cpp +++ b/media_driver/linux/common/ddi/media_libva_util.cpp @@ -1192,6 +1192,7 @@ void* DdiMediaUtil_LockSurface(DDI_MEDIA_SURFACE* surface, uint32_t flag) { DDI_CHK_NULL(surface, "nullptr surface", nullptr); DDI_CHK_NULL(surface->pMediaCtx, "nullptr surface->pMediaCtx", nullptr); + surface->lock->lock(); if (MEDIA_IS_SKU(&surface->pMediaCtx->SkuTable, FtrLocalMemory)) { if ((MosUtilities::MosAtomicIncrement(&surface->iRefCount) == 1) && (false == surface->bMapped)) @@ -1215,6 +1216,7 @@ void* DdiMediaUtil_LockSurface(DDI_MEDIA_SURFACE* surface, uint32_t flag) } surface->iRefCount++; } + surface->lock->unlock(); return surface->pData; @@ -1506,6 +1508,8 @@ void DdiMediaUtil_FreeSurface(DDI_MEDIA_SURFACE *surface) DDI_CHK_NULL(surface->pMediaCtx, "nullptr surface->pMediaCtx", ); DDI_CHK_NULL(surface->pMediaCtx->pGmmClientContext, "nullptr surface->pMediaCtx->pGmmClientContext", ); + if (surface->lock) + surface->lock->lock(); // Unmap Aux mapping if the surface was mapped if (surface->pMediaCtx->m_auxTableMgr) { @@ -1538,6 +1542,12 @@ void DdiMediaUtil_FreeSurface(DDI_MEDIA_SURFACE *surface) surface->pMediaCtx->pGmmClientContext->DestroyResInfoObject(surface->pGmmResourceInfo); surface->pGmmResourceInfo = nullptr; } + + if (surface->lock) + { + surface->lock->unlock(); + MOS_Delete(surface->lock); + } } @@ -1546,6 +1556,10 @@ void DdiMediaUtil_FreeBuffer(DDI_MEDIA_BUFFER *buf) { DDI_CHK_NULL(buf, "nullptr", ); // calling sequence checking + if (buf->lock) + { + buf->lock->lock(); + } if (buf->bMapped) { DdiMediaUtil_UnlockBuffer(buf); @@ -1567,6 +1581,12 @@ void DdiMediaUtil_FreeBuffer(DDI_MEDIA_BUFFER *buf) buf->pMediaCtx->pGmmClientContext->DestroyResInfoObject(buf->pGmmResourceInfo); buf->pGmmResourceInfo = nullptr; } + + if (buf->lock) + { + buf->lock->unlock(); + MOS_Delete(buf->lock); + } } /////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1660,14 +1680,14 @@ PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMediaUtil_AllocPMediaSurfaceFromHeap(PDDI_MED PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = nullptr; - surfaceHeap->lock.lock(); + surfaceHeap->lock->lock(); if (nullptr == surfaceHeap->pFirstFreeHeapElement) { void *newHeapBase = MOS_ReallocMemory(surfaceHeap->pHeapBase, (surfaceHeap->uiAllocatedHeapElements + DDI_MEDIA_HEAP_INCREMENTAL_SIZE) * sizeof(DDI_MEDIA_SURFACE_HEAP_ELEMENT)); if (nullptr == newHeapBase) { - surfaceHeap->lock.unlock(); + surfaceHeap->lock->unlock(); DDI_ASSERTMESSAGE("DDI: realloc failed."); return nullptr; } @@ -1686,7 +1706,7 @@ PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMediaUtil_AllocPMediaSurfaceFromHeap(PDDI_MED mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surfaceHeap->pFirstFreeHeapElement; surfaceHeap->pFirstFreeHeapElement = mediaSurfaceHeapElmt->pNextFree; - surfaceHeap->lock.unlock(); + surfaceHeap->lock->unlock(); return mediaSurfaceHeapElmt; } @@ -1700,14 +1720,14 @@ void DdiMediaUtil_ReleasePMediaSurfaceFromHeap(PDDI_MEDIA_HEAP surfaceHeap, uint PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapBase = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surfaceHeap->pHeapBase; DDI_CHK_NULL(mediaSurfaceHeapBase, "nullptr mediaSurfaceHeapBase", ); - surfaceHeap->lock.lock(); + surfaceHeap->lock->lock(); PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = &mediaSurfaceHeapBase[vaSurfaceID]; DDI_CHK_NULL(mediaSurfaceHeapElmt->pSurface, "surface is already released", ); void *firstFree = surfaceHeap->pFirstFreeHeapElement; surfaceHeap->pFirstFreeHeapElement = (void*)mediaSurfaceHeapElmt; mediaSurfaceHeapElmt->pNextFree = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)firstFree; mediaSurfaceHeapElmt->pSurface = nullptr; - surfaceHeap->lock.unlock(); + surfaceHeap->lock->unlock(); } @@ -1716,7 +1736,7 @@ PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMediaUtil_AllocPMediaBufferFromHeap(PDDI_MEDIA DDI_CHK_NULL(bufferHeap, "nullptr bufferHeap", nullptr); PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapElmt = nullptr; - bufferHeap->lock.lock(); + bufferHeap->lock->lock(); if (nullptr == bufferHeap->pFirstFreeHeapElement) { void *newHeapBase = MOS_ReallocMemory(bufferHeap->pHeapBase, (bufferHeap->uiAllocatedHeapElements + DDI_MEDIA_HEAP_INCREMENTAL_SIZE) * sizeof(DDI_MEDIA_BUFFER_HEAP_ELEMENT)); @@ -1739,7 +1759,7 @@ PDDI_MEDIA_BUFFER_HEAP_ELEMENT DdiMediaUtil_AllocPMediaBufferFromHeap(PDDI_MEDIA mediaBufferHeapElmt = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)bufferHeap->pFirstFreeHeapElement; bufferHeap->pFirstFreeHeapElement = mediaBufferHeapElmt->pNextFree; - bufferHeap->lock.unlock(); + bufferHeap->lock->unlock(); return mediaBufferHeapElmt; } @@ -1749,7 +1769,7 @@ void DdiMediaUtil_ReleasePMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap, uint32 DDI_CHK_NULL(bufferHeap, "nullptr bufferHeap", ); DDI_CHK_LESS(vaBufferID, bufferHeap->uiAllocatedHeapElements, "invalid buffer id", ); - bufferHeap->lock.lock(); + bufferHeap->lock->lock(); PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapBase = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)bufferHeap->pHeapBase; PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapElmt = &mediaBufferHeapBase[vaBufferID]; DDI_CHK_NULL(mediaBufferHeapElmt->pBuffer, "buffer is already released", ); @@ -1757,7 +1777,7 @@ void DdiMediaUtil_ReleasePMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap, uint32 bufferHeap->pFirstFreeHeapElement = (void*)mediaBufferHeapElmt; mediaBufferHeapElmt->pNextFree = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)firstFree; mediaBufferHeapElmt->pBuffer = nullptr; - bufferHeap->lock.unlock(); + bufferHeap->lock->unlock(); } PDDI_MEDIA_IMAGE_HEAP_ELEMENT DdiMediaUtil_AllocPVAImageFromHeap(PDDI_MEDIA_HEAP imageHeap) diff --git a/media_driver/linux/common/vp/ddi/media_libva_vp.c b/media_driver/linux/common/vp/ddi/media_libva_vp.c index dcff2555a7..cb7fff40b2 100644 --- a/media_driver/linux/common/vp/ddi/media_libva_vp.c +++ b/media_driver/linux/common/vp/ddi/media_libva_vp.c @@ -3069,6 +3069,7 @@ VAStatus DdiVp_CreateBuffer( pBuf->format = Media_Format_Buffer; pBuf->uiOffset = 0; pBuf->pData = (uint8_t*)MOS_AllocAndZeroMemory(uiSize * uiNumElements); + pBuf->lock = MOS_New(std::shared_timed_mutex); if (nullptr == pBuf->pData) { MOS_FreeMemAndSetNull(pBuf); diff --git a/media_softlet/linux/common/ddi/media_libva_common_next.h b/media_softlet/linux/common/ddi/media_libva_common_next.h index 575b6d9819..221e1541d8 100644 --- a/media_softlet/linux/common/ddi/media_libva_common_next.h +++ b/media_softlet/linux/common/ddi/media_libva_common_next.h @@ -260,6 +260,7 @@ typedef struct _DDI_MEDIA_SURFACE uint32_t uiVariantFlag; int memType; + std::shared_timed_mutex *lock = nullptr;; } DDI_MEDIA_SURFACE, *PDDI_MEDIA_SURFACE; typedef struct _DDI_MEDIA_BUFFER @@ -291,6 +292,7 @@ typedef struct _DDI_MEDIA_BUFFER PDDI_MEDIA_SURFACE pSurface = nullptr; GMM_RESOURCE_INFO *pGmmResourceInfo = nullptr; // GMM resource descriptor PDDI_MEDIA_CONTEXT pMediaCtx = nullptr; // Media driver Context + std::shared_timed_mutex *lock = nullptr;; } DDI_MEDIA_BUFFER, *PDDI_MEDIA_BUFFER; typedef struct _DDI_MEDIA_SURFACE_HEAP_ELEMENT @@ -298,7 +300,6 @@ typedef struct _DDI_MEDIA_SURFACE_HEAP_ELEMENT PDDI_MEDIA_SURFACE pSurface; uint32_t uiVaSurfaceID; struct _DDI_MEDIA_SURFACE_HEAP_ELEMENT *pNextFree; - std::shared_timed_mutex lock; }DDI_MEDIA_SURFACE_HEAP_ELEMENT, *PDDI_MEDIA_SURFACE_HEAP_ELEMENT; typedef struct _DDI_MEDIA_BUFFER_HEAP_ELEMENT @@ -308,7 +309,6 @@ typedef struct _DDI_MEDIA_BUFFER_HEAP_ELEMENT uint32_t uiCtxType; uint32_t uiVaBufferID; struct _DDI_MEDIA_BUFFER_HEAP_ELEMENT *pNextFree; - std::shared_timed_mutex lock; }DDI_MEDIA_BUFFER_HEAP_ELEMENT, *PDDI_MEDIA_BUFFER_HEAP_ELEMENT; typedef struct _DDI_MEDIA_IMAGE_HEAP_ELEMENT @@ -331,7 +331,8 @@ typedef struct _DDI_MEDIA_HEAP uint32_t uiHeapElementSize; uint32_t uiAllocatedHeapElements; void *pFirstFreeHeapElement; - std::shared_timed_mutex lock; + //std::shared_timed_mutex lock; + std::shared_timed_mutex *lock = nullptr;; }DDI_MEDIA_HEAP, *PDDI_MEDIA_HEAP; #ifndef ANDROID From 67ef46f1c24be3ab8691debc791d5fc22c0d061f Mon Sep 17 00:00:00 2001 From: "Xu, Zhengguo" Date: Tue, 30 Jul 2024 14:47:12 +0800 Subject: [PATCH 5/5] [Decode] Fix memleak in ULT --- media_driver/linux/common/ddi/media_libva.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index 302fa48e89..7f19be68af 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -3963,6 +3963,11 @@ VAStatus DdiMedia_DestroyBuffer ( break; //return va_STATUS_SUCCESS; } + if (buf->lock) + { + //buf->lock->unlock(); //todo: lock ahead firstly? + MOS_Delete(buf->lock); //todo: delete lock to avoid leak? check MOS_FreeMemory(buf) in code + } MOS_FreeMemory(buf); DdiMedia_DestroyBufFromVABufferID(mediaCtx, buffer_id);