Portal and high update count fixes

This commit is contained in:
Magnus Norddahl 2025-05-12 00:39:41 +02:00
commit 2c069349a3
9 changed files with 51 additions and 23 deletions

View file

@ -85,6 +85,7 @@ void VkLightmapper::SetLevelMesh(LevelMesh* level)
void VkLightmapper::BeginFrame()
{
drawindexed.Pos = 0;
copytiles.Pos = 0;
}
void VkLightmapper::Raytrace(const TArray<LightmapTile*>& tiles)
@ -97,6 +98,7 @@ void VkLightmapper::Raytrace(const TArray<LightmapTile*>& tiles)
fb->GetCommands()->PushGroup(fb->GetCommands()->GetTransferCommands(), "lightmap.total");
UploadUniforms();
bool firstCall = true;
while (true)
{
SelectTiles(tiles);
@ -108,6 +110,15 @@ void VkLightmapper::Raytrace(const TArray<LightmapTile*>& tiles)
if (lm_blur)
Blur();
CopyResult();
if (drawindexed.Pos == drawindexed.BufferSize || copytiles.Pos == drawindexed.BufferSize)
{
fb->GetCommands()->PopGroup(fb->GetCommands()->GetTransferCommands());
fb->WaitForCommands(false);
fb->GetCommands()->PushGroup(fb->GetCommands()->GetTransferCommands(), "lightmap.total");
drawindexed.Pos = 0;
copytiles.Pos = 0;
}
}
fb->GetCommands()->PopGroup(fb->GetCommands()->GetTransferCommands());
@ -159,6 +170,10 @@ void VkLightmapper::Render()
fb->GetCommands()->PushGroup(cmdbuffer, "lightmap.raytrace");
PipelineBarrier()
.AddImage(bakeImage.raytrace.Image.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
.Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
RenderPassBegin()
.RenderPass(raytrace.renderPass.get())
.RenderArea(0, 0, bakeImage.maxX, bakeImage.maxY)
@ -180,6 +195,8 @@ void VkLightmapper::Render()
viewport.height = (float)bakeImageSize;
cmdbuffer->setViewport(0, 1, &viewport);
int startPos = drawindexed.Pos;
for (int i = 0, count = selectedTiles.Size(); i < count; i++)
{
auto& selectedTile = selectedTiles[i];
@ -237,7 +254,7 @@ void VkLightmapper::Render()
selectedTile.Rendered = true;
}
cmdbuffer->drawIndexedIndirect(drawindexed.CommandsBuffer->buffer, 0, drawindexed.Pos, sizeof(VkDrawIndexedIndirectCommand));
cmdbuffer->drawIndexedIndirect(drawindexed.CommandsBuffer->buffer, startPos * sizeof(VkDrawIndexedIndirectCommand), drawindexed.Pos - startPos, sizeof(VkDrawIndexedIndirectCommand));
cmdbuffer->endRenderPass();
@ -270,7 +287,8 @@ void VkLightmapper::Resolve()
PipelineBarrier()
.AddImage(bakeImage.raytrace.Image.get(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT)
.Execute(cmdbuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
.AddImage(bakeImage.resolve.Image.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
.Execute(cmdbuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
RenderPassBegin()
.RenderPass(resolve.renderPass.get())
@ -400,8 +418,8 @@ void VkLightmapper::CopyResult()
barrier0.Execute(cmdbuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
// Copy into the lightmap images
int start = 0;
int pos = 0;
int start = copytiles.Pos;
int pos = copytiles.Pos;
for (unsigned int i = 0, count = copylists.Size(); i < count; i++)
{
auto& list = copylists[i];
@ -477,6 +495,8 @@ void VkLightmapper::CopyResult()
cmdbuffer->endRenderPass();
}
copytiles.Pos = pos;
// Transition lightmap destination images back to be used for fragment shader sampling
PipelineBarrier barrier1;
for (unsigned int i = 0, count = copylists.Size(); i < count; i++)