[Mesa-dev] [PATCH 4/5] swr: [rasterizer core] Frontend dependency work
Cherniak, Bruce
bruce.cherniak at intel.com
Thu Oct 27 15:56:52 UTC 2016
Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com>
> On Oct 26, 2016, at 7:08 PM, George Kyriazis <george.kyriazis at intel.com> wrote:
>
> Add frontend dependency concept in the DRAW_CONTEXT, which
> allows serialization of frontend work if necessary.
> ---
> src/gallium/drivers/swr/rasterizer/core/api.cpp | 3 +++
> src/gallium/drivers/swr/rasterizer/core/context.h | 3 ++-
> src/gallium/drivers/swr/rasterizer/core/threads.cpp | 14 +++++++++++++-
> 3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp
> index e67ede2..5f941e8 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp
> @@ -317,7 +317,10 @@ DRAW_CONTEXT* GetDrawContext(SWR_CONTEXT *pContext, bool isSplitDraw = false)
>
> SWR_ASSERT(pCurDrawContext->pArena->IsEmpty() == true);
>
> + // Reset dependency
> pCurDrawContext->dependent = false;
> + pCurDrawContext->dependentFE = false;
> +
> pCurDrawContext->pContext = pContext;
> pCurDrawContext->isCompute = false; // Dispatch has to set this to true.
>
> diff --git a/src/gallium/drivers/swr/rasterizer/core/context.h b/src/gallium/drivers/swr/rasterizer/core/context.h
> index 9a26e33..a9de63b 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/context.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/context.h
> @@ -404,7 +404,8 @@ struct DRAW_CONTEXT
> CachingArena* pArena;
>
> uint32_t drawId;
> - bool dependent;
> + bool dependentFE; // Frontend work is dependent on all previous FE
> + bool dependent; // Backend work is dependent on all previous BE
> bool isCompute; // Is this DC a compute context?
> bool cleanupState; // True if this is the last draw using an entry in the state ring.
> volatile bool doneFE; // Is FE work done for this draw?
> diff --git a/src/gallium/drivers/swr/rasterizer/core/threads.cpp b/src/gallium/drivers/swr/rasterizer/core/threads.cpp
> index ea5542a..701a550 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/threads.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/core/threads.cpp
> @@ -313,6 +313,11 @@ bool CheckDependency(SWR_CONTEXT *pContext, DRAW_CONTEXT *pDC, uint32_t lastReti
> return pDC->dependent && IDComparesLess(lastRetiredDraw, pDC->drawId - 1);
> }
>
> +bool CheckDependencyFE(SWR_CONTEXT *pContext, DRAW_CONTEXT *pDC, uint32_t lastRetiredDraw)
> +{
> + return pDC->dependentFE && IDComparesLess(lastRetiredDraw, pDC->drawId - 1);
> +}
> +
> //////////////////////////////////////////////////////////////////////////
> /// @brief Update client stats.
> INLINE void UpdateClientStats(SWR_CONTEXT* pContext, uint32_t workerId, DRAW_CONTEXT* pDC)
> @@ -595,6 +600,7 @@ INLINE void CompleteDrawFE(SWR_CONTEXT* pContext, uint32_t workerId, DRAW_CONTEX
> // Ensure all streaming writes are globally visible before marking this FE done
> _mm_mfence();
> pDC->doneFE = true;
> +
> InterlockedDecrement((volatile LONG*)&pContext->drawsOutstandingFE);
> }
>
> @@ -606,7 +612,7 @@ void WorkOnFifoFE(SWR_CONTEXT *pContext, uint32_t workerId, uint32_t &curDrawFE)
> {
> uint32_t dcSlot = curDrawFE % KNOB_MAX_DRAWS_IN_FLIGHT;
> DRAW_CONTEXT *pDC = &pContext->dcRing[dcSlot];
> - if (pDC->isCompute || pDC->doneFE || pDC->FeLock)
> + if (pDC->isCompute || pDC->doneFE)
> {
> CompleteDrawContextInl(pContext, workerId, pDC);
> curDrawFE++;
> @@ -617,6 +623,7 @@ void WorkOnFifoFE(SWR_CONTEXT *pContext, uint32_t workerId, uint32_t &curDrawFE)
> }
> }
>
> + uint32_t lastRetiredFE = curDrawFE - 1;
> uint32_t curDraw = curDrawFE;
> while (IDComparesLess(curDraw, drawEnqueued))
> {
> @@ -625,6 +632,11 @@ void WorkOnFifoFE(SWR_CONTEXT *pContext, uint32_t workerId, uint32_t &curDrawFE)
>
> if (!pDC->isCompute && !pDC->FeLock)
> {
> + if (CheckDependencyFE(pContext, pDC, lastRetiredFE))
> + {
> + return;
> + }
> +
> uint32_t initial = InterlockedCompareExchange((volatile uint32_t*)&pDC->FeLock, 1, 0);
> if (initial == 0)
> {
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list