Archived
1
Fork 0

Properly transition image layouts

This commit is contained in:
Joshua Goins 2018-11-06 13:47:33 -05:00
parent 0c970b0236
commit 7bdda6d1fa
4 changed files with 51 additions and 21 deletions

View file

@ -113,12 +113,12 @@ void DoFPass::createDescriptorSet(RenderTarget* target) {
bokehImageInfo.sampler = bokehSampler_; bokehImageInfo.sampler = bokehSampler_;
VkDescriptorImageInfo sceneImageInfo = {}; VkDescriptorImageInfo sceneImageInfo = {};
sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
sceneImageInfo.imageView = target->offscreenColorImageViews[i]; sceneImageInfo.imageView = target->offscreenColorImageViews[i];
sceneImageInfo.sampler = bokehSampler_; sceneImageInfo.sampler = bokehSampler_;
VkDescriptorImageInfo depthImageInfo = {}; VkDescriptorImageInfo depthImageInfo = {};
depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;; depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;;
depthImageInfo.imageView = target->offscreenDepthImageViews[i]; depthImageInfo.imageView = target->offscreenDepthImageViews[i];
depthImageInfo.sampler = bokehSampler_; depthImageInfo.sampler = bokehSampler_;
@ -164,7 +164,7 @@ void DoFPass::createRenderPass() {
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; colorAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkAttachmentReference colorAttachmentRef = {}; VkAttachmentReference colorAttachmentRef = {};
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
@ -225,7 +225,7 @@ void DoFPass::createPipeline() {
vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;
vertShaderStageInfo.module = vertShaderModule; vertShaderStageInfo.module = vertShaderModule;
vertShaderStageInfo.pName = "main"; vertShaderStageInfo.pName = "main";
VkPipelineShaderStageCreateInfo fragShaderStageInfo = {}; VkPipelineShaderStageCreateInfo fragShaderStageInfo = {};
fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT;

View file

@ -45,22 +45,22 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
for(uint32_t i = 0; i < target->numImages; i++) { for(uint32_t i = 0; i < target->numImages; i++) {
VkDescriptorImageInfo sceneImageInfo = {}; VkDescriptorImageInfo sceneImageInfo = {};
sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
sceneImageInfo.imageView = target->offscreenColorImageViews[i]; sceneImageInfo.imageView = target->offscreenColorImageViews[i];
sceneImageInfo.sampler = offscreenSampler_; sceneImageInfo.sampler = offscreenSampler_;
VkDescriptorImageInfo depthImageInfo = {}; VkDescriptorImageInfo depthImageInfo = {};
depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;; depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;;
depthImageInfo.imageView = target->offscreenDepthImageViews[i]; depthImageInfo.imageView = target->offscreenDepthImageViews[i];
depthImageInfo.sampler = offscreenSampler_; depthImageInfo.sampler = offscreenSampler_;
VkDescriptorImageInfo nearFieldImageInfo = {}; VkDescriptorImageInfo nearFieldImageInfo = {};
nearFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; nearFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
nearFieldImageInfo.imageView = target->nearFieldImageViews[i]; nearFieldImageInfo.imageView = target->nearFieldImageViews[i];
nearFieldImageInfo.sampler = offscreenSampler_; nearFieldImageInfo.sampler = offscreenSampler_;
VkDescriptorImageInfo farFieldImageInfo = {}; VkDescriptorImageInfo farFieldImageInfo = {};
farFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; farFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
farFieldImageInfo.imageView = target->farFieldImageViews[i]; farFieldImageInfo.imageView = target->farFieldImageViews[i];
farFieldImageInfo.sampler = offscreenSampler_; farFieldImageInfo.sampler = offscreenSampler_;
@ -70,7 +70,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
sceneDescriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; sceneDescriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
sceneDescriptorWrite.dstSet = target->postSets[i]; sceneDescriptorWrite.dstSet = target->postSets[i];
sceneDescriptorWrite.pImageInfo = &sceneImageInfo; sceneDescriptorWrite.pImageInfo = &sceneImageInfo;
VkWriteDescriptorSet depthDescriptorWrite = {}; VkWriteDescriptorSet depthDescriptorWrite = {};
depthDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; depthDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
depthDescriptorWrite.descriptorCount = 1; depthDescriptorWrite.descriptorCount = 1;
@ -78,7 +78,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
depthDescriptorWrite.dstBinding = 1; depthDescriptorWrite.dstBinding = 1;
depthDescriptorWrite.dstSet = target->postSets[i]; depthDescriptorWrite.dstSet = target->postSets[i];
depthDescriptorWrite.pImageInfo = &depthImageInfo; depthDescriptorWrite.pImageInfo = &depthImageInfo;
VkWriteDescriptorSet nearFieldDescriptorWrite = {}; VkWriteDescriptorSet nearFieldDescriptorWrite = {};
nearFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; nearFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
nearFieldDescriptorWrite.descriptorCount = 1; nearFieldDescriptorWrite.descriptorCount = 1;
@ -86,7 +86,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
nearFieldDescriptorWrite.dstBinding = 2; nearFieldDescriptorWrite.dstBinding = 2;
nearFieldDescriptorWrite.dstSet = target->postSets[i]; nearFieldDescriptorWrite.dstSet = target->postSets[i];
nearFieldDescriptorWrite.pImageInfo = &nearFieldImageInfo; nearFieldDescriptorWrite.pImageInfo = &nearFieldImageInfo;
VkWriteDescriptorSet farFieldDescriptorWrite = {}; VkWriteDescriptorSet farFieldDescriptorWrite = {};
farFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; farFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
farFieldDescriptorWrite.descriptorCount = 1; farFieldDescriptorWrite.descriptorCount = 1;
@ -94,7 +94,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
farFieldDescriptorWrite.dstBinding = 3; farFieldDescriptorWrite.dstBinding = 3;
farFieldDescriptorWrite.dstSet = target->postSets[i]; farFieldDescriptorWrite.dstSet = target->postSets[i];
farFieldDescriptorWrite.pImageInfo = &farFieldImageInfo; farFieldDescriptorWrite.pImageInfo = &farFieldImageInfo;
const std::array<VkWriteDescriptorSet, 4> descriptorWrites = { const std::array<VkWriteDescriptorSet, 4> descriptorWrites = {
sceneDescriptorWrite, sceneDescriptorWrite,
depthDescriptorWrite, depthDescriptorWrite,
@ -111,7 +111,7 @@ void PostPass::createDescriptorSetLayout() {
offscreenSamplerBinding.descriptorCount = 1; offscreenSamplerBinding.descriptorCount = 1;
offscreenSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; offscreenSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
offscreenSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; offscreenSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
VkDescriptorSetLayoutBinding depthSamplerBinding = {}; VkDescriptorSetLayoutBinding depthSamplerBinding = {};
depthSamplerBinding.binding = 1; depthSamplerBinding.binding = 1;
depthSamplerBinding.descriptorCount = 1; depthSamplerBinding.descriptorCount = 1;
@ -123,20 +123,20 @@ void PostPass::createDescriptorSetLayout() {
nearFieldSamplerBinding.descriptorCount = 1; nearFieldSamplerBinding.descriptorCount = 1;
nearFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; nearFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
nearFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; nearFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
VkDescriptorSetLayoutBinding farFieldSamplerBinding = {}; VkDescriptorSetLayoutBinding farFieldSamplerBinding = {};
farFieldSamplerBinding.binding = 3; farFieldSamplerBinding.binding = 3;
farFieldSamplerBinding.descriptorCount = 1; farFieldSamplerBinding.descriptorCount = 1;
farFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; farFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
farFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; farFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
const std::array<VkDescriptorSetLayoutBinding, 4> bindings = { const std::array<VkDescriptorSetLayoutBinding, 4> bindings = {
offscreenSamplerBinding, offscreenSamplerBinding,
depthSamplerBinding, depthSamplerBinding,
nearFieldSamplerBinding, nearFieldSamplerBinding,
farFieldSamplerBinding farFieldSamplerBinding
}; };
VkDescriptorSetLayoutCreateInfo createInfo = {}; VkDescriptorSetLayoutCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
createInfo.bindingCount = bindings.size(); createInfo.bindingCount = bindings.size();

View file

@ -1283,12 +1283,23 @@ void Renderer::createPresentationRenderPass() {
subpass.colorAttachmentCount = 1; subpass.colorAttachmentCount = 1;
subpass.pColorAttachments = &colorAttachmentRef; subpass.pColorAttachments = &colorAttachmentRef;
std::array<VkSubpassDependency, 1> dependencies;
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
dependencies[0].dstSubpass = 0;
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
VkRenderPassCreateInfo renderPassInfo = {}; VkRenderPassCreateInfo renderPassInfo = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo.attachmentCount = 1; renderPassInfo.attachmentCount = 1;
renderPassInfo.pAttachments = &colorAttachment; renderPassInfo.pAttachments = &colorAttachment;
renderPassInfo.subpassCount = 1; renderPassInfo.subpassCount = 1;
renderPassInfo.pSubpasses = &subpass; renderPassInfo.pSubpasses = &subpass;
renderPassInfo.dependencyCount = dependencies.size();
renderPassInfo.pDependencies = dependencies.data();
vkCreateRenderPass(device_, &renderPassInfo, nullptr, &presentationRenderPass_); vkCreateRenderPass(device_, &renderPassInfo, nullptr, &presentationRenderPass_);
} }

View file

@ -93,7 +93,7 @@ void WorldPass::createRenderPass() {
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; colorAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkAttachmentDescription depthAttachment = {}; VkAttachmentDescription depthAttachment = {};
depthAttachment.format = VK_FORMAT_D32_SFLOAT; depthAttachment.format = VK_FORMAT_D32_SFLOAT;
@ -103,7 +103,7 @@ void WorldPass::createRenderPass() {
depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; depthAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkAttachmentReference colorAttachmentRef = {}; VkAttachmentReference colorAttachmentRef = {};
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
@ -123,12 +123,31 @@ void WorldPass::createRenderPass() {
depthAttachment depthAttachment
}; };
std::array<VkSubpassDependency, 2> dependencies;
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
dependencies[0].dstSubpass = 0;
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
dependencies[1].srcSubpass = 0;
dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
VkRenderPassCreateInfo renderPassInfo = {}; VkRenderPassCreateInfo renderPassInfo = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo.attachmentCount = attachments.size(); renderPassInfo.attachmentCount = attachments.size();
renderPassInfo.pAttachments = attachments.data(); renderPassInfo.pAttachments = attachments.data();
renderPassInfo.subpassCount = 1; renderPassInfo.subpassCount = 1;
renderPassInfo.pSubpasses = &subpass; renderPassInfo.pSubpasses = &subpass;
renderPassInfo.dependencyCount = dependencies.size();
renderPassInfo.pDependencies = dependencies.data();
vkCreateRenderPass(renderer_.getDevice(), &renderPassInfo, nullptr, &renderPass_); vkCreateRenderPass(renderer_.getDevice(), &renderPassInfo, nullptr, &renderPass_);
} }