gallium/swr: Fix various asserts and security issues
[mesa.git] / src / gallium / drivers / swr / rasterizer / core / threads.cpp
index a0ddd96c61f07f6214c8b8f249eed5d138cb792a..c75fb568431e720c6cdd579e423d777ebd07c510 100644 (file)
@@ -714,6 +714,9 @@ INLINE void CompleteDrawFE(SWR_CONTEXT* pContext, uint32_t workerId, DRAW_CONTEX
         }
     }
 
+    if (pContext->pfnUpdateStreamOut)
+        pContext->pfnUpdateStreamOut(GetPrivateState(pDC),  pDC->dynState.soPrims);
+
     // Ensure all streaming writes are globally visible before marking this FE done
     _mm_mfence();
     pDC->doneFE = true;
@@ -1003,6 +1006,7 @@ void CreateThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
     CPUNumaNodes nodes;
     uint32_t     numThreadsPerProcGroup = 0;
     CalculateProcessorTopology(nodes, numThreadsPerProcGroup);
+    assert(numThreadsPerProcGroup > 0);
 
     // Assumption, for asymmetric topologies, multi-threaded cores will appear
     // in the list before single-threaded cores.  This appears to be true for
@@ -1188,7 +1192,7 @@ void CreateThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
     pContext->NumWorkerThreads = pPool->numThreads;
 
     pPool->pThreadData = new (std::nothrow) THREAD_DATA[pPool->numThreads];
-    SWR_ASSERT(pPool->pThreadData);
+    assert(pPool->pThreadData);
     memset(pPool->pThreadData, 0, sizeof(THREAD_DATA) * pPool->numThreads);
     pPool->numaMask = 0;
 
@@ -1200,7 +1204,7 @@ void CreateThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
         pContext->workerPrivateState.pfnInitWorkerData = nullptr;
         pContext->workerPrivateState.pfnFinishWorkerData = nullptr;
     }
+
     // initialize contents of SWR_WORKER_DATA
     size_t perWorkerSize =
         AlignUpPow2(pContext->workerPrivateState.perWorkerPrivateStateSize, 64);
@@ -1216,7 +1220,7 @@ void CreateThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
             pPool->pThreadData[i].pWorkerPrivateData = pWorkerData;
             if (pContext->workerPrivateState.pfnInitWorkerData)
             {
-                pContext->workerPrivateState.pfnInitWorkerData(pWorkerData, i);
+                pContext->workerPrivateState.pfnInitWorkerData(pContext, pWorkerData, i);
             }
             pWorkerData = PtrAdd(pWorkerData, perWorkerSize);
         }
@@ -1228,7 +1232,7 @@ void CreateThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
     }
 
     pPool->pThreads = new (std::nothrow) THREAD_PTR[pPool->numThreads];
-    SWR_ASSERT(pPool->pThreads);
+    assert(pPool->pThreads);
 
     if (pContext->threadInfo.MAX_WORKER_THREADS)
     {
@@ -1297,7 +1301,7 @@ void CreateThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
                     if (numRemovedThreads)
                     {
                         --numRemovedThreads;
-                        SWR_REL_ASSERT(numReservedThreads);
+                        assert(numReservedThreads);
                         --numReservedThreads;
                         pPool->pApiThreadData[numReservedThreads].workerId    = 0xFFFFFFFFU;
                         pPool->pApiThreadData[numReservedThreads].procGroupId = core.procGroup;
@@ -1396,7 +1400,7 @@ void DestroyThreadPool(SWR_CONTEXT* pContext, THREAD_POOL* pPool)
         if (pContext->workerPrivateState.pfnFinishWorkerData)
         {
             pContext->workerPrivateState.pfnFinishWorkerData(
-                pPool->pThreadData[t].pWorkerPrivateData, t);
+                pContext, pPool->pThreadData[t].pWorkerPrivateData, t);
         }
     }