1 #ifndef _VKTPIPELINEIMAGEUTIL_HPP
2 #define _VKTPIPELINEIMAGEUTIL_HPP
3 /*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
7 * Copyright (c) 2015 The Khronos Group Inc.
8 * Copyright (c) 2015 Imagination Technologies Ltd.
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
14 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 * \brief Utilities for images.
25 *//*--------------------------------------------------------------------*/
27 #include "tcuDefs.hpp"
30 #include "vkPlatform.hpp"
31 #include "vkMemUtil.hpp"
33 #include "tcuTexture.hpp"
34 #include "tcuCompressedTexture.hpp"
35 #include "deSharedPtr.hpp"
46 BORDER_COLOR_OPAQUE_BLACK,
47 BORDER_COLOR_OPAQUE_WHITE,
48 BORDER_COLOR_TRANSPARENT_BLACK,
53 bool isSupportedSamplableFormat (const vk::InstanceInterface& instanceInterface,
54 vk::VkPhysicalDevice device,
56 bool isLinearFilteringSupported (const vk::InstanceInterface& instanceInterface,
57 vk::VkPhysicalDevice device,
59 vk::VkImageTiling tiling);
61 vk::VkBorderColor getFormatBorderColor (BorderColor color, vk::VkFormat format);
63 void getLookupScaleBias (vk::VkFormat format,
64 tcu::Vec4& lookupScale,
65 tcu::Vec4& lookupBias);
67 /*--------------------------------------------------------------------*//*!
68 * Gets a tcu::TextureLevel initialized with data from a VK color
71 * The VkImage must be non-multisampled and able to be used as a source
72 * operand for transfer operations.
73 *//*--------------------------------------------------------------------*/
74 de::MovePtr<tcu::TextureLevel> readColorAttachment (const vk::DeviceInterface& vk,
77 deUint32 queueFamilyIndex,
78 vk::Allocator& allocator,
81 const tcu::UVec2& renderSize);
83 /*--------------------------------------------------------------------*//*!
84 * Uploads data from a test texture to a destination VK image.
86 * The VkImage must be non-multisampled and able to be used as a
87 * destination operand for transfer operations.
88 *//*--------------------------------------------------------------------*/
89 void uploadTestTexture (const vk::DeviceInterface& vk,
92 deUint32 queueFamilyIndex,
93 vk::Allocator& allocator,
94 const TestTexture& testTexture,
95 vk::VkImage destImage);
97 /*--------------------------------------------------------------------*//*!
98 * Uploads data from a test texture to a destination VK image using sparse
101 * The VkImage must be non-multisampled and able to be used as a
102 * destination operand for transfer operations.
103 *//*--------------------------------------------------------------------*/
104 void uploadTestTextureSparse (const vk::DeviceInterface& vk,
106 const vk::VkPhysicalDevice physicalDevice,
107 const vk::InstanceInterface& instance,
108 const vk::VkImageCreateInfo& imageCreateInfo,
110 deUint32 queueFamilyIndex,
111 vk::Allocator& allocator,
112 std::vector<de::SharedPtr<vk::Allocation> >& allocations,
113 const TestTexture& srcTexture,
114 vk::VkImage destImage);
119 TestTexture (const tcu::TextureFormat& format, int width, int height, int depth);
120 TestTexture (const tcu::CompressedTexFormat& format, int width, int height, int depth);
121 virtual ~TestTexture (void);
123 virtual int getNumLevels (void) const = 0;
124 virtual deUint32 getSize (void) const;
125 virtual int getArraySize (void) const { return 1; }
127 virtual bool isCompressed (void) const { return !m_compressedLevels.empty(); }
128 virtual deUint32 getCompressedSize (void) const;
130 virtual tcu::PixelBufferAccess getLevel (int level, int layer) = 0;
131 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const = 0;
133 virtual tcu::CompressedTexture& getCompressedLevel (int level, int layer);
134 virtual const tcu::CompressedTexture& getCompressedLevel (int level, int layer) const;
136 virtual std::vector<vk::VkBufferImageCopy> getBufferCopyRegions (void) const;
137 virtual void write (deUint8* destPtr) const;
138 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const = 0;
140 virtual const tcu::TextureFormat& getTextureFormat (void) const = 0;
141 virtual tcu::UVec3 getTextureDimension (void) const = 0;
144 void populateLevels (const std::vector<tcu::PixelBufferAccess>& levels);
145 void populateCompressedLevels (tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels);
147 static void fillWithGradient (const tcu::PixelBufferAccess& levelAccess);
149 void copyToTexture (TestTexture&) const;
152 std::vector<tcu::CompressedTexture*> m_compressedLevels;
155 class TestTexture1D : public TestTexture
158 tcu::Texture1D m_texture;
161 TestTexture1D (const tcu::TextureFormat& format, int width);
162 TestTexture1D (const tcu::CompressedTexFormat& format, int width);
163 virtual ~TestTexture1D (void);
165 virtual int getNumLevels (void) const;
166 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
167 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
168 virtual const tcu::Texture1D& getTexture (void) const;
169 virtual tcu::Texture1D& getTexture (void);
170 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
171 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
173 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
176 class TestTexture1DArray : public TestTexture
179 tcu::Texture1DArray m_texture;
182 TestTexture1DArray (const tcu::TextureFormat& format, int width, int arraySize);
183 TestTexture1DArray (const tcu::CompressedTexFormat& format, int width, int arraySize);
184 virtual ~TestTexture1DArray (void);
186 virtual int getNumLevels (void) const;
187 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
188 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
189 virtual const tcu::Texture1DArray& getTexture (void) const;
190 virtual tcu::Texture1DArray& getTexture (void);
191 virtual int getArraySize (void) const;
192 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
193 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
195 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
198 class TestTexture2D : public TestTexture
201 tcu::Texture2D m_texture;
204 TestTexture2D (const tcu::TextureFormat& format, int width, int height);
205 TestTexture2D (const tcu::CompressedTexFormat& format, int width, int height);
206 virtual ~TestTexture2D (void);
208 virtual int getNumLevels (void) const;
209 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
210 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
211 virtual const tcu::Texture2D& getTexture (void) const;
212 virtual tcu::Texture2D& getTexture (void);
213 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
214 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
216 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
219 class TestTexture2DArray : public TestTexture
222 tcu::Texture2DArray m_texture;
225 TestTexture2DArray (const tcu::TextureFormat& format, int width, int height, int arraySize);
226 TestTexture2DArray (const tcu::CompressedTexFormat& format, int width, int height, int arraySize);
227 virtual ~TestTexture2DArray (void);
229 virtual int getNumLevels (void) const;
230 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
231 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
232 virtual const tcu::Texture2DArray& getTexture (void) const;
233 virtual tcu::Texture2DArray& getTexture (void);
234 virtual int getArraySize (void) const;
235 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
236 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
238 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
241 class TestTexture3D : public TestTexture
244 tcu::Texture3D m_texture;
247 TestTexture3D (const tcu::TextureFormat& format, int width, int height, int depth);
248 TestTexture3D (const tcu::CompressedTexFormat& format, int width, int height, int depth);
249 virtual ~TestTexture3D (void);
251 virtual int getNumLevels (void) const;
252 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
253 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
254 virtual const tcu::Texture3D& getTexture (void) const;
255 virtual tcu::Texture3D& getTexture (void);
256 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
257 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), m_texture.getDepth()); }
259 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
262 class TestTextureCube : public TestTexture
265 tcu::TextureCube m_texture;
268 TestTextureCube (const tcu::TextureFormat& format, int size);
269 TestTextureCube (const tcu::CompressedTexFormat& format, int size);
270 virtual ~TestTextureCube (void);
272 virtual int getNumLevels (void) const;
273 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
274 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
275 virtual int getArraySize (void) const;
276 virtual const tcu::TextureCube& getTexture (void) const;
277 virtual tcu::TextureCube& getTexture (void);
278 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
279 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
281 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
284 class TestTextureCubeArray: public TestTexture
287 tcu::TextureCubeArray m_texture;
290 TestTextureCubeArray (const tcu::TextureFormat& format, int size, int arraySize);
291 TestTextureCubeArray (const tcu::CompressedTexFormat& format, int size, int arraySize);
292 virtual ~TestTextureCubeArray (void);
294 virtual int getNumLevels (void) const;
295 virtual tcu::PixelBufferAccess getLevel (int level, int layer);
296 virtual const tcu::ConstPixelBufferAccess getLevel (int level, int layer) const;
297 virtual int getArraySize (void) const;
298 virtual const tcu::TextureCubeArray& getTexture (void) const;
299 virtual tcu::TextureCubeArray& getTexture (void);
300 virtual const tcu::TextureFormat& getTextureFormat (void) const { return m_texture.getFormat(); }
301 virtual tcu::UVec3 getTextureDimension (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
303 virtual de::MovePtr<TestTexture> copy (const tcu::TextureFormat) const;
309 #endif // _VKTPIPELINEIMAGEUTIL_HPP