//========= Copyright 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "stdafx.h" // NOTE: This must be the last file included!!! #include "tier0/memdbgon.h" using namespace SF::GFx; using namespace SF::Render; void ScaleformUIImpl::InitRendererImpl( void ) { if ( m_pShaderDeviceMgr ) { m_pDeviceCallbacks = new DeviceCallbacks(); m_pDeviceCallbacks->m_pScaleform = this; m_pShaderDeviceMgr->AddDeviceDependentObject( m_pDeviceCallbacks ); } m_iScreenHeight = 768; m_iScreenWidth = 1024; } void ScaleformUIImpl::ShutdownRendererImpl( void ) { if ( m_pShaderDeviceMgr ) { if ( m_pDeviceCallbacks ) { m_pShaderDeviceMgr->RemoveDeviceDependentObject( m_pDeviceCallbacks ); delete m_pDeviceCallbacks; m_pDeviceCallbacks = NULL; } } #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) if ( m_pD3D9Stateblock ) { m_pD3D9Stateblock->Release(); m_pD3D9Stateblock = NULL; } #endif if ( m_pRenderHAL ) { m_pRenderHAL->ShutdownHAL(); m_pRenderer2D.Clear(); m_pRenderHAL.Clear(); } } void ScaleformUIImpl::SaveRenderingState( void ) { #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) if ( m_pD3D9Stateblock ) { m_pD3D9Stateblock->Capture(); } // SF does not touch SRGB settings so make sure they are consistent m_pDevice->GetRenderState( D3DRS_SRGBWRITEENABLE, &m_srgbRenderState ); m_pDevice->SetRenderState( D3DRS_SRGBWRITEENABLE, FALSE ); for ( int i = 0; i < 16; i++ ) { m_pDevice->GetSamplerState( i, D3DSAMP_SRGBTEXTURE, &m_pSavedSrgbSamplerStates[i] ); m_pDevice->SetSamplerState( i, D3DSAMP_SRGBTEXTURE, FALSE ); } #elif defined( DX_TO_GL_ABSTRACTION ) if (m_pDevice) { m_pDevice->SaveGLState(); } #endif } void ScaleformUIImpl::RestoreRenderingState( void ) { #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) if ( m_pD3D9Stateblock ) { m_pD3D9Stateblock->Apply(); } // Restore srgb render and sampler states // (Looks like state block capture/apply didn't work, should investigate at a later state) m_pDevice->SetRenderState( D3DRS_SRGBWRITEENABLE, m_srgbRenderState ); for ( int i = 0; i < 16; i++ ) { m_pDevice->SetSamplerState( i, D3DSAMP_SRGBTEXTURE, m_pSavedSrgbSamplerStates[i] ); } #elif defined( DX_TO_GL_ABSTRACTION ) if (m_pDevice) { m_pDevice->RestoreGLState(); } #endif } void ScaleformUIImpl::SetRenderingDevice( IDirect3DDevice9 *pDevice, D3DPRESENT_PARAMETERS *pPresentParameters, HWND hWnd ) { #if defined(DX_TO_GL_ABSTRACTION) if ( !m_pThreadCommandQueue ) { m_pThreadCommandQueue = new CScaleFormThreadCommandQueue; } #endif if ( !m_pRenderHAL ) { // This is startup initialisation m_pDevice = pDevice; #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) m_pRenderHAL = *new D3D9::HAL(); m_pRenderHAL->InitHAL( D3D9::HALInitParams( m_pDevice, *pPresentParameters, D3D9::HALConfig_NoSceneCalls ) ); #else m_pRenderHAL = *new GL::HAL( m_pThreadCommandQueue ); m_pRenderHAL->InitHAL( GL::HALInitParams( GL::HALConfig_DisableBinaryShaders | GL::HALConfig_DisableShaderPipelines, SF::ThreadId(), SF::String(), true ) ); if ( m_pThreadCommandQueue ) { m_pThreadCommandQueue->pHAL = m_pRenderHAL; } #endif Assert ( !m_pRenderer2D ); m_pRenderer2D = *new Renderer2D( m_pRenderHAL.GetPtr() ); if ( m_pThreadCommandQueue ) { m_pThreadCommandQueue->pR2D = m_pRenderer2D; } InitFonts(); SF::Ptr pImageCreator = *new CScaleformImageCreator( this, (TextureManager*)m_pRenderHAL->GetTextureManager() ); m_pLoader->SetImageCreator( pImageCreator ); } else { #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) m_pRenderHAL->RestoreAfterReset(); #else m_pRenderHAL->ResetContext(); #endif } #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) pDevice->CreateStateBlock( D3DSBT_ALL, &m_pD3D9Stateblock ); #endif #if defined( SF_ENABLE_IME ) && defined( SF_ENABLE_IME_WIN32 ) if ( !m_pIMEManager ) { m_pIMEManager = *new ScaleformeUIIMEManager( hWnd, m_pGameEventManager ); if ( m_pIMEManager ) { m_pIMEManager->Init( m_pLoader->GetLog(), static_cast(m_pLoader->GetFileOpener().GetPtr()), NULL, false ); m_pIMEManager->SetIMEMoviePath( "ime.swf" ); m_pLoader->SetIMEManager( m_pIMEManager ); m_pIMEManager->EnableIME( m_bIMEEnabled ); } } #else NOTE_UNUSED( hWnd ); #endif D3DVIEWPORT9 viewport; pDevice->GetViewport( &viewport ); m_iScreenWidth = viewport.Width; m_iScreenHeight = viewport.Height; SetScreenSize( m_iScreenWidth, m_iScreenHeight ); } void ScaleformUIImpl::NotifyRenderingDeviceLost( void ) { #if defined( WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) if ( !m_pRenderHAL ) return; m_pRenderHAL->PrepareForReset(); m_pD3D9Stateblock->Release(); m_pD3D9Stateblock = NULL; #endif } #if defined( _WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) void DumpMeshBufferSetStats( D3D9::MeshBufferSet *pMBSet ) { int totalMem = 0; for ( int i = 0; i < MC_NUM_BUFFER_BUCKETS; i++ ) { D3D9::MeshBufferBucket *pBucket = &pMBSet->m_buckets[i]; Msg("Bucket %2d: created = %3d, free = %3d, total = %6d bytes (%4d KB)\n", i, pBucket->m_numCreated, pBucket->m_numFree, pBucket->m_totalMemUsed, pBucket->m_totalMemUsed / 1024 ); totalMem += pBucket->m_totalMemUsed; } Msg( "Total = %d KB\n", totalMem/1024 ); } #endif void ScaleformUIImpl::DumpMeshCacheStats( void ) { #if defined( _WIN32 ) && !defined( DX_TO_GL_ABSTRACTION ) if ( !m_pRenderHAL ) { Msg( "No renderer, no HAL, no stats.\n" ); return; } D3D9::MeshCache *mc = &m_pRenderHAL->GetMeshCache(); // Log stats Msg( "SF MeshBufferSet, VB mem summary\n" ); DumpMeshBufferSetStats( &mc->VertexBuffers ); Msg( "SF MeshBufferSet, IB mem summary\n" ); DumpMeshBufferSetStats( &mc->IndexBuffers ); #endif }