1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2021 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "Util.hpp"
16*03ce13f7SAndroid Build Coastguard Worker #include "VulkanTester.hpp"
17*03ce13f7SAndroid Build Coastguard Worker
18*03ce13f7SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
19*03ce13f7SAndroid Build Coastguard Worker
20*03ce13f7SAndroid Build Coastguard Worker #include <cassert>
21*03ce13f7SAndroid Build Coastguard Worker
22*03ce13f7SAndroid Build Coastguard Worker class ClearImageBenchmark
23*03ce13f7SAndroid Build Coastguard Worker {
24*03ce13f7SAndroid Build Coastguard Worker public:
initialize(vk::Format clearFormat,vk::ImageAspectFlagBits clearAspect)25*03ce13f7SAndroid Build Coastguard Worker void initialize(vk::Format clearFormat, vk::ImageAspectFlagBits clearAspect)
26*03ce13f7SAndroid Build Coastguard Worker {
27*03ce13f7SAndroid Build Coastguard Worker tester.initialize();
28*03ce13f7SAndroid Build Coastguard Worker auto &device = tester.getDevice();
29*03ce13f7SAndroid Build Coastguard Worker auto &physicalDevice = tester.getPhysicalDevice();
30*03ce13f7SAndroid Build Coastguard Worker
31*03ce13f7SAndroid Build Coastguard Worker vk::ImageCreateInfo imageInfo;
32*03ce13f7SAndroid Build Coastguard Worker imageInfo.imageType = vk::ImageType::e2D;
33*03ce13f7SAndroid Build Coastguard Worker imageInfo.format = clearFormat;
34*03ce13f7SAndroid Build Coastguard Worker imageInfo.tiling = vk::ImageTiling::eOptimal;
35*03ce13f7SAndroid Build Coastguard Worker imageInfo.initialLayout = vk::ImageLayout::eUndefined;
36*03ce13f7SAndroid Build Coastguard Worker imageInfo.usage = vk::ImageUsageFlagBits::eTransferDst;
37*03ce13f7SAndroid Build Coastguard Worker imageInfo.samples = vk::SampleCountFlagBits::e4;
38*03ce13f7SAndroid Build Coastguard Worker imageInfo.extent = vk::Extent3D(1024, 1024, 1);
39*03ce13f7SAndroid Build Coastguard Worker imageInfo.mipLevels = 1;
40*03ce13f7SAndroid Build Coastguard Worker imageInfo.arrayLayers = 1;
41*03ce13f7SAndroid Build Coastguard Worker
42*03ce13f7SAndroid Build Coastguard Worker image = device.createImage(imageInfo);
43*03ce13f7SAndroid Build Coastguard Worker
44*03ce13f7SAndroid Build Coastguard Worker vk::MemoryRequirements memoryRequirements = device.getImageMemoryRequirements(image);
45*03ce13f7SAndroid Build Coastguard Worker
46*03ce13f7SAndroid Build Coastguard Worker vk::MemoryAllocateInfo allocateInfo;
47*03ce13f7SAndroid Build Coastguard Worker allocateInfo.allocationSize = memoryRequirements.size;
48*03ce13f7SAndroid Build Coastguard Worker allocateInfo.memoryTypeIndex = Util::getMemoryTypeIndex(physicalDevice, memoryRequirements.memoryTypeBits);
49*03ce13f7SAndroid Build Coastguard Worker
50*03ce13f7SAndroid Build Coastguard Worker memory = device.allocateMemory(allocateInfo);
51*03ce13f7SAndroid Build Coastguard Worker
52*03ce13f7SAndroid Build Coastguard Worker device.bindImageMemory(image, memory, 0);
53*03ce13f7SAndroid Build Coastguard Worker
54*03ce13f7SAndroid Build Coastguard Worker vk::CommandPoolCreateInfo commandPoolCreateInfo;
55*03ce13f7SAndroid Build Coastguard Worker commandPoolCreateInfo.queueFamilyIndex = tester.getQueueFamilyIndex();
56*03ce13f7SAndroid Build Coastguard Worker
57*03ce13f7SAndroid Build Coastguard Worker commandPool = device.createCommandPool(commandPoolCreateInfo);
58*03ce13f7SAndroid Build Coastguard Worker
59*03ce13f7SAndroid Build Coastguard Worker vk::CommandBufferAllocateInfo commandBufferAllocateInfo;
60*03ce13f7SAndroid Build Coastguard Worker commandBufferAllocateInfo.commandPool = commandPool;
61*03ce13f7SAndroid Build Coastguard Worker commandBufferAllocateInfo.commandBufferCount = 1;
62*03ce13f7SAndroid Build Coastguard Worker
63*03ce13f7SAndroid Build Coastguard Worker commandBuffer = device.allocateCommandBuffers(commandBufferAllocateInfo)[0];
64*03ce13f7SAndroid Build Coastguard Worker
65*03ce13f7SAndroid Build Coastguard Worker vk::CommandBufferBeginInfo commandBufferBeginInfo;
66*03ce13f7SAndroid Build Coastguard Worker commandBufferBeginInfo.flags = {};
67*03ce13f7SAndroid Build Coastguard Worker
68*03ce13f7SAndroid Build Coastguard Worker commandBuffer.begin(commandBufferBeginInfo);
69*03ce13f7SAndroid Build Coastguard Worker
70*03ce13f7SAndroid Build Coastguard Worker vk::ImageMemoryBarrier imageMemoryBarrier;
71*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrier.image = image;
72*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrier.subresourceRange.aspectMask = clearAspect;
73*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
74*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
75*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrier.oldLayout = vk::ImageLayout::eUndefined;
76*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrier.newLayout = vk::ImageLayout::eGeneral;
77*03ce13f7SAndroid Build Coastguard Worker commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eTopOfPipe,
78*03ce13f7SAndroid Build Coastguard Worker vk::DependencyFlagBits::eDeviceGroup, {}, {}, imageMemoryBarrier);
79*03ce13f7SAndroid Build Coastguard Worker
80*03ce13f7SAndroid Build Coastguard Worker vk::ImageSubresourceRange range;
81*03ce13f7SAndroid Build Coastguard Worker range.aspectMask = clearAspect;
82*03ce13f7SAndroid Build Coastguard Worker range.baseMipLevel = 0;
83*03ce13f7SAndroid Build Coastguard Worker range.levelCount = 1;
84*03ce13f7SAndroid Build Coastguard Worker range.baseArrayLayer = 0;
85*03ce13f7SAndroid Build Coastguard Worker range.layerCount = 1;
86*03ce13f7SAndroid Build Coastguard Worker
87*03ce13f7SAndroid Build Coastguard Worker if(clearAspect == vk::ImageAspectFlagBits::eColor)
88*03ce13f7SAndroid Build Coastguard Worker {
89*03ce13f7SAndroid Build Coastguard Worker vk::ClearColorValue clearColorValue;
90*03ce13f7SAndroid Build Coastguard Worker clearColorValue.float32[0] = 0.0f;
91*03ce13f7SAndroid Build Coastguard Worker clearColorValue.float32[1] = 1.0f;
92*03ce13f7SAndroid Build Coastguard Worker clearColorValue.float32[2] = 0.0f;
93*03ce13f7SAndroid Build Coastguard Worker clearColorValue.float32[3] = 1.0f;
94*03ce13f7SAndroid Build Coastguard Worker
95*03ce13f7SAndroid Build Coastguard Worker commandBuffer.clearColorImage(image, vk::ImageLayout::eGeneral, &clearColorValue, 1, &range);
96*03ce13f7SAndroid Build Coastguard Worker }
97*03ce13f7SAndroid Build Coastguard Worker else if(clearAspect == vk::ImageAspectFlagBits::eDepth)
98*03ce13f7SAndroid Build Coastguard Worker {
99*03ce13f7SAndroid Build Coastguard Worker vk::ClearDepthStencilValue clearDepthStencilValue;
100*03ce13f7SAndroid Build Coastguard Worker clearDepthStencilValue.depth = 1.0f;
101*03ce13f7SAndroid Build Coastguard Worker clearDepthStencilValue.stencil = 0xFF;
102*03ce13f7SAndroid Build Coastguard Worker
103*03ce13f7SAndroid Build Coastguard Worker commandBuffer.clearDepthStencilImage(image, vk::ImageLayout::eGeneral, &clearDepthStencilValue, 1, &range);
104*03ce13f7SAndroid Build Coastguard Worker }
105*03ce13f7SAndroid Build Coastguard Worker else
106*03ce13f7SAndroid Build Coastguard Worker assert(false);
107*03ce13f7SAndroid Build Coastguard Worker
108*03ce13f7SAndroid Build Coastguard Worker commandBuffer.end();
109*03ce13f7SAndroid Build Coastguard Worker }
110*03ce13f7SAndroid Build Coastguard Worker
~ClearImageBenchmark()111*03ce13f7SAndroid Build Coastguard Worker ~ClearImageBenchmark()
112*03ce13f7SAndroid Build Coastguard Worker {
113*03ce13f7SAndroid Build Coastguard Worker auto &device = tester.getDevice();
114*03ce13f7SAndroid Build Coastguard Worker device.freeCommandBuffers(commandPool, 1, &commandBuffer);
115*03ce13f7SAndroid Build Coastguard Worker device.destroyCommandPool(commandPool, nullptr);
116*03ce13f7SAndroid Build Coastguard Worker device.freeMemory(memory, nullptr);
117*03ce13f7SAndroid Build Coastguard Worker device.destroyImage(image, nullptr);
118*03ce13f7SAndroid Build Coastguard Worker }
119*03ce13f7SAndroid Build Coastguard Worker
clear()120*03ce13f7SAndroid Build Coastguard Worker void clear()
121*03ce13f7SAndroid Build Coastguard Worker {
122*03ce13f7SAndroid Build Coastguard Worker auto &queue = tester.getQueue();
123*03ce13f7SAndroid Build Coastguard Worker
124*03ce13f7SAndroid Build Coastguard Worker vk::SubmitInfo submitInfo;
125*03ce13f7SAndroid Build Coastguard Worker submitInfo.commandBufferCount = 1;
126*03ce13f7SAndroid Build Coastguard Worker submitInfo.pCommandBuffers = &commandBuffer;
127*03ce13f7SAndroid Build Coastguard Worker
128*03ce13f7SAndroid Build Coastguard Worker queue.submit(1, &submitInfo, nullptr);
129*03ce13f7SAndroid Build Coastguard Worker queue.waitIdle();
130*03ce13f7SAndroid Build Coastguard Worker }
131*03ce13f7SAndroid Build Coastguard Worker
132*03ce13f7SAndroid Build Coastguard Worker private:
133*03ce13f7SAndroid Build Coastguard Worker VulkanTester tester;
134*03ce13f7SAndroid Build Coastguard Worker vk::Image image; // Owning handle
135*03ce13f7SAndroid Build Coastguard Worker vk::DeviceMemory memory; // Owning handle
136*03ce13f7SAndroid Build Coastguard Worker vk::CommandPool commandPool; // Owning handle
137*03ce13f7SAndroid Build Coastguard Worker vk::CommandBuffer commandBuffer; // Owning handle
138*03ce13f7SAndroid Build Coastguard Worker };
139*03ce13f7SAndroid Build Coastguard Worker
ClearImage(benchmark::State & state,vk::Format clearFormat,vk::ImageAspectFlagBits clearAspect)140*03ce13f7SAndroid Build Coastguard Worker static void ClearImage(benchmark::State &state, vk::Format clearFormat, vk::ImageAspectFlagBits clearAspect)
141*03ce13f7SAndroid Build Coastguard Worker {
142*03ce13f7SAndroid Build Coastguard Worker ClearImageBenchmark benchmark;
143*03ce13f7SAndroid Build Coastguard Worker benchmark.initialize(clearFormat, clearAspect);
144*03ce13f7SAndroid Build Coastguard Worker
145*03ce13f7SAndroid Build Coastguard Worker // Execute once to have the Reactor routine generated.
146*03ce13f7SAndroid Build Coastguard Worker benchmark.clear();
147*03ce13f7SAndroid Build Coastguard Worker
148*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
149*03ce13f7SAndroid Build Coastguard Worker {
150*03ce13f7SAndroid Build Coastguard Worker benchmark.clear();
151*03ce13f7SAndroid Build Coastguard Worker }
152*03ce13f7SAndroid Build Coastguard Worker }
153*03ce13f7SAndroid Build Coastguard Worker
154*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_CAPTURE(ClearImage, VK_FORMAT_R8G8B8A8_UNORM, vk::Format::eR8G8B8A8Unorm, vk::ImageAspectFlagBits::eColor)->Unit(benchmark::kMillisecond)->MeasureProcessCPUTime();
155*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_CAPTURE(ClearImage, VK_FORMAT_R32_SFLOAT, vk::Format::eR32Sfloat, vk::ImageAspectFlagBits::eColor)->Unit(benchmark::kMillisecond)->MeasureProcessCPUTime();
156*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_CAPTURE(ClearImage, VK_FORMAT_D32_SFLOAT, vk::Format::eD32Sfloat, vk::ImageAspectFlagBits::eDepth)->Unit(benchmark::kMillisecond)->MeasureProcessCPUTime();
157