layers:Synch validation updates
I started scrubbing the valid usage blocks for synch validation and
made a few different updates here.
Added a missing unique error id and a comment for another.
Got a bit sidetracked and decided to implement a check for all
stageMasks to make sure that they don't set geometry shader or
tessellation shader bits if those featurse aren't enabled.
Added a test to verify new check and made a bunch of updates to the
database file.
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index cb8e4c6..5f06e6a 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -11200,6 +11200,60 @@
vkQueueWaitIdle(m_device->m_queue);
}
+TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
+ TEST_DESCRIPTION("Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
+ "disabled on the device.");
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ std::vector<const char *> device_extension_names;
+ auto features = m_device->phy().features();
+ // Make sure gs & ts are disabled
+ features.geometryShader = false;
+ features.tessellationShader = false;
+ // The sacrificial device object
+ VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
+
+ VkCommandPoolCreateInfo pool_create_info{};
+ pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
+ pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
+
+ VkCommandPool command_pool;
+ vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
+
+ VkCommandBufferAllocateInfo cmd = {};
+ cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
+ cmd.pNext = NULL;
+ cmd.commandPool = command_pool;
+ cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
+ cmd.commandBufferCount = 1;
+
+ VkCommandBuffer cmd_buffer;
+ VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
+ ASSERT_VK_SUCCESS(err);
+
+ VkEvent event;
+ VkEventCreateInfo evci = {};
+ evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
+ VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
+ ASSERT_VK_SUCCESS(result);
+
+ VkCommandBufferBeginInfo cbbi = {};
+ cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ vkBeginCommandBuffer(cmd_buffer, &cbbi);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
+ vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
+ vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
+ m_errorMonitor->VerifyFound();
+
+ vkDestroyEvent(test_device.handle(), event, NULL);
+ vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
+}
+
TEST_F(VkLayerTest, InUseDestroyedSignaled) {
TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
"in primary and secondary command buffers. "