Merge vk-gl-cts/vulkan-cts-1.1.2 into vk-gl-cts/vulkan-cts-1.1.3
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / spirv_assembly / vktSpvAsmGraphicsShaderTestUtil.hpp
1 #ifndef _VKTSPVASMGRAPHICSSHADERTESTUTIL_HPP
2 #define _VKTSPVASMGRAPHICSSHADERTESTUTIL_HPP
3 /*-------------------------------------------------------------------------
4  * Vulkan Conformance Tests
5  * ------------------------
6  *
7  * Copyright (c) 2017 Google Inc.
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Graphics pipeline and helper functions for SPIR-V assembly tests
24  *//*--------------------------------------------------------------------*/
25
26 #include "tcuCommandLine.hpp"
27 #include "tcuRGBA.hpp"
28
29 #include "vkPrograms.hpp"
30 #include "vktSpvAsmComputeShaderTestUtil.hpp"
31 #include "vktSpvAsmUtils.hpp"
32 #include "vktTestCaseUtil.hpp"
33
34 #include "deRandom.hpp"
35 #include "deSharedPtr.hpp"
36
37 #include <map>
38 #include <sstream>
39 #include <string>
40 #include <utility>
41
42 namespace vkt
43 {
44 namespace SpirVAssembly
45 {
46
47 typedef vk::Unique<VkBuffer>                                                                            BufferHandleUp;
48 typedef vk::Unique<VkImage>                                                                                     ImageHandleUp;
49 typedef vk::Unique<VkImageView>                                                                         ImageViewHandleUp;
50 typedef vk::Unique<VkSampler>                                                                           SamplerHandleUp;
51 typedef de::SharedPtr<BufferHandleUp>                                                           BufferHandleSp;
52 typedef de::SharedPtr<ImageHandleUp>                                                            ImageHandleSp;
53 typedef de::SharedPtr<ImageViewHandleUp>                                                        ImageViewHandleSp;
54 typedef de::SharedPtr<SamplerHandleUp>                                                          SamplerHandleSp;
55 typedef vk::Unique<vk::VkShaderModule>                                                          ModuleHandleUp;
56 typedef de::SharedPtr<ModuleHandleUp>                                                           ModuleHandleSp;
57 typedef std::pair<std::string, vk::VkShaderStageFlagBits>                       EntryToStage;
58 typedef std::map<std::string, std::vector<EntryToStage> >                       ModuleMap;
59 typedef std::map<vk::VkShaderStageFlagBits, SpecConstants >                     StageToSpecConstantMap;
60
61 enum NumberType
62 {
63         NUMBERTYPE_INT32,
64         NUMBERTYPE_UINT32,
65         NUMBERTYPE_FLOAT32,
66         NUMBERTYPE_END32,               // Marks the end of 32-bit scalar types
67         NUMBERTYPE_INT16,
68         NUMBERTYPE_UINT16,
69         NUMBERTYPE_FLOAT16,
70         NUMBERTYPE_END16,               // Marks the end of 16-bit scalar types
71         NUMBERTYPE_FLOAT64,
72 };
73
74 typedef enum RoundingModeFlags_e
75 {
76         ROUNDINGMODE_RTE = 0x1, // Round to nearest even
77         ROUNDINGMODE_RTZ = 0x2, // Round to zero
78 } RoundingModeFlags;
79
80 typedef bool (*GraphicsVerifyBinaryFunc) (const ProgramBinary&  binary);
81
82 // Resources used by graphics-pipeline-based tests.
83 struct GraphicsResources
84 {
85         // Resources used as inputs.
86         std::vector<Resource>           inputs;
87         // Input resource format if used
88         VkFormat                                        inputFormat;
89         // Resources used as outputs. The data supplied will be used as
90         // the expected outputs for the corresponding bindings by default.
91         // If other behaviors are needed, please provide a custom verifyIO.
92         std::vector<Resource>           outputs;
93         // If null, a default verification will be performed by comparing the
94         // memory pointed to by outputAllocations  and the contents of
95         // expectedOutputs. Otherwise the function pointed to by verifyIO will
96         // be called. If true is returned, then the test case is assumed to
97         // have passed, if false is returned, then the test case is assumed
98         // to have failed.
99         VerifyIOFunc                            verifyIO;
100         GraphicsVerifyBinaryFunc        verifyBinary;
101         SpirvVersion                            spirvVersion;
102
103                                                         GraphicsResources()
104                                                                 : inputFormat   (VK_FORMAT_R32G32B32A32_SFLOAT)
105                                                                 , verifyIO              (DE_NULL)
106                                                                 , verifyBinary  (DE_NULL)
107                                                                 , spirvVersion  (SPIRV_VERSION_1_0)
108                                                         {}
109 };
110
111 // Interface data type.
112 struct IFDataType
113 {
114                                                 IFDataType                      (deUint32 numE, NumberType elementT)
115                                                         : numElements   (numE)
116                                                         , elementType   (elementT)
117                                                 {
118                                                         DE_ASSERT(numE > 0 && numE < 5);
119                                                         DE_ASSERT(elementT != NUMBERTYPE_END32 && elementT != NUMBERTYPE_END16);
120                                                 }
121
122                                                 IFDataType                      (const IFDataType& that)
123                                                         : numElements   (that.numElements)
124                                                         , elementType   (that.elementType)
125                                                 {}
126
127         deUint32                        getElementNumBytes      (void) const;
128         deUint32                        getNumBytes                     (void) const { return numElements * getElementNumBytes(); }
129
130         vk::VkFormat            getVkFormat                     (void) const;
131
132         tcu::TextureFormat      getTextureFormat        (void) const;
133
134         std::string                     str                                     (void) const;
135
136         bool                            elementIs32bit          (void) const { return elementType < NUMBERTYPE_END32; }
137         bool                            elementIs64bit          (void) const { return elementType > NUMBERTYPE_END16; }
138
139         bool                            isVector                        (void) const { return numElements > 1; }
140
141         deUint32                        numElements;
142         NumberType                      elementType;
143 };
144
145 typedef std::pair<IFDataType, BufferSp>                 Interface;
146
147 // Interface variables used by graphics-pipeline-based tests.
148 class GraphicsInterfaces
149 {
150 public:
151                                                 GraphicsInterfaces      ()
152                                                         : rndMode       (static_cast<RoundingModeFlags>(0))
153                                                 {}
154
155                                                 GraphicsInterfaces      (const GraphicsInterfaces& that)
156                                                         : inputs        (that.inputs)
157                                                         , outputs       (that.outputs)
158                                                         , rndMode       (that.rndMode)
159                                                 {}
160
161         void                            setInputOutput          (const Interface& input, const Interface&  output)
162                                                 {
163                                                         inputs.clear();
164                                                         outputs.clear();
165                                                         inputs.push_back(input);
166                                                         outputs.push_back(output);
167                                                 }
168
169         const IFDataType&       getInputType            (void) const
170                                                 {
171                                                         DE_ASSERT(inputs.size() == 1);
172                                                         return inputs.front().first;
173                                                 }
174
175         const IFDataType&       getOutputType           (void) const
176                                                 {
177                                                         DE_ASSERT(outputs.size() == 1);
178                                                         return outputs.front().first;
179                                                 }
180
181         const BufferSp&         getInputBuffer          (void) const
182                                                 {
183                                                         DE_ASSERT(inputs.size() == 1);
184                                                         return inputs.front().second;
185                                                 }
186
187         const BufferSp&         getOutputBuffer         (void) const
188                                                 {
189                                                         DE_ASSERT(outputs.size() == 1);
190                                                         return outputs.front().second;
191                                                 }
192
193         bool                            empty                           (void) const
194                                                 {
195                                                         return inputs.size() == 0;
196                                                 }
197
198         void                            setRoundingMode         (RoundingModeFlags flag)
199                                                 {
200                                                         rndMode = flag;
201                                                 }
202         RoundingModeFlags       getRoundingMode         (void) const
203                                                 {
204                                                         return rndMode;
205                                                 }
206 private:
207         // vector<Interface> acts as a null-able Interface here. Canonically we should use
208         // std::unique_ptr, but sadly we cannot leverage C++11 in dEQP. dEQP has its own
209         // de::UniquePtr, but still cumbersome to use in InstanceContext and do copies
210         // at various places.
211         // Public methods should make sure that there are less than two elements in both
212         // members and both members have the same number of elements.
213         std::vector<Interface>  inputs;
214         std::vector<Interface>  outputs;
215         RoundingModeFlags               rndMode;
216
217 };
218
219 struct PushConstants
220 {
221 public:
222                                                         PushConstants (void)
223                                                         {}
224
225                                                         PushConstants (const PushConstants& that)
226                                                                 : pcs   (that.pcs)
227                                                         {}
228
229         void                                    setPushConstant (const BufferSp& pc)
230                                                         {
231                                                                 pcs.clear();
232                                                                 pcs.push_back(pc);
233                                                         }
234
235         bool                                    empty (void) const
236                                                         {
237                                                                 return pcs.empty();
238                                                         }
239
240         const BufferSp&                 getBuffer(void) const
241                                                         {
242                                                                 DE_ASSERT(pcs.size() == 1);
243                                                                 return pcs[0];
244                                                         }
245
246 private:
247         // Right now we only support one field in the push constant block.
248         std::vector<BufferSp>   pcs;
249 };
250
251 // Returns the corresponding buffer usage flag bit for the given descriptor type.
252 VkBufferUsageFlagBits getMatchingBufferUsageFlagBit (VkDescriptorType dType);
253
254 // Context for a specific test instantiation. For example, an instantiation
255 // may test colors yellow/magenta/cyan/mauve in a tesselation shader
256 // with an entry point named 'main_to_the_main'
257 struct InstanceContext
258 {
259         // Map of modules to what entry_points we care to use from those modules.
260         ModuleMap                                                               moduleMap;
261         tcu::RGBA                                                               inputColors[4];
262         tcu::RGBA                                                               outputColors[4];
263         // Concrete SPIR-V code to test via boilerplate specialization.
264         std::map<std::string, std::string>              testCodeFragments;
265         StageToSpecConstantMap                                  specConstants;
266         bool                                                                    hasTessellation;
267         vk::VkShaderStageFlagBits                               requiredStages;
268         std::vector<std::string>                                requiredDeviceExtensions;
269         VulkanFeatures                                                  requestedFeatures;
270         PushConstants                                                   pushConstants;
271         // Specifies the (one or more) stages that use a customized shader code.
272         VkShaderStageFlags                                              customizedStages;
273         // Possible resources used by the graphics pipeline.
274         // If it is not empty, a single descriptor set (number 0) will be allocated
275         // to point to all resources specified. Binding numbers are allocated in
276         // accord with the resources' order in the vector; outputs are allocated
277         // after inputs.
278         GraphicsResources                                               resources;
279         // Possible interface variables use by the graphics pipeline.
280         // If it is not empty, input/output variables will be set up for shader stages
281         // in the test. Both the input and output variable will take location #2 in the
282         // pipeline for all stages, except that the output variable in the fragment
283         // stage will take location #1.
284         GraphicsInterfaces                                              interfaces;
285         qpTestResult                                                    failResult;
286         std::string                                                             failMessageTemplate;    //!< ${reason} in the template will be replaced with a detailed failure message
287         bool                                                                    renderFullSquare;               // Forces to render whole render area, though with background color
288
289         InstanceContext (const tcu::RGBA                                                        (&inputs)[4],
290                                          const tcu::RGBA                                                        (&outputs)[4],
291                                          const std::map<std::string, std::string>&      testCodeFragments_,
292                                          const StageToSpecConstantMap&                          specConstants_,
293                                          const PushConstants&                                           pushConsants_,
294                                          const GraphicsResources&                                       resources_,
295                                          const GraphicsInterfaces&                                      interfaces_,
296                                          const std::vector<std::string>&                        extensions_,
297                                          VulkanFeatures                                                         vulkanFeatures_,
298                                          VkShaderStageFlags                                                     customizedStages_);
299
300         InstanceContext (const InstanceContext& other);
301
302         std::string getSpecializedFailMessage (const std::string& failureReason);
303 };
304
305 // A description of a shader to be used for a single stage of the graphics pipeline.
306 struct ShaderElement
307 {
308         // The module that contains this shader entrypoint.
309         std::string                                     moduleName;
310
311         // The name of the entrypoint.
312         std::string                                     entryName;
313
314         // Which shader stage this entry point represents.
315         vk::VkShaderStageFlagBits       stage;
316
317         ShaderElement (const std::string& moduleName_, const std::string& entryPoint_, vk::VkShaderStageFlagBits shaderStage_);
318 };
319
320 template <typename T>
321 const std::string numberToString (T number)
322 {
323         std::stringstream ss;
324         ss << number;
325         return ss.str();
326 }
327
328 template<typename T>    T                       randomScalar    (de::Random& rnd, T minValue, T maxValue);
329 template<> inline               float           randomScalar    (de::Random& rnd, float minValue, float maxValue)               { return rnd.getFloat(minValue, maxValue);      }
330 template<> inline               deInt32         randomScalar    (de::Random& rnd, deInt32 minValue, deInt32 maxValue)   { return rnd.getInt(minValue, maxValue);        }
331
332 void getDefaultColors (tcu::RGBA (&colors)[4]);
333
334 void getHalfColorsFullAlpha (tcu::RGBA (&colors)[4]);
335
336 void getInvertedDefaultColors (tcu::RGBA (&colors)[4]);
337
338 // Creates fragments that specialize into a simple pass-through shader (of any kind).
339 std::map<std::string, std::string> passthruFragments (void);
340
341 // Creates a combined shader module based on VkShaderStageFlagBits defined in InstanceContext
342 void createCombinedModule (vk::SourceCollections& dst, InstanceContext ctx);
343
344 // This has two shaders of each stage. The first
345 // is a passthrough, the second inverts the color.
346 void createMultipleEntries (vk::SourceCollections& dst, InstanceContext);
347
348 // Turns a statically sized array of ShaderElements into an instance-context
349 // by setting up the mapping of modules to their contained shaders and stages.
350 // The inputs and expected outputs are given by inputColors and outputColors
351 template<size_t N>
352 InstanceContext createInstanceContext (const ShaderElement                                                      (&elements)[N],
353                                                                            const tcu::RGBA                                                              (&inputColors)[4],
354                                                                            const tcu::RGBA                                                              (&outputColors)[4],
355                                                                            const std::map<std::string, std::string>&    testCodeFragments,
356                                                                            const StageToSpecConstantMap&                                specConstants,
357                                                                            const PushConstants&                                                 pushConstants,
358                                                                            const GraphicsResources&                                             resources,
359                                                                            const GraphicsInterfaces&                                    interfaces,
360                                                                            const std::vector<std::string>&                              extensions,
361                                                                            VulkanFeatures                                                               vulkanFeatures,
362                                                                            VkShaderStageFlags                                                   customizedStages,
363                                                                            const qpTestResult                                                   failResult                      = QP_TEST_RESULT_FAIL,
364                                                                            const std::string&                                                   failMessageTemplate     = std::string())
365 {
366         InstanceContext ctx (inputColors, outputColors, testCodeFragments, specConstants, pushConstants, resources, interfaces, extensions, vulkanFeatures, customizedStages);
367         for (size_t i = 0; i < N; ++i)
368         {
369                 ctx.moduleMap[elements[i].moduleName].push_back(std::make_pair(elements[i].entryName, elements[i].stage));
370                 ctx.requiredStages = static_cast<VkShaderStageFlagBits>(ctx.requiredStages | elements[i].stage);
371         }
372         ctx.failResult                          = failResult;
373         if (!failMessageTemplate.empty())
374                 ctx.failMessageTemplate = failMessageTemplate;
375         return ctx;
376 }
377
378 // The same as createInstanceContext above, without extensions, spec constants, and resources.
379 template<size_t N>
380 inline InstanceContext createInstanceContext (const ShaderElement                                               (&elements)[N],
381                                                                                           tcu::RGBA                                                                     (&inputColors)[4],
382                                                                                           const tcu::RGBA                                                       (&outputColors)[4],
383                                                                                           const std::map<std::string, std::string>&     testCodeFragments)
384 {
385         return createInstanceContext(elements, inputColors, outputColors, testCodeFragments,
386                                                                  StageToSpecConstantMap(), PushConstants(), GraphicsResources(),
387                                                                  GraphicsInterfaces(), std::vector<std::string>(),
388                                                                  VulkanFeatures(), vk::VK_SHADER_STAGE_ALL);
389 }
390
391 // The same as createInstanceContext above, but with default colors.
392 template<size_t N>
393 InstanceContext createInstanceContext (const ShaderElement                                                      (&elements)[N],
394                                                                            const std::map<std::string, std::string>&    testCodeFragments)
395 {
396         tcu::RGBA defaultColors[4];
397         getDefaultColors(defaultColors);
398         return createInstanceContext(elements, defaultColors, defaultColors, testCodeFragments);
399 }
400
401 void addShaderCodeCustomVertex (vk::SourceCollections& dst, InstanceContext& context, const SpirVAsmBuildOptions* spirVAsmBuildOptions);
402 void addShaderCodeCustomTessControl (vk::SourceCollections& dst, InstanceContext& context, const SpirVAsmBuildOptions* spirVAsmBuildOptions);
403 void addShaderCodeCustomTessEval (vk::SourceCollections& dst, InstanceContext& context, const SpirVAsmBuildOptions* spirVAsmBuildOptions);
404 void addShaderCodeCustomGeometry (vk::SourceCollections& dst, InstanceContext& context, const SpirVAsmBuildOptions* spirVAsmBuildOptions);
405 void addShaderCodeCustomFragment (vk::SourceCollections& dst, InstanceContext& context, const SpirVAsmBuildOptions* spirVAsmBuildOptions);
406
407 void createTestForStage (vk::VkShaderStageFlagBits                                      stage,
408                                                  const std::string&                                                     name,
409                                                  const tcu::RGBA                                                        (&inputColors)[4],
410                                                  const tcu::RGBA                                                        (&outputColors)[4],
411                                                  const std::map<std::string, std::string>&      testCodeFragments,
412                                                  const SpecConstants&                                           specConstants,
413                                                  const PushConstants&                                           pushConstants,
414                                                  const GraphicsResources&                                       resources,
415                                                  const GraphicsInterfaces&                                      interfaces,
416                                                  const std::vector<std::string>&                        extensions,
417                                                  VulkanFeatures                                                         vulkanFeatures,
418                                                  tcu::TestCaseGroup*                                            tests,
419                                                  const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
420                                                  const std::string&                                                     failMessageTemplate = std::string(),
421                                                  const bool                                                                     renderFullSquare        = false);
422
423 void createTestsForAllStages (const std::string&                                                name,
424                                                           const tcu::RGBA                                                       (&inputColors)[4],
425                                                           const tcu::RGBA                                                       (&outputColors)[4],
426                                                           const std::map<std::string, std::string>&     testCodeFragments,
427                                                           const SpecConstants&                                          specConstants,
428                                                           const PushConstants&                                          pushConstants,
429                                                           const GraphicsResources&                                      resources,
430                                                           const GraphicsInterfaces&                                     interfaces,
431                                                           const std::vector<std::string>&                       extensions,
432                                                           VulkanFeatures                                                        vulkanFeatures,
433                                                           tcu::TestCaseGroup*                                           tests,
434                                                           const qpTestResult                                            failResult                      = QP_TEST_RESULT_FAIL,
435                                                           const std::string&                                            failMessageTemplate     = std::string());
436
437 inline void createTestsForAllStages (const std::string&                                                 name,
438                                                                          const tcu::RGBA                                                        (&inputColors)[4],
439                                                                          const tcu::RGBA                                                        (&outputColors)[4],
440                                                                          const std::map<std::string, std::string>&      testCodeFragments,
441                                                                          tcu::TestCaseGroup*                                            tests,
442                                                                          const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
443                                                                          const std::string&                                                     failMessageTemplate     = std::string())
444 {
445         SpecConstants                           noSpecConstants;
446         PushConstants                           noPushConstants;
447         GraphicsResources                       noResources;
448         GraphicsInterfaces                      noInterfaces;
449         std::vector<std::string>        noExtensions;
450
451         createTestsForAllStages(
452                         name, inputColors, outputColors, testCodeFragments, noSpecConstants, noPushConstants,
453                         noResources, noInterfaces, noExtensions, VulkanFeatures(),
454                         tests, failResult, failMessageTemplate);
455 }
456
457 inline void createTestsForAllStages (const std::string&                                                 name,
458                                                                          const tcu::RGBA                                                        (&inputColors)[4],
459                                                                          const tcu::RGBA                                                        (&outputColors)[4],
460                                                                          const std::map<std::string, std::string>&      testCodeFragments,
461                                                                          const SpecConstants&                                           specConstants,
462                                                                          tcu::TestCaseGroup*                                            tests,
463                                                                          const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
464                                                                          const std::string&                                                     failMessageTemplate     = std::string())
465 {
466         PushConstants                                   noPushConstants;
467         GraphicsResources                               noResources;
468         GraphicsInterfaces                              noInterfaces;
469         std::vector<std::string>                noExtensions;
470
471         createTestsForAllStages(
472                         name, inputColors, outputColors, testCodeFragments, specConstants, noPushConstants,
473                         noResources, noInterfaces, noExtensions, VulkanFeatures(),
474                         tests, failResult, failMessageTemplate);
475 }
476
477 inline void createTestsForAllStages (const std::string&                                                 name,
478                                                                          const tcu::RGBA                                                        (&inputColors)[4],
479                                                                          const tcu::RGBA                                                        (&outputColors)[4],
480                                                                          const std::map<std::string, std::string>&      testCodeFragments,
481                                                                          const GraphicsResources&                                       resources,
482                                                                          const std::vector<std::string>&                        extensions,
483                                                                          tcu::TestCaseGroup*                                            tests,
484                                                                          VulkanFeatures                                                         vulkanFeatures          = VulkanFeatures(),
485                                                                          const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
486                                                                          const std::string&                                                     failMessageTemplate     = std::string())
487 {
488         SpecConstants                           noSpecConstants;
489         PushConstants                           noPushConstants;
490         GraphicsInterfaces                      noInterfaces;
491
492         createTestsForAllStages(
493                         name, inputColors, outputColors, testCodeFragments, noSpecConstants, noPushConstants,
494                         resources, noInterfaces, extensions, vulkanFeatures,
495                         tests, failResult, failMessageTemplate);
496 }
497
498 inline void createTestsForAllStages (const std::string& name,
499                                                                          const tcu::RGBA                                                        (&inputColors)[4],
500                                                                          const tcu::RGBA                                                        (&outputColors)[4],
501                                                                          const std::map<std::string, std::string>&      testCodeFragments,
502                                                                          const GraphicsInterfaces                                       interfaces,
503                                                                          const std::vector<std::string>&                        extensions,
504                                                                          tcu::TestCaseGroup*                                            tests,
505                                                                          VulkanFeatures                                                         vulkanFeatures          = VulkanFeatures(),
506                                                                          const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
507                                                                          const std::string&                                                     failMessageTemplate     = std::string())
508 {
509         GraphicsResources                       noResources;
510         SpecConstants                           noSpecConstants;
511         PushConstants                           noPushConstants;
512
513         createTestsForAllStages(
514                         name, inputColors, outputColors, testCodeFragments, noSpecConstants, noPushConstants,
515                         noResources, interfaces, extensions, vulkanFeatures,
516                         tests, failResult, failMessageTemplate);
517 }
518
519 inline void createTestsForAllStages (const std::string& name,
520                                                                          const tcu::RGBA                                                        (&inputColors)[4],
521                                                                          const tcu::RGBA                                                        (&outputColors)[4],
522                                                                          const std::map<std::string, std::string>&      testCodeFragments,
523                                                                          const PushConstants&                                           pushConstants,
524                                                                          const GraphicsResources&                                       resources,
525                                                                          const std::vector<std::string>&                        extensions,
526                                                                          tcu::TestCaseGroup*                                            tests,
527                                                                          VulkanFeatures                                                         vulkanFeatures          = VulkanFeatures(),
528                                                                          const qpTestResult                                                     failResult                      = QP_TEST_RESULT_FAIL,
529                                                                          const std::string&                                                     failMessageTemplate     = std::string())
530 {
531         SpecConstants                                   noSpecConstants;
532         GraphicsInterfaces                              noInterfaces;
533
534         createTestsForAllStages(
535                         name, inputColors, outputColors, testCodeFragments, noSpecConstants, pushConstants,
536                         resources, noInterfaces, extensions, vulkanFeatures,
537                         tests, failResult, failMessageTemplate);
538 }
539
540 // Sets up and runs a Vulkan pipeline, then spot-checks the resulting image.
541 // Feeds the pipeline a set of colored triangles, which then must occur in the
542 // rendered image.  The surface is cleared before executing the pipeline, so
543 // whatever the shaders draw can be directly spot-checked.
544 tcu::TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instance);
545
546 // Adds a new test to group using custom fragments for the tessellation-control
547 // stage and passthrough fragments for all other stages.  Uses default colors
548 // for input and expected output.
549 void addTessCtrlTest (tcu::TestCaseGroup* group, const char* name, const std::map<std::string, std::string>& fragments);
550
551 // Given the original 32-bit float value, computes the corresponding 16-bit
552 // float value under the given rounding mode flags and compares with the
553 // returned 16-bit float value. Returns true if they are considered as equal.
554 //
555 // The following equivalence criteria are respected:
556 // * Positive and negative zeros are considered equivalent.
557 // * Denormalized floats are allowed to be flushed to zeros, including
558 //   * Inputted 32bit denormalized float
559 //   * Generated 16bit denormalized float
560 // * Different bit patterns of NaNs are allowed.
561 // * For the rest, require exactly the same bit pattern.
562 bool compare16BitFloat (float original, deUint16 returned, RoundingModeFlags flags, tcu::TestLog& log);
563
564 // Given the original 16-bit float value, computes the corresponding 32-bit
565 // float value and compares with the returned 32-bit float value.
566 // Returns true if they are considered as equal.
567 //
568 // The following equivalence criteria are respected:
569 // * Positive and negative zeros are considered equivalent.
570 // * Denormalized floats are allowed to be flushed to zeros, including
571 //   * Inputted 16bit denormalized float
572 //   * Generated 32bit denormalized float
573 // * Different bit patterns of NaNs are allowed.
574 // * For the rest, require exactly the same bit pattern.
575 bool compare16BitFloat (deUint16 returned, float original, tcu::TestLog& log);
576 bool compare16BitFloat (deFloat16 original, deFloat16 returned, std::string& error);
577
578 // Given the original 64-bit float value, computes the corresponding 16-bit
579 // float value under the given rounding mode flags and compares with the
580 // returned 16-bit float value. Returns true if they are considered as equal.
581 //
582 // The following equivalence criteria are respected:
583 // * Positive and negative zeros are considered equivalent.
584 // * Denormalized floats are allowed to be flushed to zeros, including
585 //   * Inputted 64bit denormalized float
586 //   * Generated 16bit denormalized float
587 // * Different bit patterns of NaNs are allowed.
588 // * For the rest, require exactly the same bit pattern.
589 bool compare16BitFloat64 (double original, deUint16 returned, RoundingModeFlags flags, tcu::TestLog& log);
590
591 // Compare the returned 32-bit float against its expected value.
592 //
593 // The following equivalence criteria are respected:
594 // * Denormalized floats are allowed to be flushed to zeros, including
595 //   * The expected value itself is a denormalized float
596 //   * The expected value is a denormalized float if converted to 16bit
597 // * Different bit patterns of NaNs/Infs are allowed.
598 // * For the rest, use C++ float equivalence check.
599 bool compare32BitFloat (float expected, float returned, tcu::TestLog& log);
600
601 // Compare the returned 64-bit float against its expected value.
602 //
603 // The following equivalence criteria are respected:
604 // * Denormalized floats are allowed to be flushed to zeros, including
605 //   * The expected value itself is a denormalized float
606 //   * The expected value is a denormalized float if converted to 16bit
607 // * Different bit patterns of NaNs/Infs are allowed.
608 // * For the rest, use C++ float equivalence check.
609 bool compare64BitFloat (double expected, double returned, tcu::TestLog& log);
610
611 } // SpirVAssembly
612 } // vkt
613
614 #endif // _VKTSPVASMGRAPHICSSHADERTESTUTIL_HPP