1 #ifndef _VKTSHADERRENDER_HPP
2 #define _VKTSHADERRENDER_HPP
3 /*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
7 * Copyright (c) 2015 The Khronos Group Inc.
8 * Copyright (c) 2015 Samsung Electronics Co., 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 Vulkan ShaderRenderCase
25 *//*--------------------------------------------------------------------*/
27 #include "tcuTexture.hpp"
28 #include "tcuSurface.hpp"
31 #include "deSharedPtr.hpp"
32 #include "deUniquePtr.hpp"
35 #include "vkPrograms.hpp"
37 #include "vkMemUtil.hpp"
38 #include "vkBuilderUtil.hpp"
39 #include "vkTypeUtil.hpp"
40 #include "vkPlatform.hpp"
42 #include "vktTestCaseUtil.hpp"
52 LineStream (int indent = 0) { m_indent = indent; }
55 const char* str (void) const { m_string = m_stream.str(); return m_string.c_str(); }
56 LineStream& operator<< (const char* line) { for (int i = 0; i < m_indent; i++) { m_stream << "\t"; } m_stream << line << "\n"; return *this; }
60 std::ostringstream m_stream;
61 mutable std::string m_string;
65 class ShaderRenderCaseInstance;
83 deUint32 baseMipLevel;
84 vk::VkComponentMapping componentMapping;
86 Parameters (deUint32 baseMipLevel_ = 0,
87 vk::VkComponentMapping componentMapping_ = vk::makeComponentMappingRGBA())
88 : baseMipLevel (baseMipLevel_)
89 , componentMapping (componentMapping_)
94 TextureBinding (const tcu::Archive& archive,
97 const tcu::Sampler& sampler);
98 TextureBinding (const tcu::Texture2D* tex2D, const tcu::Sampler& sampler);
99 TextureBinding (const tcu::TextureCube* texCube, const tcu::Sampler& sampler);
100 TextureBinding (const tcu::Texture2DArray* tex2DArray, const tcu::Sampler& sampler);
101 TextureBinding (const tcu::Texture3D* tex3D, const tcu::Sampler& sampler);
102 ~TextureBinding (void);
104 Type getType (void) const { return m_type; }
105 const tcu::Sampler& getSampler (void) const { return m_sampler; }
106 const tcu::Texture2D& get2D (void) const { DE_ASSERT(getType() == TYPE_2D && m_binding.tex2D != NULL); return *m_binding.tex2D; }
107 const tcu::TextureCube& getCube (void) const { DE_ASSERT(getType() == TYPE_CUBE_MAP && m_binding.texCube != NULL); return *m_binding.texCube; }
108 const tcu::Texture2DArray& get2DArray (void) const { DE_ASSERT(getType() == TYPE_2D_ARRAY && m_binding.tex2DArray != NULL); return *m_binding.tex2DArray; }
109 const tcu::Texture3D& get3D (void) const { DE_ASSERT(getType() == TYPE_3D && m_binding.tex3D != NULL); return *m_binding.tex3D; }
111 void setParameters (const Parameters& params) { m_params = params; }
112 const Parameters& getParameters (void) const { return m_params; }
115 TextureBinding (const TextureBinding&); // not allowed!
116 TextureBinding& operator= (const TextureBinding&); // not allowed!
118 static de::MovePtr<tcu::Texture2D> loadTexture2D (const tcu::Archive& archive, const char* filename);
121 tcu::Sampler m_sampler;
126 const tcu::Texture2D* tex2D;
127 const tcu::TextureCube* texCube;
128 const tcu::Texture2DArray* tex2DArray;
129 const tcu::Texture3D* tex3D;
133 typedef de::SharedPtr<TextureBinding> TextureBindingSp;
135 // ShaderEvalContext.
137 class ShaderEvalContext
143 MAX_USER_ATTRIBS = 4,
149 tcu::Sampler sampler;
150 const tcu::Texture2D* tex2D;
151 const tcu::TextureCube* texCube;
152 const tcu::Texture2DArray* tex2DArray;
153 const tcu::Texture3D* tex3D;
155 inline ShaderSampler (void)
158 , tex2DArray(DE_NULL)
164 ShaderEvalContext (const QuadGrid& quadGrid);
165 ~ShaderEvalContext (void);
167 void reset (float sx, float sy);
171 tcu::Vec4 unitCoords;
172 tcu::Vec4 constCoords;
174 tcu::Vec4 in[MAX_USER_ATTRIBS];
175 ShaderSampler textures[MAX_TEXTURES];
182 inline void discard (void) { isDiscarded = true; }
183 tcu::Vec4 texture2D (int unitNdx, const tcu::Vec2& coords);
186 const QuadGrid& m_quadGrid;
189 typedef void (*ShaderEvalFunc) (ShaderEvalContext& c);
191 inline void evalCoordsPassthroughX (ShaderEvalContext& c) { c.color.x() = c.coords.x(); }
192 inline void evalCoordsPassthroughXY (ShaderEvalContext& c) { c.color.xy() = c.coords.swizzle(0,1); }
193 inline void evalCoordsPassthroughXYZ (ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); }
194 inline void evalCoordsPassthrough (ShaderEvalContext& c) { c.color = c.coords; }
195 inline void evalCoordsSwizzleWZYX (ShaderEvalContext& c) { c.color = c.coords.swizzle(3,2,1,0); }
198 // Either inherit a class with overridden evaluate() or just pass in an evalFunc.
200 class ShaderEvaluator
203 ShaderEvaluator (void);
204 ShaderEvaluator (const ShaderEvalFunc evalFunc);
205 virtual ~ShaderEvaluator (void);
207 virtual void evaluate (ShaderEvalContext& ctx) const;
210 ShaderEvaluator (const ShaderEvaluator&); // not allowed!
211 ShaderEvaluator& operator= (const ShaderEvaluator&); // not allowed!
213 const ShaderEvalFunc m_evalFunc;
218 typedef void (*UniformSetupFunc) (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords);
224 UniformSetup (const UniformSetupFunc setup);
225 virtual ~UniformSetup (void);
226 virtual void setup (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) const;
229 UniformSetup (const UniformSetup&); // not allowed!
230 UniformSetup& operator= (const UniformSetup&); // not allowed!
232 const UniformSetupFunc m_setupFunc;
235 typedef void (*AttributeSetupFunc) (ShaderRenderCaseInstance& instance, deUint32 numVertices);
237 class ShaderRenderCase : public vkt::TestCase
240 ShaderRenderCase (tcu::TestContext& testCtx,
241 const std::string& name,
242 const std::string& description,
243 const bool isVertexCase,
244 const ShaderEvalFunc evalFunc,
245 const UniformSetup* uniformSetup,
246 const AttributeSetupFunc attribFunc);
248 ShaderRenderCase (tcu::TestContext& testCtx,
249 const std::string& name,
250 const std::string& description,
251 const bool isVertexCase,
252 const ShaderEvaluator* evaluator,
253 const UniformSetup* uniformSetup,
254 const AttributeSetupFunc attribFunc);
256 virtual ~ShaderRenderCase (void);
257 virtual void initPrograms (vk::SourceCollections& programCollection) const;
258 virtual TestInstance* createInstance (Context& context) const;
261 std::string m_vertShaderSource;
262 std::string m_fragShaderSource;
264 const bool m_isVertexCase;
265 const de::UniquePtr<const ShaderEvaluator> m_evaluator;
266 const de::UniquePtr<const UniformSetup> m_uniformSetup;
267 const AttributeSetupFunc m_attribFunc;
373 enum BaseAttributeType
393 // ShaderRenderCaseInstance.
395 class ShaderRenderCaseInstance : public vkt::TestInstance
398 ShaderRenderCaseInstance (Context& context,
399 const bool isVertexCase,
400 const ShaderEvaluator& evaluator,
401 const UniformSetup& uniformSetup,
402 const AttributeSetupFunc attribFunc);
404 virtual ~ShaderRenderCaseInstance (void);
405 virtual tcu::TestStatus iterate (void);
407 void addAttribute (deUint32 bindingLocation,
409 deUint32 sizePerElement,
412 void useAttribute (deUint32 bindingLocation,
413 BaseAttributeType type);
416 void addUniform (deUint32 bindingLocation,
417 vk::VkDescriptorType descriptorType,
419 void addUniform (deUint32 bindingLocation,
420 vk::VkDescriptorType descriptorType,
423 void useUniform (deUint32 bindingLocation,
424 BaseUniformType type);
425 void useSampler (deUint32 bindingLocation,
428 static const tcu::Vec4 getDefaultConstCoords (void) { return tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f); }
431 ShaderRenderCaseInstance (Context& context,
432 const bool isVertexCase,
433 const ShaderEvaluator* evaluator,
434 const UniformSetup* uniformSetup,
435 const AttributeSetupFunc attribFunc);
437 virtual void setup (void);
438 virtual void setupUniforms (const tcu::Vec4& constCoords);
439 virtual void setupDefaultInputs (void);
441 void render (deUint32 numVertices,
442 deUint32 numTriangles,
443 const deUint16* indices,
444 const tcu::Vec4& constCoords = getDefaultConstCoords());
446 const tcu::TextureLevel& getResultImage (void) const { return m_resultImage; }
448 const tcu::UVec2 getViewportSize (void) const;
450 void setSampleCount (vk::VkSampleCountFlagBits sampleCount);
452 bool isMultiSampling (void) const;
454 vk::Allocator& m_memAlloc;
455 const tcu::Vec4 m_clearColor;
456 const bool m_isVertexCase;
458 std::vector<tcu::Mat4> m_userAttribTransforms;
459 std::vector<TextureBindingSp> m_textures;
461 std::string m_vertexShaderName;
462 std::string m_fragmentShaderName;
463 tcu::UVec2 m_renderSize;
464 vk::VkFormat m_colorFormat;
467 typedef std::vector<tcu::ConstPixelBufferAccess> TextureLayerData;
468 typedef std::vector<TextureLayerData> TextureData;
470 void uploadImage (const tcu::TextureFormat& texFormat,
471 const TextureData& textureData,
472 const tcu::Sampler& refSampler,
474 deUint32 arrayLayers,
475 vk::VkImage destImage);
477 void createSamplerUniform (deUint32 bindingLocation,
478 TextureBinding::Type textureType,
479 const tcu::TextureFormat& texFormat,
480 const tcu::IVec3 texSize,
481 const TextureData& textureData,
482 const tcu::Sampler& refSampler,
484 deUint32 arrayLayers,
485 TextureBinding::Parameters textureParams);
487 void setupUniformData (deUint32 bindingLocation, size_t size, const void* dataPtr);
489 void computeVertexReference (tcu::Surface& result, const QuadGrid& quadGrid);
490 void computeFragmentReference (tcu::Surface& result, const QuadGrid& quadGrid);
491 bool compareImages (const tcu::Surface& resImage,
492 const tcu::Surface& refImage,
493 float errorThreshold);
496 const ShaderEvaluator* m_evaluator;
497 const UniformSetup* m_uniformSetup;
498 const AttributeSetupFunc m_attribFunc;
500 de::MovePtr<QuadGrid> m_quadGrid;
501 tcu::TextureLevel m_resultImage;
503 struct EnabledBaseAttribute
506 BaseAttributeType type;
508 std::vector<EnabledBaseAttribute> m_enabledBaseAttributes;
510 de::MovePtr<vk::DescriptorSetLayoutBuilder> m_descriptorSetLayoutBuilder;
511 de::MovePtr<vk::DescriptorPoolBuilder> m_descriptorPoolBuilder;
512 de::MovePtr<vk::DescriptorSetUpdateBuilder> m_descriptorSetUpdateBuilder;
514 typedef de::SharedPtr<vk::Unique<vk::VkBuffer> > VkBufferSp;
515 typedef de::SharedPtr<vk::Unique<vk::VkImage> > VkImageSp;
516 typedef de::SharedPtr<vk::Unique<vk::VkImageView> > VkImageViewSp;
517 typedef de::SharedPtr<vk::Unique<vk::VkSampler> > VkSamplerSp;
518 typedef de::SharedPtr<vk::Allocation> AllocationSp;
523 UniformInfo (void) {}
524 virtual ~UniformInfo (void) {}
526 vk::VkDescriptorType type;
530 class BufferUniform : public UniformInfo
533 BufferUniform (void) {}
534 virtual ~BufferUniform (void) {}
538 vk::VkDescriptorBufferInfo descriptor;
541 class SamplerUniform : public UniformInfo
544 SamplerUniform (void) {}
545 virtual ~SamplerUniform (void) {}
548 VkImageViewSp imageView;
551 vk::VkDescriptorImageInfo descriptor;
554 typedef de::SharedPtr<de::UniquePtr<UniformInfo> > UniformInfoSp;
555 std::vector<UniformInfoSp> m_uniformInfos;
557 std::vector<vk::VkVertexInputBindingDescription> m_vertexBindingDescription;
558 std::vector<vk::VkVertexInputAttributeDescription> m_vertexAttributeDescription;
560 std::vector<VkBufferSp> m_vertexBuffers;
561 std::vector<AllocationSp> m_vertexBufferAllocs;
563 vk::VkSampleCountFlagBits m_sampleCount;
567 void ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescriptorType descriptorType, const T& data)
569 addUniform(bindingLocation, descriptorType, sizeof(T), &data);
575 #endif // _VKTSHADERRENDER_HPP