- centralize how image transitions are done in the vulkan backend
This commit is contained in:
parent
99f58855ad
commit
9ab19d057d
12 changed files with 385 additions and 420 deletions
|
|
@ -71,39 +71,32 @@ void VkRenderBuffers::CreatePipeline(int width, int height)
|
|||
for (int i = 0; i < NumPipelineImages; i++)
|
||||
{
|
||||
PipelineImage[i].reset();
|
||||
PipelineView[i].reset();
|
||||
}
|
||||
|
||||
PipelineBarrier barrier;
|
||||
VkImageTransition barrier;
|
||||
for (int i = 0; i < NumPipelineImages; i++)
|
||||
{
|
||||
ImageBuilder builder;
|
||||
builder.setSize(width, height);
|
||||
builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT);
|
||||
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
|
||||
PipelineImage[i] = builder.create(fb->device);
|
||||
PipelineImage[i]->SetDebugName("VkRenderBuffers.PipelineImage");
|
||||
PipelineImage[i].Image = builder.create(fb->device);
|
||||
PipelineImage[i].Image->SetDebugName("VkRenderBuffers.PipelineImage");
|
||||
|
||||
ImageViewBuilder viewbuilder;
|
||||
viewbuilder.setImage(PipelineImage[i].get(), VK_FORMAT_R16G16B16A16_SFLOAT);
|
||||
PipelineView[i] = viewbuilder.create(fb->device);
|
||||
PipelineView[i]->SetDebugName("VkRenderBuffers.PipelineView");
|
||||
viewbuilder.setImage(PipelineImage[i].Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT);
|
||||
PipelineImage[i].View = viewbuilder.create(fb->device);
|
||||
PipelineImage[i].View->SetDebugName("VkRenderBuffers.PipelineView");
|
||||
|
||||
barrier.addImage(PipelineImage[i].get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
|
||||
PipelineLayout[i] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
barrier.addImage(&PipelineImage[i], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true);
|
||||
}
|
||||
barrier.execute(fb->GetDrawCommands(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
|
||||
barrier.execute(fb->GetDrawCommands());
|
||||
}
|
||||
|
||||
void VkRenderBuffers::CreateScene(int width, int height, VkSampleCountFlagBits samples)
|
||||
{
|
||||
auto fb = GetVulkanFrameBuffer();
|
||||
|
||||
SceneColorView.reset();
|
||||
SceneDepthStencilView.reset();
|
||||
SceneDepthView.reset();
|
||||
SceneNormalView.reset();
|
||||
SceneFogView.reset();
|
||||
SceneColor.reset();
|
||||
SceneDepthStencil.reset();
|
||||
SceneNormal.reset();
|
||||
|
|
@ -114,14 +107,12 @@ void VkRenderBuffers::CreateScene(int width, int height, VkSampleCountFlagBits s
|
|||
CreateSceneNormal(width, height, samples);
|
||||
CreateSceneFog(width, height, samples);
|
||||
|
||||
PipelineBarrier barrier;
|
||||
barrier.addImage(SceneColor.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
|
||||
barrier.addImage(SceneDepthStencil.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
barrier.addImage(SceneNormal.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
|
||||
barrier.addImage(SceneFog.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
|
||||
barrier.execute(fb->GetDrawCommands(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
|
||||
|
||||
SceneColorLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
VkImageTransition barrier;
|
||||
barrier.addImage(&SceneColor, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true);
|
||||
barrier.addImage(&SceneDepthStencil, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, true);
|
||||
barrier.addImage(&SceneNormal, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true);
|
||||
barrier.addImage(&SceneFog, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true);
|
||||
barrier.execute(fb->GetDrawCommands());
|
||||
}
|
||||
|
||||
void VkRenderBuffers::CreateSceneColor(int width, int height, VkSampleCountFlagBits samples)
|
||||
|
|
@ -133,13 +124,13 @@ void VkRenderBuffers::CreateSceneColor(int width, int height, VkSampleCountFlagB
|
|||
builder.setSamples(samples);
|
||||
builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT);
|
||||
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
|
||||
SceneColor = builder.create(fb->device);
|
||||
SceneColor->SetDebugName("VkRenderBuffers.SceneColor");
|
||||
SceneColor.Image = builder.create(fb->device);
|
||||
SceneColor.Image->SetDebugName("VkRenderBuffers.SceneColor");
|
||||
|
||||
ImageViewBuilder viewbuilder;
|
||||
viewbuilder.setImage(SceneColor.get(), VK_FORMAT_R16G16B16A16_SFLOAT);
|
||||
SceneColorView = viewbuilder.create(fb->device);
|
||||
SceneColorView->SetDebugName("VkRenderBuffers.SceneColorView");
|
||||
viewbuilder.setImage(SceneColor.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT);
|
||||
SceneColor.View = viewbuilder.create(fb->device);
|
||||
SceneColor.View->SetDebugName("VkRenderBuffers.SceneColorView");
|
||||
}
|
||||
|
||||
void VkRenderBuffers::CreateSceneDepthStencil(int width, int height, VkSampleCountFlagBits samples)
|
||||
|
|
@ -160,17 +151,18 @@ void VkRenderBuffers::CreateSceneDepthStencil(int width, int height, VkSampleCou
|
|||
I_FatalError("This device does not support any of the required depth stencil image formats.");
|
||||
}
|
||||
}
|
||||
SceneDepthStencil = builder.create(fb->device);
|
||||
SceneDepthStencil->SetDebugName("VkRenderBuffers.SceneDepthStencil");
|
||||
SceneDepthStencil.Image = builder.create(fb->device);
|
||||
SceneDepthStencil.Image->SetDebugName("VkRenderBuffers.SceneDepthStencil");
|
||||
SceneDepthStencil.AspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
ImageViewBuilder viewbuilder;
|
||||
viewbuilder.setImage(SceneDepthStencil.get(), SceneDepthStencilFormat, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
SceneDepthStencilView = viewbuilder.create(fb->device);
|
||||
SceneDepthStencilView->SetDebugName("VkRenderBuffers.SceneDepthStencilView");
|
||||
viewbuilder.setImage(SceneDepthStencil.Image.get(), SceneDepthStencilFormat, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
SceneDepthStencil.View = viewbuilder.create(fb->device);
|
||||
SceneDepthStencil.View->SetDebugName("VkRenderBuffers.SceneDepthStencilView");
|
||||
|
||||
viewbuilder.setImage(SceneDepthStencil.get(), SceneDepthStencilFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
|
||||
SceneDepthView = viewbuilder.create(fb->device);
|
||||
SceneDepthView->SetDebugName("VkRenderBuffers.SceneDepthView");
|
||||
viewbuilder.setImage(SceneDepthStencil.Image.get(), SceneDepthStencilFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
|
||||
SceneDepthStencil.DepthOnlyView = viewbuilder.create(fb->device);
|
||||
SceneDepthStencil.DepthOnlyView->SetDebugName("VkRenderBuffers.SceneDepthView");
|
||||
}
|
||||
|
||||
void VkRenderBuffers::CreateSceneFog(int width, int height, VkSampleCountFlagBits samples)
|
||||
|
|
@ -182,13 +174,13 @@ void VkRenderBuffers::CreateSceneFog(int width, int height, VkSampleCountFlagBit
|
|||
builder.setSamples(samples);
|
||||
builder.setFormat(VK_FORMAT_R8G8B8A8_UNORM);
|
||||
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
|
||||
SceneFog = builder.create(fb->device);
|
||||
SceneFog->SetDebugName("VkRenderBuffers.SceneFog");
|
||||
SceneFog.Image = builder.create(fb->device);
|
||||
SceneFog.Image->SetDebugName("VkRenderBuffers.SceneFog");
|
||||
|
||||
ImageViewBuilder viewbuilder;
|
||||
viewbuilder.setImage(SceneFog.get(), VK_FORMAT_R8G8B8A8_UNORM);
|
||||
SceneFogView = viewbuilder.create(fb->device);
|
||||
SceneFogView->SetDebugName("VkRenderBuffers.SceneFogView");
|
||||
viewbuilder.setImage(SceneFog.Image.get(), VK_FORMAT_R8G8B8A8_UNORM);
|
||||
SceneFog.View = viewbuilder.create(fb->device);
|
||||
SceneFog.View->SetDebugName("VkRenderBuffers.SceneFogView");
|
||||
}
|
||||
|
||||
void VkRenderBuffers::CreateSceneNormal(int width, int height, VkSampleCountFlagBits samples)
|
||||
|
|
@ -200,22 +192,21 @@ void VkRenderBuffers::CreateSceneNormal(int width, int height, VkSampleCountFlag
|
|||
builder.setSamples(samples);
|
||||
builder.setFormat(VK_FORMAT_A2R10G10B10_UNORM_PACK32);
|
||||
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
|
||||
SceneNormal = builder.create(fb->device);
|
||||
SceneNormal->SetDebugName("VkRenderBuffers.SceneNormal");
|
||||
SceneNormal.Image = builder.create(fb->device);
|
||||
SceneNormal.Image->SetDebugName("VkRenderBuffers.SceneNormal");
|
||||
|
||||
ImageViewBuilder viewbuilder;
|
||||
viewbuilder.setImage(SceneNormal.get(), VK_FORMAT_A2R10G10B10_UNORM_PACK32);
|
||||
SceneNormalView = viewbuilder.create(fb->device);
|
||||
SceneNormalView->SetDebugName("VkRenderBuffers.SceneNormalView");
|
||||
viewbuilder.setImage(SceneNormal.Image.get(), VK_FORMAT_A2R10G10B10_UNORM_PACK32);
|
||||
SceneNormal.View = viewbuilder.create(fb->device);
|
||||
SceneNormal.View->SetDebugName("VkRenderBuffers.SceneNormalView");
|
||||
}
|
||||
|
||||
void VkRenderBuffers::CreateShadowmap()
|
||||
{
|
||||
if (Shadowmap && Shadowmap->width == gl_shadowmap_quality)
|
||||
if (Shadowmap.Image && Shadowmap.Image->width == gl_shadowmap_quality)
|
||||
return;
|
||||
|
||||
Shadowmap.reset();
|
||||
ShadowmapView.reset();
|
||||
|
||||
auto fb = GetVulkanFrameBuffer();
|
||||
|
||||
|
|
@ -223,17 +214,17 @@ void VkRenderBuffers::CreateShadowmap()
|
|||
builder.setSize(gl_shadowmap_quality, 1024);
|
||||
builder.setFormat(VK_FORMAT_R32_SFLOAT);
|
||||
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
|
||||
Shadowmap = builder.create(fb->device);
|
||||
Shadowmap->SetDebugName("VkRenderBuffers.Shadowmap");
|
||||
Shadowmap.Image = builder.create(fb->device);
|
||||
Shadowmap.Image->SetDebugName("VkRenderBuffers.Shadowmap");
|
||||
|
||||
ImageViewBuilder viewbuilder;
|
||||
viewbuilder.setImage(Shadowmap.get(), VK_FORMAT_R32_SFLOAT);
|
||||
ShadowmapView = viewbuilder.create(fb->device);
|
||||
ShadowmapView->SetDebugName("VkRenderBuffers.ShadowmapView");
|
||||
viewbuilder.setImage(Shadowmap.Image.get(), VK_FORMAT_R32_SFLOAT);
|
||||
Shadowmap.View = viewbuilder.create(fb->device);
|
||||
Shadowmap.View->SetDebugName("VkRenderBuffers.ShadowmapView");
|
||||
|
||||
PipelineBarrier barrier;
|
||||
barrier.addImage(Shadowmap.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0, VK_ACCESS_SHADER_READ_BIT);
|
||||
barrier.execute(fb->GetDrawCommands(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
|
||||
VkImageTransition barrier;
|
||||
barrier.addImage(&Shadowmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true);
|
||||
barrier.execute(fb->GetDrawCommands());
|
||||
|
||||
if (!ShadowmapSampler)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue