Portal and high update count fixes
This commit is contained in:
parent
8bf31755df
commit
2c069349a3
9 changed files with 51 additions and 23 deletions
|
|
@ -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++)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue