xref: /aosp_15_r20/external/deqp/external/vulkancts/modules/vulkan/mesh_shader/vktMeshShaderUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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