1 #ifndef _VKTTEXTURETESTUTIL_HPP
2 #define _VKTTEXTURETESTUTIL_HPP
3 /*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
7 * Copyright (c) 2016 The Khronos Group Inc.
8 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
9 * Copyright (c) 2014 The Android Open Source Project
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
25 * \brief Texture test utilities.
28 * + Quads consist of 2 triangles, rendered using explicit indices.
29 * + All TextureTestUtil functions and classes expect texture coordinates
30 * for quads to be specified in order (-1, -1), (-1, 1), (1, -1), (1, 1).
31 *//*--------------------------------------------------------------------*/
33 #include "tcuDefs.hpp"
34 #include "tcuSurface.hpp"
37 #include "vktTestCase.hpp"
39 #include "gluShaderProgram.hpp"
40 #include "gluTextureTestUtil.hpp"
41 #include "deSharedPtr.hpp"
43 #include "../pipeline/vktPipelineImageUtil.hpp"
61 PROGRAM_2D_FLOAT_BIAS,
64 PROGRAM_2D_SHADOW_BIAS,
71 PROGRAM_1D_FLOAT_BIAS,
74 PROGRAM_1D_SHADOW_BIAS,
81 PROGRAM_CUBE_FLOAT_BIAS,
82 PROGRAM_CUBE_INT_BIAS,
83 PROGRAM_CUBE_UINT_BIAS,
84 PROGRAM_CUBE_SHADOW_BIAS,
86 PROGRAM_1D_ARRAY_FLOAT,
88 PROGRAM_1D_ARRAY_UINT,
89 PROGRAM_1D_ARRAY_SHADOW,
91 PROGRAM_2D_ARRAY_FLOAT,
93 PROGRAM_2D_ARRAY_UINT,
94 PROGRAM_2D_ARRAY_SHADOW,
100 PROGRAM_3D_FLOAT_BIAS,
102 PROGRAM_3D_UINT_BIAS,
104 PROGRAM_CUBE_ARRAY_FLOAT,
105 PROGRAM_CUBE_ARRAY_INT,
106 PROGRAM_CUBE_ARRAY_UINT,
107 PROGRAM_CUBE_ARRAY_SHADOW,
109 PROGRAM_BUFFER_FLOAT,
116 void initializePrograms(vk::SourceCollections& programCollection, glu::Precision texCoordPrecision, const std::vector<Program>& programs);
118 typedef de::SharedPtr<pipeline::TestTexture> TestTextureSp;
119 typedef de::SharedPtr<pipeline::TestTexture2D> TestTexture2DSp;
120 typedef de::SharedPtr<pipeline::TestTextureCube> TestTextureCubeSp;
121 typedef de::SharedPtr<pipeline::TestTexture2DArray> TestTexture2DArraySp;
122 typedef de::SharedPtr<pipeline::TestTexture3D> TestTexture3DSp;
124 class TextureBinding {
136 TextureBinding (Context& context);
137 TextureBinding (Context& context, const TestTextureSp& textureData, const Type type);
138 vk::VkImage getImage (void) { return *m_textureImage; }
139 vk::VkImageView getImageView (void) { return *m_textureImageView; }
140 Type getType (void) { return m_type; }
141 const pipeline::TestTexture& getTestTexture (void) { return *m_textureData; }
142 void updateTextureViewMipLevels (deUint32 baseLevel, deUint32 maxLevel);
145 TextureBinding (const TextureBinding&); // not allowed!
146 TextureBinding& operator= (const TextureBinding&); // not allowed!
148 void updateTextureData (const TestTextureSp& textureData, const Type type);
152 TestTextureSp m_textureData;
153 vk::Move<vk::VkImage> m_textureImage;
154 de::MovePtr<vk::Allocation> m_textureImageMemory;
155 vk::Move<vk::VkImageView> m_textureImageView;
158 typedef de::SharedPtr<TextureBinding> TextureBindingSp;
160 class TextureRenderer
163 TextureRenderer (Context& context, vk::VkSampleCountFlagBits sampleCount, deUint32 renderWidth, deUint32 renderHeight);
164 ~TextureRenderer (void);
166 void renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, glu::TextureTestUtil::TextureType texType);
167 void renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, const glu::TextureTestUtil::ReferenceParams& params);
168 void renderQuad (tcu::Surface& result,
169 const float* positions,
171 const float* texCoord,
172 const glu::TextureTestUtil::ReferenceParams& params,
173 const float maxAnisotropy);
175 void clearImage (vk::VkImage image);
176 void add2DTexture (const TestTexture2DSp& texture);
177 const pipeline::TestTexture2D& get2DTexture (int textureIndex) const;
179 void addCubeTexture (const TestTextureCubeSp& texture);
180 const pipeline::TestTextureCube& getCubeTexture (int textureIndex) const;
182 void add2DArrayTexture (const TestTexture2DArraySp& texture);
183 const pipeline::TestTexture2DArray& get2DArrayTexture (int textureIndex) const;
185 void add3DTexture (const TestTexture3DSp& texture);
186 const pipeline::TestTexture3D& get3DTexture (int textureIndex) const;
188 void setViewport (float viewportX, float viewportY, float viewportW, float viewportH);
190 TextureBinding* getTextureBinding (int textureIndex) const;
192 deUint32 getRenderWidth (void) const;
193 deUint32 getRenderHeight (void) const;
196 TextureRenderer (const TextureRenderer& other);
197 TextureRenderer& operator= (const TextureRenderer& other);
202 const deUint32 m_renderWidth;
203 const deUint32 m_renderHeight;
204 const vk::VkSampleCountFlagBits m_sampleCount;
205 const deBool m_multisampling;
207 const vk::VkFormat m_imageFormat;
208 const tcu::TextureFormat m_textureFormat;
210 vk::Move<vk::VkImage> m_image;
211 de::MovePtr<vk::Allocation> m_imageMemory;
212 vk::Move<vk::VkImageView> m_imageView;
214 vk::Move<vk::VkImage> m_resolvedImage;
215 de::MovePtr<vk::Allocation> m_resolvedImageMemory;
216 vk::Move<vk::VkImageView> m_resolvedImageView;
218 vk::Move<vk::VkCommandPool> m_commandPool;
219 vk::Move<vk::VkRenderPass> m_renderPass;
220 vk::Move<vk::VkFramebuffer> m_frameBuffer;
222 vk::Move<vk::VkDescriptorPool> m_descriptorPool;
224 vk::Move<vk::VkBuffer> m_uniformBuffer;
225 de::MovePtr<vk::Allocation> m_uniformBufferMemory;
226 const vk::VkDeviceSize m_uniformBufferSize;
228 vk::Move<vk::VkBuffer> m_vertexIndexBuffer;
229 de::MovePtr<vk::Allocation> m_vertexIndexBufferMemory;
230 static const vk::VkDeviceSize s_vertexIndexBufferSize;
231 static const deUint16 s_vertexIndices[6];
233 vk::Move<vk::VkFence> m_fence;
235 vk::Move<vk::VkBuffer> m_resultBuffer;
236 de::MovePtr<vk::Allocation> m_resultBufferMemory;
237 const vk::VkDeviceSize m_resultBufferSize;
239 std::vector<TextureBindingSp> m_textureBindings;
241 float m_viewportOffsetX;
242 float m_viewportOffsetY;
243 float m_viewportWidth;
244 float m_viewportHeight;
247 vk::Move<vk::VkDescriptorSet> makeDescriptorSet (const vk::VkDescriptorPool descriptorPool, const vk::VkDescriptorSetLayout setLayout) const;
248 void addImageTransitionBarrier (vk::VkCommandBuffer commandBuffer, vk::VkImage image, vk::VkPipelineStageFlags srcStageMask, vk::VkPipelineStageFlags dstStageMask, vk::VkAccessFlags srcAccessMask, vk::VkAccessFlags dstAccessMask, vk::VkImageLayout oldLayout, vk::VkImageLayout newLayout) const;
252 tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::WrapMode wrapW, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
253 tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
254 tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
256 TestTexture2DSp loadTexture2D (const tcu::Archive& archive, const std::vector<std::string>& filenames);
257 TestTextureCubeSp loadTextureCube (const tcu::Archive& archive, const std::vector<std::string>& filenames);
259 template <typename INSTANCE_TYPE>
260 class TextureTestCase : public TestCase
263 TextureTestCase (tcu::TestContext& context, const std::string& name, const std::string& description, const typename INSTANCE_TYPE::ParameterType& testParameters)
264 : TestCase (context, name, description)
265 , m_testsParameters (testParameters)
268 virtual TestInstance* createInstance (Context& context) const
270 return new INSTANCE_TYPE(context, m_testsParameters);
273 virtual void initPrograms (vk::SourceCollections& programCollection) const
275 initializePrograms(programCollection, m_testsParameters.texCoordPrecision, m_testsParameters.programs);
279 const typename INSTANCE_TYPE::ParameterType m_testsParameters;
282 struct TextureCommonTestCaseParameters
284 TextureCommonTestCaseParameters (void);
286 vk::VkSampleCountFlagBits sampleCount;
287 glu::Precision texCoordPrecision;
289 tcu::Sampler::FilterMode minFilter;
290 tcu::Sampler::FilterMode magFilter;
291 tcu::Sampler::WrapMode wrapS;
292 tcu::Sampler::WrapMode wrapT;
296 std::vector<util::Program> programs;
299 struct Texture2DTestCaseParameters : public TextureCommonTestCaseParameters
301 Texture2DTestCaseParameters (void);
306 struct TextureCubeTestCaseParameters : public TextureCommonTestCaseParameters
308 TextureCubeTestCaseParameters (void);
312 struct Texture2DArrayTestCaseParameters : public Texture2DTestCaseParameters
314 Texture2DArrayTestCaseParameters(void);
318 struct Texture3DTestCaseParameters : public Texture2DTestCaseParameters
320 Texture3DTestCaseParameters (void);
321 tcu::Sampler::WrapMode wrapR;
329 #endif // _VKTTEXTURETESTUTIL_HPP