blob: f8b24884149fa4f2d40fe6902e202179704ec090 [file] [log] [blame]
Po-Hsien Wang5372c812020-10-02 09:41:01 +08001// Copyright 2020 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "clearTest.h"
6
7namespace vkbench {
8void ClearTest::Initialize() {
9 CreateRenderPass();
10 CreateFrameBuffers();
11
12 // Create a cmdBuffer with draw call.
13 cmd_buffers_ = vk->GetDevice().allocateCommandBuffers(
14 {vk->GetCommandPool(), vk::CommandBufferLevel::ePrimary, 1});
15 for (const auto& buffer : cmd_buffers_) {
Po-Hsien Wang41024f42020-10-28 17:52:56 -070016 buffer.begin(vk::CommandBufferBeginInfo());
Po-Hsien Wang5372c812020-10-02 09:41:01 +080017 vk::RenderPassBeginInfo render_pass_info;
18 render_pass_info.setFramebuffer(frame_buffer_)
19 .setRenderPass(render_pass_)
20 .setClearValueCount(1)
21 .setPClearValues(&clear_color_)
22 .setRenderArea(vk::Rect2D({}, img_size_));
23 buffer.beginRenderPass(render_pass_info, vk::SubpassContents::eInline);
24 buffer.endRenderPass();
25 buffer.end();
26 }
27
28 vk::SubmitInfo info;
29 info.setCommandBufferCount(1).setPCommandBuffers(cmd_buffers_.data());
30 smt_infos_.push_back(info);
31}
32
33void ClearTest::Run() {
34 vk->GetGFXQueue().submit(smt_infos_, {});
35 vk->GetGFXQueue().waitIdle();
36}
37
38void ClearTest::Destroy() {
39 vk::Device device = vk->GetDevice();
40 device.destroyImageView(img_view_);
41 delete img_;
42
43 device.destroyFramebuffer(frame_buffer_);
44 device.destroyRenderPass(render_pass_);
45 device.freeCommandBuffers(vk->GetCommandPool(), cmd_buffers_);
Po-Hsien Wang513fe192020-10-02 11:40:07 +080046 smt_infos_.clear();
Po-Hsien Wang5372c812020-10-02 09:41:01 +080047}
48
49void ClearTest::CreateRenderPass() {
50 vk::AttachmentDescription att_description;
51 att_description.setSamples(vk::SampleCountFlagBits::e1)
52 .setFormat(img_format_)
53 .setLoadOp(vk::AttachmentLoadOp::eClear)
54 .setStoreOp(vk::AttachmentStoreOp::eStore)
55 .setInitialLayout(vk::ImageLayout::eUndefined)
56 .setFinalLayout(vk::ImageLayout::eGeneral);
57
58 vk::AttachmentReference att_reference;
59 att_reference.setAttachment(0).setLayout(
60 vk::ImageLayout::eColorAttachmentOptimal);
61 vk::SubpassDescription subpass;
62 subpass.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics)
63 .setColorAttachmentCount(1)
64 .setPColorAttachments(&att_reference);
65
66 vk::RenderPassCreateInfo render_pass_info;
67 render_pass_info.setAttachmentCount(1)
68 .setPAttachments(&att_description)
69 .setSubpassCount(1)
70 .setPSubpasses(&subpass);
71 render_pass_ = vk->GetDevice().createRenderPass(render_pass_info);
72}
73
74void ClearTest::CreateFrameBuffers() {
75 const vk::Device device = vk->GetDevice();
76
77 img_ = vk->AllocateImage(img_size_, img_format_,
78 vk::ImageUsageFlagBits::eColorAttachment |
79 vk::ImageUsageFlagBits::eTransferSrc,
80 vk::MemoryPropertyFlagBits::eDeviceLocal);
81
82 vk::ImageViewCreateInfo img_view_create_info;
83 img_view_create_info.setViewType(vk::ImageViewType::e2D)
84 .setFormat(img_format_)
85 .setImage(img_->GetImage());
86 img_view_create_info.subresourceRange
87 .setAspectMask(vk::ImageAspectFlagBits::eColor)
88 .setBaseMipLevel(0)
89 .setLevelCount(1)
90 .setBaseArrayLayer(0)
91 .setLayerCount(1);
92 img_view_ = device.createImageView(img_view_create_info);
93
94 vk::FramebufferCreateInfo frame_buffer_info;
95 frame_buffer_info.setRenderPass(render_pass_)
96 .setAttachmentCount(1)
97 .setPAttachments(&img_view_)
98 .setWidth(img_size_.width)
99 .setHeight(img_size_.height)
100 .setLayers(1);
101 frame_buffer_ = device.createFramebuffer(frame_buffer_info);
102}
103
Po-Hsien Wanga956e652020-11-11 16:29:04 -0800104void ClearTest::SaveImage(FilePath file_path) const {
Po-Hsien Wang5372c812020-10-02 09:41:01 +0800105 const vk::Device device = vk->GetDevice();
106 vkImage* dest = vk->GetReadableImage(img_, img_size_, img_format_);
107 DEFER(delete dest);
108 vk::SubresourceLayout sub_resource_layout = device.getImageSubresourceLayout(
109 dest->GetImage(), {vk::ImageAspectFlagBits::eColor, 0, 0});
110 const char* data =
111 (const char*)device.mapMemory(dest->GetMemory(), 0, VK_WHOLE_SIZE);
112 data += sub_resource_layout.offset;
Po-Hsien Wanga956e652020-11-11 16:29:04 -0800113 SavePPM(file_path, data, img_size_.width, img_size_.height,
Po-Hsien Wang5372c812020-10-02 09:41:01 +0800114 sub_resource_layout.rowPitch);
Po-Hsien Wanga956e652020-11-11 16:29:04 -0800115 DEBUG("Saved image to %s", file_path.value().c_str());
Po-Hsien Wang5372c812020-10-02 09:41:01 +0800116}
117
118} // namespace vkbench