| 1972 | } |
| 1973 | |
| 1974 | Tr2Sprite2dDisplayList* Tr2Sprite2dScene::EndCapture( Tr2Sprite2dDisplayList* previousDisplayList ) |
| 1975 | { |
| 1976 | CCP_STATS_ZONE( __FUNCTION__ ); |
| 1977 | |
| 1978 | CCP_ASSERT( m_captureDisplayList ); |
| 1979 | if( !m_captureDisplayList ) |
| 1980 | { |
| 1981 | return nullptr; |
| 1982 | } |
| 1983 | |
| 1984 | IssueDrawCall(); |
| 1985 | |
| 1986 | HRESULT hr; |
| 1987 | |
| 1988 | USE_MAIN_THREAD_RENDER_CONTEXT(); |
| 1989 | |
| 1990 | // Create a vertex buffer for capturing upcoming vertices. This is a static vertex buffer, |
| 1991 | // even though it may be short-lived. Filling a vertex buffer in the managed pool is faster |
| 1992 | // than if it were in the default pool so we use the managed pool. |
| 1993 | |
| 1994 | unsigned int vbSize = m_captureVertexDataSize * sizeof( Tr2Sprite2dD3DVertex ); |
| 1995 | unsigned int ibSize = m_captureIndexDataSize * sizeof( unsigned int ); |
| 1996 | |
| 1997 | if( !vbSize || !ibSize ) |
| 1998 | { |
| 1999 | ResetCapture(); |
| 2000 | return nullptr; |
| 2001 | } |
| 2002 | |
| 2003 | { |
| 2004 | bool reusedVb = false; |
| 2005 | if( previousDisplayList && previousDisplayList->vertexBuffer.IsValid() && |
| 2006 | previousDisplayList->vertexBuffer.GetSize() >= vbSize && previousDisplayList->vertexBuffer.GetSize() / 2 <= vbSize ) |
| 2007 | { |
| 2008 | if( SUCCEEDED( previousDisplayList->vertexBuffer.UpdateBuffer( 0, vbSize, m_captureVertexData.get(), renderContext ) ) ) |
| 2009 | { |
| 2010 | m_captureDisplayList->vertexBuffer = previousDisplayList->vertexBuffer; |
| 2011 | previousDisplayList->vertexBuffer = Tr2BufferAL(); |
| 2012 | reusedVb = true; |
| 2013 | } |
| 2014 | } |
| 2015 | if( !reusedVb ) |
| 2016 | { |
| 2017 | vbSize = std::min( m_captureVertexDataCapacity, m_captureVertexDataSize + m_captureVertexDataSize / 4 ) * sizeof( Tr2Sprite2dD3DVertex ); |
| 2018 | hr = m_captureDisplayList->vertexBuffer.Create( 1, vbSize, Tr2GpuUsage::VERTEX_BUFFER, Tr2CpuUsage::WRITE, m_captureVertexData.get(), renderContext ); |
| 2019 | if( FAILED( hr ) ) |
| 2020 | { |
| 2021 | CCP_LOGERR( "%s failed (%d) to create vertex buffer for %d vertices (%d KiB)", __FUNCTION__, hr, m_captureVertexDataSize, vbSize / 1024 ); |
| 2022 | ResetCapture(); |
| 2023 | return nullptr; |
| 2024 | } |
| 2025 | else |
| 2026 | { |
| 2027 | CCP_STATS_ADD( displayListVertexBufferSize, vbSize ); |
| 2028 | m_captureDisplayList->vertexBuffer.SetName( "UI Captured Vertex Buffer" ); |
| 2029 | } |
| 2030 | } |
| 2031 | } |
no test coverage detected