1e5c31af7Sopenharmony_ci#ifndef _VKTSPARSERESOURCESTESTSUTIL_HPP 2e5c31af7Sopenharmony_ci#define _VKTSPARSERESOURCESTESTSUTIL_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------ 4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests 5e5c31af7Sopenharmony_ci * ------------------------ 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright (c) 2016 The Khronos Group Inc. 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci *//*! 22e5c31af7Sopenharmony_ci * \file vktSparseResourcesTestsUtil.hpp 23e5c31af7Sopenharmony_ci * \brief Sparse Resources Tests Utility Classes 24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "vkDefs.hpp" 27e5c31af7Sopenharmony_ci#include "vkObjUtil.hpp" 28e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp" 29e5c31af7Sopenharmony_ci#include "vkRef.hpp" 30e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp" 31e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp" 32e5c31af7Sopenharmony_ci#include "vkImageUtil.hpp" 33e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp" 34e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp" 35e5c31af7Sopenharmony_ci 36e5c31af7Sopenharmony_cinamespace vkt 37e5c31af7Sopenharmony_ci{ 38e5c31af7Sopenharmony_cinamespace sparse 39e5c31af7Sopenharmony_ci{ 40e5c31af7Sopenharmony_ci 41e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Unique<vk::VkDeviceMemory> > DeviceMemorySp; 42e5c31af7Sopenharmony_ci 43e5c31af7Sopenharmony_cienum ImageType 44e5c31af7Sopenharmony_ci{ 45e5c31af7Sopenharmony_ci IMAGE_TYPE_1D = 0, 46e5c31af7Sopenharmony_ci IMAGE_TYPE_1D_ARRAY, 47e5c31af7Sopenharmony_ci IMAGE_TYPE_2D, 48e5c31af7Sopenharmony_ci IMAGE_TYPE_2D_ARRAY, 49e5c31af7Sopenharmony_ci IMAGE_TYPE_3D, 50e5c31af7Sopenharmony_ci IMAGE_TYPE_CUBE, 51e5c31af7Sopenharmony_ci IMAGE_TYPE_CUBE_ARRAY, 52e5c31af7Sopenharmony_ci IMAGE_TYPE_BUFFER, 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_ci IMAGE_TYPE_LAST 55e5c31af7Sopenharmony_ci}; 56e5c31af7Sopenharmony_ci 57e5c31af7Sopenharmony_cienum FeatureFlagBits 58e5c31af7Sopenharmony_ci{ 59e5c31af7Sopenharmony_ci FEATURE_TESSELLATION_SHADER = 1u << 0, 60e5c31af7Sopenharmony_ci FEATURE_GEOMETRY_SHADER = 1u << 1, 61e5c31af7Sopenharmony_ci FEATURE_SHADER_FLOAT_64 = 1u << 2, 62e5c31af7Sopenharmony_ci FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS = 1u << 3, 63e5c31af7Sopenharmony_ci FEATURE_FRAGMENT_STORES_AND_ATOMICS = 1u << 4, 64e5c31af7Sopenharmony_ci FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE = 1u << 5, 65e5c31af7Sopenharmony_ci}; 66e5c31af7Sopenharmony_citypedef deUint32 FeatureFlags; 67e5c31af7Sopenharmony_ci 68e5c31af7Sopenharmony_cienum 69e5c31af7Sopenharmony_ci{ 70e5c31af7Sopenharmony_ci NO_MATCH_FOUND = ~((deUint32)0), //!< no matching index 71e5c31af7Sopenharmony_ci}; 72e5c31af7Sopenharmony_ci 73e5c31af7Sopenharmony_cistruct TestFormat 74e5c31af7Sopenharmony_ci{ 75e5c31af7Sopenharmony_ci vk::VkFormat format; 76e5c31af7Sopenharmony_ci}; 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_cistruct TestImageParameters 79e5c31af7Sopenharmony_ci{ 80e5c31af7Sopenharmony_ci ImageType imageType; 81e5c31af7Sopenharmony_ci std::vector<tcu::UVec3> imageSizes; 82e5c31af7Sopenharmony_ci std::vector<TestFormat> formats; 83e5c31af7Sopenharmony_ci 84e5c31af7Sopenharmony_ci TestImageParameters (ImageType imageType_, const std::vector<tcu::UVec3>& imageSizes_, const std::vector<TestFormat>& formats_) 85e5c31af7Sopenharmony_ci : imageType (imageType_) 86e5c31af7Sopenharmony_ci , imageSizes (imageSizes_) 87e5c31af7Sopenharmony_ci , formats (formats_) 88e5c31af7Sopenharmony_ci {} 89e5c31af7Sopenharmony_ci}; 90e5c31af7Sopenharmony_ci 91e5c31af7Sopenharmony_cibool formatIsR64 (const vk::VkFormat& format); 92e5c31af7Sopenharmony_ci 93e5c31af7Sopenharmony_cistd::vector<TestFormat> getTestFormats (const ImageType& imageType); 94e5c31af7Sopenharmony_ci 95e5c31af7Sopenharmony_civk::VkImageType mapImageType (const ImageType imageType); 96e5c31af7Sopenharmony_ci 97e5c31af7Sopenharmony_civk::VkImageViewType mapImageViewType (const ImageType imageType); 98e5c31af7Sopenharmony_ci 99e5c31af7Sopenharmony_cistd::string getImageTypeName (const ImageType imageType); 100e5c31af7Sopenharmony_ci 101e5c31af7Sopenharmony_cistd::string getShaderImageType (const tcu::TextureFormat& format, 102e5c31af7Sopenharmony_ci const ImageType imageType); 103e5c31af7Sopenharmony_ci 104e5c31af7Sopenharmony_cistd::string getShaderImageType (const vk::PlanarFormatDescription& description, 105e5c31af7Sopenharmony_ci const ImageType imageType); 106e5c31af7Sopenharmony_ci 107e5c31af7Sopenharmony_cistd::string getShaderImageDataType (const tcu::TextureFormat& format); 108e5c31af7Sopenharmony_ci 109e5c31af7Sopenharmony_cistd::string getShaderImageDataType (const vk::PlanarFormatDescription& description); 110e5c31af7Sopenharmony_ci 111e5c31af7Sopenharmony_cistd::string getShaderImageFormatQualifier (const tcu::TextureFormat& format); 112e5c31af7Sopenharmony_ci 113e5c31af7Sopenharmony_cistd::string getShaderImageFormatQualifier (vk::VkFormat format); 114e5c31af7Sopenharmony_ci 115e5c31af7Sopenharmony_cistd::string getImageFormatID (vk::VkFormat format); 116e5c31af7Sopenharmony_ci 117e5c31af7Sopenharmony_cistd::string getShaderImageCoordinates (const ImageType imageType, 118e5c31af7Sopenharmony_ci const std::string& x, 119e5c31af7Sopenharmony_ci const std::string& xy, 120e5c31af7Sopenharmony_ci const std::string& xyz); 121e5c31af7Sopenharmony_ci 122e5c31af7Sopenharmony_ci//!< Size used for addresing image in a compute shader 123e5c31af7Sopenharmony_citcu::UVec3 getShaderGridSize (const ImageType imageType, 124e5c31af7Sopenharmony_ci const tcu::UVec3& imageSize, 125e5c31af7Sopenharmony_ci const deUint32 mipLevel = 0); 126e5c31af7Sopenharmony_ci 127e5c31af7Sopenharmony_ci//!< Size of a single image layer 128e5c31af7Sopenharmony_citcu::UVec3 getLayerSize (const ImageType imageType, 129e5c31af7Sopenharmony_ci const tcu::UVec3& imageSize); 130e5c31af7Sopenharmony_ci 131e5c31af7Sopenharmony_ci//!< Number of array layers (for array and cube types) 132e5c31af7Sopenharmony_cideUint32 getNumLayers (const ImageType imageType, 133e5c31af7Sopenharmony_ci const tcu::UVec3& imageSize); 134e5c31af7Sopenharmony_ci 135e5c31af7Sopenharmony_ci//!< Number of texels in an image 136e5c31af7Sopenharmony_cideUint32 getNumPixels (const ImageType imageType, 137e5c31af7Sopenharmony_ci const tcu::UVec3& imageSize); 138e5c31af7Sopenharmony_ci 139e5c31af7Sopenharmony_ci//!< Coordinate dimension used for addressing (e.g. 3 (x,y,z) for 2d array) 140e5c31af7Sopenharmony_cideUint32 getDimensions (const ImageType imageType); 141e5c31af7Sopenharmony_ci 142e5c31af7Sopenharmony_ci//!< Coordinate dimension used for addressing a single layer (e.g. 2 (x,y) for 2d array) 143e5c31af7Sopenharmony_cideUint32 getLayerDimensions (const ImageType imageType); 144e5c31af7Sopenharmony_ci 145e5c31af7Sopenharmony_ci//!< Helper function for checking if requested image size does not exceed device limits 146e5c31af7Sopenharmony_cibool isImageSizeSupported (const vk::InstanceInterface& instance, 147e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 148e5c31af7Sopenharmony_ci const ImageType imageType, 149e5c31af7Sopenharmony_ci const tcu::UVec3& imageSize); 150e5c31af7Sopenharmony_ci 151e5c31af7Sopenharmony_cideUint32 getImageMipLevelSizeInBytes (const vk::VkExtent3D& baseExtents, 152e5c31af7Sopenharmony_ci const deUint32 layersCount, 153e5c31af7Sopenharmony_ci const tcu::TextureFormat& format, 154e5c31af7Sopenharmony_ci const deUint32 mipmapLevel, 155e5c31af7Sopenharmony_ci const deUint32 mipmapMemoryAlignment = 1u); 156e5c31af7Sopenharmony_ci 157e5c31af7Sopenharmony_cideUint32 getImageSizeInBytes (const vk::VkExtent3D& baseExtents, 158e5c31af7Sopenharmony_ci const deUint32 layersCount, 159e5c31af7Sopenharmony_ci const tcu::TextureFormat& format, 160e5c31af7Sopenharmony_ci const deUint32 mipmapLevelsCount = 1u, 161e5c31af7Sopenharmony_ci const deUint32 mipmapMemoryAlignment = 1u); 162e5c31af7Sopenharmony_ci 163e5c31af7Sopenharmony_cideUint32 getImageMipLevelSizeInBytes (const vk::VkExtent3D& baseExtents, 164e5c31af7Sopenharmony_ci const deUint32 layersCount, 165e5c31af7Sopenharmony_ci const vk::PlanarFormatDescription& formatDescription, 166e5c31af7Sopenharmony_ci const deUint32 planeNdx, 167e5c31af7Sopenharmony_ci const deUint32 mipmapLevel, 168e5c31af7Sopenharmony_ci const deUint32 mipmapMemoryAlignment = 1u); 169e5c31af7Sopenharmony_ci 170e5c31af7Sopenharmony_cideUint32 getImageSizeInBytes (const vk::VkExtent3D& baseExtents, 171e5c31af7Sopenharmony_ci const deUint32 layersCount, 172e5c31af7Sopenharmony_ci const vk::PlanarFormatDescription& formatDescription, 173e5c31af7Sopenharmony_ci const deUint32 planeNdx, 174e5c31af7Sopenharmony_ci const deUint32 mipmapLevelsCount =1u, 175e5c31af7Sopenharmony_ci const deUint32 mipmapMemoryAlignment =1u); 176e5c31af7Sopenharmony_ci 177e5c31af7Sopenharmony_civk::VkBufferImageCopy makeBufferImageCopy (const vk::VkExtent3D extent, 178e5c31af7Sopenharmony_ci const deUint32 layersCount, 179e5c31af7Sopenharmony_ci const deUint32 mipmapLevel = 0u, 180e5c31af7Sopenharmony_ci const vk::VkDeviceSize bufferOffset = 0ull); 181e5c31af7Sopenharmony_ci 182e5c31af7Sopenharmony_civk::VkSparseImageMemoryBind makeSparseImageMemoryBind (const vk::DeviceInterface& vk, 183e5c31af7Sopenharmony_ci const vk::VkDevice device, 184e5c31af7Sopenharmony_ci const vk::VkDeviceSize allocationSize, 185e5c31af7Sopenharmony_ci const deUint32 memoryType, 186e5c31af7Sopenharmony_ci const vk::VkImageSubresource& subresource, 187e5c31af7Sopenharmony_ci const vk::VkOffset3D& offset, 188e5c31af7Sopenharmony_ci const vk::VkExtent3D& extent); 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_civk::VkSparseMemoryBind makeSparseMemoryBind (const vk::DeviceInterface& vk, 191e5c31af7Sopenharmony_ci const vk::VkDevice device, 192e5c31af7Sopenharmony_ci const vk::VkDeviceSize allocationSize, 193e5c31af7Sopenharmony_ci const deUint32 memoryType, 194e5c31af7Sopenharmony_ci const vk::VkDeviceSize resourceOffset, 195e5c31af7Sopenharmony_ci const vk::VkSparseMemoryBindFlags flags = 0u); 196e5c31af7Sopenharmony_ci 197e5c31af7Sopenharmony_civoid submitCommands (const vk::DeviceInterface& vk, 198e5c31af7Sopenharmony_ci const vk::VkQueue queue, 199e5c31af7Sopenharmony_ci const vk::VkCommandBuffer cmdBuffer, 200e5c31af7Sopenharmony_ci const deUint32 waitSemaphoreCount = 0, 201e5c31af7Sopenharmony_ci const vk::VkSemaphore* pWaitSemaphores = DE_NULL, 202e5c31af7Sopenharmony_ci const vk::VkPipelineStageFlags* pWaitDstStageMask = DE_NULL, 203e5c31af7Sopenharmony_ci const deUint32 signalSemaphoreCount = 0, 204e5c31af7Sopenharmony_ci const vk::VkSemaphore* pSignalSemaphores = DE_NULL); 205e5c31af7Sopenharmony_ci 206e5c31af7Sopenharmony_civoid submitCommandsAndWait (const vk::DeviceInterface& vk, 207e5c31af7Sopenharmony_ci const vk::VkDevice device, 208e5c31af7Sopenharmony_ci const vk::VkQueue queue, 209e5c31af7Sopenharmony_ci const vk::VkCommandBuffer cmdBuffer, 210e5c31af7Sopenharmony_ci const deUint32 waitSemaphoreCount = 0, 211e5c31af7Sopenharmony_ci const vk::VkSemaphore* pWaitSemaphores = DE_NULL, 212e5c31af7Sopenharmony_ci const vk::VkPipelineStageFlags* pWaitDstStageMask = DE_NULL, 213e5c31af7Sopenharmony_ci const deUint32 signalSemaphoreCount = 0, 214e5c31af7Sopenharmony_ci const vk::VkSemaphore* pSignalSemaphores = DE_NULL, 215e5c31af7Sopenharmony_ci const bool useDeviceGroups = false, 216e5c31af7Sopenharmony_ci const deUint32 physicalDeviceID = 0); 217e5c31af7Sopenharmony_ci 218e5c31af7Sopenharmony_civoid requireFeatures (const vk::InstanceInterface& vki, 219e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 220e5c31af7Sopenharmony_ci const FeatureFlags flags); 221e5c31af7Sopenharmony_ci 222e5c31af7Sopenharmony_cideUint32 findMatchingMemoryType (const vk::InstanceInterface& instance, 223e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 224e5c31af7Sopenharmony_ci const vk::VkMemoryRequirements& objectMemoryRequirements, 225e5c31af7Sopenharmony_ci const vk::MemoryRequirement& memoryRequirement); 226e5c31af7Sopenharmony_ci 227e5c31af7Sopenharmony_cideUint32 getHeapIndexForMemoryType (const vk::InstanceInterface& instance, 228e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 229e5c31af7Sopenharmony_ci const deUint32 memoryType); 230e5c31af7Sopenharmony_ci 231e5c31af7Sopenharmony_cibool checkSparseSupportForImageType (const vk::InstanceInterface& instance, 232e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 233e5c31af7Sopenharmony_ci const ImageType imageType); 234e5c31af7Sopenharmony_ci 235e5c31af7Sopenharmony_cibool checkSparseSupportForImageFormat (const vk::InstanceInterface& instance, 236e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 237e5c31af7Sopenharmony_ci const vk::VkImageCreateInfo& imageInfo); 238e5c31af7Sopenharmony_ci 239e5c31af7Sopenharmony_cibool checkImageFormatFeatureSupport (const vk::InstanceInterface& instance, 240e5c31af7Sopenharmony_ci const vk::VkPhysicalDevice physicalDevice, 241e5c31af7Sopenharmony_ci const vk::VkFormat format, 242e5c31af7Sopenharmony_ci const vk::VkFormatFeatureFlags featureFlags); 243e5c31af7Sopenharmony_ci 244e5c31af7Sopenharmony_cideUint32 getSparseAspectRequirementsIndex (const std::vector<vk::VkSparseImageMemoryRequirements>& requirements, 245e5c31af7Sopenharmony_ci const vk::VkImageAspectFlags aspectFlags); 246e5c31af7Sopenharmony_ci 247e5c31af7Sopenharmony_civk::VkFormat getPlaneCompatibleFormatForWriting (const vk::PlanarFormatDescription& formatInfo, 248e5c31af7Sopenharmony_ci deUint32 planeNdx); 249e5c31af7Sopenharmony_ci 250e5c31af7Sopenharmony_cibool areLsb6BitsDontCare(vk::VkFormat format); 251e5c31af7Sopenharmony_ci 252e5c31af7Sopenharmony_cibool areLsb4BitsDontCare(vk::VkFormat format); 253e5c31af7Sopenharmony_ci 254e5c31af7Sopenharmony_citemplate<typename T> 255e5c31af7Sopenharmony_ciinline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove) 256e5c31af7Sopenharmony_ci{ 257e5c31af7Sopenharmony_ci return de::SharedPtr<vk::Unique<T> >(new vk::Unique<T>(vkMove)); 258e5c31af7Sopenharmony_ci} 259e5c31af7Sopenharmony_ci 260e5c31af7Sopenharmony_citemplate<typename T> 261e5c31af7Sopenharmony_ciinline de::SharedPtr<de::UniquePtr<T> > makeDeSharedPtr (de::MovePtr<T> deMove) 262e5c31af7Sopenharmony_ci{ 263e5c31af7Sopenharmony_ci return de::SharedPtr<de::UniquePtr<T> >(new de::UniquePtr<T>(deMove)); 264e5c31af7Sopenharmony_ci} 265e5c31af7Sopenharmony_ci 266e5c31af7Sopenharmony_citemplate<typename T> 267e5c31af7Sopenharmony_ciinline std::size_t sizeInBytes (const std::vector<T>& vec) 268e5c31af7Sopenharmony_ci{ 269e5c31af7Sopenharmony_ci return vec.size() * sizeof(vec[0]); 270e5c31af7Sopenharmony_ci} 271e5c31af7Sopenharmony_ci 272e5c31af7Sopenharmony_citemplate<typename T> 273e5c31af7Sopenharmony_ciinline const T* getDataOrNullptr (const std::vector<T>& vec, const std::size_t index = 0u) 274e5c31af7Sopenharmony_ci{ 275e5c31af7Sopenharmony_ci return (index < vec.size() ? &vec[index] : DE_NULL); 276e5c31af7Sopenharmony_ci} 277e5c31af7Sopenharmony_ci 278e5c31af7Sopenharmony_ci} // sparse 279e5c31af7Sopenharmony_ci} // vkt 280e5c31af7Sopenharmony_ci 281e5c31af7Sopenharmony_ci#endif // _VKTSPARSERESOURCESTESTSUTIL_HPP 282