@@ -45,6 +45,11 @@ OpCapability Shader
4545 } else if (execution_model == " Geometry" ) {
4646 ss << " OpExecutionMode %main InputPoints\n " ;
4747 ss << " OpExecutionMode %main OutputPoints\n " ;
48+ } else if (execution_model == " MeshEXT" ) {
49+ ss << " OpExecutionMode %main OutputPoints\n " ;
50+ ss << " OpExecutionMode %main OutputPrimitivesEXT 124\n " ;
51+ ss << " OpExecutionMode %main OutputVertices 5\n " ;
52+ ss << " OpExecutionMode %main LocalSize 1 1 1\n " ;
4853 } else if (execution_model == " GLCompute" ) {
4954 ss << " OpExecutionMode %main LocalSize 1 1 1\n " ;
5055 }
@@ -89,6 +94,11 @@ OpCapability Shader
8994%workgroup_memory = OpConstant %u32 256
9095%image_memory = OpConstant %u32 2048
9196%uniform_image_memory = OpConstant %u32 2112
97+ %acquire_uniform_memory = OpConstant %u32 66
98+ %acquire_workgroup_memory = OpConstant %u32 258
99+ %release_uniform_memory = OpConstant %u32 68
100+ %release_workgroup_memory = OpConstant %u32 260
101+ %release_workgroup_memory_volatile = OpConstant %u32 33028
92102
93103%main = OpFunction %void None %func
94104%main_entry = OpLabel
@@ -1274,6 +1284,147 @@ TEST_F(ValidateBarriers, OpControlBarrierShaderCallRayGenFailure) {
12741284 " Workgroup and Subgroup" ));
12751285}
12761286
1287+ TEST_F (ValidateBarriers, OpControlBarrierArriveWaitGLComputeSuccess) {
1288+ const std::string body = R"(
1289+ OpControlBarrierArriveEXT %workgroup %workgroup %release_workgroup_memory
1290+ OpControlBarrierWaitEXT %workgroup %workgroup %acquire_workgroup_memory
1291+ )" ;
1292+
1293+ CompileSuccessfully (GenerateShaderCodeImpl (body,
1294+ // capabilities_and_extensions
1295+ R"(
1296+ OpCapability VulkanMemoryModelKHR
1297+ OpCapability SplitBarrierEXT
1298+ OpExtension "SPV_KHR_vulkan_memory_model"
1299+ OpExtension "SPV_EXT_split_barrier"
1300+ )" ,
1301+ // definitions
1302+ " " ,
1303+ // execution_model
1304+ " GLCompute" ,
1305+ // memory_model
1306+ " OpMemoryModel Logical VulkanKHR" ),
1307+ SPV_ENV_VULKAN_1_1 );
1308+ ASSERT_EQ (SPV_SUCCESS , ValidateInstructions (SPV_ENV_VULKAN_1_1 ));
1309+ }
1310+
1311+ TEST_F (ValidateBarriers, OpControlBarrierArriveWaitInvalidVolatile) {
1312+ const std::string body = R"(
1313+ OpControlBarrierArriveEXT %workgroup %workgroup %release_workgroup_memory_volatile
1314+ OpControlBarrierWaitEXT %workgroup %workgroup %acquire_workgroup_memory
1315+ )" ;
1316+
1317+ CompileSuccessfully (GenerateShaderCodeImpl (body,
1318+ // capabilities_and_extensions
1319+ R"(
1320+ OpCapability VulkanMemoryModelKHR
1321+ OpCapability SplitBarrierEXT
1322+ OpExtension "SPV_KHR_vulkan_memory_model"
1323+ OpExtension "SPV_EXT_split_barrier"
1324+ )" ,
1325+ // definitions
1326+ " " ,
1327+ // execution_model
1328+ " GLCompute" ,
1329+ // memory_model
1330+ " OpMemoryModel Logical VulkanKHR" ),
1331+ SPV_ENV_VULKAN_1_1 );
1332+
1333+ ASSERT_EQ (SPV_ERROR_INVALID_DATA , ValidateInstructions (SPV_ENV_VULKAN_1_1 ));
1334+ EXPECT_THAT (getDiagnosticString (),
1335+ AnyVUID (" VUID-StandaloneSpirv-MemorySemantics-13551" ));
1336+ EXPECT_THAT (
1337+ getDiagnosticString (),
1338+ HasSubstr (" Memory Semantics with Volatile bit set must not be used with "
1339+ " barrier instructions" ));
1340+ }
1341+
1342+ TEST_F (ValidateBarriers, SplitBarrierInvalidExecutionModel) {
1343+ const std::string body = R"(
1344+ OpControlBarrierArriveEXT %workgroup %workgroup %release_workgroup_memory
1345+ OpControlBarrierWaitEXT %workgroup %workgroup %acquire_workgroup_memory
1346+ )" ;
1347+
1348+ CompileSuccessfully (GenerateShaderCode (body,
1349+ // capabilities_and_extensions
1350+ R"(
1351+ OpCapability MeshShadingEXT
1352+ OpCapability SplitBarrierEXT
1353+ OpExtension "SPV_EXT_mesh_shader"
1354+ OpExtension "SPV_EXT_split_barrier"
1355+ )" ,
1356+ // execution_model
1357+ " MeshEXT" ),
1358+ SPV_ENV_VULKAN_1_4 );
1359+
1360+ ASSERT_EQ (SPV_ERROR_INVALID_ID , ValidateInstructions (SPV_ENV_VULKAN_1_4 ));
1361+ EXPECT_THAT (getDiagnosticString (),
1362+ AnyVUID (" VUID-StandaloneSpirv-SplitBarrierEXT-13552" ));
1363+ EXPECT_THAT (getDiagnosticString (),
1364+ HasSubstr (" The SplitBarrierEXT capability must not be enabled in "
1365+ " any stage other than GLCompute or Kernel." ));
1366+ }
1367+
1368+ TEST_F (ValidateBarriers, OpControlBarrierArriveInvalidMemorySemantics) {
1369+ const std::string body = R"(
1370+ OpControlBarrierArriveEXT %workgroup %workgroup %acquire_release_workgroup
1371+ OpControlBarrierWaitEXT %workgroup %workgroup %acquire_workgroup_memory
1372+ )" ;
1373+
1374+ CompileSuccessfully (GenerateShaderCodeImpl (body,
1375+ // capabilities_and_extensions
1376+ R"(
1377+ OpCapability VulkanMemoryModelKHR
1378+ OpCapability SplitBarrierEXT
1379+ OpExtension "SPV_KHR_vulkan_memory_model"
1380+ OpExtension "SPV_EXT_split_barrier"
1381+ )" ,
1382+ // definitions
1383+ " " ,
1384+ // execution_model
1385+ " GLCompute" ,
1386+ // memory_model
1387+ " OpMemoryModel Logical VulkanKHR" ),
1388+ SPV_ENV_VULKAN_1_1 );
1389+ ASSERT_EQ (SPV_ERROR_INVALID_DATA , ValidateInstructions (SPV_ENV_VULKAN_1_1 ));
1390+ EXPECT_THAT (getDiagnosticString (),
1391+ AnyVUID (" VUID-StandaloneSpirv-MemorySemantics-13556" ));
1392+ EXPECT_THAT (
1393+ getDiagnosticString (),
1394+ HasSubstr (" Memory Semantics must not have any non-relaxed memory order "
1395+ " set other than Release" ));
1396+ }
1397+
1398+ TEST_F (ValidateBarriers, OpControlBarrierWaitInvalidMemorySemantics) {
1399+ const std::string body = R"(
1400+ OpControlBarrierArriveEXT %workgroup %workgroup %release_workgroup_memory
1401+ OpControlBarrierWaitEXT %workgroup %workgroup %acquire_release_workgroup
1402+ )" ;
1403+
1404+ CompileSuccessfully (GenerateShaderCodeImpl (body,
1405+ // capabilities_and_extensions
1406+ R"(
1407+ OpCapability VulkanMemoryModelKHR
1408+ OpCapability SplitBarrierEXT
1409+ OpExtension "SPV_KHR_vulkan_memory_model"
1410+ OpExtension "SPV_EXT_split_barrier"
1411+ )" ,
1412+ // definitions
1413+ " " ,
1414+ // execution_model
1415+ " GLCompute" ,
1416+ // memory_model
1417+ " OpMemoryModel Logical VulkanKHR" ),
1418+ SPV_ENV_VULKAN_1_1 );
1419+ ASSERT_EQ (SPV_ERROR_INVALID_DATA , ValidateInstructions (SPV_ENV_VULKAN_1_1 ));
1420+ EXPECT_THAT (getDiagnosticString (),
1421+ AnyVUID (" VUID-StandaloneSpirv-MemorySemantics-13557" ));
1422+ EXPECT_THAT (
1423+ getDiagnosticString (),
1424+ HasSubstr (" Memory Semantics must not have any non-relaxed memory order "
1425+ " set other than Acquire" ));
1426+ }
1427+
12771428} // namespace
12781429} // namespace val
12791430} // namespace spvtools
0 commit comments