Fix issues in pipeline.timestamp.transfer_tests
[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 /*--------------------------------------------------------------------*//*!
63  * Gets a tcu::TextureLevel initialized with data from a VK color
64  * attachment.
65  *
66  * The VkImage must be non-multisampled and able to be used as a source
67  * operand for transfer operations.
68  *//*--------------------------------------------------------------------*/
69 de::MovePtr<tcu::TextureLevel>  readColorAttachment                      (const vk::DeviceInterface&    vk,
70                                                                                                                           vk::VkDevice                                  device,
71                                                                                                                           vk::VkQueue                                   queue,
72                                                                                                                           deUint32                                              queueFamilyIndex,
73                                                                                                                           vk::Allocator&                                allocator,
74                                                                                                                           vk::VkImage                                   image,
75                                                                                                                           vk::VkFormat                                  format,
76                                                                                                                           const tcu::UVec2&                             renderSize);
77
78 /*--------------------------------------------------------------------*//*!
79  * Uploads data from a test texture to a destination VK image.
80  *
81  * The VkImage must be non-multisampled and able to be used as a
82  * destination operand for transfer operations.
83  *//*--------------------------------------------------------------------*/
84 void                                                    uploadTestTexture                       (const vk::DeviceInterface&             vk,
85                                                                                                                          vk::VkDevice                                   device,
86                                                                                                                          vk::VkQueue                                    queue,
87                                                                                                                          deUint32                                               queueFamilyIndex,
88                                                                                                                          vk::Allocator&                                 allocator,
89                                                                                                                          const TestTexture&                             testTexture,
90                                                                                                                          vk::VkImage                                    destImage);
91
92 class TestTexture
93 {
94 public:
95                                                                                                 TestTexture                                     (const tcu::TextureFormat& format, int width, int height, int depth);
96                                                                                                 TestTexture                                     (const tcu::CompressedTexFormat& format, int width, int height, int depth);
97         virtual                                                                         ~TestTexture                            (void);
98
99         virtual int                                                                     getNumLevels                            (void) const = 0;
100         virtual deUint32                                                        getSize                                         (void) const;
101         virtual int                                                                     getArraySize                            (void) const { return 1; }
102
103         virtual bool                                                            isCompressed                            (void) const { return !m_compressedLevels.empty(); }
104         virtual deUint32                                                        getCompressedSize                       (void) const;
105
106         virtual tcu::PixelBufferAccess                          getLevel                                        (int level, int layer) = 0;
107         virtual const tcu::ConstPixelBufferAccess       getLevel                                        (int level, int layer) const = 0;
108
109         virtual tcu::CompressedTexture&                         getCompressedLevel                      (int level, int layer);
110         virtual const tcu::CompressedTexture&           getCompressedLevel                      (int level, int layer) const;
111
112         virtual std::vector<vk::VkBufferImageCopy>      getBufferCopyRegions            (void) const;
113         virtual void                                                            write                                           (deUint8* destPtr) const;
114
115 protected:
116         void                                                                            populateLevels                          (const std::vector<tcu::PixelBufferAccess>& levels);
117         void                                                                            populateCompressedLevels        (tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels);
118
119         static void                                                                     fillWithGradient                        (const tcu::PixelBufferAccess& levelAccess);
120
121 protected:
122         std::vector<tcu::CompressedTexture*>            m_compressedLevels;
123 };
124
125 class TestTexture1D : public TestTexture
126 {
127 private:
128         tcu::Texture1D                                                          m_texture;
129
130 public:
131                                                                                                 TestTexture1D   (const tcu::TextureFormat& format, int width);
132                                                                                                 TestTexture1D   (const tcu::CompressedTexFormat& format, int width);
133         virtual                                                                         ~TestTexture1D  (void);
134
135         virtual int getNumLevels (void) const;
136         virtual tcu::PixelBufferAccess                          getLevel                (int level, int layer);
137         virtual const tcu::ConstPixelBufferAccess       getLevel                (int level, int layer) const;
138         virtual const tcu::Texture1D&                           getTexture              (void) const;
139 };
140
141 class TestTexture1DArray : public TestTexture
142 {
143 private:
144         tcu::Texture1DArray                                                     m_texture;
145
146 public:
147                                                                                                 TestTexture1DArray      (const tcu::TextureFormat& format, int width, int arraySize);
148                                                                                                 TestTexture1DArray      (const tcu::CompressedTexFormat& format, int width, int arraySize);
149         virtual                                                                         ~TestTexture1DArray     (void);
150
151         virtual int                                                                     getNumLevels            (void) const;
152         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
153         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
154         virtual const tcu::Texture1DArray&                      getTexture                      (void) const;
155         virtual int                                                                     getArraySize            (void) const;
156 };
157
158 class TestTexture2D : public TestTexture
159 {
160 private:
161         tcu::Texture2D                                                          m_texture;
162
163 public:
164                                                                                                 TestTexture2D           (const tcu::TextureFormat& format, int width, int height);
165                                                                                                 TestTexture2D           (const tcu::CompressedTexFormat& format, int width, int height);
166         virtual                                                                         ~TestTexture2D          (void);
167
168         virtual int                                                                     getNumLevels            (void) const;
169         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
170         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
171         virtual const tcu::Texture2D&                           getTexture                      (void) const;
172 };
173
174 class TestTexture2DArray : public TestTexture
175 {
176 private:
177         tcu::Texture2DArray     m_texture;
178
179 public:
180                                                                                                 TestTexture2DArray      (const tcu::TextureFormat& format, int width, int height, int arraySize);
181                                                                                                 TestTexture2DArray      (const tcu::CompressedTexFormat& format, int width, int height, int arraySize);
182         virtual                                                                         ~TestTexture2DArray     (void);
183
184         virtual int                                                                     getNumLevels            (void) const;
185         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
186         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
187         virtual const tcu::Texture2DArray&                      getTexture                      (void) const;
188         virtual int                                                                     getArraySize            (void) const;
189 };
190
191 class TestTexture3D : public TestTexture
192 {
193 private:
194         tcu::Texture3D  m_texture;
195
196 public:
197                                                                                                 TestTexture3D           (const tcu::TextureFormat& format, int width, int height, int depth);
198                                                                                                 TestTexture3D           (const tcu::CompressedTexFormat& format, int width, int height, int depth);
199         virtual                                                                         ~TestTexture3D          (void);
200
201         virtual int                                                                     getNumLevels            (void) const;
202         virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
203         virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
204         virtual const tcu::Texture3D&                           getTexture                      (void) const;
205 };
206
207 class TestTextureCube : public TestTexture
208 {
209 private:
210         tcu::TextureCube                                                        m_texture;
211
212 public:
213                                                                                                 TestTextureCube                 (const tcu::TextureFormat& format, int size);
214                                                                                                 TestTextureCube                 (const tcu::CompressedTexFormat& format, int size);
215         virtual                                                                         ~TestTextureCube                (void);
216
217         virtual int                                                                     getNumLevels                    (void) const;
218         virtual tcu::PixelBufferAccess                          getLevel                                (int level, int layer);
219         virtual const tcu::ConstPixelBufferAccess       getLevel                                (int level, int layer) const;
220         virtual int                                                                     getArraySize                    (void) const;
221         virtual const tcu::TextureCube&                         getTexture                              (void) const;
222 };
223
224 class TestTextureCubeArray: public TestTexture
225 {
226 private:
227         tcu::TextureCubeArray                                           m_texture;
228
229 public:
230                                                                                                 TestTextureCubeArray    (const tcu::TextureFormat& format, int size, int arraySize);
231                                                                                                 TestTextureCubeArray    (const tcu::CompressedTexFormat& format, int size, int arraySize);
232         virtual                                                                         ~TestTextureCubeArray   (void);
233
234         virtual int                                                                     getNumLevels                    (void) const;
235         virtual tcu::PixelBufferAccess                          getLevel                                (int level, int layer);
236         virtual const tcu::ConstPixelBufferAccess       getLevel                                (int level, int layer) const;
237         virtual int                                                                     getArraySize                    (void) const;
238         virtual const tcu::TextureCubeArray&            getTexture                              (void) const;
239 };
240
241 } // pipeline
242 } // vkt
243
244 #endif // _VKTPIPELINEIMAGEUTIL_HPP