1 #ifndef _VKTSUBGROUPSTESTSUTILS_HPP
2 #define _VKTSUBGROUPSTESTSUTILS_HPP
3 /*------------------------------------------------------------------------
4  * Vulkan Conformance Tests
5  * ------------------------
6  *
7  * Copyright (c) 2017 The Khronos Group Inc.
8  * Copyright (c) 2017 Codeplay Software 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 Subgroups tests utility classes
25  */ /*--------------------------------------------------------------------*/
26 
27 #include "vkBuilderUtil.hpp"
28 #include "vkDefs.hpp"
29 #include "vkDeviceUtil.hpp"
30 #include "vkMemUtil.hpp"
31 #include "vkPlatform.hpp"
32 #include "vkPrograms.hpp"
33 #include "vkQueryUtil.hpp"
34 #include "vkRef.hpp"
35 #include "vkRefUtil.hpp"
36 #include "vkStrUtil.hpp"
37 #include "vkTypeUtil.hpp"
38 #include "vktTestCase.hpp"
39 #include "vktTestCaseUtil.hpp"
40 
41 #include "tcuFormatUtil.hpp"
42 #include "tcuTestLog.hpp"
43 #include "tcuVectorUtil.hpp"
44 
45 #include "gluShaderUtil.hpp"
46 
47 #include "deSharedPtr.hpp"
48 #include "deUniquePtr.hpp"
49 
50 #include <string>
51 
52 namespace vkt
53 {
54 namespace subgroups
55 {
56 // A struct to represent input data to a shader
57 struct SSBOData
58 {
SSBODatavkt::subgroups::SSBOData59 	SSBOData() :
60 		initializeType	(InitializeNone),
61 		layout			(LayoutStd140),
62 		format			(vk::VK_FORMAT_UNDEFINED),
63 		numElements		(0),
64 		isImage			(false),
65 		binding			(0u),
66 		stages			((vk::VkShaderStageFlagBits)0u)
67 	{}
68 
69 	enum InputDataInitializeType
70 	{
71 		InitializeNone = 0,
72 		InitializeNonZero,
73 		InitializeZero,
74 	} initializeType;
75 
76 	enum InputDataLayoutType
77 	{
78 		LayoutStd140 = 0,
79 		LayoutStd430,
80 		LayoutPacked
81 	} layout;
82 
83 	vk::VkFormat				format;
84 	vk::VkDeviceSize			numElements;
85 	bool						isImage;
86 	deUint32					binding;
87 	vk::VkShaderStageFlagBits	stages;
88 };
89 
90 std::string getSharedMemoryBallotHelper();
91 
92 deUint32 getSubgroupSize(Context& context);
93 
94 vk::VkDeviceSize maxSupportedSubgroupSize();
95 
96 std::string getShaderStageName(vk::VkShaderStageFlags stage);
97 
98 std::string getSubgroupFeatureName(vk::VkSubgroupFeatureFlagBits bit);
99 
100 void addNoSubgroupShader (vk::SourceCollections& programCollection);
101 
102 std::string getVertShaderForStage(vk::VkShaderStageFlags stage);//TODO
103 
104 bool isSubgroupSupported(Context& context);
105 
106 bool areSubgroupOperationsSupportedForStage(
107 	Context& context, vk::VkShaderStageFlags stage);
108 
109 bool areSubgroupOperationsRequiredForStage(vk::VkShaderStageFlags stage);
110 
111 bool isSubgroupFeatureSupportedForDevice(Context& context, vk::VkSubgroupFeatureFlagBits bit);
112 
113 bool isFragmentSSBOSupportedForDevice(Context& context);
114 
115 bool isVertexSSBOSupportedForDevice(Context& context);
116 
117 bool isDoubleSupportedForDevice(Context& context);
118 
119 bool isDoubleFormat(vk::VkFormat format);
120 
121 std::string getFormatNameForGLSL(vk::VkFormat format);
122 
123 void addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection);
124 void addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection);
125 
126 void setVertexShaderFrameBuffer (vk::SourceCollections& programCollection);
127 
128 void setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection);
129 
130 void setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection);
131 
132 void setTesCtrlShaderFrameBuffer (vk::SourceCollections& programCollection);
133 
134 void setTesEvalShaderFrameBuffer (vk::SourceCollections& programCollection);
135 
136 bool check(std::vector<const void*> datas,
137 	deUint32 width, deUint32 ref);
138 
139 bool checkCompute(std::vector<const void*> datas,
140 	const deUint32 numWorkgroups[3], const deUint32 localSize[3],
141 	deUint32 ref);
142 
143 tcu::TestStatus makeTessellationEvaluationFrameBufferTest(Context& context, vk::VkFormat format,
144 	SSBOData* extraData, deUint32 extraDataCount,
145 	bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
146 	const vk::VkShaderStageFlags shaderStage = vk::VK_SHADER_STAGE_ALL_GRAPHICS);
147 
148 tcu::TestStatus makeGeometryFrameBufferTest(Context& context, vk::VkFormat format, SSBOData* extraData,
149 	deUint32 extraDataCount,
150 	bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
151 
152 tcu::TestStatus allStages(Context& context, vk::VkFormat format,
153 	SSBOData* extraData, deUint32 extraDataCount,
154 	bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize),
155 	const vk::VkShaderStageFlags shaderStage);
156 
157 tcu::TestStatus makeVertexFrameBufferTest(Context& context, vk::VkFormat format,
158 	SSBOData* extraData, deUint32 extraDataCount,
159 	bool (*checkResult)(std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize));
160 
161 tcu::TestStatus makeFragmentFrameBufferTest(Context& context, vk::VkFormat format,
162 	SSBOData* extraData, deUint32 extraDataCount,
163 	bool (*checkResult)(std::vector<const void*> datas, deUint32 width,
164 									 deUint32 height, deUint32 subgroupSize));
165 
166 tcu::TestStatus makeComputeTest(
167 	Context& context, vk::VkFormat format, SSBOData* inputs,
168 	deUint32 inputsCount,
169 	bool (*checkResult)(std::vector<const void*> datas,
170 		const deUint32 numWorkgroups[3], const deUint32 localSize[3],
171 		deUint32 subgroupSize));
172 } // subgroups
173 } // vkt
174 
175 #endif // _VKTSUBGROUPSTESTSUTILS_HPP
176