1 #ifndef _VKTSPARSERESOURCESTESTSUTIL_HPP
2 #define _VKTSPARSERESOURCESTESTSUTIL_HPP
3 /*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
6 *
7 * Copyright (c) 2016 The Khronos Group Inc.
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file vktSparseResourcesTestsUtil.hpp
23 * \brief Sparse Resources Tests Utility Classes
24 *//*--------------------------------------------------------------------*/
25
26 #include "vkDefs.hpp"
27 #include "vkMemUtil.hpp"
28 #include "vkRef.hpp"
29 #include "vkRefUtil.hpp"
30 #include "vkMemUtil.hpp"
31 #include "vkImageUtil.hpp"
32 #include "deSharedPtr.hpp"
33 #include "deUniquePtr.hpp"
34
35 namespace vkt
36 {
37 namespace sparse
38 {
39
40 typedef de::SharedPtr<vk::Unique<vk::VkDeviceMemory> > DeviceMemorySp;
41
42 enum ImageType
43 {
44 IMAGE_TYPE_1D = 0,
45 IMAGE_TYPE_1D_ARRAY,
46 IMAGE_TYPE_2D,
47 IMAGE_TYPE_2D_ARRAY,
48 IMAGE_TYPE_3D,
49 IMAGE_TYPE_CUBE,
50 IMAGE_TYPE_CUBE_ARRAY,
51 IMAGE_TYPE_BUFFER,
52
53 IMAGE_TYPE_LAST
54 };
55
56 enum FeatureFlagBits
57 {
58 FEATURE_TESSELLATION_SHADER = 1u << 0,
59 FEATURE_GEOMETRY_SHADER = 1u << 1,
60 FEATURE_SHADER_FLOAT_64 = 1u << 2,
61 FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS = 1u << 3,
62 FEATURE_FRAGMENT_STORES_AND_ATOMICS = 1u << 4,
63 FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE = 1u << 5,
64 };
65 typedef deUint32 FeatureFlags;
66
67 enum
68 {
69 BUFFER_IMAGE_COPY_OFFSET_GRANULARITY = 4u,
70 NO_MATCH_FOUND = ~((deUint32)0), //!< no matching index
71 };
72
73 vk::VkImageType mapImageType (const ImageType imageType);
74
75 vk::VkImageViewType mapImageViewType (const ImageType imageType);
76
77 std::string getImageTypeName (const ImageType imageType);
78
79 std::string getShaderImageType (const tcu::TextureFormat& format,
80 const ImageType imageType);
81
82 std::string getShaderImageDataType (const tcu::TextureFormat& format);
83
84 std::string getShaderImageFormatQualifier (const tcu::TextureFormat& format);
85
86 std::string getShaderImageCoordinates (const ImageType imageType,
87 const std::string& x,
88 const std::string& xy,
89 const std::string& xyz);
90
91 //!< Size used for addresing image in a compute shader
92 tcu::UVec3 getShaderGridSize (const ImageType imageType,
93 const tcu::UVec3& imageSize,
94 const deUint32 mipLevel = 0);
95
96 //!< Size of a single image layer
97 tcu::UVec3 getLayerSize (const ImageType imageType,
98 const tcu::UVec3& imageSize);
99
100 //!< Number of array layers (for array and cube types)
101 deUint32 getNumLayers (const ImageType imageType,
102 const tcu::UVec3& imageSize);
103
104 //!< Number of texels in an image
105 deUint32 getNumPixels (const ImageType imageType,
106 const tcu::UVec3& imageSize);
107
108 //!< Coordinate dimension used for addressing (e.g. 3 (x,y,z) for 2d array)
109 deUint32 getDimensions (const ImageType imageType);
110
111 //!< Coordinate dimension used for addressing a single layer (e.g. 2 (x,y) for 2d array)
112 deUint32 getLayerDimensions (const ImageType imageType);
113
114 //!< Helper function for checking if requested image size does not exceed device limits
115 bool isImageSizeSupported (const vk::InstanceInterface& instance,
116 const vk::VkPhysicalDevice physicalDevice,
117 const ImageType imageType,
118 const tcu::UVec3& imageSize);
119
120 vk::VkExtent3D mipLevelExtents (const vk::VkExtent3D& baseExtents,
121 const deUint32 mipLevel);
122
123 tcu::UVec3 mipLevelExtents (const tcu::UVec3& baseExtents,
124 const deUint32 mipLevel);
125
126 deUint32 getImageMaxMipLevels (const vk::VkImageFormatProperties& imageFormatProperties,
127 const vk::VkExtent3D& extent);
128
129 deUint32 getImageMipLevelSizeInBytes (const vk::VkExtent3D& baseExtents,
130 const deUint32 layersCount,
131 const tcu::TextureFormat& format,
132 const deUint32 mipmapLevel,
133 const deUint32 mipmapMemoryAlignment = 1u);
134
135 deUint32 getImageSizeInBytes (const vk::VkExtent3D& baseExtents,
136 const deUint32 layersCount,
137 const tcu::TextureFormat& format,
138 const deUint32 mipmapLevelsCount = 1u,
139 const deUint32 mipmapMemoryAlignment = 1u);
140
141 vk::Move<vk::VkCommandPool> makeCommandPool (const vk::DeviceInterface& vk,
142 const vk::VkDevice device,
143 const deUint32 queueFamilyIndex);
144
145 vk::Move<vk::VkCommandBuffer> makeCommandBuffer (const vk::DeviceInterface& vk,
146 const vk::VkDevice device,
147 const vk::VkCommandPool commandPool);
148
149 vk::Move<vk::VkPipelineLayout> makePipelineLayout (const vk::DeviceInterface& vk,
150 const vk::VkDevice device,
151 const vk::VkDescriptorSetLayout descriptorSetLayout = DE_NULL);
152
153 vk::Move<vk::VkPipeline> makeComputePipeline (const vk::DeviceInterface& vk,
154 const vk::VkDevice device,
155 const vk::VkPipelineLayout pipelineLayout,
156 const vk::VkShaderModule shaderModule,
157 const vk::VkSpecializationInfo* specializationInfo = 0);
158
159 vk::Move<vk::VkBufferView> makeBufferView (const vk::DeviceInterface& vk,
160 const vk::VkDevice device,
161 const vk::VkBuffer buffer,
162 const vk::VkFormat format,
163 const vk::VkDeviceSize offset,
164 const vk::VkDeviceSize size);
165
166 vk::Move<vk::VkImageView> makeImageView (const vk::DeviceInterface& vk,
167 const vk::VkDevice device,
168 const vk::VkImage image,
169 const vk::VkImageViewType imageViewType,
170 const vk::VkFormat format,
171 const vk::VkImageSubresourceRange subresourceRange);
172
173 vk::Move<vk::VkDescriptorSet> makeDescriptorSet (const vk::DeviceInterface& vk,
174 const vk::VkDevice device,
175 const vk::VkDescriptorPool descriptorPool,
176 const vk::VkDescriptorSetLayout setLayout);
177
178 vk::Move<vk::VkSemaphore> makeSemaphore (const vk::DeviceInterface& vk,
179 const vk::VkDevice device);
180
181 vk::Move<vk::VkFence> makeFence (const vk::DeviceInterface& vk,
182 const vk::VkDevice device,
183 const vk::VkFenceCreateFlags flags = 0u);
184
185 vk::Move<vk::VkFramebuffer> makeFramebuffer (const vk::DeviceInterface& vk,
186 const vk::VkDevice device,
187 const vk::VkRenderPass renderPass,
188 const deUint32 attachmentCount,
189 const vk::VkImageView* pAttachments,
190 const deUint32 width,
191 const deUint32 height,
192 const deUint32 layers = 1u);
193
194 de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk,
195 const vk::VkDevice device,
196 vk::Allocator& allocator,
197 const vk::VkImage image,
198 const vk::MemoryRequirement requirement);
199
200 de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk,
201 const vk::VkDevice device,
202 vk::Allocator& allocator,
203 const vk::VkBuffer buffer,
204 const vk::MemoryRequirement requirement);
205
206 vk::VkBufferCreateInfo makeBufferCreateInfo (const vk::VkDeviceSize bufferSize,
207 const vk::VkBufferUsageFlags usage);
208
209 vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkExtent3D extent,
210 const deUint32 layersCount,
211 const deUint32 mipmapLevel = 0u,
212 const vk::VkDeviceSize bufferOffset = 0ull);
213
214 vk::VkBufferMemoryBarrier makeBufferMemoryBarrier (const vk::VkAccessFlags srcAccessMask,
215 const vk::VkAccessFlags dstAccessMask,
216 const vk::VkBuffer buffer,
217 const vk::VkDeviceSize offset,
218 const vk::VkDeviceSize bufferSizeBytes);
219
220 vk::VkImageMemoryBarrier makeImageMemoryBarrier (const vk::VkAccessFlags srcAccessMask,
221 const vk::VkAccessFlags dstAccessMask,
222 const vk::VkImageLayout oldLayout,
223 const vk::VkImageLayout newLayout,
224 const vk::VkImage image,
225 const vk::VkImageSubresourceRange subresourceRange);
226
227 vk::VkImageMemoryBarrier makeImageMemoryBarrier (const vk::VkAccessFlags srcAccessMask,
228 const vk::VkAccessFlags dstAccessMask,
229 const vk::VkImageLayout oldLayout,
230 const vk::VkImageLayout newLayout,
231 const deUint32 srcQueueFamilyIndex,
232 const deUint32 destQueueFamilyIndex,
233 const vk::VkImage image,
234 const vk::VkImageSubresourceRange subresourceRange);
235
236 vk::VkMemoryBarrier makeMemoryBarrier (const vk::VkAccessFlags srcAccessMask,
237 const vk::VkAccessFlags dstAccessMask);
238
239 vk::VkSparseImageMemoryBind makeSparseImageMemoryBind (const vk::DeviceInterface& vk,
240 const vk::VkDevice device,
241 const vk::VkDeviceSize allocationSize,
242 const deUint32 memoryType,
243 const vk::VkImageSubresource& subresource,
244 const vk::VkOffset3D& offset,
245 const vk::VkExtent3D& extent);
246
247 vk::VkSparseMemoryBind makeSparseMemoryBind (const vk::DeviceInterface& vk,
248 const vk::VkDevice device,
249 const vk::VkDeviceSize allocationSize,
250 const deUint32 memoryType,
251 const vk::VkDeviceSize resourceOffset);
252
253 void beginCommandBuffer (const vk::DeviceInterface& vk,
254 const vk::VkCommandBuffer cmdBuffer);
255
256 void endCommandBuffer (const vk::DeviceInterface& vk,
257 const vk::VkCommandBuffer cmdBuffer);
258
259 void submitCommands (const vk::DeviceInterface& vk,
260 const vk::VkQueue queue,
261 const vk::VkCommandBuffer cmdBuffer,
262 const deUint32 waitSemaphoreCount = 0,
263 const vk::VkSemaphore* pWaitSemaphores = DE_NULL,
264 const vk::VkPipelineStageFlags* pWaitDstStageMask = DE_NULL,
265 const deUint32 signalSemaphoreCount = 0,
266 const vk::VkSemaphore* pSignalSemaphores = DE_NULL);
267
268 void submitCommandsAndWait (const vk::DeviceInterface& vk,
269 const vk::VkDevice device,
270 const vk::VkQueue queue,
271 const vk::VkCommandBuffer cmdBuffer,
272 const deUint32 waitSemaphoreCount = 0,
273 const vk::VkSemaphore* pWaitSemaphores = DE_NULL,
274 const vk::VkPipelineStageFlags* pWaitDstStageMask = DE_NULL,
275 const deUint32 signalSemaphoreCount = 0,
276 const vk::VkSemaphore* pSignalSemaphores = DE_NULL);
277
278 void requireFeatures (const vk::InstanceInterface& vki,
279 const vk::VkPhysicalDevice physicalDevice,
280 const FeatureFlags flags);
281
282 deUint32 findMatchingMemoryType (const vk::InstanceInterface& instance,
283 const vk::VkPhysicalDevice physicalDevice,
284 const vk::VkMemoryRequirements& objectMemoryRequirements,
285 const vk::MemoryRequirement& memoryRequirement);
286
287 bool checkSparseSupportForImageType (const vk::InstanceInterface& instance,
288 const vk::VkPhysicalDevice physicalDevice,
289 const ImageType imageType);
290
291 bool checkSparseSupportForImageFormat (const vk::InstanceInterface& instance,
292 const vk::VkPhysicalDevice physicalDevice,
293 const vk::VkImageCreateInfo& imageInfo);
294
295 bool checkImageFormatFeatureSupport (const vk::InstanceInterface& instance,
296 const vk::VkPhysicalDevice physicalDevice,
297 const vk::VkFormat format,
298 const vk::VkFormatFeatureFlags featureFlags);
299
300 deUint32 getSparseAspectRequirementsIndex (const std::vector<vk::VkSparseImageMemoryRequirements>& requirements,
301 const vk::VkImageAspectFlags aspectFlags);
302
makeBuffer(const vk::DeviceInterface & vk,const vk::VkDevice device,const vk::VkBufferCreateInfo & createInfo)303 inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
304 {
305 return createBuffer(vk, device, &createInfo);
306 }
307
makeImage(const vk::DeviceInterface & vk,const vk::VkDevice device,const vk::VkImageCreateInfo & createInfo)308 inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
309 {
310 return createImage(vk, device, &createInfo);
311 }
312
313 template<typename T>
makeVkSharedPtr(vk::Move<T> vkMove)314 inline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove)
315 {
316 return de::SharedPtr<vk::Unique<T> >(new vk::Unique<T>(vkMove));
317 }
318
319 template<typename T>
makeDeSharedPtr(de::MovePtr<T> deMove)320 inline de::SharedPtr<de::UniquePtr<T> > makeDeSharedPtr (de::MovePtr<T> deMove)
321 {
322 return de::SharedPtr<de::UniquePtr<T> >(new de::UniquePtr<T>(deMove));
323 }
324
325 template<typename T>
sizeInBytes(const std::vector<T> & vec)326 inline std::size_t sizeInBytes (const std::vector<T>& vec)
327 {
328 return vec.size() * sizeof(vec[0]);
329 }
330
331 template<typename T>
getDataOrNullptr(const std::vector<T> & vec,const std::size_t index=0u)332 inline const T* getDataOrNullptr (const std::vector<T>& vec, const std::size_t index = 0u)
333 {
334 return (index < vec.size() ? &vec[index] : DE_NULL);
335 }
336
337 } // sparse
338 } // vkt
339
340 #endif // _VKTSPARSERESOURCESTESTSUTIL_HPP
341