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: result.width = 2; result.height = 2; break;
40 case FragmentSize::SIZE_2X1: result.width = 2; result.height = 1; break;
41 case FragmentSize::SIZE_1X1: result.width = 1; result.height = 1; break;
42 default: DE_ASSERT(false); break;
43 }
44
45 return result;
46 }
47
getGLSLShadingRateMask(FragmentSize fragmentSize)48 std::string getGLSLShadingRateMask (FragmentSize fragmentSize)
49 {
50 std::string shadingRateMask;
51
52 switch (fragmentSize)
53 {
54 case FragmentSize::SIZE_2X2: shadingRateMask = "(gl_ShadingRateFlag2HorizontalPixelsEXT|gl_ShadingRateFlag2VerticalPixelsEXT)"; break;
55 case FragmentSize::SIZE_2X1: shadingRateMask = "gl_ShadingRateFlag2HorizontalPixelsEXT"; break;
56 case FragmentSize::SIZE_1X1: shadingRateMask = "0"; break;
57 default: DE_ASSERT(false); break;
58 }
59
60 return shadingRateMask;
61 }
62
getSPVShadingRateValue(FragmentSize fragmentSize)63 int getSPVShadingRateValue (FragmentSize fragmentSize)
64 {
65 #if 0
66 const int gl_ShadingRateFlag2VerticalPixelsEXT = 1;
67 const int gl_ShadingRateFlag4VerticalPixelsEXT = 2;
68 const int gl_ShadingRateFlag2HorizontalPixelsEXT = 4;
69 const int gl_ShadingRateFlag4HorizontalPixelsEXT = 8;
70 #endif
71 int shadingRateValue = 0;
72
73 switch (fragmentSize)
74 {
75 case FragmentSize::SIZE_2X2: shadingRateValue = 5; break; // (gl_ShadingRateFlag2HorizontalPixelsEXT|gl_ShadingRateFlag2VerticalPixelsEXT)
76 case FragmentSize::SIZE_2X1: shadingRateValue = 4; break; // gl_ShadingRateFlag2HorizontalPixelsEXT
77 case FragmentSize::SIZE_1X1: shadingRateValue = 0; break;
78 default: DE_ASSERT(false); break;
79 }
80
81 return shadingRateValue;
82 }
83
checkTaskMeshShaderSupportNV(Context & context,bool requireTask,bool requireMesh)84 void checkTaskMeshShaderSupportNV (Context& context, bool requireTask, bool requireMesh)
85 {
86 context.requireDeviceFunctionality("VK_NV_mesh_shader");
87
88 DE_ASSERT(requireTask || requireMesh);
89
90 const auto& meshFeatures = context.getMeshShaderFeatures();
91
92 if (requireTask && !meshFeatures.taskShader)
93 TCU_THROW(NotSupportedError, "Task shader not supported");
94
95 if (requireMesh && !meshFeatures.meshShader)
96 TCU_THROW(NotSupportedError, "Mesh shader not supported");
97 }
98
checkTaskMeshShaderSupportEXT(Context & context,bool requireTask,bool requireMesh)99 void checkTaskMeshShaderSupportEXT (Context& context, bool requireTask, bool requireMesh)
100 {
101 context.requireDeviceFunctionality("VK_EXT_mesh_shader");
102
103 DE_ASSERT(requireTask || requireMesh);
104
105 const auto& meshFeatures = context.getMeshShaderFeaturesEXT();
106
107 if (requireTask && !meshFeatures.taskShader)
108 TCU_THROW(NotSupportedError, "Task shader not supported");
109
110 if (requireMesh && !meshFeatures.meshShader)
111 TCU_THROW(NotSupportedError, "Mesh shader not supported");
112 }
113
getMinMeshEXTBuildOptions(uint32_t vulkanVersion,uint32_t flags)114 vk::ShaderBuildOptions getMinMeshEXTBuildOptions (uint32_t vulkanVersion, uint32_t flags)
115 {
116 return vk::ShaderBuildOptions(vulkanVersion, vk::SPIRV_VERSION_1_4, flags, true);
117 }
118
getMinMeshEXTSpvBuildOptions(uint32_t vulkanVersion,bool allowMaintenance4)119 vk::SpirVAsmBuildOptions getMinMeshEXTSpvBuildOptions (uint32_t vulkanVersion, bool allowMaintenance4)
120 {
121 return vk::SpirVAsmBuildOptions(vulkanVersion, vk::SPIRV_VERSION_1_4, true/*allowSpirv14*/, allowMaintenance4);
122 }
123
124 }
125 }
126