aboutsummaryrefslogtreecommitdiff
path: root/src/vulkan/frame_buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vulkan/frame_buffer.cc')
-rw-r--r--src/vulkan/frame_buffer.cc66
1 files changed, 57 insertions, 9 deletions
diff --git a/src/vulkan/frame_buffer.cc b/src/vulkan/frame_buffer.cc
index 47eb82d..b6ad13a 100644
--- a/src/vulkan/frame_buffer.cc
+++ b/src/vulkan/frame_buffer.cc
@@ -30,10 +30,12 @@ FrameBuffer::FrameBuffer(
Device* device,
const std::vector<const amber::Pipeline::BufferInfo*>& color_attachments,
amber::Pipeline::BufferInfo depth_stencil_attachment,
+ const std::vector<const amber::Pipeline::BufferInfo*>& resolve_targets,
uint32_t width,
uint32_t height)
: device_(device),
color_attachments_(color_attachments),
+ resolve_targets_(resolve_targets),
depth_stencil_attachment_(depth_stencil_attachment),
width_(width),
height_(height) {}
@@ -62,15 +64,16 @@ Result FrameBuffer::Initialize(VkRenderPass render_pass) {
attachments.resize(color_attachments_.size());
for (auto* info : color_attachments_) {
+ const VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
color_images_.push_back(MakeUnique<TransferImage>(
device_, *info->buffer->GetFormat(), VK_IMAGE_ASPECT_COLOR_BIT,
- VK_IMAGE_TYPE_2D, width_ << info->base_mip_level,
+ VK_IMAGE_TYPE_2D, usage_flags, width_ << info->base_mip_level,
height_ << info->base_mip_level, depth_, info->buffer->GetMipLevels(),
- info->base_mip_level, 1u, 1u));
+ info->base_mip_level, 1u, info->buffer->GetSamples()));
- Result r = color_images_.back()->Initialize(
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+ Result r = color_images_.back()->Initialize();
if (!r.IsSuccess())
return r;
@@ -87,19 +90,37 @@ Result FrameBuffer::Initialize(VkRenderPass render_pass) {
aspect |= VK_IMAGE_ASPECT_STENCIL_BIT;
assert(aspect != 0);
+ const VkImageUsageFlags usage_flags =
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
+
depth_stencil_image_ = MakeUnique<TransferImage>(
device_, *depth_stencil_attachment_.buffer->GetFormat(), aspect,
- VK_IMAGE_TYPE_2D, width_, height_, depth_, 1u, 0u, 1u, 1u);
+ VK_IMAGE_TYPE_2D, usage_flags, width_, height_, depth_, 1u, 0u, 1u, 1u);
- Result r = depth_stencil_image_->Initialize(
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
+ Result r = depth_stencil_image_->Initialize();
if (!r.IsSuccess())
return r;
attachments.push_back(depth_stencil_image_->GetVkImageView());
}
+ for (auto* info : resolve_targets_) {
+ const VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ resolve_images_.push_back(MakeUnique<TransferImage>(
+ device_, *info->buffer->GetFormat(), VK_IMAGE_ASPECT_COLOR_BIT,
+ VK_IMAGE_TYPE_2D, usage_flags, width_, height_, depth_, 1u, 0u, 1u,
+ 1u));
+
+ Result r = resolve_images_.back()->Initialize();
+ if (!r.IsSuccess())
+ return r;
+
+ attachments.push_back(resolve_images_.back()->GetVkImageView());
+ }
+
VkFramebufferCreateInfo frame_buffer_info = VkFramebufferCreateInfo();
frame_buffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
frame_buffer_info.renderPass = render_pass;
@@ -126,6 +147,9 @@ void FrameBuffer::ChangeFrameLayout(CommandBuffer* command,
for (auto& img : color_images_)
img->ImageBarrier(command, color_layout, color_stage);
+ for (auto& img : resolve_images_)
+ img->ImageBarrier(command, color_layout, color_stage);
+
if (depth_stencil_image_)
depth_stencil_image_->ImageBarrier(command, depth_layout, depth_stage);
}
@@ -162,6 +186,9 @@ void FrameBuffer::TransferImagesToHost(CommandBuffer* command) {
for (auto& img : color_images_)
img->CopyToHost(command);
+ for (auto& img : resolve_images_)
+ img->CopyToHost(command);
+
if (depth_stencil_image_)
depth_stencil_image_->CopyToHost(command);
}
@@ -176,6 +203,15 @@ void FrameBuffer::CopyImagesToBuffers() {
info->buffer->GetSizeInBytes());
}
+ for (size_t i = 0; i < resolve_images_.size(); ++i) {
+ auto& img = resolve_images_[i];
+ auto* info = resolve_targets_[i];
+ auto* values = info->buffer->ValuePtr();
+ values->resize(info->buffer->GetSizeInBytes());
+ std::memcpy(values->data(), img->HostAccessibleMemoryPtr(),
+ info->buffer->GetSizeInBytes());
+ }
+
if (depth_stencil_image_) {
auto* values = depth_stencil_attachment_.buffer->ValuePtr();
values->resize(depth_stencil_attachment_.buffer->GetSizeInBytes());
@@ -205,6 +241,18 @@ void FrameBuffer::CopyBuffersToImages() {
info->buffer->GetSizeInBytes());
}
+ for (size_t i = 0; i < resolve_images_.size(); ++i) {
+ auto& img = resolve_images_[i];
+ auto* info = resolve_targets_[i];
+ auto* values = info->buffer->ValuePtr();
+ // Nothing to do if our local buffer is empty
+ if (values->empty())
+ continue;
+
+ std::memcpy(img->HostAccessibleMemoryPtr(), values->data(),
+ info->buffer->GetSizeInBytes());
+ }
+
if (depth_stencil_image_) {
auto* values = depth_stencil_attachment_.buffer->ValuePtr();
// Nothing to do if our local buffer is empty