blob: f8b24884149fa4f2d40fe6902e202179704ec090 [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 "clearTest.h"
namespace vkbench {
void ClearTest::Initialize() {
CreateRenderPass();
CreateFrameBuffers();
// Create a cmdBuffer with draw call.
cmd_buffers_ = vk->GetDevice().allocateCommandBuffers(
{vk->GetCommandPool(), vk::CommandBufferLevel::ePrimary, 1});
for (const auto& buffer : cmd_buffers_) {
buffer.begin(vk::CommandBufferBeginInfo());
vk::RenderPassBeginInfo render_pass_info;
render_pass_info.setFramebuffer(frame_buffer_)
.setRenderPass(render_pass_)
.setClearValueCount(1)
.setPClearValues(&clear_color_)
.setRenderArea(vk::Rect2D({}, img_size_));
buffer.beginRenderPass(render_pass_info, vk::SubpassContents::eInline);
buffer.endRenderPass();
buffer.end();
}
vk::SubmitInfo info;
info.setCommandBufferCount(1).setPCommandBuffers(cmd_buffers_.data());
smt_infos_.push_back(info);
}
void ClearTest::Run() {
vk->GetGFXQueue().submit(smt_infos_, {});
vk->GetGFXQueue().waitIdle();
}
void ClearTest::Destroy() {
vk::Device device = vk->GetDevice();
device.destroyImageView(img_view_);
delete img_;
device.destroyFramebuffer(frame_buffer_);
device.destroyRenderPass(render_pass_);
device.freeCommandBuffers(vk->GetCommandPool(), cmd_buffers_);
smt_infos_.clear();
}
void ClearTest::CreateRenderPass() {
vk::AttachmentDescription att_description;
att_description.setSamples(vk::SampleCountFlagBits::e1)
.setFormat(img_format_)
.setLoadOp(vk::AttachmentLoadOp::eClear)
.setStoreOp(vk::AttachmentStoreOp::eStore)
.setInitialLayout(vk::ImageLayout::eUndefined)
.setFinalLayout(vk::ImageLayout::eGeneral);
vk::AttachmentReference att_reference;
att_reference.setAttachment(0).setLayout(
vk::ImageLayout::eColorAttachmentOptimal);
vk::SubpassDescription subpass;
subpass.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics)
.setColorAttachmentCount(1)
.setPColorAttachments(&att_reference);
vk::RenderPassCreateInfo render_pass_info;
render_pass_info.setAttachmentCount(1)
.setPAttachments(&att_description)
.setSubpassCount(1)
.setPSubpasses(&subpass);
render_pass_ = vk->GetDevice().createRenderPass(render_pass_info);
}
void ClearTest::CreateFrameBuffers() {
const vk::Device device = vk->GetDevice();
img_ = vk->AllocateImage(img_size_, img_format_,
vk::ImageUsageFlagBits::eColorAttachment |
vk::ImageUsageFlagBits::eTransferSrc,
vk::MemoryPropertyFlagBits::eDeviceLocal);
vk::ImageViewCreateInfo img_view_create_info;
img_view_create_info.setViewType(vk::ImageViewType::e2D)
.setFormat(img_format_)
.setImage(img_->GetImage());
img_view_create_info.subresourceRange
.setAspectMask(vk::ImageAspectFlagBits::eColor)
.setBaseMipLevel(0)
.setLevelCount(1)
.setBaseArrayLayer(0)
.setLayerCount(1);
img_view_ = device.createImageView(img_view_create_info);
vk::FramebufferCreateInfo frame_buffer_info;
frame_buffer_info.setRenderPass(render_pass_)
.setAttachmentCount(1)
.setPAttachments(&img_view_)
.setWidth(img_size_.width)
.setHeight(img_size_.height)
.setLayers(1);
frame_buffer_ = device.createFramebuffer(frame_buffer_info);
}
void ClearTest::SaveImage(FilePath file_path) const {
const vk::Device device = vk->GetDevice();
vkImage* dest = vk->GetReadableImage(img_, img_size_, img_format_);
DEFER(delete dest);
vk::SubresourceLayout sub_resource_layout = device.getImageSubresourceLayout(
dest->GetImage(), {vk::ImageAspectFlagBits::eColor, 0, 0});
const char* data =
(const char*)device.mapMemory(dest->GetMemory(), 0, VK_WHOLE_SIZE);
data += sub_resource_layout.offset;
SavePPM(file_path, data, img_size_.width, img_size_.height,
sub_resource_layout.rowPitch);
DEBUG("Saved image to %s", file_path.value().c_str());
}
} // namespace vkbench