csgo-2018-source/engine/buildworldlists_PS3.cpp
2021-07-24 21:11:47 -07:00

174 lines
6.1 KiB
C++

//================ 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<int>, 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 );
}
}