1#ifndef _VKTMESHSHADERUTIL_HPP 2#define _VKTMESHSHADERUTIL_HPP 3/*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2021 The Khronos Group Inc. 8 * Copyright (c) 2021 Valve Corporation. 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 Mesh Shader Utility Code 25 *//*--------------------------------------------------------------------*/ 26 27#include "vktTestCase.hpp" 28 29#include "vkDefs.hpp" 30 31#include "deSTLUtil.hpp" 32 33#include <vector> 34 35namespace vkt 36{ 37namespace MeshShader 38{ 39 40// Primitive shading rate cases. 41enum class FragmentSize 42{ 43 SIZE_2X2 = 0, 44 SIZE_2X1 = 1, 45 SIZE_1X1 = 2, 46 SIZE_COUNT = 3, 47}; 48 49using FragmentSizeVector = std::vector<FragmentSize>; 50 51// Get the block extent according to the fragment size. 52vk::VkExtent2D getShadingRateSize (FragmentSize fragmentSize); 53 54// Returns a shading rate size that does not match the given fragment sizes. 55template <typename Iterator> 56FragmentSize getBadShadingRateSize (Iterator itBegin, Iterator itEnd) 57{ 58 const auto fsCount = static_cast<int>(FragmentSize::SIZE_COUNT); 59 60 for (int i = 0; i < fsCount; ++i) 61 { 62 const auto fs = static_cast<FragmentSize>(i); 63 if (!de::contains(itBegin, itEnd, fs)) 64 return fs; 65 } 66 67 DE_ASSERT(false); 68 return FragmentSize::SIZE_COUNT; 69} 70 71// GLSL representation of the given fragment size. 72std::string getGLSLShadingRateMask (FragmentSize fragmentSize); 73 74// GLSL/SPV value of the given mask. 75int getSPVShadingRateValue (FragmentSize fragmentSize); 76 77// Basic feature check (NV version) 78void checkTaskMeshShaderSupportNV (Context& context, bool requireTask, bool requireMesh); 79 80// Basic feature check (EXT version) 81void checkTaskMeshShaderSupportEXT (Context& context, bool requireTask, bool requireMesh); 82 83// Get the right SPIR-V build options for the EXT. 84vk::ShaderBuildOptions getMinMeshEXTBuildOptions (uint32_t vulkanVersion, uint32_t flags = 0u); 85vk::SpirVAsmBuildOptions getMinMeshEXTSpvBuildOptions (uint32_t vulkanVersion, bool allowMaintenance4 = false); 86 87} 88} 89 90#endif // _VKTMESHSHADERUTIL_HPP 91