| 979 | } |
| 980 | |
| 981 | bool TriTextureRes::CreateEmptyTexture( uint32_t width, uint32_t height, uint32_t mipCount, Tr2RenderContextEnum::PixelFormat format ) |
| 982 | { |
| 983 | USE_MAIN_THREAD_RENDER_CONTEXT(); |
| 984 | |
| 985 | if( !width || !height ) |
| 986 | { |
| 987 | return false; |
| 988 | } |
| 989 | |
| 990 | DestroyOwnTexture(); |
| 991 | |
| 992 | Tr2BitmapDimensions bmp( width, height, mipCount, format ); |
| 993 | |
| 994 | auto trueMipLevelCount = bmp.GetTrueMipCount(); |
| 995 | unsigned memoryUse = 0; |
| 996 | |
| 997 | std::vector<uint8_t> empty; |
| 998 | empty.resize( bmp.GetMipSize( 0 ), 0 ); |
| 999 | |
| 1000 | std::vector<Tr2SubresourceData> initData( trueMipLevelCount ); |
| 1001 | |
| 1002 | for( unsigned i = 0; i != trueMipLevelCount; ++i ) |
| 1003 | { |
| 1004 | Tr2SubresourceData& srd = initData[i]; |
| 1005 | srd.m_sysMem = empty.data(); |
| 1006 | srd.m_sysMemSlicePitch = bmp.GetMipSize( i ); |
| 1007 | srd.m_sysMemPitch = bmp.GetMipPitch( i ); |
| 1008 | memoryUse += srd.m_sysMemSlicePitch; |
| 1009 | } |
| 1010 | |
| 1011 | CR_RETURN_VAL( m_ownTexture.Create( |
| 1012 | bmp, |
| 1013 | Tr2GpuUsage::SHADER_RESOURCE, |
| 1014 | Tr2CpuUsage::READ | Tr2CpuUsage::WRITE, |
| 1015 | initData.data(), |
| 1016 | renderContext ), |
| 1017 | false ); |
| 1018 | |
| 1019 | *static_cast<Tr2BitmapDimensions*>( this ) = m_ownTexture.GetDesc(); |
| 1020 | |
| 1021 | m_memoryUse = memoryUse; |
| 1022 | m_originalMemoryUse = memoryUse; |
| 1023 | |
| 1024 | CCP_STATS_ADD( textureResBytes, m_memoryUse ); |
| 1025 | SetTexture( m_ownTexture ); |
| 1026 | SetPrepared( true ); |
| 1027 | SetGood( true ); |
| 1028 | return true; |
| 1029 | } |
| 1030 | |
| 1031 | BlueStdResult TriTextureRes::CreateFromTexture( TriTextureRes* texture ) |
| 1032 | { |
nothing calls this directly
no test coverage detected