Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DON'T merge, TEST only] remove heap mutex and use rw lock to protect… #1790

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions media_driver/linux/common/codec/ddi/media_ddi_decode_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -1122,6 +1123,7 @@ VAStatus DdiMediaDecode::CreateBuffer(
if(buf)
{
MOS_FreeMemory(buf->pData);
MOS_Delete(buf->lock);
MOS_FreeMemory(buf);
}
return va;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions media_driver/linux/common/codec/ddi/media_libva_decoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -422,6 +423,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec
break;
}
}
mediaCtx->pSurfaceHeap->lock->unlock_shared();
}
else
{
Expand Down Expand Up @@ -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;
Expand All @@ -502,6 +505,7 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt
break;
}
}
mediaCtx->pSurfaceHeap->lock->unlock_shared();
}
else
{
Expand Down
182 changes: 130 additions & 52 deletions media_driver/linux/common/ddi/media_libva.cpp

Large diffs are not rendered by default.

76 changes: 54 additions & 22 deletions media_driver/linux/common/ddi/media_libva_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -143,29 +143,44 @@ 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();
//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();
//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;
}

VASurfaceID DdiMedia_GetVASurfaceIDFromSurface(PDDI_MEDIA_SURFACE surface)
{
DDI_CHK_NULL(surface, "nullptr surface", VA_INVALID_SURFACE);

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();
return surfaceElement->uiVaSurfaceID;
}
surfaceElement ++;
}
surface->pMediaCtx->pSurfaceHeap->lock->unlock();
return VA_INVALID_SURFACE;
}

Expand Down Expand Up @@ -219,7 +234,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();
uint32_t i;
//get current element heap and index
for(i = 0; i < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; i ++)
Expand All @@ -233,7 +249,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();
//DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex);
if(dstSurface->pShadowBuffer)
{
MOS_FreeMemory(dstSurface->pShadowBuffer->pGmmResourceInfo);
Expand All @@ -249,7 +266,8 @@ PDDI_MEDIA_SURFACE DdiMedia_ReplaceSurfaceWithNewFormat(PDDI_MEDIA_SURFACE surfa
DdiMediaUtil_FreeSurface(surface);
MOS_FreeMemory(surface);

DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex);
mediaCtx->pSurfaceHeap->lock->unlock();
//DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex);

return dstSurface;
}
Expand All @@ -274,16 +292,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();
PDDI_MEDIA_SURFACE_HEAP_ELEMENT surfaceElement = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)surface->pMediaCtx->pSurfaceHeap->pHeapBase;
DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex);
surface->pMediaCtx->pSurfaceHeap->lock->unlock();
//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)
Expand Down Expand Up @@ -348,41 +368,53 @@ 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);

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);
DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex);
//DdiMediaUtil_LockMutex(&mediaCtx->BufferMutex);
mediaCtx->pBufferHeap->lock->lock();
bufHeapElement = (PDDI_MEDIA_BUFFER_HEAP_ELEMENT)mediaCtx->pBufferHeap->pHeapBase;
bufHeapElement += i;
buf = bufHeapElement->pBuffer;
DdiMediaUtil_UnLockMutex(&mediaCtx->BufferMutex);
mediaCtx->pBufferHeap->lock->unlock();
//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;
}

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;
}

Expand All @@ -394,11 +426,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;
}
Expand Down
26 changes: 26 additions & 0 deletions media_driver/linux/common/ddi/media_libva_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
//!
Expand Down Expand Up @@ -204,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
//!
Expand Down
Loading
Loading