xref: /aosp_15_r20/external/swiftshader/tests/VulkanBenchmarks/ClearImageBenchmarks.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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