1e5c31af7Sopenharmony_ci#ifndef _VKTSUBGROUPSTESTSUTILS_HPP 2e5c31af7Sopenharmony_ci#define _VKTSUBGROUPSTESTSUTILS_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------ 4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests 5e5c31af7Sopenharmony_ci * ------------------------ 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright (c) 2017 The Khronos Group Inc. 8e5c31af7Sopenharmony_ci * Copyright (c) 2017 Codeplay Software Ltd. 9e5c31af7Sopenharmony_ci * 10e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 11e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 12e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 13e5c31af7Sopenharmony_ci * 14e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 15e5c31af7Sopenharmony_ci * 16e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 17e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 18e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 20e5c31af7Sopenharmony_ci * limitations under the License. 21e5c31af7Sopenharmony_ci * 22e5c31af7Sopenharmony_ci */ /*! 23e5c31af7Sopenharmony_ci * \file 24e5c31af7Sopenharmony_ci * \brief Subgroups tests utility classes 25e5c31af7Sopenharmony_ci */ /*--------------------------------------------------------------------*/ 26e5c31af7Sopenharmony_ci 27e5c31af7Sopenharmony_ci#include "vkBuilderUtil.hpp" 28e5c31af7Sopenharmony_ci#include "vkDefs.hpp" 29e5c31af7Sopenharmony_ci#include "vkDeviceUtil.hpp" 30e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp" 31e5c31af7Sopenharmony_ci#include "vkPlatform.hpp" 32e5c31af7Sopenharmony_ci#include "vkPrograms.hpp" 33e5c31af7Sopenharmony_ci#include "vkQueryUtil.hpp" 34e5c31af7Sopenharmony_ci#include "vkRef.hpp" 35e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp" 36e5c31af7Sopenharmony_ci#include "vkStrUtil.hpp" 37e5c31af7Sopenharmony_ci#include "vkTypeUtil.hpp" 38e5c31af7Sopenharmony_ci#include "vktTestCase.hpp" 39e5c31af7Sopenharmony_ci#include "vktTestCaseUtil.hpp" 40e5c31af7Sopenharmony_ci#include "vkRayTracingUtil.hpp" 41e5c31af7Sopenharmony_ci 42e5c31af7Sopenharmony_ci#include "tcuFormatUtil.hpp" 43e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp" 44e5c31af7Sopenharmony_ci#include "tcuVectorUtil.hpp" 45e5c31af7Sopenharmony_ci 46e5c31af7Sopenharmony_ci#include "gluShaderUtil.hpp" 47e5c31af7Sopenharmony_ci 48e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp" 49e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp" 50e5c31af7Sopenharmony_ci 51e5c31af7Sopenharmony_ci#include <string> 52e5c31af7Sopenharmony_ci#include <vector> 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_cinamespace vkt 55e5c31af7Sopenharmony_ci{ 56e5c31af7Sopenharmony_cinamespace subgroups 57e5c31af7Sopenharmony_ci{ 58e5c31af7Sopenharmony_citypedef bool (*CheckResult)(const void* internalData, std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize); 59e5c31af7Sopenharmony_citypedef bool (*CheckResultFragment)(const void* internalData, std::vector<const void*> datas, deUint32 width, deUint32 height, deUint32 subgroupSize); 60e5c31af7Sopenharmony_citypedef bool (*CheckResultCompute)(const void* internalData, std::vector<const void*> datas, const deUint32 numWorkgroups[3], const deUint32 localSize[3], deUint32 subgroupSize); 61e5c31af7Sopenharmony_ci 62e5c31af7Sopenharmony_ci// A struct to represent input data to a shader 63e5c31af7Sopenharmony_cistruct SSBOData 64e5c31af7Sopenharmony_ci{ 65e5c31af7Sopenharmony_ci enum InputDataInitializeType 66e5c31af7Sopenharmony_ci { 67e5c31af7Sopenharmony_ci InitializeNone = 0, 68e5c31af7Sopenharmony_ci InitializeNonZero, 69e5c31af7Sopenharmony_ci InitializeZero, 70e5c31af7Sopenharmony_ci }; 71e5c31af7Sopenharmony_ci enum InputDataLayoutType 72e5c31af7Sopenharmony_ci { 73e5c31af7Sopenharmony_ci LayoutStd140 = 0, 74e5c31af7Sopenharmony_ci LayoutStd430, 75e5c31af7Sopenharmony_ci LayoutPacked 76e5c31af7Sopenharmony_ci }; 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ci enum BindingType 79e5c31af7Sopenharmony_ci { 80e5c31af7Sopenharmony_ci BindingSSBO, 81e5c31af7Sopenharmony_ci BindingImage, 82e5c31af7Sopenharmony_ci BindingUBO, 83e5c31af7Sopenharmony_ci }; 84e5c31af7Sopenharmony_ci 85e5c31af7Sopenharmony_ci SSBOData() : 86e5c31af7Sopenharmony_ci initializeType (InitializeNone), 87e5c31af7Sopenharmony_ci layout (LayoutStd140), 88e5c31af7Sopenharmony_ci format (vk::VK_FORMAT_UNDEFINED), 89e5c31af7Sopenharmony_ci numElements (0), 90e5c31af7Sopenharmony_ci bindingType (BindingSSBO), 91e5c31af7Sopenharmony_ci binding (0u), 92e5c31af7Sopenharmony_ci stages ((vk::VkShaderStageFlags)0u) 93e5c31af7Sopenharmony_ci {} 94e5c31af7Sopenharmony_ci 95e5c31af7Sopenharmony_ci SSBOData (InputDataInitializeType initializeType_, 96e5c31af7Sopenharmony_ci InputDataLayoutType layout_, 97e5c31af7Sopenharmony_ci vk::VkFormat format_, 98e5c31af7Sopenharmony_ci vk::VkDeviceSize numElements_, 99e5c31af7Sopenharmony_ci BindingType bindingType_ = BindingSSBO, 100e5c31af7Sopenharmony_ci deUint32 binding_ = 0u, 101e5c31af7Sopenharmony_ci vk::VkShaderStageFlags stages_ = static_cast<vk::VkShaderStageFlags>(0u)) 102e5c31af7Sopenharmony_ci : initializeType (initializeType_) 103e5c31af7Sopenharmony_ci , layout (layout_) 104e5c31af7Sopenharmony_ci , format (format_) 105e5c31af7Sopenharmony_ci , numElements (numElements_) 106e5c31af7Sopenharmony_ci , bindingType (bindingType_) 107e5c31af7Sopenharmony_ci , binding (binding_) 108e5c31af7Sopenharmony_ci , stages (stages_) 109e5c31af7Sopenharmony_ci { 110e5c31af7Sopenharmony_ci if (bindingType == BindingUBO) 111e5c31af7Sopenharmony_ci DE_ASSERT(layout == LayoutStd140); 112e5c31af7Sopenharmony_ci } 113e5c31af7Sopenharmony_ci 114e5c31af7Sopenharmony_ci bool isImage () const 115e5c31af7Sopenharmony_ci { 116e5c31af7Sopenharmony_ci return (bindingType == BindingImage); 117e5c31af7Sopenharmony_ci } 118e5c31af7Sopenharmony_ci 119e5c31af7Sopenharmony_ci bool isUBO () const 120e5c31af7Sopenharmony_ci { 121e5c31af7Sopenharmony_ci return (bindingType == BindingUBO); 122e5c31af7Sopenharmony_ci } 123e5c31af7Sopenharmony_ci 124e5c31af7Sopenharmony_ci InputDataInitializeType initializeType; 125e5c31af7Sopenharmony_ci InputDataLayoutType layout; 126e5c31af7Sopenharmony_ci vk::VkFormat format; 127e5c31af7Sopenharmony_ci vk::VkDeviceSize numElements; 128e5c31af7Sopenharmony_ci BindingType bindingType; 129e5c31af7Sopenharmony_ci deUint32 binding; 130e5c31af7Sopenharmony_ci vk::VkShaderStageFlags stages; 131e5c31af7Sopenharmony_ci}; 132e5c31af7Sopenharmony_ci 133e5c31af7Sopenharmony_cideUint32 getStagesCount (vk::VkShaderStageFlags shaderStages); 134e5c31af7Sopenharmony_ci 135e5c31af7Sopenharmony_cistd::string getSharedMemoryBallotHelper (); 136e5c31af7Sopenharmony_ci 137e5c31af7Sopenharmony_cistd::string getSharedMemoryBallotHelperARB (); 138e5c31af7Sopenharmony_ci 139e5c31af7Sopenharmony_cideUint32 getSubgroupSize (Context& context); 140e5c31af7Sopenharmony_ci 141e5c31af7Sopenharmony_cideUint32 maxSupportedSubgroupSize (); 142e5c31af7Sopenharmony_ci 143e5c31af7Sopenharmony_cistd::string getShaderStageName (vk::VkShaderStageFlags stage); 144e5c31af7Sopenharmony_ci 145e5c31af7Sopenharmony_cistd::string getSubgroupFeatureName (vk::VkSubgroupFeatureFlagBits bit); 146e5c31af7Sopenharmony_ci 147e5c31af7Sopenharmony_civoid addNoSubgroupShader (vk::SourceCollections& programCollection); 148e5c31af7Sopenharmony_ci 149e5c31af7Sopenharmony_civoid initStdFrameBufferPrograms (vk::SourceCollections& programCollection, 150e5c31af7Sopenharmony_ci const vk::ShaderBuildOptions& buildOptions, 151e5c31af7Sopenharmony_ci vk::VkShaderStageFlags shaderStage, 152e5c31af7Sopenharmony_ci vk::VkFormat format, 153e5c31af7Sopenharmony_ci bool gsPointSize, 154e5c31af7Sopenharmony_ci const std::string& extHeader, 155e5c31af7Sopenharmony_ci const std::string& testSrc, 156e5c31af7Sopenharmony_ci const std::string& helperStr, 157e5c31af7Sopenharmony_ci const std::vector<std::string>& declarations = std::vector<std::string>()); 158e5c31af7Sopenharmony_ci 159e5c31af7Sopenharmony_civoid initStdPrograms (vk::SourceCollections& programCollection, 160e5c31af7Sopenharmony_ci const vk::ShaderBuildOptions& buildOptions, 161e5c31af7Sopenharmony_ci vk::VkShaderStageFlags shaderStage, 162e5c31af7Sopenharmony_ci vk::VkFormat format, 163e5c31af7Sopenharmony_ci bool gsPointSize, 164e5c31af7Sopenharmony_ci const std::string& extHeader, 165e5c31af7Sopenharmony_ci const std::string& testSrc, 166e5c31af7Sopenharmony_ci const std::string& helperStr, 167e5c31af7Sopenharmony_ci const std::vector<std::string>& declarations = std::vector<std::string>(), 168e5c31af7Sopenharmony_ci const bool avoidHelperInvocations = false, 169e5c31af7Sopenharmony_ci const std::string& tempRes = " uint tempRes;\n"); 170e5c31af7Sopenharmony_ci 171e5c31af7Sopenharmony_cibool isSubgroupSupported (Context& context); 172e5c31af7Sopenharmony_ci 173e5c31af7Sopenharmony_cibool areSubgroupOperationsSupportedForStage (Context& context, vk::VkShaderStageFlags stage); 174e5c31af7Sopenharmony_ci 175e5c31af7Sopenharmony_cibool isSubgroupFeatureSupportedForDevice (Context& context, vk::VkSubgroupFeatureFlagBits bit); 176e5c31af7Sopenharmony_ci 177e5c31af7Sopenharmony_cibool areQuadOperationsSupportedForStages (Context& context, const vk::VkShaderStageFlags stages); 178e5c31af7Sopenharmony_ci 179e5c31af7Sopenharmony_cibool isFragmentSSBOSupportedForDevice (Context& context); 180e5c31af7Sopenharmony_ci 181e5c31af7Sopenharmony_cibool isVertexSSBOSupportedForDevice (Context& context); 182e5c31af7Sopenharmony_ci 183e5c31af7Sopenharmony_cibool isFormatSupportedForDevice (Context& context, vk::VkFormat format); 184e5c31af7Sopenharmony_ci 185e5c31af7Sopenharmony_cibool isInt64SupportedForDevice (Context& context); 186e5c31af7Sopenharmony_ci 187e5c31af7Sopenharmony_cibool isTessellationAndGeometryPointSizeSupported (Context& context); 188e5c31af7Sopenharmony_ci 189e5c31af7Sopenharmony_cibool is16BitUBOStorageSupported (Context& context); 190e5c31af7Sopenharmony_ci 191e5c31af7Sopenharmony_cibool is8BitUBOStorageSupported (Context& context); 192e5c31af7Sopenharmony_ci 193e5c31af7Sopenharmony_cibool isSubgroupBroadcastDynamicIdSupported (Context& context); 194e5c31af7Sopenharmony_ci 195e5c31af7Sopenharmony_cistd::string getFormatNameForGLSL (vk::VkFormat format); 196e5c31af7Sopenharmony_ci 197e5c31af7Sopenharmony_cistd::string getAdditionalExtensionForFormat (vk::VkFormat format); 198e5c31af7Sopenharmony_ci 199e5c31af7Sopenharmony_ciconst std::vector<vk::VkFormat> getAllFormats (); 200e5c31af7Sopenharmony_ci 201e5c31af7Sopenharmony_cibool isFormatSigned (vk::VkFormat format); 202e5c31af7Sopenharmony_cibool isFormatUnsigned (vk::VkFormat format); 203e5c31af7Sopenharmony_cibool isFormatFloat (vk::VkFormat format); 204e5c31af7Sopenharmony_cibool isFormatBool (vk::VkFormat format); 205e5c31af7Sopenharmony_cibool isFormat8bitTy (vk::VkFormat format); 206e5c31af7Sopenharmony_cibool isFormat16BitTy (vk::VkFormat format); 207e5c31af7Sopenharmony_ci 208e5c31af7Sopenharmony_civoid addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection); 209e5c31af7Sopenharmony_civoid addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection); 210e5c31af7Sopenharmony_ci 211e5c31af7Sopenharmony_civoid setVertexShaderFrameBuffer (vk::SourceCollections& programCollection); 212e5c31af7Sopenharmony_ci 213e5c31af7Sopenharmony_civoid setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection); 214e5c31af7Sopenharmony_ci 215e5c31af7Sopenharmony_civoid setFragmentShaderFrameBuffer (vk::SourceCollections& programCollection); 216e5c31af7Sopenharmony_ci 217e5c31af7Sopenharmony_civoid setTesCtrlShaderFrameBuffer (vk::SourceCollections& programCollection); 218e5c31af7Sopenharmony_ci 219e5c31af7Sopenharmony_civoid setTesEvalShaderFrameBuffer (vk::SourceCollections& programCollection); 220e5c31af7Sopenharmony_ci 221e5c31af7Sopenharmony_cibool check (std::vector<const void*> datas, deUint32 width, deUint32 ref); 222e5c31af7Sopenharmony_ci 223e5c31af7Sopenharmony_cibool checkComputeOrMesh (std::vector<const void*> datas, 224e5c31af7Sopenharmony_ci const deUint32 numWorkgroups[3], 225e5c31af7Sopenharmony_ci const deUint32 localSize[3], 226e5c31af7Sopenharmony_ci deUint32 ref); 227e5c31af7Sopenharmony_ci 228e5c31af7Sopenharmony_citcu::TestStatus makeTessellationEvaluationFrameBufferTest (Context& context, 229e5c31af7Sopenharmony_ci vk::VkFormat format, 230e5c31af7Sopenharmony_ci const SSBOData* extraData, 231e5c31af7Sopenharmony_ci deUint32 extraDataCount, 232e5c31af7Sopenharmony_ci const void* internalData, 233e5c31af7Sopenharmony_ci CheckResult checkResult, 234e5c31af7Sopenharmony_ci const vk::VkShaderStageFlags shaderStage = vk::VK_SHADER_STAGE_ALL_GRAPHICS); 235e5c31af7Sopenharmony_ci 236e5c31af7Sopenharmony_citcu::TestStatus makeGeometryFrameBufferTest (Context& context, 237e5c31af7Sopenharmony_ci vk::VkFormat format, 238e5c31af7Sopenharmony_ci const SSBOData* extraData, 239e5c31af7Sopenharmony_ci deUint32 extraDataCount, 240e5c31af7Sopenharmony_ci const void* internalData, 241e5c31af7Sopenharmony_ci CheckResult checkResult); 242e5c31af7Sopenharmony_ci 243e5c31af7Sopenharmony_ci// Allows using verification functions with or without the optional last boolean argument. 244e5c31af7Sopenharmony_ci// If using a function that does not need the last argument, it will not be passed down to it. 245e5c31af7Sopenharmony_ciclass VerificationFunctor 246e5c31af7Sopenharmony_ci{ 247e5c31af7Sopenharmony_cipublic: 248e5c31af7Sopenharmony_ci using NoLastArgVariant = bool(*)(const void*, std::vector<const void*>, deUint32, deUint32); 249e5c31af7Sopenharmony_ci using AllArgsVariant = bool(*)(const void*, std::vector<const void*>, deUint32, deUint32, bool); 250e5c31af7Sopenharmony_ci 251e5c31af7Sopenharmony_ci VerificationFunctor (NoLastArgVariant func) 252e5c31af7Sopenharmony_ci : m_noLastArgFunc{func}, m_allArgsFunc{nullptr} 253e5c31af7Sopenharmony_ci {} 254e5c31af7Sopenharmony_ci 255e5c31af7Sopenharmony_ci VerificationFunctor (AllArgsVariant func) 256e5c31af7Sopenharmony_ci : m_noLastArgFunc{nullptr}, m_allArgsFunc{func} 257e5c31af7Sopenharmony_ci {} 258e5c31af7Sopenharmony_ci 259e5c31af7Sopenharmony_ci bool operator() (const void* extraData, std::vector<const void*> datas, deUint32 width, deUint32 subgroupSize, bool multipleCallsPossible) const 260e5c31af7Sopenharmony_ci { 261e5c31af7Sopenharmony_ci if (m_allArgsFunc) 262e5c31af7Sopenharmony_ci return m_allArgsFunc(extraData, datas, width, subgroupSize, multipleCallsPossible); 263e5c31af7Sopenharmony_ci return m_noLastArgFunc(extraData, datas, width, subgroupSize); 264e5c31af7Sopenharmony_ci } 265e5c31af7Sopenharmony_ci 266e5c31af7Sopenharmony_ciprivate: 267e5c31af7Sopenharmony_ci NoLastArgVariant m_noLastArgFunc; 268e5c31af7Sopenharmony_ci AllArgsVariant m_allArgsFunc; 269e5c31af7Sopenharmony_ci}; 270e5c31af7Sopenharmony_ci 271e5c31af7Sopenharmony_civk::VkShaderStageFlags getPossibleGraphicsSubgroupStages (Context& context, const vk::VkShaderStageFlags testedStages); 272e5c31af7Sopenharmony_ci 273e5c31af7Sopenharmony_citcu::TestStatus allStages (Context& context, 274e5c31af7Sopenharmony_ci vk::VkFormat format, 275e5c31af7Sopenharmony_ci const SSBOData* extraData, 276e5c31af7Sopenharmony_ci deUint32 extraDataCount, 277e5c31af7Sopenharmony_ci const void* internalData, 278e5c31af7Sopenharmony_ci const VerificationFunctor& checkResult, 279e5c31af7Sopenharmony_ci const vk::VkShaderStageFlags shaderStage); 280e5c31af7Sopenharmony_ci 281e5c31af7Sopenharmony_citcu::TestStatus makeVertexFrameBufferTest (Context& context, 282e5c31af7Sopenharmony_ci vk::VkFormat format, 283e5c31af7Sopenharmony_ci const SSBOData* extraData, 284e5c31af7Sopenharmony_ci deUint32 extraDataCount, 285e5c31af7Sopenharmony_ci const void* internalData, 286e5c31af7Sopenharmony_ci CheckResult checkResult); 287e5c31af7Sopenharmony_ci 288e5c31af7Sopenharmony_citcu::TestStatus makeFragmentFrameBufferTest (Context& context, 289e5c31af7Sopenharmony_ci vk::VkFormat format, 290e5c31af7Sopenharmony_ci const SSBOData* extraData, 291e5c31af7Sopenharmony_ci deUint32 extraDataCount, 292e5c31af7Sopenharmony_ci const void* internalData, 293e5c31af7Sopenharmony_ci CheckResultFragment checkResult); 294e5c31af7Sopenharmony_ci 295e5c31af7Sopenharmony_citcu::TestStatus makeComputeTest (Context& context, 296e5c31af7Sopenharmony_ci vk::VkFormat format, 297e5c31af7Sopenharmony_ci const SSBOData* inputs, 298e5c31af7Sopenharmony_ci deUint32 inputsCount, 299e5c31af7Sopenharmony_ci const void* internalData, 300e5c31af7Sopenharmony_ci CheckResultCompute checkResult, 301e5c31af7Sopenharmony_ci deUint32 requiredSubgroupSize = 0u, 302e5c31af7Sopenharmony_ci const deUint32 pipelineShaderStageCreateFlags = 0u); 303e5c31af7Sopenharmony_ci 304e5c31af7Sopenharmony_citcu::TestStatus makeMeshTest (Context& context, 305e5c31af7Sopenharmony_ci vk::VkFormat format, 306e5c31af7Sopenharmony_ci const SSBOData* inputs, 307e5c31af7Sopenharmony_ci deUint32 inputsCount, 308e5c31af7Sopenharmony_ci const void* internalData, 309e5c31af7Sopenharmony_ci CheckResultCompute checkResult, 310e5c31af7Sopenharmony_ci deUint32 requiredSubgroupSize = 0u, 311e5c31af7Sopenharmony_ci const deUint32 pipelineShaderStageCreateFlags = 0u); 312e5c31af7Sopenharmony_ci 313e5c31af7Sopenharmony_ci/* Functions needed for VK_EXT_subgroup_size_control tests */ 314e5c31af7Sopenharmony_citcu::TestStatus makeTessellationEvaluationFrameBufferTestRequiredSubgroupSize (Context& context, 315e5c31af7Sopenharmony_ci vk::VkFormat format, 316e5c31af7Sopenharmony_ci const SSBOData* extraData, 317e5c31af7Sopenharmony_ci deUint32 extraDataCount, 318e5c31af7Sopenharmony_ci const void* internalData, 319e5c31af7Sopenharmony_ci CheckResult checkResult, 320e5c31af7Sopenharmony_ci const vk::VkShaderStageFlags shaderStage = vk::VK_SHADER_STAGE_ALL_GRAPHICS, 321e5c31af7Sopenharmony_ci const deUint32 tessShaderStageCreateFlags = 0u, 322e5c31af7Sopenharmony_ci const deUint32 requiredSubgroupSize = 0u); 323e5c31af7Sopenharmony_ci 324e5c31af7Sopenharmony_citcu::TestStatus makeGeometryFrameBufferTestRequiredSubgroupSize (Context& context, 325e5c31af7Sopenharmony_ci vk::VkFormat format, 326e5c31af7Sopenharmony_ci const SSBOData* extraData, 327e5c31af7Sopenharmony_ci deUint32 extraDataCount, 328e5c31af7Sopenharmony_ci const void* internalData, 329e5c31af7Sopenharmony_ci CheckResult checkResult, 330e5c31af7Sopenharmony_ci const deUint32 geometryShaderStageCreateFlags = 0u, 331e5c31af7Sopenharmony_ci const deUint32 requiredSubgroupSize = 0u); 332e5c31af7Sopenharmony_ci 333e5c31af7Sopenharmony_citcu::TestStatus allStagesRequiredSubgroupSize (Context& context, 334e5c31af7Sopenharmony_ci vk::VkFormat format, 335e5c31af7Sopenharmony_ci const SSBOData* extraDatas, 336e5c31af7Sopenharmony_ci deUint32 extraDatasCount, 337e5c31af7Sopenharmony_ci const void* internalData, 338e5c31af7Sopenharmony_ci const VerificationFunctor& checkResult, 339e5c31af7Sopenharmony_ci const vk::VkShaderStageFlags shaderStageTested, 340e5c31af7Sopenharmony_ci const deUint32 vertexShaderStageCreateFlags, 341e5c31af7Sopenharmony_ci const deUint32 tessellationControlShaderStageCreateFlags, 342e5c31af7Sopenharmony_ci const deUint32 tessellationEvalShaderStageCreateFlags, 343e5c31af7Sopenharmony_ci const deUint32 geometryShaderStageCreateFlags, 344e5c31af7Sopenharmony_ci const deUint32 fragmentShaderStageCreateFlags, 345e5c31af7Sopenharmony_ci const deUint32 requiredSubgroupSize[5]); 346e5c31af7Sopenharmony_ci 347e5c31af7Sopenharmony_citcu::TestStatus makeVertexFrameBufferTestRequiredSubgroupSize (Context& context, 348e5c31af7Sopenharmony_ci vk::VkFormat format, 349e5c31af7Sopenharmony_ci const SSBOData* extraData, 350e5c31af7Sopenharmony_ci deUint32 extraDataCount, 351e5c31af7Sopenharmony_ci const void* internalData, 352e5c31af7Sopenharmony_ci CheckResult checkResult, 353e5c31af7Sopenharmony_ci const deUint32 vertexShaderStageCreateFlags = 0u, 354e5c31af7Sopenharmony_ci const deUint32 requiredSubgroupSize = 0u); 355e5c31af7Sopenharmony_ci 356e5c31af7Sopenharmony_citcu::TestStatus makeFragmentFrameBufferTestRequiredSubgroupSize (Context& context, 357e5c31af7Sopenharmony_ci vk::VkFormat format, 358e5c31af7Sopenharmony_ci const SSBOData* extraData, 359e5c31af7Sopenharmony_ci deUint32 extraDataCount, 360e5c31af7Sopenharmony_ci const void* internalData, 361e5c31af7Sopenharmony_ci CheckResultFragment checkResult, 362e5c31af7Sopenharmony_ci const deUint32 fragmentShaderStageCreateFlags = 0u, 363e5c31af7Sopenharmony_ci const deUint32 requiredSubgroupSize = 0u); 364e5c31af7Sopenharmony_ci 365e5c31af7Sopenharmony_citcu::TestStatus makeComputeTestRequiredSubgroupSize (Context& context, 366e5c31af7Sopenharmony_ci vk::VkFormat format, 367e5c31af7Sopenharmony_ci const SSBOData* inputs, 368e5c31af7Sopenharmony_ci deUint32 inputsCount, 369e5c31af7Sopenharmony_ci const void* internalData, 370e5c31af7Sopenharmony_ci CheckResultCompute checkResult, 371e5c31af7Sopenharmony_ci const deUint32 pipelineShaderStageCreateFlags, 372e5c31af7Sopenharmony_ci const deUint32 numWorkgroups[3], 373e5c31af7Sopenharmony_ci const deBool isRequiredSubgroupSize, 374e5c31af7Sopenharmony_ci const deUint32 subgroupSize, 375e5c31af7Sopenharmony_ci const deUint32 localSizesToTest[][3], 376e5c31af7Sopenharmony_ci const deUint32 localSizesToTestCount); 377e5c31af7Sopenharmony_ci 378e5c31af7Sopenharmony_citcu::TestStatus makeMeshTestRequiredSubgroupSize (Context& context, 379e5c31af7Sopenharmony_ci vk::VkFormat format, 380e5c31af7Sopenharmony_ci const SSBOData* inputs, 381e5c31af7Sopenharmony_ci deUint32 inputsCount, 382e5c31af7Sopenharmony_ci const void* internalData, 383e5c31af7Sopenharmony_ci CheckResultCompute checkResult, 384e5c31af7Sopenharmony_ci const deUint32 pipelineShaderStageCreateFlags, 385e5c31af7Sopenharmony_ci const deUint32 numWorkgroups[3], 386e5c31af7Sopenharmony_ci const deBool isRequiredSubgroupSize, 387e5c31af7Sopenharmony_ci const deUint32 subgroupSize, 388e5c31af7Sopenharmony_ci const deUint32 localSizesToTest[][3], 389e5c31af7Sopenharmony_ci const deUint32 localSizesToTestCount); 390e5c31af7Sopenharmony_ci 391e5c31af7Sopenharmony_civoid supportedCheckShader (Context& context, const vk::VkShaderStageFlags shaderStage); 392e5c31af7Sopenharmony_ci 393e5c31af7Sopenharmony_ciconst std::vector<vk::VkFormat> getAllRayTracingFormats(); 394e5c31af7Sopenharmony_ci 395e5c31af7Sopenharmony_civoid addRayTracingNoSubgroupShader (vk::SourceCollections& programCollection); 396e5c31af7Sopenharmony_ci 397e5c31af7Sopenharmony_civk::VkShaderStageFlags getPossibleRayTracingSubgroupStages (Context& context, const vk::VkShaderStageFlags testedStages); 398e5c31af7Sopenharmony_ci 399e5c31af7Sopenharmony_citcu::TestStatus allRayTracingStages (Context& context, 400e5c31af7Sopenharmony_ci vk::VkFormat format, 401e5c31af7Sopenharmony_ci const SSBOData* extraData, 402e5c31af7Sopenharmony_ci deUint32 extraDataCount, 403e5c31af7Sopenharmony_ci const void* internalData, 404e5c31af7Sopenharmony_ci const VerificationFunctor& checkResult, 405e5c31af7Sopenharmony_ci const vk::VkShaderStageFlags shaderStage); 406e5c31af7Sopenharmony_ci 407e5c31af7Sopenharmony_citcu::TestStatus allRayTracingStagesRequiredSubgroupSize (Context& context, 408e5c31af7Sopenharmony_ci vk::VkFormat format, 409e5c31af7Sopenharmony_ci const SSBOData* extraDatas, 410e5c31af7Sopenharmony_ci deUint32 extraDatasCount, 411e5c31af7Sopenharmony_ci const void* internalData, 412e5c31af7Sopenharmony_ci const VerificationFunctor& checkResult, 413e5c31af7Sopenharmony_ci const vk::VkShaderStageFlags shaderStageTested, 414e5c31af7Sopenharmony_ci const deUint32 shaderStageCreateFlags[6], 415e5c31af7Sopenharmony_ci const deUint32 requiredSubgroupSize[6]); 416e5c31af7Sopenharmony_ci} // subgroups 417e5c31af7Sopenharmony_ci} // vkt 418e5c31af7Sopenharmony_ci 419e5c31af7Sopenharmony_ci#endif // _VKTSUBGROUPSTESTSUTILS_HPP 420