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