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