1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2021 The Khronos Group Inc.
6 * Copyright (c) 2021 Valve Corporation.
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 *//*!
21 * \file
22 * \brief Mesh Shader Utility Code
23 *//*--------------------------------------------------------------------*/
24 #include "vktMeshShaderUtil.hpp"
25 #include "vkDefs.hpp"
26
27 namespace vkt
28 {
29 namespace MeshShader
30 {
31
32 using namespace vk;
33
getShadingRateSize(FragmentSize fragmentSize)34 VkExtent2D getShadingRateSize(FragmentSize fragmentSize)
35 {
36 VkExtent2D result{0u, 0u};
37 switch (fragmentSize)
38 {
39 case FragmentSize::SIZE_2X2:
40 result.width = 2;
41 result.height = 2;
42 break;
43 case FragmentSize::SIZE_2X1:
44 result.width = 2;
45 result.height = 1;
46 break;
47 case FragmentSize::SIZE_1X1:
48 result.width = 1;
49 result.height = 1;
50 break;
51 default:
52 DE_ASSERT(false);
53 break;
54 }
55
56 return result;
57 }
58
getGLSLShadingRateMask(FragmentSize fragmentSize)59 std::string getGLSLShadingRateMask(FragmentSize fragmentSize)
60 {
61 std::string shadingRateMask;
62
63 switch (fragmentSize)
64 {
65 case FragmentSize::SIZE_2X2:
66 shadingRateMask = "(gl_ShadingRateFlag2HorizontalPixelsEXT|gl_ShadingRateFlag2VerticalPixelsEXT)";
67 break;
68 case FragmentSize::SIZE_2X1:
69 shadingRateMask = "gl_ShadingRateFlag2HorizontalPixelsEXT";
70 break;
71 case FragmentSize::SIZE_1X1:
72 shadingRateMask = "0";
73 break;
74 default:
75 DE_ASSERT(false);
76 break;
77 }
78
79 return shadingRateMask;
80 }
81
getSPVShadingRateValue(FragmentSize fragmentSize)82 int getSPVShadingRateValue(FragmentSize fragmentSize)
83 {
84 #if 0
85 const int gl_ShadingRateFlag2VerticalPixelsEXT = 1;
86 const int gl_ShadingRateFlag4VerticalPixelsEXT = 2;
87 const int gl_ShadingRateFlag2HorizontalPixelsEXT = 4;
88 const int gl_ShadingRateFlag4HorizontalPixelsEXT = 8;
89 #endif
90 int shadingRateValue = 0;
91
92 switch (fragmentSize)
93 {
94 case FragmentSize::SIZE_2X2:
95 shadingRateValue = 5;
96 break; // (gl_ShadingRateFlag2HorizontalPixelsEXT|gl_ShadingRateFlag2VerticalPixelsEXT)
97 case FragmentSize::SIZE_2X1:
98 shadingRateValue = 4;
99 break; // gl_ShadingRateFlag2HorizontalPixelsEXT
100 case FragmentSize::SIZE_1X1:
101 shadingRateValue = 0;
102 break;
103 default:
104 DE_ASSERT(false);
105 break;
106 }
107
108 return shadingRateValue;
109 }
110
checkTaskMeshShaderSupportNV(Context & context,bool requireTask,bool requireMesh)111 void checkTaskMeshShaderSupportNV(Context &context, bool requireTask, bool requireMesh)
112 {
113 context.requireDeviceFunctionality("VK_NV_mesh_shader");
114
115 DE_ASSERT(requireTask || requireMesh);
116
117 const auto &meshFeatures = context.getMeshShaderFeatures();
118
119 if (requireTask && !meshFeatures.taskShader)
120 TCU_THROW(NotSupportedError, "Task shader not supported");
121
122 if (requireMesh && !meshFeatures.meshShader)
123 TCU_THROW(NotSupportedError, "Mesh shader not supported");
124 }
125
checkTaskMeshShaderSupportEXT(Context & context,bool requireTask,bool requireMesh)126 void checkTaskMeshShaderSupportEXT(Context &context, bool requireTask, bool requireMesh)
127 {
128 context.requireDeviceFunctionality("VK_EXT_mesh_shader");
129
130 DE_ASSERT(requireTask || requireMesh);
131
132 const auto &meshFeatures = context.getMeshShaderFeaturesEXT();
133
134 if (requireTask && !meshFeatures.taskShader)
135 TCU_THROW(NotSupportedError, "Task shader not supported");
136
137 if (requireMesh && !meshFeatures.meshShader)
138 TCU_THROW(NotSupportedError, "Mesh shader not supported");
139 }
140
getMinMeshEXTBuildOptions(uint32_t vulkanVersion,uint32_t flags)141 vk::ShaderBuildOptions getMinMeshEXTBuildOptions(uint32_t vulkanVersion, uint32_t flags)
142 {
143 return vk::ShaderBuildOptions(vulkanVersion, vk::SPIRV_VERSION_1_4, flags, true);
144 }
145
getMinMeshEXTSpvBuildOptions(uint32_t vulkanVersion,bool allowMaintenance4)146 vk::SpirVAsmBuildOptions getMinMeshEXTSpvBuildOptions(uint32_t vulkanVersion, bool allowMaintenance4)
147 {
148 return vk::SpirVAsmBuildOptions(vulkanVersion, vk::SPIRV_VERSION_1_4, true /*allowSpirv14*/, allowMaintenance4);
149 }
150
151 } // namespace MeshShader
152 } // namespace vkt
153