Try to determine renderable format in lifetime tests am: c0a5dc217f am: eba26e2387...
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / pipeline / vktPipelineImageUtil.hpp
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
36 namespace vkt
37 {
38 namespace pipeline
39 {
40
41 class TestTexture;
42
43 enum BorderColor
44 {
45         BORDER_COLOR_OPAQUE_BLACK,
46         BORDER_COLOR_OPAQUE_WHITE,
47         BORDER_COLOR_TRANSPARENT_BLACK,
48
49         BORDER_COLOR_COUNT
50 };
51
52 bool                                                    isSupportedSamplableFormat      (const vk::InstanceInterface&   instanceInterface,
53                                                                                                                          vk::VkPhysicalDevice                   device,
54                                                                                                                          vk::VkFormat                                   format);
55 bool                                                    isLinearFilteringSupported      (const vk::InstanceInterface&   instanceInterface,
56                                                                                                                          vk::VkPhysicalDevice                   device,
57                                                                                                                          vk::VkFormat                                   format,
58                                                                                                                          vk::VkImageTiling                              tiling);
59
60 vk::VkBorderColor                               getFormatBorderColor            (BorderColor color, vk::VkFormat format);
61
62 void                                                    getLookupScaleBias                      (vk::VkFormat                                   format,
63                                                                                                                          tcu::Vec4&                                             lookupScale,
64                                                                                                                          tcu::Vec4&                                             lookupBias);
65
66 /*--------------------------------------------------------------------*//*!
67  * Gets a tcu::TextureLevel initialized with data from a VK color
68  * attachment.
69  *
70  * The VkImage must be non-multisampled and able to be used as a source
71  * operand for transfer operations.
72  *//*--------------------------------------------------------------------*/
73 de::MovePtr<tcu::TextureLevel>  readColorAttachment                      (const vk::DeviceInterface&    vk,
74                                                                                                                           vk::VkDevice                                  device,
75                                                                                                                           vk::VkQueue                                   queue,
76                                                                                                                           deUint32                                              queueFamilyIndex,
77                                                                                                                           vk::Allocator&                                allocator,
78                                                                                                                           vk::VkImage                                   image,
79                                                                                                                           vk::VkFormat                                  format,
80                                                                                                                           const tcu::UVec2&                             renderSize);
81
82 /*--------------------------------------------------------------------*//*!
83  * Uploads data from a test texture to a destination VK image.
84  *
85  * The VkImage must be non-multisampled and able to be used as a
86  * destination operand for transfer operations.
87  *//*--------------------------------------------------------------------*/
88 void                                                    uploadTestTexture                       (const vk::DeviceInterface&             vk,
89                                                                                                                          vk::VkDevice                                   device,
90                                                                                                                          vk::VkQueue                                    queue,
91                                                                                                                          deUint32                                               queueFamilyIndex,
92                                                                                                                          vk::Allocator&                                 allocator,
93                                                                                                                          const TestTexture&                             testTexture,
94                                                                                                                          vk::VkImage                                    destImage);
95
96 class TestTexture
97 {
98 public:
99                                                                                                 TestTexture                                     (const tcu::TextureFormat& format, int width, int height, int depth);
100                                                                                                 TestTexture                                     (const tcu::CompressedTexFormat& format, int width, int height, int depth);
101         virtual                                                                         ~TestTexture                            (void);
102
103         virtual int                                                                     getNumLevels                            (void) const = 0;
104         virtual deUint32                                                        getSize                                         (void) const;
105         virtual int                                                                     getArraySize                            (void) const { return 1; }
106
107         virtual bool                                                            isCompressed                            (void) const { return !m_compressedLevels.empty(); }
108         virtual deUint32                                                        getCompressedSize                       (void) const;
109
110         virtual tcu::PixelBufferAccess                          getLevel                                        (int level, int layer) = 0;
111         virtual const tcu::ConstPixelBufferAccess       getLevel                                        (int level, int layer) const = 0;
112
113         virtual tcu::CompressedTexture&                         getCompressedLevel                      (int level, int layer);
114         virtual const tcu::CompressedTexture&           getCompressedLevel                      (int level, int layer) const;
115
116         virtual std::vector<vk::VkBufferImageCopy>      getBufferCopyRegions            (void) const;
117         virtual void                                                            write                                           (deUint8* destPtr) const;
118         virtual de::MovePtr<TestTexture>                        copy                                            (const tcu::TextureFormat) const = 0;
119
120         virtual const tcu::TextureFormat&                       getTextureFormat                        (void) const = 0;
121         virtual tcu::UVec3                                                      getTextureDimension                     (void) const = 0;
122
123 protected:
124         void                                                                            populateLevels                          (const std::vector<tcu::PixelBufferAccess>& levels);
125         void                                                                            populateCompressedLevels        (tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels);
126
127         static void                                                                     fillWithGradient                        (const tcu::PixelBufferAccess& levelAccess);
128
129         void                                                                            copyToTexture                           (TestTexture&) const;
130
131 protected:
132         std::vector<tcu::CompressedTexture*>            m_compressedLevels;
133 };
134
135 class TestTexture1D : public TestTexture
136 {
137 private:
138         tcu::Texture1D                                                          m_texture;
139
140 public:
141                                                                                                 TestTexture1D           (const tcu::TextureFormat& format, int width);
142                                                                                                 TestTexture1D           (const tcu::CompressedTexFormat& format, int width);
143         virtual                                                                         ~TestTexture1D          (void);
144
145         virtual int getNumLevels (void) const;
146         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
147         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
148         virtual const tcu::Texture1D&                           getTexture                      (void) const;
149         virtual tcu::Texture1D&                                         getTexture                      (void);
150         virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
151         virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
152
153         virtual de::MovePtr<TestTexture>                        copy                            (const tcu::TextureFormat) const;
154 };
155
156 class TestTexture1DArray : public TestTexture
157 {
158 private:
159         tcu::Texture1DArray                                                     m_texture;
160
161 public:
162                                                                                                 TestTexture1DArray      (const tcu::TextureFormat& format, int width, int arraySize);
163                                                                                                 TestTexture1DArray      (const tcu::CompressedTexFormat& format, int width, int arraySize);
164         virtual                                                                         ~TestTexture1DArray     (void);
165
166         virtual int                                                                     getNumLevels            (void) const;
167         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
168         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
169         virtual const tcu::Texture1DArray&                      getTexture                      (void) const;
170         virtual tcu::Texture1DArray&                            getTexture                      (void);
171         virtual int                                                                     getArraySize            (void) const;
172         virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
173         virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
174
175         virtual de::MovePtr<TestTexture>                        copy                            (const tcu::TextureFormat) const;
176 };
177
178 class TestTexture2D : public TestTexture
179 {
180 private:
181         tcu::Texture2D                                                          m_texture;
182
183 public:
184                                                                                                 TestTexture2D           (const tcu::TextureFormat& format, int width, int height);
185                                                                                                 TestTexture2D           (const tcu::CompressedTexFormat& format, int width, int height);
186         virtual                                                                         ~TestTexture2D          (void);
187
188         virtual int                                                                     getNumLevels            (void) const;
189         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
190         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
191         virtual const tcu::Texture2D&                           getTexture                      (void) const;
192         virtual tcu::Texture2D&                                         getTexture                      (void);
193         virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
194         virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
195
196         virtual de::MovePtr<TestTexture>                        copy                            (const tcu::TextureFormat) const;
197 };
198
199 class TestTexture2DArray : public TestTexture
200 {
201 private:
202         tcu::Texture2DArray     m_texture;
203
204 public:
205                                                                                                 TestTexture2DArray      (const tcu::TextureFormat& format, int width, int height, int arraySize);
206                                                                                                 TestTexture2DArray      (const tcu::CompressedTexFormat& format, int width, int height, int arraySize);
207         virtual                                                                         ~TestTexture2DArray     (void);
208
209         virtual int                                                                     getNumLevels            (void) const;
210         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
211         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
212         virtual const tcu::Texture2DArray&                      getTexture                      (void) const;
213         virtual tcu::Texture2DArray&                            getTexture                      (void);
214         virtual int                                                                     getArraySize            (void) const;
215         virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
216         virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
217
218         virtual de::MovePtr<TestTexture>                        copy                            (const tcu::TextureFormat) const;
219 };
220
221 class TestTexture3D : public TestTexture
222 {
223 private:
224         tcu::Texture3D  m_texture;
225
226 public:
227                                                                                                 TestTexture3D           (const tcu::TextureFormat& format, int width, int height, int depth);
228                                                                                                 TestTexture3D           (const tcu::CompressedTexFormat& format, int width, int height, int depth);
229         virtual                                                                         ~TestTexture3D          (void);
230
231         virtual int                                                                     getNumLevels            (void) const;
232         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
233         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
234         virtual const tcu::Texture3D&                           getTexture                      (void) const;
235         virtual tcu::Texture3D&                                         getTexture                      (void);
236         virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
237         virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), m_texture.getDepth()); }
238
239         virtual de::MovePtr<TestTexture>                        copy                            (const tcu::TextureFormat) const;
240 };
241
242 class TestTextureCube : public TestTexture
243 {
244 private:
245         tcu::TextureCube                                                        m_texture;
246
247 public:
248                                                                                                 TestTextureCube                 (const tcu::TextureFormat& format, int size);
249                                                                                                 TestTextureCube                 (const tcu::CompressedTexFormat& format, int size);
250         virtual                                                                         ~TestTextureCube                (void);
251
252         virtual int                                                                     getNumLevels                    (void) const;
253         virtual tcu::PixelBufferAccess                          getLevel                                (int level, int layer);
254         virtual const tcu::ConstPixelBufferAccess       getLevel                                (int level, int layer) const;
255         virtual int                                                                     getArraySize                    (void) const;
256         virtual const tcu::TextureCube&                         getTexture                              (void) const;
257         virtual tcu::TextureCube&                                       getTexture                              (void);
258         virtual const tcu::TextureFormat&                       getTextureFormat                (void) const { return m_texture.getFormat(); }
259         virtual tcu::UVec3                                                      getTextureDimension             (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
260
261         virtual de::MovePtr<TestTexture>                        copy                                    (const tcu::TextureFormat) const;
262 };
263
264 class TestTextureCubeArray: public TestTexture
265 {
266 private:
267         tcu::TextureCubeArray                                           m_texture;
268
269 public:
270                                                                                                 TestTextureCubeArray    (const tcu::TextureFormat& format, int size, int arraySize);
271                                                                                                 TestTextureCubeArray    (const tcu::CompressedTexFormat& format, int size, int arraySize);
272         virtual                                                                         ~TestTextureCubeArray   (void);
273
274         virtual int                                                                     getNumLevels                    (void) const;
275         virtual tcu::PixelBufferAccess                          getLevel                                (int level, int layer);
276         virtual const tcu::ConstPixelBufferAccess       getLevel                                (int level, int layer) const;
277         virtual int                                                                     getArraySize                    (void) const;
278         virtual const tcu::TextureCubeArray&            getTexture                              (void) const;
279         virtual tcu::TextureCubeArray&                          getTexture                              (void);
280         virtual const tcu::TextureFormat&                       getTextureFormat                (void) const { return m_texture.getFormat(); }
281         virtual tcu::UVec3                                                      getTextureDimension             (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
282
283         virtual de::MovePtr<TestTexture>                        copy                                    (const tcu::TextureFormat) const;
284 };
285
286 } // pipeline
287 } // vkt
288
289 #endif // _VKTPIPELINEIMAGEUTIL_HPP