| 367 | |
| 368 | |
| 369 | EveInstancedMeshManager::InstanceBuffer::Allocation EveInstancedMeshManager::InstanceBuffer::Allocate( uint32_t count ) |
| 370 | { |
| 371 | USE_MAIN_THREAD_RENDER_CONTEXT(); |
| 372 | |
| 373 | auto frameNumber = renderContext.GetRecordingFrameNumber(); |
| 374 | |
| 375 | auto offset = GetUnusedRegion( count ); |
| 376 | if( !offset.has_value() ) |
| 377 | { |
| 378 | if( mappedData ) |
| 379 | { |
| 380 | mappedRetiredBuffers.push_back( buffer.get() ); |
| 381 | mappedData = nullptr; |
| 382 | } |
| 383 | auto oldCount = buffer ? buffer->GetDesc().count : 0; |
| 384 | retiredBuffers.push_back( std::move( buffer ) ); |
| 385 | buffer = std::make_unique<Tr2BufferAL>(); |
| 386 | uint32_t newCount = std::max( count, oldCount ? oldCount * 2 : 128 * 1024 ); |
| 387 | buffer->Create( 4, newCount, Tr2GpuUsage::VERTEX_BUFFER, Tr2CpuUsage::WRITE_OFTEN | Tr2CpuUsage::NON_SYNCRONIZED_WRITE, nullptr, renderContext ); |
| 388 | regions.clear(); |
| 389 | offset = 0; |
| 390 | } |
| 391 | |
| 392 | buffer->MapForWriting( mappedData, renderContext ); |
| 393 | |
| 394 | if( !regions.empty() && regions.back().recordedFrame == frameNumber && regions.back().offset + regions.back().length == offset ) |
| 395 | { |
| 396 | regions.back().length += count; |
| 397 | } |
| 398 | else |
| 399 | { |
| 400 | regions.push_back( { offset.value(), count, frameNumber } ); |
| 401 | } |
| 402 | return { buffer.get(), mappedData + offset.value(), offset.value() }; |
| 403 | } |
| 404 | |
| 405 | std::optional<uint32_t> EveInstancedMeshManager::InstanceBuffer::GetUnusedRegion( uint32_t count ) |
| 406 | { |
no test coverage detected