Po-Hsien Wang | 5372c81 | 2020-10-02 09:41:01 +0800 | [diff] [blame] | 1 | // 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 | |
| 7 | namespace vkbench { |
| 8 | void 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 Wang | 41024f4 | 2020-10-28 17:52:56 -0700 | [diff] [blame] | 16 | buffer.begin(vk::CommandBufferBeginInfo()); |
Po-Hsien Wang | 5372c81 | 2020-10-02 09:41:01 +0800 | [diff] [blame] | 17 | 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 | |
| 33 | void ClearTest::Run() { |
| 34 | vk->GetGFXQueue().submit(smt_infos_, {}); |
| 35 | vk->GetGFXQueue().waitIdle(); |
| 36 | } |
| 37 | |
| 38 | void 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 Wang | 513fe19 | 2020-10-02 11:40:07 +0800 | [diff] [blame] | 46 | smt_infos_.clear(); |
Po-Hsien Wang | 5372c81 | 2020-10-02 09:41:01 +0800 | [diff] [blame] | 47 | } |
| 48 | |
| 49 | void 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 | |
| 74 | void 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 Wang | a956e65 | 2020-11-11 16:29:04 -0800 | [diff] [blame] | 104 | void ClearTest::SaveImage(FilePath file_path) const { |
Po-Hsien Wang | 5372c81 | 2020-10-02 09:41:01 +0800 | [diff] [blame] | 105 | 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 Wang | a956e65 | 2020-11-11 16:29:04 -0800 | [diff] [blame] | 113 | SavePPM(file_path, data, img_size_.width, img_size_.height, |
Po-Hsien Wang | 5372c81 | 2020-10-02 09:41:01 +0800 | [diff] [blame] | 114 | sub_resource_layout.rowPitch); |
Po-Hsien Wang | a956e65 | 2020-11-11 16:29:04 -0800 | [diff] [blame] | 115 | DEBUG("Saved image to %s", file_path.value().c_str()); |
Po-Hsien Wang | 5372c81 | 2020-10-02 09:41:01 +0800 | [diff] [blame] | 116 | } |
| 117 | |
| 118 | } // namespace vkbench |