1 #ifndef _VKTPIPELINEIMAGEUTIL_HPP 2 #define _VKTPIPELINEIMAGEUTIL_HPP 3 /*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2015 The Khronos Group Inc. 8 * Copyright (c) 2015 Imagination Technologies Ltd. 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 * 22 *//*! 23 * \file 24 * \brief Utilities for images. 25 *//*--------------------------------------------------------------------*/ 26 27 #include "tcuDefs.hpp" 28 #include "vkDefs.hpp" 29 #include "vkDefs.hpp" 30 #include "vkPlatform.hpp" 31 #include "vkMemUtil.hpp" 32 #include "vkRef.hpp" 33 #include "tcuTexture.hpp" 34 #include "tcuCompressedTexture.hpp" 35 #include "deSharedPtr.hpp" 36 37 namespace vkt 38 { 39 namespace pipeline 40 { 41 42 class TestTexture; 43 44 enum BorderColor 45 { 46 BORDER_COLOR_OPAQUE_BLACK, 47 BORDER_COLOR_OPAQUE_WHITE, 48 BORDER_COLOR_TRANSPARENT_BLACK, 49 50 BORDER_COLOR_COUNT 51 }; 52 53 bool isSupportedSamplableFormat (const vk::InstanceInterface& instanceInterface, 54 vk::VkPhysicalDevice device, 55 vk::VkFormat format); 56 bool isLinearFilteringSupported (const vk::InstanceInterface& instanceInterface, 57 vk::VkPhysicalDevice device, 58 vk::VkFormat format, 59 vk::VkImageTiling tiling); 60 61 bool isMinMaxFilteringSupported (const vk::InstanceInterface& instanceInterface, 62 vk::VkPhysicalDevice device, 63 vk::VkFormat format, 64 vk::VkImageTiling tiling); 65 66 vk::VkBorderColor getFormatBorderColor (BorderColor color, vk::VkFormat format); 67 68 void getLookupScaleBias (vk::VkFormat format, 69 tcu::Vec4& lookupScale, 70 tcu::Vec4& lookupBias); 71 72 /*--------------------------------------------------------------------*//*! 73 * Gets a tcu::TextureLevel initialized with data from a VK color 74 * attachment. 75 * 76 * The VkImage must be non-multisampled and able to be used as a source 77 * operand for transfer operations. 78 *//*--------------------------------------------------------------------*/ 79 de::MovePtr<tcu::TextureLevel> readColorAttachment (const vk::DeviceInterface& vk, 80 vk::VkDevice device, 81 vk::VkQueue queue, 82 deUint32 queueFamilyIndex, 83 vk::Allocator& allocator, 84 vk::VkImage image, 85 vk::VkFormat format, 86 const tcu::UVec2& renderSize); 87 88 /*--------------------------------------------------------------------*//*! 89 * Uploads data from a test texture to a destination VK image. 90 * 91 * The VkImage must be non-multisampled and able to be used as a 92 * destination operand for transfer operations. 93 *//*--------------------------------------------------------------------*/ 94 void uploadTestTexture (const vk::DeviceInterface& vk, 95 vk::VkDevice device, 96 vk::VkQueue queue, 97 deUint32 queueFamilyIndex, 98 vk::Allocator& allocator, 99 const TestTexture& testTexture, 100 vk::VkImage destImage); 101 102 /*--------------------------------------------------------------------*//*! 103 * Uploads data from a test texture to a destination VK image using sparse 104 * binding. 105 * 106 * The VkImage must be non-multisampled and able to be used as a 107 * destination operand for transfer operations. 108 *//*--------------------------------------------------------------------*/ 109 void uploadTestTextureSparse (const vk::DeviceInterface& vk, 110 vk::VkDevice device, 111 const vk::VkPhysicalDevice physicalDevice, 112 const vk::InstanceInterface& instance, 113 const vk::VkImageCreateInfo& imageCreateInfo, 114 vk::VkQueue universalQueue, 115 deUint32 universalQueueFamilyIndex, 116 vk::VkQueue sparseQueue, 117 vk::Allocator& allocator, 118 std::vector<de::SharedPtr<vk::Allocation> >& allocations, 119 const TestTexture& srcTexture, 120 vk::VkImage destImage); 121 122 class TestTexture 123 { 124 public: 125 TestTexture (const tcu::TextureFormat& format, int width, int height, int depth); 126 TestTexture (const tcu::CompressedTexFormat& format, int width, int height, int depth); 127 virtual ~TestTexture (void); 128 129 virtual int getNumLevels (void) const = 0; 130 virtual deUint32 getSize (void) const; getArraySize(void) const131 virtual int getArraySize (void) const { return 1; } 132 isCompressed(void) const133 virtual bool isCompressed (void) const { return !m_compressedLevels.empty(); } 134 virtual deUint32 getCompressedSize (void) const; 135 136 virtual tcu::PixelBufferAccess getLevel (int level, int layer) = 0; 137 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const = 0; 138 139 virtual tcu::CompressedTexture& getCompressedLevel (int level, int layer); 140 virtual const tcu::CompressedTexture& getCompressedLevel (int level, int layer) const; 141 142 virtual std::vector<vk::VkBufferImageCopy> getBufferCopyRegions (void) const; 143 virtual void write (deUint8* destPtr) const; 144 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const = 0; 145 146 virtual const tcu::TextureFormat& getTextureFormat (void) const = 0; 147 virtual tcu::UVec3 getTextureDimension (void) const = 0; 148 149 protected: 150 void populateLevels (const std::vector<tcu::PixelBufferAccess>& levels); 151 void populateCompressedLevels (tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels); 152 153 static void fillWithGradient (const tcu::PixelBufferAccess& levelAccess); 154 155 void copyToTexture (TestTexture&) const; 156 157 protected: 158 std::vector<tcu::CompressedTexture*> m_compressedLevels; 159 }; 160 161 class TestTexture1D : public TestTexture 162 { 163 private: 164 tcu::Texture1D m_texture; 165 166 public: 167 TestTexture1D (const tcu::TextureFormat& format, int width); 168 TestTexture1D (const tcu::CompressedTexFormat& format, int width); 169 virtual ~TestTexture1D (void); 170 171 virtual int getNumLevels (void) const; 172 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 173 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 174 virtual const tcu::Texture1D& getTexture (void) const; 175 virtual tcu::Texture1D& getTexture (void); getTextureFormat(void) const176 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const177 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); } 178 179 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 180 }; 181 182 class TestTexture1DArray : public TestTexture 183 { 184 private: 185 tcu::Texture1DArray m_texture; 186 187 public: 188 TestTexture1DArray (const tcu::TextureFormat& format, int width, int arraySize); 189 TestTexture1DArray (const tcu::CompressedTexFormat& format, int width, int arraySize); 190 virtual ~TestTexture1DArray (void); 191 192 virtual int getNumLevels (void) const; 193 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 194 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 195 virtual const tcu::Texture1DArray& getTexture (void) const; 196 virtual tcu::Texture1DArray& getTexture (void); 197 virtual int getArraySize (void) const; getTextureFormat(void) const198 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const199 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); } 200 201 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 202 }; 203 204 class TestTexture2D : public TestTexture 205 { 206 private: 207 tcu::Texture2D m_texture; 208 209 public: 210 TestTexture2D (const tcu::TextureFormat& format, int width, int height); 211 TestTexture2D (const tcu::TextureFormat& format, int width, int height, int miplevels); 212 TestTexture2D (const tcu::CompressedTexFormat& format, int width, int height); 213 virtual ~TestTexture2D (void); 214 215 virtual int getNumLevels (void) const; 216 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 217 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 218 virtual const tcu::Texture2D& getTexture (void) const; 219 virtual tcu::Texture2D& getTexture (void); getTextureFormat(void) const220 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const221 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); } 222 223 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 224 }; 225 226 class TestTexture2DArray : public TestTexture 227 { 228 private: 229 tcu::Texture2DArray m_texture; 230 231 public: 232 TestTexture2DArray (const tcu::TextureFormat& format, int width, int height, int arraySize); 233 TestTexture2DArray (const tcu::CompressedTexFormat& format, int width, int height, int arraySize); 234 virtual ~TestTexture2DArray (void); 235 236 virtual int getNumLevels (void) const; 237 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 238 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 239 virtual const tcu::Texture2DArray& getTexture (void) const; 240 virtual tcu::Texture2DArray& getTexture (void); 241 virtual int getArraySize (void) const; getTextureFormat(void) const242 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const243 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); } 244 245 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 246 }; 247 248 class TestTexture3D : public TestTexture 249 { 250 private: 251 tcu::Texture3D m_texture; 252 253 public: 254 TestTexture3D (const tcu::TextureFormat& format, int width, int height, int depth); 255 TestTexture3D (const tcu::CompressedTexFormat& format, int width, int height, int depth); 256 virtual ~TestTexture3D (void); 257 258 virtual int getNumLevels (void) const; 259 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 260 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 261 virtual const tcu::Texture3D& getTexture (void) const; 262 virtual tcu::Texture3D& getTexture (void); getTextureFormat(void) const263 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const264 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), m_texture.getDepth()); } 265 266 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 267 }; 268 269 class TestTextureCube : public TestTexture 270 { 271 private: 272 tcu::TextureCube m_texture; 273 274 public: 275 TestTextureCube (const tcu::TextureFormat& format, int size); 276 TestTextureCube (const tcu::CompressedTexFormat& format, int size); 277 virtual ~TestTextureCube (void); 278 279 virtual int getNumLevels (void) const; 280 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 281 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 282 virtual int getArraySize (void) const; 283 virtual const tcu::TextureCube& getTexture (void) const; 284 virtual tcu::TextureCube& getTexture (void); getTextureFormat(void) const285 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const286 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); } 287 288 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 289 }; 290 291 class TestTextureCubeArray: public TestTexture 292 { 293 private: 294 tcu::TextureCubeArray m_texture; 295 296 public: 297 TestTextureCubeArray (const tcu::TextureFormat& format, int size, int arraySize); 298 TestTextureCubeArray (const tcu::CompressedTexFormat& format, int size, int arraySize); 299 virtual ~TestTextureCubeArray (void); 300 301 virtual int getNumLevels (void) const; 302 virtual tcu::PixelBufferAccess getLevel (int level, int layer); 303 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const; 304 virtual int getArraySize (void) const; 305 virtual const tcu::TextureCubeArray& getTexture (void) const; 306 virtual tcu::TextureCubeArray& getTexture (void); getTextureFormat(void) const307 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); } getTextureDimension(void) const308 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); } 309 310 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const; 311 }; 312 313 } // pipeline 314 } // vkt 315 316 #endif // _VKTPIPELINEIMAGEUTIL_HPP 317