1e5c31af7Sopenharmony_ci#ifndef _VKTSPVASMUTILS_HPP
2e5c31af7Sopenharmony_ci#define _VKTSPVASMUTILS_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
5e5c31af7Sopenharmony_ci * ------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2017 Google Inc.
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief Utilities for Vulkan SPIR-V assembly tests
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "vkDefs.hpp"
27e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp"
28e5c31af7Sopenharmony_ci#include "vkRef.hpp"
29e5c31af7Sopenharmony_ci#include "vkTypeUtil.hpp"
30e5c31af7Sopenharmony_ci#include "vktTestCase.hpp"
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ci#include "deMemory.h"
33e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
34e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp"
35e5c31af7Sopenharmony_ci#include "deRandom.hpp"
36e5c31af7Sopenharmony_ci#include "deFloat16.h"
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ci#include <string>
39e5c31af7Sopenharmony_ci#include <vector>
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_cinamespace vkt
42e5c31af7Sopenharmony_ci{
43e5c31af7Sopenharmony_cinamespace SpirVAssembly
44e5c31af7Sopenharmony_ci{
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_ci#define SPIRV_ASSEMBLY_TYPES																				\
47e5c31af7Sopenharmony_ci	"%void = OpTypeVoid\n"																					\
48e5c31af7Sopenharmony_ci	"%bool = OpTypeBool\n"																					\
49e5c31af7Sopenharmony_ci																											\
50e5c31af7Sopenharmony_ci	"%i32 = OpTypeInt 32 1\n"																				\
51e5c31af7Sopenharmony_ci	"%u32 = OpTypeInt 32 0\n"																				\
52e5c31af7Sopenharmony_ci																											\
53e5c31af7Sopenharmony_ci	"%f32 = OpTypeFloat 32\n"																				\
54e5c31af7Sopenharmony_ci	"%v2i32 = OpTypeVector %i32 2\n"																		\
55e5c31af7Sopenharmony_ci	"%v2u32 = OpTypeVector %u32 2\n"																		\
56e5c31af7Sopenharmony_ci	"%v2f32 = OpTypeVector %f32 2\n"																		\
57e5c31af7Sopenharmony_ci	"%v3i32 = OpTypeVector %i32 3\n"																		\
58e5c31af7Sopenharmony_ci	"%v3u32 = OpTypeVector %u32 3\n"																		\
59e5c31af7Sopenharmony_ci	"%v3f32 = OpTypeVector %f32 3\n"																		\
60e5c31af7Sopenharmony_ci	"%v4i32 = OpTypeVector %i32 4\n"																		\
61e5c31af7Sopenharmony_ci	"%v4u32 = OpTypeVector %u32 4\n"																		\
62e5c31af7Sopenharmony_ci	"%v4f32 = OpTypeVector %f32 4\n"																		\
63e5c31af7Sopenharmony_ci	"%v4bool = OpTypeVector %bool 4\n"																		\
64e5c31af7Sopenharmony_ci																											\
65e5c31af7Sopenharmony_ci	"%v4f32_v4f32_function = OpTypeFunction %v4f32 %v4f32\n"									\
66e5c31af7Sopenharmony_ci	"%bool_function = OpTypeFunction %bool\n"																\
67e5c31af7Sopenharmony_ci	"%voidf = OpTypeFunction %void\n"																			\
68e5c31af7Sopenharmony_ci																											\
69e5c31af7Sopenharmony_ci	"%ip_f32 = OpTypePointer Input %f32\n"																	\
70e5c31af7Sopenharmony_ci	"%ip_i32 = OpTypePointer Input %i32\n"																	\
71e5c31af7Sopenharmony_ci	"%ip_u32 = OpTypePointer Input %u32\n"																	\
72e5c31af7Sopenharmony_ci	"%ip_v2f32 = OpTypePointer Input %v2f32\n"																\
73e5c31af7Sopenharmony_ci	"%ip_v2i32 = OpTypePointer Input %v2i32\n"																\
74e5c31af7Sopenharmony_ci	"%ip_v2u32 = OpTypePointer Input %v2u32\n"																\
75e5c31af7Sopenharmony_ci	"%ip_v3f32 = OpTypePointer Input %v3f32\n"																\
76e5c31af7Sopenharmony_ci	"%ip_v4f32 = OpTypePointer Input %v4f32\n"																\
77e5c31af7Sopenharmony_ci	"%ip_v4i32 = OpTypePointer Input %v4i32\n"																\
78e5c31af7Sopenharmony_ci	"%ip_v4u32 = OpTypePointer Input %v4u32\n"																\
79e5c31af7Sopenharmony_ci																											\
80e5c31af7Sopenharmony_ci	"%op_f32 = OpTypePointer Output %f32\n"																	\
81e5c31af7Sopenharmony_ci	"%op_i32 = OpTypePointer Output %i32\n"																	\
82e5c31af7Sopenharmony_ci	"%op_u32 = OpTypePointer Output %u32\n"																	\
83e5c31af7Sopenharmony_ci	"%op_v2f32 = OpTypePointer Output %v2f32\n"																\
84e5c31af7Sopenharmony_ci	"%op_v2i32 = OpTypePointer Output %v2i32\n"																\
85e5c31af7Sopenharmony_ci	"%op_v2u32 = OpTypePointer Output %v2u32\n"																\
86e5c31af7Sopenharmony_ci	"%op_v4f32 = OpTypePointer Output %v4f32\n"																\
87e5c31af7Sopenharmony_ci	"%op_v4i32 = OpTypePointer Output %v4i32\n"																\
88e5c31af7Sopenharmony_ci	"%op_v4u32 = OpTypePointer Output %v4u32\n"																\
89e5c31af7Sopenharmony_ci																											\
90e5c31af7Sopenharmony_ci	"%fp_f32   = OpTypePointer Function %f32\n"																\
91e5c31af7Sopenharmony_ci	"%fp_i32   = OpTypePointer Function %i32\n"																\
92e5c31af7Sopenharmony_ci	"%fp_v4f32 = OpTypePointer Function %v4f32\n"															\
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ci#define SPIRV_ASSEMBLY_CONSTANTS																			\
95e5c31af7Sopenharmony_ci	"%c_f32_1 = OpConstant %f32 1.0\n"																		\
96e5c31af7Sopenharmony_ci	"%c_f32_0 = OpConstant %f32 0.0\n"																		\
97e5c31af7Sopenharmony_ci	"%c_f32_0_5 = OpConstant %f32 0.5\n"																	\
98e5c31af7Sopenharmony_ci	"%c_f32_n1  = OpConstant %f32 -1.\n"																	\
99e5c31af7Sopenharmony_ci	"%c_f32_7 = OpConstant %f32 7.0\n"																		\
100e5c31af7Sopenharmony_ci	"%c_f32_8 = OpConstant %f32 8.0\n"																		\
101e5c31af7Sopenharmony_ci	"%c_i32_0 = OpConstant %i32 0\n"																		\
102e5c31af7Sopenharmony_ci	"%c_i32_1 = OpConstant %i32 1\n"																		\
103e5c31af7Sopenharmony_ci	"%c_i32_2 = OpConstant %i32 2\n"																		\
104e5c31af7Sopenharmony_ci	"%c_i32_3 = OpConstant %i32 3\n"																		\
105e5c31af7Sopenharmony_ci	"%c_i32_4 = OpConstant %i32 4\n"																		\
106e5c31af7Sopenharmony_ci	"%c_u32_0 = OpConstant %u32 0\n"																		\
107e5c31af7Sopenharmony_ci	"%c_u32_1 = OpConstant %u32 1\n"																		\
108e5c31af7Sopenharmony_ci	"%c_u32_2 = OpConstant %u32 2\n"																		\
109e5c31af7Sopenharmony_ci	"%c_u32_3 = OpConstant %u32 3\n"																		\
110e5c31af7Sopenharmony_ci	"%c_u32_32 = OpConstant %u32 32\n"																		\
111e5c31af7Sopenharmony_ci	"%c_u32_4 = OpConstant %u32 4\n"																		\
112e5c31af7Sopenharmony_ci	"%c_u32_31_bits = OpConstant %u32 0x7FFFFFFF\n"															\
113e5c31af7Sopenharmony_ci	"%c_v4f32_1_1_1_1 = OpConstantComposite %v4f32 %c_f32_1 %c_f32_1 %c_f32_1 %c_f32_1\n"					\
114e5c31af7Sopenharmony_ci	"%c_v4f32_1_0_0_1 = OpConstantComposite %v4f32 %c_f32_1 %c_f32_0 %c_f32_0 %c_f32_1\n"					\
115e5c31af7Sopenharmony_ci	"%c_v4f32_0_5_0_5_0_5_0_5 = OpConstantComposite %v4f32 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5 %c_f32_0_5\n"	\
116e5c31af7Sopenharmony_ci
117e5c31af7Sopenharmony_ci#define SPIRV_ASSEMBLY_ARRAYS																				\
118e5c31af7Sopenharmony_ci	"%a1f32 = OpTypeArray %f32 %c_u32_1\n"																	\
119e5c31af7Sopenharmony_ci	"%a2f32 = OpTypeArray %f32 %c_u32_2\n"																	\
120e5c31af7Sopenharmony_ci	"%a3v4f32 = OpTypeArray %v4f32 %c_u32_3\n"																\
121e5c31af7Sopenharmony_ci	"%a4f32 = OpTypeArray %f32 %c_u32_4\n"																	\
122e5c31af7Sopenharmony_ci	"%a32v4f32 = OpTypeArray %v4f32 %c_u32_32\n"															\
123e5c31af7Sopenharmony_ci	"%ip_a3v4f32 = OpTypePointer Input %a3v4f32\n"															\
124e5c31af7Sopenharmony_ci	"%ip_a32v4f32 = OpTypePointer Input %a32v4f32\n"														\
125e5c31af7Sopenharmony_ci	"%op_a2f32 = OpTypePointer Output %a2f32\n"																\
126e5c31af7Sopenharmony_ci	"%op_a3v4f32 = OpTypePointer Output %a3v4f32\n"															\
127e5c31af7Sopenharmony_ci	"%op_a4f32 = OpTypePointer Output %a4f32\n"																\
128e5c31af7Sopenharmony_ci
129e5c31af7Sopenharmony_ci/*--------------------------------------------------------------------*//*!
130e5c31af7Sopenharmony_ci * \brief Abstract class for an input/output storage buffer object
131e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
132e5c31af7Sopenharmony_ciclass BufferInterface
133e5c31af7Sopenharmony_ci{
134e5c31af7Sopenharmony_cipublic:
135e5c31af7Sopenharmony_ci	virtual				~BufferInterface	(void)				{}
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_ci	virtual void		getBytes			(std::vector<deUint8>& bytes) const = 0;
138e5c31af7Sopenharmony_ci	virtual void		getPackedBytes		(std::vector<deUint8>& bytes) const = 0;
139e5c31af7Sopenharmony_ci	virtual size_t		getByteSize			(void) const = 0;
140e5c31af7Sopenharmony_ci};
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_citypedef de::SharedPtr<BufferInterface>	BufferSp;
143e5c31af7Sopenharmony_citypedef de::MovePtr<vk::Allocation>		AllocationMp;
144e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Allocation>	AllocationSp;
145e5c31af7Sopenharmony_ci
146e5c31af7Sopenharmony_ciclass Resource
147e5c31af7Sopenharmony_ci{
148e5c31af7Sopenharmony_cipublic:
149e5c31af7Sopenharmony_ci	Resource(const BufferSp& buffer_, vk::VkDescriptorType descriptorType_ = vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, void* userData_ = NULL)
150e5c31af7Sopenharmony_ci		: buffer(buffer_)
151e5c31af7Sopenharmony_ci		, descriptorType(descriptorType_)
152e5c31af7Sopenharmony_ci		, userData(userData_)
153e5c31af7Sopenharmony_ci	{
154e5c31af7Sopenharmony_ci	}
155e5c31af7Sopenharmony_ci
156e5c31af7Sopenharmony_ci	virtual const BufferSp&			getBuffer			() const							{ return buffer; }
157e5c31af7Sopenharmony_ci	virtual void					getBytes			(std::vector<deUint8>& bytes) const	{ buffer->getBytes(bytes); }
158e5c31af7Sopenharmony_ci	virtual size_t					getByteSize			(void) const						{ return buffer->getByteSize(); }
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_ci	virtual void					setDescriptorType	(vk::VkDescriptorType type)		{ descriptorType = type; }
161e5c31af7Sopenharmony_ci	virtual vk::VkDescriptorType	getDescriptorType	()	const						{ return descriptorType; }
162e5c31af7Sopenharmony_ci
163e5c31af7Sopenharmony_ci	virtual void					setUserData			(void* data)					{ userData = data; }
164e5c31af7Sopenharmony_ci	virtual void*					getUserData			() const						{ return userData; }
165e5c31af7Sopenharmony_ci
166e5c31af7Sopenharmony_ciprivate:
167e5c31af7Sopenharmony_ci	BufferSp				buffer;
168e5c31af7Sopenharmony_ci	vk::VkDescriptorType	descriptorType;
169e5c31af7Sopenharmony_ci	void*					userData;
170e5c31af7Sopenharmony_ci};
171e5c31af7Sopenharmony_ci
172e5c31af7Sopenharmony_citypedef bool (*VerifyIOFunc) (const std::vector<Resource>&		inputs,
173e5c31af7Sopenharmony_ci							  const std::vector<AllocationSp>&	outputAllocations,
174e5c31af7Sopenharmony_ci							  const std::vector<Resource>&		expectedOutputs,
175e5c31af7Sopenharmony_ci							  tcu::TestLog&						log);
176e5c31af7Sopenharmony_ci
177e5c31af7Sopenharmony_cistruct SpecConstants
178e5c31af7Sopenharmony_ci{
179e5c31af7Sopenharmony_cipublic:
180e5c31af7Sopenharmony_ci							SpecConstants (void)
181e5c31af7Sopenharmony_ci							{}
182e5c31af7Sopenharmony_ci
183e5c31af7Sopenharmony_ci	bool					empty (void) const
184e5c31af7Sopenharmony_ci							{
185e5c31af7Sopenharmony_ci								return valuesBuffer.empty();
186e5c31af7Sopenharmony_ci							}
187e5c31af7Sopenharmony_ci
188e5c31af7Sopenharmony_ci	size_t					getValuesCount (void) const
189e5c31af7Sopenharmony_ci							{
190e5c31af7Sopenharmony_ci								return sizesBuffer.size();
191e5c31af7Sopenharmony_ci							}
192e5c31af7Sopenharmony_ci
193e5c31af7Sopenharmony_ci	size_t					getValueSize (const size_t valueIndex) const
194e5c31af7Sopenharmony_ci							{
195e5c31af7Sopenharmony_ci								return sizesBuffer[valueIndex];
196e5c31af7Sopenharmony_ci							}
197e5c31af7Sopenharmony_ci
198e5c31af7Sopenharmony_ci	const void*				getValuesBuffer (void) const
199e5c31af7Sopenharmony_ci							{
200e5c31af7Sopenharmony_ci								if (valuesBuffer.size() == 0)
201e5c31af7Sopenharmony_ci									return DE_NULL;
202e5c31af7Sopenharmony_ci								else
203e5c31af7Sopenharmony_ci									return static_cast<const void*>(&valuesBuffer[0]);
204e5c31af7Sopenharmony_ci							}
205e5c31af7Sopenharmony_ci
206e5c31af7Sopenharmony_ci	template<typename T>
207e5c31af7Sopenharmony_ci	void					append (const T value)
208e5c31af7Sopenharmony_ci							{
209e5c31af7Sopenharmony_ci								append(&value, sizeof(value));
210e5c31af7Sopenharmony_ci							}
211e5c31af7Sopenharmony_ci
212e5c31af7Sopenharmony_ci	void					append (const void* buf, const size_t byteSize)
213e5c31af7Sopenharmony_ci							{
214e5c31af7Sopenharmony_ci								DE_ASSERT(byteSize > 0);
215e5c31af7Sopenharmony_ci
216e5c31af7Sopenharmony_ci								valuesBuffer.resize(valuesBuffer.size() + byteSize);
217e5c31af7Sopenharmony_ci								deMemcpy(&valuesBuffer[valuesBuffer.size() - byteSize], buf, byteSize);
218e5c31af7Sopenharmony_ci
219e5c31af7Sopenharmony_ci								sizesBuffer.push_back(byteSize);
220e5c31af7Sopenharmony_ci							}
221e5c31af7Sopenharmony_ci
222e5c31af7Sopenharmony_ciprivate:
223e5c31af7Sopenharmony_ci	std::vector<deUint8>	valuesBuffer;
224e5c31af7Sopenharmony_ci	std::vector<size_t>		sizesBuffer;
225e5c31af7Sopenharmony_ci};
226e5c31af7Sopenharmony_ci
227e5c31af7Sopenharmony_cistruct VulkanFeatures
228e5c31af7Sopenharmony_ci{
229e5c31af7Sopenharmony_ci	vk::VkPhysicalDeviceFeatures							coreFeatures;
230e5c31af7Sopenharmony_ci	vk::VkPhysicalDeviceShaderFloat16Int8Features			extFloat16Int8;
231e5c31af7Sopenharmony_ci	vk::VkPhysicalDevice8BitStorageFeatures					ext8BitStorage;
232e5c31af7Sopenharmony_ci	vk::VkPhysicalDevice16BitStorageFeatures				ext16BitStorage;
233e5c31af7Sopenharmony_ci	vk::VkPhysicalDeviceVariablePointersFeatures			extVariablePointers;
234e5c31af7Sopenharmony_ci	vk::VkPhysicalDeviceVulkanMemoryModelFeatures			extVulkanMemoryModel;
235e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
236e5c31af7Sopenharmony_ci	vk::VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR	extIntegerDotProduct;
237e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
238e5c31af7Sopenharmony_ci	vk::VkPhysicalDeviceFloatControlsProperties				floatControlsProperties;
239e5c31af7Sopenharmony_ci
240e5c31af7Sopenharmony_ci	VulkanFeatures				(void)
241e5c31af7Sopenharmony_ci	{
242e5c31af7Sopenharmony_ci		deMemset(&coreFeatures,				0, sizeof(coreFeatures));
243e5c31af7Sopenharmony_ci		deMemset(&extFloat16Int8,			0, sizeof(vk::VkPhysicalDeviceShaderFloat16Int8Features));
244e5c31af7Sopenharmony_ci		deMemset(&ext8BitStorage,			0, sizeof(vk::VkPhysicalDevice8BitStorageFeatures));
245e5c31af7Sopenharmony_ci		deMemset(&ext16BitStorage,			0, sizeof(vk::VkPhysicalDevice16BitStorageFeatures));
246e5c31af7Sopenharmony_ci		deMemset(&extVariablePointers,		0, sizeof(vk::VkPhysicalDeviceVariablePointersFeatures));
247e5c31af7Sopenharmony_ci		deMemset(&extVulkanMemoryModel,		0, sizeof(vk::VkPhysicalDeviceVulkanMemoryModelFeatures));
248e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
249e5c31af7Sopenharmony_ci		deMemset(&extIntegerDotProduct,		0, sizeof(vk::VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR));
250e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
251e5c31af7Sopenharmony_ci		deMemset(&floatControlsProperties,	0, sizeof(vk::VkPhysicalDeviceFloatControlsProperties));
252e5c31af7Sopenharmony_ci		floatControlsProperties.denormBehaviorIndependence	= vk::VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE;
253e5c31af7Sopenharmony_ci		floatControlsProperties.roundingModeIndependence	= vk::VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE;
254e5c31af7Sopenharmony_ci	}
255e5c31af7Sopenharmony_ci};
256e5c31af7Sopenharmony_ci
257e5c31af7Sopenharmony_ci// Returns true if the whole VulkanFeatures is supported. If not, missingFeature will contain one feature that was missing.
258e5c31af7Sopenharmony_cibool isVulkanFeaturesSupported(const Context& context, const VulkanFeatures& toCheck, const char** missingFeature);
259e5c31af7Sopenharmony_ci
260e5c31af7Sopenharmony_cistruct VariableLocation
261e5c31af7Sopenharmony_ci{
262e5c31af7Sopenharmony_ci	deUint32 set;
263e5c31af7Sopenharmony_ci	deUint32 binding;
264e5c31af7Sopenharmony_ci
265e5c31af7Sopenharmony_ci	// Returns a string representation of the structure suitable for test names.
266e5c31af7Sopenharmony_ci	std::string toString() const ;
267e5c31af7Sopenharmony_ci
268e5c31af7Sopenharmony_ci	// Returns a string representation of the structure suitable for test descriptions.
269e5c31af7Sopenharmony_ci	std::string toDescription() const;
270e5c31af7Sopenharmony_ci};
271e5c31af7Sopenharmony_ci
272e5c31af7Sopenharmony_ci// Returns true if the given float controls features in `toCheck` are all supported.
273e5c31af7Sopenharmony_cibool isFloatControlsFeaturesSupported(	const Context&										context,
274e5c31af7Sopenharmony_ci										const vk::VkPhysicalDeviceFloatControlsProperties&	toCheck,
275e5c31af7Sopenharmony_ci										const char**										missingFeature);
276e5c31af7Sopenharmony_ci
277e5c31af7Sopenharmony_cideUint32 getMinRequiredVulkanVersion (const vk::SpirvVersion version);
278e5c31af7Sopenharmony_ci
279e5c31af7Sopenharmony_cistd::string	getVulkanName (const deUint32 version);
280e5c31af7Sopenharmony_ci
281e5c31af7Sopenharmony_ci// Performs a bitwise copy of source to the destination type Dest.
282e5c31af7Sopenharmony_citemplate <typename Dest, typename Src>
283e5c31af7Sopenharmony_ciDest bitwiseCast (Src source)
284e5c31af7Sopenharmony_ci{
285e5c31af7Sopenharmony_ci  Dest dest;
286e5c31af7Sopenharmony_ci  DE_STATIC_ASSERT(sizeof(source) == sizeof(dest));
287e5c31af7Sopenharmony_ci  deMemcpy(&dest, &source, sizeof(dest));
288e5c31af7Sopenharmony_ci  return dest;
289e5c31af7Sopenharmony_ci}
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ci// Generate and return 64-bit integers.
292e5c31af7Sopenharmony_ci//
293e5c31af7Sopenharmony_ci// Expected count to be at least 16.
294e5c31af7Sopenharmony_cistd::vector<deInt64> getInt64s (de::Random& rnd, const deUint32 count);
295e5c31af7Sopenharmony_ci
296e5c31af7Sopenharmony_ci// Generate and return 32-bit integers.
297e5c31af7Sopenharmony_ci//
298e5c31af7Sopenharmony_ci// Expected count to be at least 16.
299e5c31af7Sopenharmony_cistd::vector<deInt32> getInt32s (de::Random& rnd, const deUint32 count);
300e5c31af7Sopenharmony_ci
301e5c31af7Sopenharmony_ci// Generate and return 16-bit integers.
302e5c31af7Sopenharmony_ci//
303e5c31af7Sopenharmony_ci// Expected count to be at least 8.
304e5c31af7Sopenharmony_cistd::vector<deInt16> getInt16s (de::Random& rnd, const deUint32 count);
305e5c31af7Sopenharmony_ci
306e5c31af7Sopenharmony_ci// Generate and return 8-bit integers.
307e5c31af7Sopenharmony_ci//
308e5c31af7Sopenharmony_ci// Expected count to be at least 8.
309e5c31af7Sopenharmony_cistd::vector<deInt8> getInt8s (de::Random& rnd, const deUint32 count);
310e5c31af7Sopenharmony_ci
311e5c31af7Sopenharmony_ci// Generate and return 64-bit floats
312e5c31af7Sopenharmony_ci//
313e5c31af7Sopenharmony_ci// If includeSpecialFloat16Values is false, random float64 that can be converted to float16 inf/nan/denormal must be excluded
314e5c31af7Sopenharmony_ci// since inf may be clamped, and nan/denormal be flushed without float control features.
315e5c31af7Sopenharmony_ci// And expected count to be at least 14 (numPicks).
316e5c31af7Sopenharmony_ci// Otherwise, the first 24 number pairs are manually picked, while the rest are randomly generated.
317e5c31af7Sopenharmony_ci// And expected count to be at least 24 (numPicks).
318e5c31af7Sopenharmony_cistd::vector<double> getFloat64s (de::Random& rnd, deUint32 count, deBool includeSpecialFloat16Values = DE_TRUE);
319e5c31af7Sopenharmony_ci
320e5c31af7Sopenharmony_ci// Generate and return 32-bit floats
321e5c31af7Sopenharmony_ci//
322e5c31af7Sopenharmony_ci// If includeSpecialFloat16Values is false, random float32 that can be converted to float16 inf/nan/denormal must be excluded
323e5c31af7Sopenharmony_ci// since inf may be clamped, and nan/denormal be flushed without float control features.
324e5c31af7Sopenharmony_ci// And expected count to be at least 14 (numPicks).
325e5c31af7Sopenharmony_ci// Otherwise, the first 24 number pairs are manually picked, while the rest are randomly generated.
326e5c31af7Sopenharmony_ci// And expected count to be at least 24 (numPicks).
327e5c31af7Sopenharmony_cistd::vector<float> getFloat32s (de::Random& rnd, deUint32 count, deBool includeSpecialFloat16Values = DE_TRUE);
328e5c31af7Sopenharmony_ci
329e5c31af7Sopenharmony_ci// Generate and return 16-bit floats
330e5c31af7Sopenharmony_ci//
331e5c31af7Sopenharmony_ci// If includeSpecialFloat16Values is false, float16 inf/nan/denormal must be excluded since inf may be clamped,
332e5c31af7Sopenharmony_ci// and nan/denormal be flushed without float control features. And expected count to be at least 6 (numPicks).
333e5c31af7Sopenharmony_ci// Otherwise, the first 14 number pairs are manually picked, while the rest are randomly generated.
334e5c31af7Sopenharmony_ci// And expected count to be at least 14 (numPicks).
335e5c31af7Sopenharmony_cistd::vector<deFloat16> getFloat16s (de::Random& rnd, deUint32 count, deBool includeSpecialFloat16Values = DE_TRUE);
336e5c31af7Sopenharmony_ci
337e5c31af7Sopenharmony_ci// Generate an OpCapability Shader line.
338e5c31af7Sopenharmony_cistd::string getOpCapabilityShader();
339e5c31af7Sopenharmony_ci
340e5c31af7Sopenharmony_ci// Generate an unused Vertex entry point.
341e5c31af7Sopenharmony_cistd::string getUnusedEntryPoint();
342e5c31af7Sopenharmony_ci
343e5c31af7Sopenharmony_ci// Generate unused decorations for an input/output buffer.
344e5c31af7Sopenharmony_cistd::string getUnusedDecorations(const VariableLocation& location);
345e5c31af7Sopenharmony_ci
346e5c31af7Sopenharmony_ci// Generate unused types and constants, including a buffer type.
347e5c31af7Sopenharmony_cistd::string getUnusedTypesAndConstants();
348e5c31af7Sopenharmony_ci
349e5c31af7Sopenharmony_ci// Generate the declaration of an unused buffer variable.
350e5c31af7Sopenharmony_cistd::string getUnusedBuffer();
351e5c31af7Sopenharmony_ci
352e5c31af7Sopenharmony_ci// Generate the body of an unused function that uses the previous buffer.
353e5c31af7Sopenharmony_cistd::string getUnusedFunctionBody();
354e5c31af7Sopenharmony_ci
355e5c31af7Sopenharmony_ci} // SpirVAssembly
356e5c31af7Sopenharmony_ci} // vkt
357e5c31af7Sopenharmony_ci
358e5c31af7Sopenharmony_ci#endif // _VKTSPVASMUTILS_HPP
359