@ -130,10 +130,7 @@ StagingBufferRef StagingBufferPool::Request(size_t size, MemoryUsage usage) {
if ( usage = = MemoryUsage : : Upload & & size < = MAX_STREAM_BUFFER_REQUEST_SIZE ) {
return GetStreamBuffer ( size ) ;
}
if ( const std : : optional < StagingBufferRef > ref = TryGetReservedBuffer ( size , usage ) ) {
return * ref ;
}
return CreateStagingBuffer ( size , usage ) ;
return GetStagingBuffer ( size , usage ) ;
}
void StagingBufferPool : : TickFrame ( ) {
@ -145,17 +142,20 @@ void StagingBufferPool::TickFrame() {
}
StagingBufferRef StagingBufferPool : : GetStreamBuffer ( size_t size ) {
for ( size_t region = Region ( free_iterator ) + 1 ,
region_end = std : : min ( Region ( iterator + size ) + 1 , NUM_SYNCS ) ;
region < region_end ; + + region ) {
// If we'd have to wait, get a staging buffer to avoid waiting
if ( ! scheduler . IsFree ( sync_ticks [ region ] ) ) {
return GetStagingBuffer ( size , MemoryUsage : : Upload ) ;
}
}
for ( size_t region = Region ( used_iterator ) , region_end = Region ( iterator ) ; region < region_end ;
+ + region ) {
sync_ticks [ region ] = scheduler . CurrentTick ( ) ;
}
used_iterator = iterator ;
for ( size_t region = Region ( free_iterator ) + 1 ,
region_end = std : : min ( Region ( iterator + size ) + 1 , NUM_SYNCS ) ;
region < region_end ; + + region ) {
scheduler . Wait ( sync_ticks [ region ] ) ;
}
if ( iterator + size > free_iterator ) {
free_iterator = iterator + size ;
}
@ -180,6 +180,13 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) {
} ;
}
StagingBufferRef StagingBufferPool : : GetStagingBuffer ( size_t size , MemoryUsage usage ) {
if ( const std : : optional < StagingBufferRef > ref = TryGetReservedBuffer ( size , usage ) ) {
return * ref ;
}
return CreateStagingBuffer ( size , usage ) ;
}
std : : optional < StagingBufferRef > StagingBufferPool : : TryGetReservedBuffer ( size_t size ,
MemoryUsage usage ) {
StagingBuffers & cache_level = GetCache ( usage ) [ Common : : Log2Ceil64 ( size ) ] ;