//------------------------------------------------------------------------------ // * Determine if the occludee model is inside view frustum // * Transform the occluder models on the CPU // * Bin the occluder triangles into tiles that the frame buffer is divided into // * Rasterize the occluder triangles to the CPU depth buffer //------------------------------------------------------------------------------- void DepthBufferRasterizerSSEST::TransformModelsAndRasterizeToDepthBuffer(CPUTCamera *pCamera, UINT idx) { QueryPerformanceCounter(&mStartTime[idx]); mpCamera[idx] = pCamera; BoxTestSetupSSE setup; setup.Init(mpViewMatrix[idx], mpProjMatrix[idx], viewportMatrix, pCamera, mOccluderSizeThreshold); if(mEnableFCulling) { for(UINT i = 0; i < mNumModels1; i++) { mpTransformedModels1[i].InsideViewFrustum(setup, idx); } } else { for(UINT i = 0; i < mNumModels1; i++) { mpTransformedModels1[i].TooSmall(setup, idx); } } ActiveModels(idx); TransformMeshes(idx); BinTransformedMeshes(idx); for(UINT i = 0; i < NUM_TILES; i++) { RasterizeBinnedTrianglesToDepthBuffer(i, idx); } QueryPerformanceCounter(&mStopTime[idx][0]); mRasterizeTime[mTimeCounter++] = ((double)(mStopTime[idx][0].QuadPart - mStartTime[idx].QuadPart)) / ((double)glFrequency.QuadPart); mTimeCounter = mTimeCounter >= AVG_COUNTER ? 0 : mTimeCounter; }
//-------------------------------------------------------------------------------- // Determine the batch of occludee models each task should work on // For each occludee model in the batch // * Transform the AABBox to screen space // * Rasterize the triangles that make up the AABBox // * Depth test the raterized triangles against the CPU rasterized depth buffer //-------------------------------------------------------------------------------- void AABBoxRasterizerSSEMT::TransformAABBoxAndDepthTest(UINT taskId, UINT taskCount, UINT idx) { QueryPerformanceCounter(&mStartTime[idx][taskId]); BoxTestSetupSSE setup; setup.Init(mViewMatrix[idx], mProjMatrix[idx], viewportMatrix, mpCamera[idx], mOccludeeSizeThreshold); __m128 xformedPos[AABB_VERTICES]; __m128 cumulativeMatrix[4]; static const UINT kChunkSize = 64; for(UINT base = taskId*kChunkSize; base < mNumModels; base += mNumDepthTestTasks * kChunkSize) { UINT end = min(base + kChunkSize, mNumModels); if(mEnableFCulling) { CalcInsideFrustum(&mpCamera[idx]->mFrustum , base, end, idx); } for(UINT i = base; i < end; i++) { mpVisible[idx][i] = false; if(mpInsideFrustum[idx][i] && !mpTransformedAABBox[i].IsTooSmall(setup, cumulativeMatrix)) { PreTestResult res = mpTransformedAABBox[i].TransformAndPreTestAABBox(xformedPos, cumulativeMatrix, mpDepthSummary[idx]); if(res == ePT_UNSURE) { mpVisible[idx][i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels[idx], xformedPos, idx); } else { mpVisible[idx][i] = (res == ePT_VISIBLE); } } } } QueryPerformanceCounter(&mStopTime[idx][taskId]); }
//------------------------------------------------------------------------------ // For each occludee model // * Determine if the occludee model AABox is within the viewing frustum // * Transform the AABBox to screen space // * Rasterize the triangles that make up the AABBox // * Depth test the raterized triangles against the CPU rasterized depth buffer //----------------------------------------------------------------------------- void AABBoxRasterizerAVXST::TransformAABBoxAndDepthTest(CPUTCamera *pCamera, UINT idx) { QueryPerformanceCounter(&mStartTime[idx][0]); mpCamera[idx] = pCamera; if(mEnableFCulling) { CalcInsideFrustum(&mpCamera[idx]->mFrustum , 0, mNumModels, idx); } BoxTestSetupSSE setup; setup.Init(mViewMatrix[idx], mProjMatrix[idx], viewportMatrix, mpCamera[idx], mOccludeeSizeThreshold); __m128 xformedPos[AABB_VERTICES]; __m128 cumulativeMatrix[4]; for(UINT i = 0; i < mNumModels; i++) { mpVisible[idx][i] = false; if(mpInsideFrustum[idx][i] && !mpTransformedAABBox[i].IsTooSmall(setup, cumulativeMatrix)) { PreTestResult res = mpTransformedAABBox[i].TransformAndPreTestAABBox(xformedPos, cumulativeMatrix, mpDepthSummary[idx]); if(res == ePT_UNSURE) { mpVisible[idx][i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels[idx], xformedPos, idx); } else { mpVisible[idx][i] = (res == ePT_VISIBLE); } } } QueryPerformanceCounter(&mStopTime[idx][0]); mDepthTestTime[mTimeCounter++] = ((double)(mStopTime[idx][0].QuadPart - mStartTime[idx][0].QuadPart)) / ((double)glFrequency.QuadPart); mTimeCounter = mTimeCounter >= AVG_COUNTER ? 0 : mTimeCounter; }