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_;
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.sampler = bokehSampler_;
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.sampler = bokehSampler_;
@ -164,7 +164,7 @@ void DoFPass::createRenderPass() {
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
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 = {};
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
@ -225,7 +225,7 @@ void DoFPass::createPipeline() {
vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;
vertShaderStageInfo.module = vertShaderModule;
vertShaderStageInfo.pName = "main";
VkPipelineShaderStageCreateInfo fragShaderStageInfo = {};
fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
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++) {
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.sampler = offscreenSampler_;
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.sampler = offscreenSampler_;
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.sampler = offscreenSampler_;
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.sampler = offscreenSampler_;
@ -70,7 +70,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
sceneDescriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
sceneDescriptorWrite.dstSet = target->postSets[i];
sceneDescriptorWrite.pImageInfo = &sceneImageInfo;
VkWriteDescriptorSet depthDescriptorWrite = {};
depthDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
depthDescriptorWrite.descriptorCount = 1;
@ -78,7 +78,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
depthDescriptorWrite.dstBinding = 1;
depthDescriptorWrite.dstSet = target->postSets[i];
depthDescriptorWrite.pImageInfo = &depthImageInfo;
VkWriteDescriptorSet nearFieldDescriptorWrite = {};
nearFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
nearFieldDescriptorWrite.descriptorCount = 1;
@ -86,7 +86,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
nearFieldDescriptorWrite.dstBinding = 2;
nearFieldDescriptorWrite.dstSet = target->postSets[i];
nearFieldDescriptorWrite.pImageInfo = &nearFieldImageInfo;
VkWriteDescriptorSet farFieldDescriptorWrite = {};
farFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
farFieldDescriptorWrite.descriptorCount = 1;
@ -94,7 +94,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) {
farFieldDescriptorWrite.dstBinding = 3;
farFieldDescriptorWrite.dstSet = target->postSets[i];
farFieldDescriptorWrite.pImageInfo = &farFieldImageInfo;
const std::array<VkWriteDescriptorSet, 4> descriptorWrites = {
sceneDescriptorWrite,
depthDescriptorWrite,
@ -111,7 +111,7 @@ void PostPass::createDescriptorSetLayout() {
offscreenSamplerBinding.descriptorCount = 1;
offscreenSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
offscreenSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
VkDescriptorSetLayoutBinding depthSamplerBinding = {};
depthSamplerBinding.binding = 1;
depthSamplerBinding.descriptorCount = 1;
@ -123,20 +123,20 @@ void PostPass::createDescriptorSetLayout() {
nearFieldSamplerBinding.descriptorCount = 1;
nearFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
nearFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
VkDescriptorSetLayoutBinding farFieldSamplerBinding = {};
farFieldSamplerBinding.binding = 3;
farFieldSamplerBinding.descriptorCount = 1;
farFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
farFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
const std::array<VkDescriptorSetLayoutBinding, 4> bindings = {
offscreenSamplerBinding,
depthSamplerBinding,
nearFieldSamplerBinding,
farFieldSamplerBinding
};
VkDescriptorSetLayoutCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
createInfo.bindingCount = bindings.size();

View file

@ -1283,12 +1283,23 @@ void Renderer::createPresentationRenderPass() {
subpass.colorAttachmentCount = 1;
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 = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo.attachmentCount = 1;
renderPassInfo.pAttachments = &colorAttachment;
renderPassInfo.subpassCount = 1;
renderPassInfo.pSubpasses = &subpass;
renderPassInfo.dependencyCount = dependencies.size();
renderPassInfo.pDependencies = dependencies.data();
vkCreateRenderPass(device_, &renderPassInfo, nullptr, &presentationRenderPass_);
}

View file

@ -93,7 +93,7 @@ void WorldPass::createRenderPass() {
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
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 = {};
depthAttachment.format = VK_FORMAT_D32_SFLOAT;
@ -103,7 +103,7 @@ void WorldPass::createRenderPass() {
depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
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 = {};
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
@ -123,12 +123,31 @@ void WorldPass::createRenderPass() {
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 = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo.attachmentCount = attachments.size();
renderPassInfo.pAttachments = attachments.data();
renderPassInfo.subpassCount = 1;
renderPassInfo.pSubpasses = &subpass;
renderPassInfo.dependencyCount = dependencies.size();
renderPassInfo.pDependencies = dependencies.data();
vkCreateRenderPass(renderer_.getDevice(), &renderPassInfo, nullptr, &renderPass_);
}