• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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