1 #ifndef _VKTSHADERRENDERCASE_HPP
2 #define _VKTSHADERRENDERCASE_HPP
3 /*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
7 * Copyright (c) 2015 The Khronos Group Inc.
8 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and/or associated documentation files (the
12 * "Materials"), to deal in the Materials without restriction, including
13 * without limitation the rights to use, copy, modify, merge, publish,
14 * distribute, sublicense, and/or sell copies of the Materials, and to
15 * permit persons to whom the Materials are furnished to do so, subject to
16 * the following conditions:
18 * The above copyright notice(s) and this permission notice shall be included
19 * in all copies or substantial portions of the Materials.
21 * The Materials are Confidential Information as defined by the
22 * Khronos Membership Agreement until designated non-confidential by Khronos,
23 * at which point this condition clause shall be removed.
25 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
29 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
30 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
31 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
35 * \brief Vulkan ShaderRenderCase
36 *//*--------------------------------------------------------------------*/
38 #include "tcuTexture.hpp"
39 #include "tcuSurface.hpp"
42 #include "deSharedPtr.hpp"
43 #include "deUniquePtr.hpp"
46 #include "vkPrograms.hpp"
48 #include "vkMemUtil.hpp"
49 #include "vkBuilderUtil.hpp"
51 #include "vktTestCaseUtil.hpp"
52 #include "vktTexture.hpp"
56 namespace shaderrendercase
60 class ShaderRenderCaseInstance;
76 TextureBinding (const tcu::Archive& archive,
79 const tcu::Sampler& sampler);
81 Type getType (void) const { return m_type; }
82 const tcu::Sampler& getSampler (void) const { return m_sampler; }
83 const tcu::Texture2D* get2D (void) const { DE_ASSERT(getType() == TYPE_2D); return m_binding.tex2D; }
86 static tcu::Texture2D* loadTexture2D (const tcu::Archive& archive, const char* filename);
89 tcu::Sampler m_sampler;
92 const tcu::Texture2D* tex2D;
98 class ShaderEvalContext
104 MAX_USER_ATTRIBS = 4,
110 tcu::Sampler sampler;
111 const tcu::Texture2D* tex2D;
112 const tcu::TextureCube* texCube;
113 const tcu::Texture2DArray* tex2DArray;
114 const tcu::Texture3D* tex3D;
116 inline ShaderSampler (void)
119 , tex2DArray(DE_NULL)
125 ShaderEvalContext (const QuadGrid& quadGrid);
126 ~ShaderEvalContext (void);
128 void reset (float sx, float sy);
132 tcu::Vec4 unitCoords;
133 tcu::Vec4 constCoords;
135 tcu::Vec4 in[MAX_USER_ATTRIBS];
136 ShaderSampler textures[MAX_TEXTURES];
143 inline void discard (void) { isDiscarded = true; }
144 tcu::Vec4 texture2D (int unitNdx, const tcu::Vec2& coords);
147 const QuadGrid& m_quadGrid;
150 typedef void (*ShaderEvalFunc) (ShaderEvalContext& c);
152 inline void evalCoordsPassthroughX (ShaderEvalContext& c) { c.color.x() = c.coords.x(); }
153 inline void evalCoordsPassthroughXY (ShaderEvalContext& c) { c.color.xy() = c.coords.swizzle(0,1); }
154 inline void evalCoordsPassthroughXYZ (ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); }
155 inline void evalCoordsPassthrough (ShaderEvalContext& c) { c.color = c.coords; }
156 inline void evalCoordsSwizzleWZYX (ShaderEvalContext& c) { c.color = c.coords.swizzle(3,2,1,0); }
159 // Either inherit a class with overridden evaluate() or just pass in an evalFunc.
161 class ShaderEvaluator
164 ShaderEvaluator (void);
165 ShaderEvaluator (const ShaderEvalFunc evalFunc);
166 virtual ~ShaderEvaluator (void);
168 virtual void evaluate (ShaderEvalContext& ctx) const;
171 ShaderEvaluator (const ShaderEvaluator&); // not allowed!
172 ShaderEvaluator& operator= (const ShaderEvaluator&); // not allowed!
174 const ShaderEvalFunc m_evalFunc;
179 typedef void (*UniformSetupFunc) (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords);
185 UniformSetup (const UniformSetupFunc setup);
186 virtual ~UniformSetup (void);
187 virtual void setup (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) const;
190 UniformSetup (const UniformSetup&); // not allowed!
191 UniformSetup& operator= (const UniformSetup&); // not allowed!
193 const UniformSetupFunc m_setupFunc;
196 typedef void (*AttributeSetupFunc) (ShaderRenderCaseInstance& instance, deUint32 numVertices);
198 class ShaderRenderCase : public vkt::TestCase
201 ShaderRenderCase (tcu::TestContext& testCtx,
202 const std::string& name,
203 const std::string& description,
204 const bool isVertexCase,
205 const ShaderEvalFunc evalFunc,
206 const UniformSetup* uniformSetup,
207 const AttributeSetupFunc attribFunc);
209 ShaderRenderCase (tcu::TestContext& testCtx,
210 const std::string& name,
211 const std::string& description,
212 const bool isVertexCase,
213 const ShaderEvaluator* evaluator,
214 const UniformSetup* uniformSetup,
215 const AttributeSetupFunc attribFunc);
218 virtual ~ShaderRenderCase (void);
219 virtual void initPrograms (vk::ProgramCollection<glu::ProgramSources>& programCollection) const;
220 virtual TestInstance* createInstance (Context& context) const;
223 std::string m_vertShaderSource;
224 std::string m_fragShaderSource;
226 const bool m_isVertexCase;
227 const ShaderEvaluator* m_evaluator;
228 const UniformSetup* m_uniformSetup;
229 const AttributeSetupFunc m_attribFunc;
333 enum BaseAttributeType
353 // ShaderRenderCaseInstance.
355 class ShaderRenderCaseInstance : public vkt::TestInstance
358 ShaderRenderCaseInstance (Context& context,
359 const bool isVertexCase,
360 const ShaderEvaluator& evaluator,
361 const UniformSetup& uniformSetup,
362 const AttributeSetupFunc attribFunc);
364 virtual ~ShaderRenderCaseInstance (void);
365 virtual tcu::TestStatus iterate (void);
367 void addAttribute (deUint32 bindingLocation,
369 deUint32 sizePerElement,
372 void useAttribute (deUint32 bindingLocation,
373 BaseAttributeType type);
376 void addUniform (deUint32 bindingLocation,
377 vk::VkDescriptorType descriptorType,
379 void addUniform (deUint32 bindingLocation,
380 vk::VkDescriptorType descriptorType,
383 void useUniform (deUint32 bindingLocation,
384 BaseUniformType type);
385 void useSampler2D (deUint32 bindingLocation,
389 virtual void setup (void);
390 virtual void setupUniforms (const tcu::Vec4& constCoords);
392 const tcu::IVec2 getViewportSize (void) const;
394 std::vector<tcu::Mat4> m_userAttribTransforms;
395 const tcu::Vec4 m_clearColor;
396 std::vector<TextureBinding> m_textures;
398 vk::SimpleAllocator m_memAlloc;
402 void setupTextures (void);
403 vk::Move<vk::VkImage> createImage2D (const tcu::Texture2D& texture, const vk::VkFormat format);
404 void setupUniformData (deUint32 bindingLocation, deUint32 size, const void* dataPtr);
405 void setupDefaultInputs (const QuadGrid& quadGrid);
407 void render (tcu::Surface& result, const QuadGrid& quadGrid);
408 void computeVertexReference (tcu::Surface& result, const QuadGrid& quadGrid);
409 void computeFragmentReference (tcu::Surface& result, const QuadGrid& quadGrid);
410 bool compareImages (const tcu::Surface& resImage,
411 const tcu::Surface& refImage,
412 float errorThreshold);
414 const bool m_isVertexCase;
415 const ShaderEvaluator& m_evaluator;
416 const UniformSetup& m_uniformSetup;
417 const AttributeSetupFunc m_attribFunc;
419 struct EnabledBaseAttribute
422 BaseAttributeType type;
424 std::vector<EnabledBaseAttribute> m_enabledBaseAttributes;
426 const tcu::IVec2 m_renderSize;
427 const vk::VkFormat m_colorFormat;
429 vk::Move<vk::VkImage> m_colorImage;
430 de::MovePtr<vk::Allocation> m_colorImageAlloc;
431 vk::Move<vk::VkAttachmentView> m_colorAttachmentView;
433 vk::Move<vk::VkRenderPass> m_renderPass;
434 vk::Move<vk::VkFramebuffer> m_framebuffer;
435 vk::Move<vk::VkPipelineLayout> m_pipelineLayout;
436 vk::Move<vk::VkPipeline> m_graphicsPipeline;
438 vk::Move<vk::VkShaderModule> m_vertexShaderModule;
439 vk::Move<vk::VkShaderModule> m_fragmentShaderModule;
440 vk::Move<vk::VkShader> m_vertexShader;
441 vk::Move<vk::VkShader> m_fragmentShader;
443 vk::Move<vk::VkDynamicViewportState> m_viewportState;
444 vk::Move<vk::VkDynamicRasterState> m_rasterState;
445 vk::Move<vk::VkDynamicColorBlendState> m_colorBlendState;
447 vk::Move<vk::VkBuffer> m_indiceBuffer;
448 de::MovePtr<vk::Allocation> m_indiceBufferAlloc;
450 vk::Move<vk::VkDescriptorSetLayout> m_descriptorSetLayout;
452 vk::Move<vk::VkDescriptorPool> m_descriptorPool;
453 vk::Move<vk::VkDescriptorSet> m_descriptorSet;
455 vk::Move<vk::VkCmdPool> m_cmdPool;
456 vk::Move<vk::VkCmdBuffer> m_cmdBuffer;
458 vk::Move<vk::VkFence> m_fence;
460 vk::DescriptorSetLayoutBuilder m_descriptorSetLayoutBuilder;
461 vk::DescriptorPoolBuilder m_descriptorPoolBuilder;
462 vk::DescriptorSetUpdateBuilder m_descriptorSetUpdateBuilder;
464 typedef de::SharedPtr<vk::Unique<vk::VkBuffer> > VkBufferSp;
465 typedef de::SharedPtr<vk::Unique<vk::VkBufferView> > VkBufferViewSp;
467 typedef de::SharedPtr<vk::Unique<vk::VkImage> > VkImageSp;
468 typedef de::SharedPtr<vk::Unique<vk::VkImageView> > VkImageViewSp;
469 typedef de::SharedPtr<vk::Unique<vk::VkSampler> > VkSamplerSp;
470 typedef de::SharedPtr<de::UniquePtr<vk::Allocation> > AllocationSp;
475 UniformInfo (void) {}
476 virtual ~UniformInfo (void) {}
478 vk::VkDescriptorType type;
479 vk::VkDescriptorInfo descriptor;
483 class BufferUniform : public UniformInfo
486 BufferUniform (void) {}
487 virtual ~BufferUniform (void) {}
490 VkBufferViewSp bufferView;
494 class SamplerUniform : public UniformInfo
497 SamplerUniform (void) {}
498 virtual ~SamplerUniform (void) {}
501 VkImageViewSp imageView;
506 typedef de::SharedPtr<de::UniquePtr<UniformInfo> > UniformInfoSp;
507 std::vector<UniformInfoSp> m_uniformInfos;
509 std::vector<vk::VkVertexInputBindingDescription> m_vertexBindingDescription;
510 std::vector<vk::VkVertexInputAttributeDescription> m_vertexattributeDescription;
512 std::vector<VkBufferSp> m_vertexBuffers;
513 std::vector<AllocationSp> m_vertexBufferAllocs;
517 void ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescriptorType descriptorType, const T& data)
519 addUniform(bindingLocation, descriptorType, sizeof(T), &data);
522 } // shaderrendercase
525 #endif // _VKTSHADERRENDERCASE_HPP