Batch GPU uploads to eliminate per-upload fence waits (stutter fix)

Every uploadBuffer/VkTexture::upload called immediateSubmit which did a
separate vkQueueSubmit + vkWaitForFences. Loading a single creature model
with textures caused 4-8+ fence waits; terrain chunks caused 80+ per batch.

Added beginUploadBatch/endUploadBatch to VkContext: records all upload
commands into a single command buffer, submits once with one fence wait.
Staging buffers are deferred for cleanup after the batch completes.

Wrapped in batch mode:
- CharacterRenderer::loadModel (creature VB/IB + textures)
- M2Renderer::loadModel (doodad VB/IB + textures)
- TerrainRenderer::loadTerrain/loadTerrainIncremental (chunk geometry + textures)
- TerrainRenderer::uploadPreloadedTextures
- WMORenderer::loadModel (group geometry + textures)
This commit is contained in:
Kelsi 2026-03-07 12:19:59 -08:00
parent 884b72bc1c
commit 16b4336700
8 changed files with 97 additions and 4 deletions

View file

@ -198,8 +198,12 @@ AllocatedBuffer uploadBuffer(VkContext& ctx, const void* data, VkDeviceSize size
vkCmdCopyBuffer(cmd, staging.buffer, gpuBuffer.buffer, 1, &copyRegion);
});
// Destroy staging buffer
destroyBuffer(ctx.getAllocator(), staging);
// Destroy staging buffer (deferred if in batch mode)
if (ctx.isInUploadBatch()) {
ctx.deferStagingCleanup(staging);
} else {
destroyBuffer(ctx.getAllocator(), staging);
}
return gpuBuffer;
}