| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "vulkan_render_pass.h" |
| |
| #include "utils.h" |
| |
| VulkanRenderPass::VulkanRenderPass(std::shared_ptr<VulkanLogicalDevice> device, |
| const vk::Format &image_format, bool offscreen) |
| : initialized_(false), device_(device), image_format_(image_format), offscreen_(offscreen) {} |
| |
| bool VulkanRenderPass::Init() { |
| if (initialized_) { |
| RTN_MSG(false, "VulkanRenderPass is already initialized.\n"); |
| } |
| |
| vk::AttachmentDescription color_attachment; |
| if (offscreen_) { |
| color_attachment.finalLayout = vk::ImageLayout::eTransferSrcOptimal; |
| } else { |
| color_attachment.finalLayout = vk::ImageLayout::ePresentSrcKHR; |
| } |
| color_attachment.format = image_format_; |
| color_attachment.initialLayout = vk::ImageLayout::eUndefined; |
| color_attachment.loadOp = vk::AttachmentLoadOp::eClear; |
| color_attachment.samples = vk::SampleCountFlagBits::e1; |
| color_attachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare; |
| color_attachment.stencilStoreOp = vk::AttachmentStoreOp::eDontCare; |
| color_attachment.storeOp = vk::AttachmentStoreOp::eStore; |
| |
| vk::AttachmentReference color_attachment_ref; |
| color_attachment_ref.attachment = 0; |
| color_attachment_ref.layout = vk::ImageLayout::eColorAttachmentOptimal; |
| |
| vk::SubpassDescription subpass; |
| subpass.colorAttachmentCount = 1; |
| subpass.pColorAttachments = &color_attachment_ref; |
| subpass.pipelineBindPoint = vk::PipelineBindPoint::eGraphics; |
| |
| vk::RenderPassCreateInfo render_pass_info; |
| render_pass_info.attachmentCount = 1; |
| render_pass_info.pAttachments = &color_attachment; |
| render_pass_info.pSubpasses = &subpass; |
| render_pass_info.subpassCount = 1; |
| |
| auto rv = device_->device()->createRenderPassUnique(render_pass_info); |
| if (vk::Result::eSuccess != rv.result) { |
| RTN_MSG(false, "VK Error: 0x%x - Failed to create render pass.", rv.result); |
| } |
| render_pass_ = std::move(rv.value); |
| |
| initialized_ = true; |
| return true; |
| } |