//================ Copyright (c) Valve Corporation. All Rights Reserved. =========================== // // // //================================================================================================== #include "buildworldlists_PS3.h" #include "gl_model_private.h" #include "host.h" #include "disp.h" #include "vprof.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //-------------------------------------------------------------------------------------------------- // //-------------------------------------------------------------------------------------------------- CPS3BuildWorldListsJob g_BuildWorldListsJob; CPS3BuildWorldListsJob* g_pBuildWorldListsJob = &g_BuildWorldListsJob; job_buildworldlists::JobDescriptor_t g_buildWorldListsJobDescriptor[MAX_CONCURRENT_BUILDVIEWS] ALIGN128; job_buildworldlists::buildWorldListsDMAOut g_buildWorldListsDMAOutData[MAX_CONCURRENT_BUILDVIEWS] ALIGN128; //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void CPS3BuildWorldListsJob::Init( void ) { // Register with VJobs if( g_pVJobs ) { g_pVJobs->Register( this ); } } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void CPS3BuildWorldListsJob::Shutdown() { g_pVJobs->Unregister( this ); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void CPS3BuildWorldListsJob::OnVjobsInit() { for( int i = 0; i < MAX_CONCURRENT_BUILDVIEWS; i++ ) { g_buildWorldListsJobDescriptor[i].header = *m_pRoot->m_pJobBuildWorldLists; g_buildWorldListsJobDescriptor[i].header.useInOutBuffer = 0; g_buildWorldListsJobDescriptor[i].header.sizeStack = (48*1024)/16; g_buildWorldListsJobDescriptor[i].header.sizeInOrInOut = 0; } } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void CPS3BuildWorldListsJob::OnVjobsShutdown() { } //-------------------------------------------------------------------------------------------------- // PPU calls in here to build on SPU //-------------------------------------------------------------------------------------------------- int gSPUBreak = 0; extern Vector modelorg; extern bool g_bViewerInSolidSpace; extern int r_visframecount; extern CUtlVector< Frustum_t, CUtlMemoryAligned< Frustum_t,16 > > g_AreaFrustum; extern unsigned char g_RenderAreaBits[32]; extern Frustum_t g_Frustum; #define GET_OFFSET(type, field) ((uint32)&(((type *)0)->field)) void CPS3BuildWorldListsJob::BuildWorldLists_SPU( job_buildworldlists::JobParams_t* pParam, job_buildworldlists::buildWorldListsDMAOut *pDMAOut, bool bDrawtopview, void *pEA_VolumeCuller, float *pOrthoCenter, float *pOrthoHalfDi, bool bTopViewNoBackfaceCulling, bool bTopViewNoVisCheck, bool bShadowDepth, void* pEA_Info, void *pEA_RenderListLeaves, int drawFlags, Frustum_t *pFrustum, Frustum_t *pAreaFrustum, unsigned char *pRenderAreaBits, int buildViewID ) { SNPROF("BuildWorldLists_SPU"); // Fill in remaining src Params, assume dma dst params already filled pParam->m_nDebugBreak = gSPUBreak; // which path pParam->m_bShadowDepth = bShadowDepth; pParam->m_bDrawTopView = bDrawtopview; pParam->m_bTopViewNoBackfaceCulling = bTopViewNoBackfaceCulling; pParam->m_bTopViewNoVisCheck = bTopViewNoVisCheck; pParam->m_eaVolumeCuller = uintp(pEA_VolumeCuller); if( !pEA_VolumeCuller ) { pParam->m_orthoCenter[0] = pOrthoCenter[0]; pParam->m_orthoCenter[1] = pOrthoCenter[1]; pParam->m_orthoHalfDi[0] = pOrthoHalfDi[0]; pParam->m_orthoHalfDi[1] = pOrthoHalfDi[1]; } pParam->m_eaWorldNodes = uintp(host_state.worldbrush->nodes); pParam->m_visframecount = r_visframecount; pParam->m_pSurfaces2 = uintp(host_state.worldbrush->surfaces2); pParam->m_pmarksurfaces = uintp(host_state.worldbrush->marksurfaces); pParam->m_pLeafs = uintp(host_state.worldbrush->leafs); pParam->m_pDispInfos = uintp(((CDispArray*)host_state.worldbrush->hDispInfos)->m_pDispInfos); pParam->m_eaDispInfoReferences = uintp(host_state.worldbrush->m_pDispInfoReferences); memcpy((void*)pParam->m_ModelOrg, &modelorg, sizeof(modelorg)); pParam->m_bViewerInSolidSpace = g_bViewerInSolidSpace; pParam->m_Disp_ParentSurfID_offset = GET_OFFSET(CDispInfo, m_ParentSurfID); pParam->m_Disp_BB_offset = GET_OFFSET(CDispInfo, m_BBoxMin); pParam->m_Disp_Info_Size = sizeof(CDispInfo); pParam->m_eaFrustum = uintp(pFrustum); pParam->m_eaAreaFrustum = uintp(pAreaFrustum); pParam->m_eaRenderAreaBits = uintp(pRenderAreaBits); pParam->m_nNumSortID = materials->GetNumSortIDs(); pParam->m_nMaxVisitSurfaces = host_state.worldbrush->numsurfaces; pParam->m_nAreaFrustum = g_AreaFrustum.Count(); pParam->m_eaInfo = uintp(pEA_Info); pParam->m_eaRenderListLeaves = uintp(pEA_RenderListLeaves); pParam->m_DrawFlags = drawFlags; pParam->m_buildViewID = buildViewID; pParam->m_eaDMAOut = uintp(pDMAOut); // hacky - careful - byte offset to size/Count() member of CUtlVector pParam->m_nUtlCountOffset = 12; //GET_OFFSET(CUtlVector, m_Size); // Push Job ConVarRef r_PS3_SPU_BuildWRLists_ImmediateSync("r_PS3_SPU_BuildWRLists_ImmediateSync"); if( r_PS3_SPU_BuildWRLists_ImmediateSync.GetInt() ) { CELL_VERIFY( m_pRoot->m_queuePortBuildWorld[ buildViewID ].pushJob( &g_buildWorldListsJobDescriptor[ buildViewID ].header, sizeof(g_buildWorldListsJobDescriptor[0]), 0, CELL_SPURS_JOBQUEUE_FLAG_SYNC_JOB ) ); CELL_VERIFY( m_pRoot->m_queuePortBuildWorld[ buildViewID ].sync(0) ); } else { int syncTag = 1 + buildViewID; CELL_VERIFY( m_pRoot->m_queuePortBuildWorld[ buildViewID ].pushJob( &g_buildWorldListsJobDescriptor[ buildViewID ].header, sizeof(g_buildWorldListsJobDescriptor[0]), syncTag, CELL_SPURS_JOBQUEUE_FLAG_SYNC_JOB ) ); //Msg("pushJob World(%d) SyncTag(%d)\n", buildViewID, syncTag ); } }