blob: c0aeac3437fab25589fcc2a2a154c3f4c699a060 [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_);
46}
47
48void ClearTest::CreateRenderPass() {
49 vk::AttachmentDescription att_description;
50 att_description.setSamples(vk::SampleCountFlagBits::e1)
51 .setFormat(img_format_)
52 .setLoadOp(vk::AttachmentLoadOp::eClear)
53 .setStoreOp(vk::AttachmentStoreOp::eStore)
54 .setInitialLayout(vk::ImageLayout::eUndefined)
55 .setFinalLayout(vk::ImageLayout::eGeneral);
56
57 vk::AttachmentReference att_reference;
58 att_reference.setAttachment(0).setLayout(
59 vk::ImageLayout::eColorAttachmentOptimal);
60 vk::SubpassDescription subpass;
61 subpass.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics)
62 .setColorAttachmentCount(1)
63 .setPColorAttachments(&att_reference);
64
65 vk::RenderPassCreateInfo render_pass_info;
66 render_pass_info.setAttachmentCount(1)
67 .setPAttachments(&att_description)
68 .setSubpassCount(1)
69 .setPSubpasses(&subpass);
70 render_pass_ = vk->GetDevice().createRenderPass(render_pass_info);
71}
72
73void ClearTest::CreateFrameBuffers() {
74 const vk::Device device = vk->GetDevice();
75
76 img_ = vk->AllocateImage(img_size_, img_format_,
77 vk::ImageUsageFlagBits::eColorAttachment |
78 vk::ImageUsageFlagBits::eTransferSrc,
79 vk::MemoryPropertyFlagBits::eDeviceLocal);
80
81 vk::ImageViewCreateInfo img_view_create_info;
82 img_view_create_info.setViewType(vk::ImageViewType::e2D)
83 .setFormat(img_format_)
84 .setImage(img_->GetImage());
85 img_view_create_info.subresourceRange
86 .setAspectMask(vk::ImageAspectFlagBits::eColor)
87 .setBaseMipLevel(0)
88 .setLevelCount(1)
89 .setBaseArrayLayer(0)
90 .setLayerCount(1);
91 img_view_ = device.createImageView(img_view_create_info);
92
93 vk::FramebufferCreateInfo frame_buffer_info;
94 frame_buffer_info.setRenderPass(render_pass_)
95 .setAttachmentCount(1)
96 .setPAttachments(&img_view_)
97 .setWidth(img_size_.width)
98 .setHeight(img_size_.height)
99 .setLayers(1);
100 frame_buffer_ = device.createFramebuffer(frame_buffer_info);
101}
102
103void ClearTest::SaveImage(std::string filename) const {
104 const vk::Device device = vk->GetDevice();
105 vkImage* dest = vk->GetReadableImage(img_, img_size_, img_format_);
106 DEFER(delete dest);
107 vk::SubresourceLayout sub_resource_layout = device.getImageSubresourceLayout(
108 dest->GetImage(), {vk::ImageAspectFlagBits::eColor, 0, 0});
109 const char* data =
110 (const char*)device.mapMemory(dest->GetMemory(), 0, VK_WHOLE_SIZE);
111 data += sub_resource_layout.offset;
112 SavePPM(filename, data, img_size_.width, img_size_.height,
113 sub_resource_layout.rowPitch);
114
115 DEBUG("Saved image to %s", filename.c_str());
116}
117
118} // namespace vkbench