xref: /aosp_15_r20/external/vulkan-validation-layers/tests/vklayertests_others.cpp (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi /*
2*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 The Khronos Group Inc.
3*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 Valve Corporation
4*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 LunarG, Inc.
5*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 Google, Inc.
6*b7893ccfSSadaf Ebrahimi  *
7*b7893ccfSSadaf Ebrahimi  * Licensed under the Apache License, Version 2.0 (the "License");
8*b7893ccfSSadaf Ebrahimi  * you may not use this file except in compliance with the License.
9*b7893ccfSSadaf Ebrahimi  * You may obtain a copy of the License at
10*b7893ccfSSadaf Ebrahimi  *
11*b7893ccfSSadaf Ebrahimi  *     http://www.apache.org/licenses/LICENSE-2.0
12*b7893ccfSSadaf Ebrahimi  *
13*b7893ccfSSadaf Ebrahimi  * Author: Chia-I Wu <[email protected]>
14*b7893ccfSSadaf Ebrahimi  * Author: Chris Forbes <[email protected]>
15*b7893ccfSSadaf Ebrahimi  * Author: Courtney Goeltzenleuchter <[email protected]>
16*b7893ccfSSadaf Ebrahimi  * Author: Mark Lobodzinski <[email protected]>
17*b7893ccfSSadaf Ebrahimi  * Author: Mike Stroyan <[email protected]>
18*b7893ccfSSadaf Ebrahimi  * Author: Tobin Ehlis <[email protected]>
19*b7893ccfSSadaf Ebrahimi  * Author: Tony Barbour <[email protected]>
20*b7893ccfSSadaf Ebrahimi  * Author: Cody Northrop <[email protected]>
21*b7893ccfSSadaf Ebrahimi  * Author: Dave Houlton <[email protected]>
22*b7893ccfSSadaf Ebrahimi  * Author: Jeremy Kniager <[email protected]>
23*b7893ccfSSadaf Ebrahimi  * Author: Shannon McPherson <[email protected]>
24*b7893ccfSSadaf Ebrahimi  * Author: John Zulauf <[email protected]>
25*b7893ccfSSadaf Ebrahimi  */
26*b7893ccfSSadaf Ebrahimi 
27*b7893ccfSSadaf Ebrahimi #include "cast_utils.h"
28*b7893ccfSSadaf Ebrahimi #include "layer_validation_tests.h"
29*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,RequiredParameter)30*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, RequiredParameter) {
31*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, pointer, array, and array count parameters");
32*b7893ccfSSadaf Ebrahimi 
33*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
34*b7893ccfSSadaf Ebrahimi 
35*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
36*b7893ccfSSadaf Ebrahimi     // Specify NULL for a pointer to a handle
37*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
38*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_required_pointer
39*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFeatures(gpu(), NULL);
40*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
41*b7893ccfSSadaf Ebrahimi 
42*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
43*b7893ccfSSadaf Ebrahimi                                          "required parameter pQueueFamilyPropertyCount specified as NULL");
44*b7893ccfSSadaf Ebrahimi     // Specify NULL for pointer to array count
45*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_array
46*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
47*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
48*b7893ccfSSadaf Ebrahimi 
49*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetViewport-viewportCount-arraylength");
50*b7893ccfSSadaf Ebrahimi     // Specify 0 for a required array count
51*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_array
52*b7893ccfSSadaf Ebrahimi     VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
53*b7893ccfSSadaf Ebrahimi     m_commandBuffer->SetViewport(0, 0, &viewport);
54*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
55*b7893ccfSSadaf Ebrahimi 
56*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCreateImage-pCreateInfo-parameter");
57*b7893ccfSSadaf Ebrahimi     // Specify a null pImageCreateInfo struct pointer
58*b7893ccfSSadaf Ebrahimi     VkImage test_image;
59*b7893ccfSSadaf Ebrahimi     vkCreateImage(device(), NULL, NULL, &test_image);
60*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
61*b7893ccfSSadaf Ebrahimi 
62*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetViewport-pViewports-parameter");
63*b7893ccfSSadaf Ebrahimi     // Specify NULL for a required array
64*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_array
65*b7893ccfSSadaf Ebrahimi     m_commandBuffer->SetViewport(0, 1, NULL);
66*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
67*b7893ccfSSadaf Ebrahimi 
68*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
69*b7893ccfSSadaf Ebrahimi     // Specify VK_NULL_HANDLE for a required handle
70*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
71*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_required_handle
72*b7893ccfSSadaf Ebrahimi     vkUnmapMemory(device(), VK_NULL_HANDLE);
73*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
74*b7893ccfSSadaf Ebrahimi 
75*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
76*b7893ccfSSadaf Ebrahimi                                          "required parameter pFences[0] specified as VK_NULL_HANDLE");
77*b7893ccfSSadaf Ebrahimi     // Specify VK_NULL_HANDLE for a required handle array entry
78*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
79*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_required_handle_array
80*b7893ccfSSadaf Ebrahimi     VkFence fence = VK_NULL_HANDLE;
81*b7893ccfSSadaf Ebrahimi     vkResetFences(device(), 1, &fence);
82*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
83*b7893ccfSSadaf Ebrahimi 
84*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
85*b7893ccfSSadaf Ebrahimi     // Specify NULL for a required struct pointer
86*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
87*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_struct_type
88*b7893ccfSSadaf Ebrahimi     VkDeviceMemory memory = VK_NULL_HANDLE;
89*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), NULL, NULL, &memory);
90*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
91*b7893ccfSSadaf Ebrahimi 
92*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
93*b7893ccfSSadaf Ebrahimi     // Specify 0 for a required VkFlags parameter
94*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_flags
95*b7893ccfSSadaf Ebrahimi     m_commandBuffer->SetStencilReference(0, 0);
96*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
97*b7893ccfSSadaf Ebrahimi 
98*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
99*b7893ccfSSadaf Ebrahimi     // Specify 0 for a required VkFlags array entry
100*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
101*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_flags_array
102*b7893ccfSSadaf Ebrahimi     VkSemaphore semaphore = VK_NULL_HANDLE;
103*b7893ccfSSadaf Ebrahimi     VkPipelineStageFlags stageFlags = 0;
104*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submitInfo = {};
105*b7893ccfSSadaf Ebrahimi     submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
106*b7893ccfSSadaf Ebrahimi     submitInfo.waitSemaphoreCount = 1;
107*b7893ccfSSadaf Ebrahimi     submitInfo.pWaitSemaphores = &semaphore;
108*b7893ccfSSadaf Ebrahimi     submitInfo.pWaitDstStageMask = &stageFlags;
109*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
110*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
111*b7893ccfSSadaf Ebrahimi 
112*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkSubmitInfo-sType-sType");
113*b7893ccfSSadaf Ebrahimi     stageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
114*b7893ccfSSadaf Ebrahimi     // Set a bogus sType and see what happens
115*b7893ccfSSadaf Ebrahimi     submitInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
116*b7893ccfSSadaf Ebrahimi     submitInfo.waitSemaphoreCount = 1;
117*b7893ccfSSadaf Ebrahimi     submitInfo.pWaitSemaphores = &semaphore;
118*b7893ccfSSadaf Ebrahimi     submitInfo.pWaitDstStageMask = &stageFlags;
119*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
120*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
121*b7893ccfSSadaf Ebrahimi 
122*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkSubmitInfo-pWaitSemaphores-parameter");
123*b7893ccfSSadaf Ebrahimi     stageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
124*b7893ccfSSadaf Ebrahimi     submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
125*b7893ccfSSadaf Ebrahimi     submitInfo.waitSemaphoreCount = 1;
126*b7893ccfSSadaf Ebrahimi     // Set a null pointer for pWaitSemaphores
127*b7893ccfSSadaf Ebrahimi     submitInfo.pWaitSemaphores = NULL;
128*b7893ccfSSadaf Ebrahimi     submitInfo.pWaitDstStageMask = &stageFlags;
129*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
130*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
131*b7893ccfSSadaf Ebrahimi 
132*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCreateRenderPass-pCreateInfo-parameter");
133*b7893ccfSSadaf Ebrahimi     VkRenderPass render_pass;
134*b7893ccfSSadaf Ebrahimi     vkCreateRenderPass(device(), nullptr, nullptr, &render_pass);
135*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
136*b7893ccfSSadaf Ebrahimi }
137*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,PnextOnlyStructValidation)138*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, PnextOnlyStructValidation) {
139*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("See if checks occur on structs ONLY used in pnext chains.");
140*b7893ccfSSadaf Ebrahimi 
141*b7893ccfSSadaf Ebrahimi     if (!(CheckDescriptorIndexingSupportAndInitFramework(this, m_instance_extension_names, m_device_extension_names, NULL,
142*b7893ccfSSadaf Ebrahimi                                                          m_errorMonitor))) {
143*b7893ccfSSadaf Ebrahimi         printf("Descriptor indexing or one of its dependencies not supported, skipping tests\n");
144*b7893ccfSSadaf Ebrahimi         return;
145*b7893ccfSSadaf Ebrahimi     }
146*b7893ccfSSadaf Ebrahimi 
147*b7893ccfSSadaf Ebrahimi     PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
148*b7893ccfSSadaf Ebrahimi         (PFN_vkGetPhysicalDeviceFeatures2KHR)vkGetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
149*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
150*b7893ccfSSadaf Ebrahimi 
151*b7893ccfSSadaf Ebrahimi     // Create a device passing in a bad PdevFeatures2 value
152*b7893ccfSSadaf Ebrahimi     auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
153*b7893ccfSSadaf Ebrahimi     auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&indexing_features);
154*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
155*b7893ccfSSadaf Ebrahimi     // Set one of the features values to an invalid boolean value
156*b7893ccfSSadaf Ebrahimi     indexing_features.descriptorBindingUniformBufferUpdateAfterBind = 800;
157*b7893ccfSSadaf Ebrahimi 
158*b7893ccfSSadaf Ebrahimi     uint32_t queue_node_count;
159*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_node_count, NULL);
160*b7893ccfSSadaf Ebrahimi     VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_node_count];
161*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_node_count, queue_props);
162*b7893ccfSSadaf Ebrahimi     float priorities[] = {1.0f};
163*b7893ccfSSadaf Ebrahimi     VkDeviceQueueCreateInfo queue_info{};
164*b7893ccfSSadaf Ebrahimi     queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
165*b7893ccfSSadaf Ebrahimi     queue_info.pNext = NULL;
166*b7893ccfSSadaf Ebrahimi     queue_info.flags = 0;
167*b7893ccfSSadaf Ebrahimi     queue_info.queueFamilyIndex = 0;
168*b7893ccfSSadaf Ebrahimi     queue_info.queueCount = 1;
169*b7893ccfSSadaf Ebrahimi     queue_info.pQueuePriorities = &priorities[0];
170*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo dev_info = {};
171*b7893ccfSSadaf Ebrahimi     dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
172*b7893ccfSSadaf Ebrahimi     dev_info.pNext = NULL;
173*b7893ccfSSadaf Ebrahimi     dev_info.queueCreateInfoCount = 1;
174*b7893ccfSSadaf Ebrahimi     dev_info.pQueueCreateInfos = &queue_info;
175*b7893ccfSSadaf Ebrahimi     dev_info.enabledLayerCount = 0;
176*b7893ccfSSadaf Ebrahimi     dev_info.ppEnabledLayerNames = NULL;
177*b7893ccfSSadaf Ebrahimi     dev_info.enabledExtensionCount = m_device_extension_names.size();
178*b7893ccfSSadaf Ebrahimi     dev_info.ppEnabledExtensionNames = m_device_extension_names.data();
179*b7893ccfSSadaf Ebrahimi     dev_info.pNext = &features2;
180*b7893ccfSSadaf Ebrahimi     VkDevice dev;
181*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
182*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Failed to create");
183*b7893ccfSSadaf Ebrahimi     vkCreateDevice(gpu(), &dev_info, NULL, &dev);
184*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
185*b7893ccfSSadaf Ebrahimi }
186*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ReservedParameter)187*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ReservedParameter) {
188*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
189*b7893ccfSSadaf Ebrahimi 
190*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
191*b7893ccfSSadaf Ebrahimi 
192*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
193*b7893ccfSSadaf Ebrahimi     // Specify 0 for a reserved VkFlags parameter
194*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
195*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_reserved_flags
196*b7893ccfSSadaf Ebrahimi     VkEvent event_handle = VK_NULL_HANDLE;
197*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_info = {};
198*b7893ccfSSadaf Ebrahimi     event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
199*b7893ccfSSadaf Ebrahimi     event_info.flags = 1;
200*b7893ccfSSadaf Ebrahimi     vkCreateEvent(device(), &event_info, NULL, &event_handle);
201*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
202*b7893ccfSSadaf Ebrahimi }
203*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,DebugMarkerNameTest)204*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, DebugMarkerNameTest) {
205*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Ensure debug marker object names are printed in debug report output");
206*b7893ccfSSadaf Ebrahimi 
207*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
208*b7893ccfSSadaf Ebrahimi     if (DeviceExtensionSupported(gpu(), "VK_LAYER_LUNARG_core_validation", VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) {
209*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
210*b7893ccfSSadaf Ebrahimi     } else {
211*b7893ccfSSadaf Ebrahimi         printf("%s Debug Marker Extension not supported, skipping test\n", kSkipPrefix);
212*b7893ccfSSadaf Ebrahimi         return;
213*b7893ccfSSadaf Ebrahimi     }
214*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
215*b7893ccfSSadaf Ebrahimi 
216*b7893ccfSSadaf Ebrahimi     PFN_vkDebugMarkerSetObjectNameEXT fpvkDebugMarkerSetObjectNameEXT =
217*b7893ccfSSadaf Ebrahimi         (PFN_vkDebugMarkerSetObjectNameEXT)vkGetInstanceProcAddr(instance(), "vkDebugMarkerSetObjectNameEXT");
218*b7893ccfSSadaf Ebrahimi     if (!(fpvkDebugMarkerSetObjectNameEXT)) {
219*b7893ccfSSadaf Ebrahimi         printf("%s Can't find fpvkDebugMarkerSetObjectNameEXT; skipped.\n", kSkipPrefix);
220*b7893ccfSSadaf Ebrahimi         return;
221*b7893ccfSSadaf Ebrahimi     }
222*b7893ccfSSadaf Ebrahimi 
223*b7893ccfSSadaf Ebrahimi     if (DeviceSimulation()) {
224*b7893ccfSSadaf Ebrahimi         printf("%sSkipping object naming test.\n", kSkipPrefix);
225*b7893ccfSSadaf Ebrahimi         return;
226*b7893ccfSSadaf Ebrahimi     }
227*b7893ccfSSadaf Ebrahimi 
228*b7893ccfSSadaf Ebrahimi     VkBuffer buffer;
229*b7893ccfSSadaf Ebrahimi     VkDeviceMemory memory_1, memory_2;
230*b7893ccfSSadaf Ebrahimi     std::string memory_name = "memory_name";
231*b7893ccfSSadaf Ebrahimi 
232*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo buffer_create_info = {};
233*b7893ccfSSadaf Ebrahimi     buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
234*b7893ccfSSadaf Ebrahimi     buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
235*b7893ccfSSadaf Ebrahimi     buffer_create_info.size = 1;
236*b7893ccfSSadaf Ebrahimi 
237*b7893ccfSSadaf Ebrahimi     vkCreateBuffer(device(), &buffer_create_info, nullptr, &buffer);
238*b7893ccfSSadaf Ebrahimi 
239*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements memRequirements;
240*b7893ccfSSadaf Ebrahimi     vkGetBufferMemoryRequirements(device(), buffer, &memRequirements);
241*b7893ccfSSadaf Ebrahimi 
242*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo memory_allocate_info = {};
243*b7893ccfSSadaf Ebrahimi     memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
244*b7893ccfSSadaf Ebrahimi     memory_allocate_info.allocationSize = memRequirements.size;
245*b7893ccfSSadaf Ebrahimi     memory_allocate_info.memoryTypeIndex = 0;
246*b7893ccfSSadaf Ebrahimi 
247*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), &memory_allocate_info, nullptr, &memory_1);
248*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), &memory_allocate_info, nullptr, &memory_2);
249*b7893ccfSSadaf Ebrahimi 
250*b7893ccfSSadaf Ebrahimi     VkDebugMarkerObjectNameInfoEXT name_info = {};
251*b7893ccfSSadaf Ebrahimi     name_info.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT;
252*b7893ccfSSadaf Ebrahimi     name_info.pNext = nullptr;
253*b7893ccfSSadaf Ebrahimi     name_info.object = (uint64_t)memory_2;
254*b7893ccfSSadaf Ebrahimi     name_info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT;
255*b7893ccfSSadaf Ebrahimi     name_info.pObjectName = memory_name.c_str();
256*b7893ccfSSadaf Ebrahimi     fpvkDebugMarkerSetObjectNameEXT(device(), &name_info);
257*b7893ccfSSadaf Ebrahimi 
258*b7893ccfSSadaf Ebrahimi     vkBindBufferMemory(device(), buffer, memory_1, 0);
259*b7893ccfSSadaf Ebrahimi 
260*b7893ccfSSadaf Ebrahimi     // Test core_validation layer
261*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, memory_name);
262*b7893ccfSSadaf Ebrahimi     vkBindBufferMemory(device(), buffer, memory_2, 0);
263*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
264*b7893ccfSSadaf Ebrahimi 
265*b7893ccfSSadaf Ebrahimi     vkFreeMemory(device(), memory_1, nullptr);
266*b7893ccfSSadaf Ebrahimi     memory_1 = VK_NULL_HANDLE;
267*b7893ccfSSadaf Ebrahimi     vkFreeMemory(device(), memory_2, nullptr);
268*b7893ccfSSadaf Ebrahimi     memory_2 = VK_NULL_HANDLE;
269*b7893ccfSSadaf Ebrahimi     vkDestroyBuffer(device(), buffer, nullptr);
270*b7893ccfSSadaf Ebrahimi     buffer = VK_NULL_HANDLE;
271*b7893ccfSSadaf Ebrahimi 
272*b7893ccfSSadaf Ebrahimi     VkCommandBuffer commandBuffer;
273*b7893ccfSSadaf Ebrahimi     std::string commandBuffer_name = "command_buffer_name";
274*b7893ccfSSadaf Ebrahimi     VkCommandPool commandpool_1;
275*b7893ccfSSadaf Ebrahimi     VkCommandPool commandpool_2;
276*b7893ccfSSadaf Ebrahimi     VkCommandPoolCreateInfo pool_create_info{};
277*b7893ccfSSadaf Ebrahimi     pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
278*b7893ccfSSadaf Ebrahimi     pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
279*b7893ccfSSadaf Ebrahimi     pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
280*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(device(), &pool_create_info, nullptr, &commandpool_1);
281*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(device(), &pool_create_info, nullptr, &commandpool_2);
282*b7893ccfSSadaf Ebrahimi 
283*b7893ccfSSadaf Ebrahimi     VkCommandBufferAllocateInfo command_buffer_allocate_info{};
284*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
285*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.commandPool = commandpool_1;
286*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.commandBufferCount = 1;
287*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
288*b7893ccfSSadaf Ebrahimi     vkAllocateCommandBuffers(device(), &command_buffer_allocate_info, &commandBuffer);
289*b7893ccfSSadaf Ebrahimi 
290*b7893ccfSSadaf Ebrahimi     name_info.object = (uint64_t)commandBuffer;
291*b7893ccfSSadaf Ebrahimi     name_info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT;
292*b7893ccfSSadaf Ebrahimi     name_info.pObjectName = commandBuffer_name.c_str();
293*b7893ccfSSadaf Ebrahimi     fpvkDebugMarkerSetObjectNameEXT(device(), &name_info);
294*b7893ccfSSadaf Ebrahimi 
295*b7893ccfSSadaf Ebrahimi     VkCommandBufferBeginInfo cb_begin_Info = {};
296*b7893ccfSSadaf Ebrahimi     cb_begin_Info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
297*b7893ccfSSadaf Ebrahimi     cb_begin_Info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
298*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(commandBuffer, &cb_begin_Info);
299*b7893ccfSSadaf Ebrahimi 
300*b7893ccfSSadaf Ebrahimi     const VkRect2D scissor = {{-1, 0}, {16, 16}};
301*b7893ccfSSadaf Ebrahimi     const VkRect2D scissors[] = {scissor, scissor};
302*b7893ccfSSadaf Ebrahimi 
303*b7893ccfSSadaf Ebrahimi     // Test parameter_validation layer
304*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, commandBuffer_name);
305*b7893ccfSSadaf Ebrahimi     vkCmdSetScissor(commandBuffer, 1, 1, scissors);
306*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
307*b7893ccfSSadaf Ebrahimi 
308*b7893ccfSSadaf Ebrahimi     // Test object_tracker layer
309*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, commandBuffer_name);
310*b7893ccfSSadaf Ebrahimi     vkFreeCommandBuffers(device(), commandpool_2, 1, &commandBuffer);
311*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
312*b7893ccfSSadaf Ebrahimi 
313*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(device(), commandpool_1, NULL);
314*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(device(), commandpool_2, NULL);
315*b7893ccfSSadaf Ebrahimi }
316*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,DebugUtilsNameTest)317*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, DebugUtilsNameTest) {
318*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Ensure debug utils object names are printed in debug messenger output");
319*b7893ccfSSadaf Ebrahimi 
320*b7893ccfSSadaf Ebrahimi     // Skip test if extension not supported
321*b7893ccfSSadaf Ebrahimi     if (InstanceExtensionSupported(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) {
322*b7893ccfSSadaf Ebrahimi         m_instance_extension_names.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
323*b7893ccfSSadaf Ebrahimi     } else {
324*b7893ccfSSadaf Ebrahimi         printf("%s Debug Utils Extension not supported, skipping test\n", kSkipPrefix);
325*b7893ccfSSadaf Ebrahimi         return;
326*b7893ccfSSadaf Ebrahimi     }
327*b7893ccfSSadaf Ebrahimi 
328*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
329*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
330*b7893ccfSSadaf Ebrahimi 
331*b7893ccfSSadaf Ebrahimi     PFN_vkSetDebugUtilsObjectNameEXT fpvkSetDebugUtilsObjectNameEXT =
332*b7893ccfSSadaf Ebrahimi         (PFN_vkSetDebugUtilsObjectNameEXT)vkGetInstanceProcAddr(instance(), "vkSetDebugUtilsObjectNameEXT");
333*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(fpvkSetDebugUtilsObjectNameEXT);  // Must be extant if extension is enabled
334*b7893ccfSSadaf Ebrahimi     PFN_vkCreateDebugUtilsMessengerEXT fpvkCreateDebugUtilsMessengerEXT =
335*b7893ccfSSadaf Ebrahimi         (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance(), "vkCreateDebugUtilsMessengerEXT");
336*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(fpvkCreateDebugUtilsMessengerEXT);  // Must be extant if extension is enabled
337*b7893ccfSSadaf Ebrahimi     PFN_vkDestroyDebugUtilsMessengerEXT fpvkDestroyDebugUtilsMessengerEXT =
338*b7893ccfSSadaf Ebrahimi         (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance(), "vkDestroyDebugUtilsMessengerEXT");
339*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(fpvkDestroyDebugUtilsMessengerEXT);  // Must be extant if extension is enabled
340*b7893ccfSSadaf Ebrahimi     PFN_vkCmdInsertDebugUtilsLabelEXT fpvkCmdInsertDebugUtilsLabelEXT =
341*b7893ccfSSadaf Ebrahimi         (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance(), "vkCmdInsertDebugUtilsLabelEXT");
342*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(fpvkCmdInsertDebugUtilsLabelEXT);  // Must be extant if extension is enabled
343*b7893ccfSSadaf Ebrahimi 
344*b7893ccfSSadaf Ebrahimi     if (DeviceSimulation()) {
345*b7893ccfSSadaf Ebrahimi         printf("%sSkipping object naming test.\n", kSkipPrefix);
346*b7893ccfSSadaf Ebrahimi         return;
347*b7893ccfSSadaf Ebrahimi     }
348*b7893ccfSSadaf Ebrahimi 
349*b7893ccfSSadaf Ebrahimi     DebugUtilsLabelCheckData callback_data;
350*b7893ccfSSadaf Ebrahimi     auto empty_callback = [](const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, DebugUtilsLabelCheckData *data) {
351*b7893ccfSSadaf Ebrahimi         data->count++;
352*b7893ccfSSadaf Ebrahimi     };
353*b7893ccfSSadaf Ebrahimi     callback_data.count = 0;
354*b7893ccfSSadaf Ebrahimi     callback_data.callback = empty_callback;
355*b7893ccfSSadaf Ebrahimi 
356*b7893ccfSSadaf Ebrahimi     auto callback_create_info = lvl_init_struct<VkDebugUtilsMessengerCreateInfoEXT>();
357*b7893ccfSSadaf Ebrahimi     callback_create_info.messageSeverity =
358*b7893ccfSSadaf Ebrahimi         VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
359*b7893ccfSSadaf Ebrahimi     callback_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
360*b7893ccfSSadaf Ebrahimi     callback_create_info.pfnUserCallback = DebugUtilsCallback;
361*b7893ccfSSadaf Ebrahimi     callback_create_info.pUserData = &callback_data;
362*b7893ccfSSadaf Ebrahimi     VkDebugUtilsMessengerEXT my_messenger = VK_NULL_HANDLE;
363*b7893ccfSSadaf Ebrahimi     fpvkCreateDebugUtilsMessengerEXT(instance(), &callback_create_info, nullptr, &my_messenger);
364*b7893ccfSSadaf Ebrahimi 
365*b7893ccfSSadaf Ebrahimi     VkBuffer buffer;
366*b7893ccfSSadaf Ebrahimi     VkDeviceMemory memory_1, memory_2;
367*b7893ccfSSadaf Ebrahimi     std::string memory_name = "memory_name";
368*b7893ccfSSadaf Ebrahimi 
369*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo buffer_create_info = {};
370*b7893ccfSSadaf Ebrahimi     buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
371*b7893ccfSSadaf Ebrahimi     buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
372*b7893ccfSSadaf Ebrahimi     buffer_create_info.size = 1;
373*b7893ccfSSadaf Ebrahimi 
374*b7893ccfSSadaf Ebrahimi     vkCreateBuffer(device(), &buffer_create_info, nullptr, &buffer);
375*b7893ccfSSadaf Ebrahimi 
376*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements memRequirements;
377*b7893ccfSSadaf Ebrahimi     vkGetBufferMemoryRequirements(device(), buffer, &memRequirements);
378*b7893ccfSSadaf Ebrahimi 
379*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo memory_allocate_info = {};
380*b7893ccfSSadaf Ebrahimi     memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
381*b7893ccfSSadaf Ebrahimi     memory_allocate_info.allocationSize = memRequirements.size;
382*b7893ccfSSadaf Ebrahimi     memory_allocate_info.memoryTypeIndex = 0;
383*b7893ccfSSadaf Ebrahimi 
384*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), &memory_allocate_info, nullptr, &memory_1);
385*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), &memory_allocate_info, nullptr, &memory_2);
386*b7893ccfSSadaf Ebrahimi 
387*b7893ccfSSadaf Ebrahimi     VkDebugUtilsObjectNameInfoEXT name_info = {};
388*b7893ccfSSadaf Ebrahimi     name_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
389*b7893ccfSSadaf Ebrahimi     name_info.pNext = nullptr;
390*b7893ccfSSadaf Ebrahimi     name_info.objectHandle = (uint64_t)memory_2;
391*b7893ccfSSadaf Ebrahimi     name_info.objectType = VK_OBJECT_TYPE_DEVICE_MEMORY;
392*b7893ccfSSadaf Ebrahimi     name_info.pObjectName = memory_name.c_str();
393*b7893ccfSSadaf Ebrahimi     fpvkSetDebugUtilsObjectNameEXT(device(), &name_info);
394*b7893ccfSSadaf Ebrahimi 
395*b7893ccfSSadaf Ebrahimi     vkBindBufferMemory(device(), buffer, memory_1, 0);
396*b7893ccfSSadaf Ebrahimi 
397*b7893ccfSSadaf Ebrahimi     // Test core_validation layer
398*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, memory_name);
399*b7893ccfSSadaf Ebrahimi     vkBindBufferMemory(device(), buffer, memory_2, 0);
400*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
401*b7893ccfSSadaf Ebrahimi 
402*b7893ccfSSadaf Ebrahimi     vkFreeMemory(device(), memory_1, nullptr);
403*b7893ccfSSadaf Ebrahimi     memory_1 = VK_NULL_HANDLE;
404*b7893ccfSSadaf Ebrahimi     vkFreeMemory(device(), memory_2, nullptr);
405*b7893ccfSSadaf Ebrahimi     memory_2 = VK_NULL_HANDLE;
406*b7893ccfSSadaf Ebrahimi     vkDestroyBuffer(device(), buffer, nullptr);
407*b7893ccfSSadaf Ebrahimi     buffer = VK_NULL_HANDLE;
408*b7893ccfSSadaf Ebrahimi 
409*b7893ccfSSadaf Ebrahimi     VkCommandBuffer commandBuffer;
410*b7893ccfSSadaf Ebrahimi     std::string commandBuffer_name = "command_buffer_name";
411*b7893ccfSSadaf Ebrahimi     VkCommandPool commandpool_1;
412*b7893ccfSSadaf Ebrahimi     VkCommandPool commandpool_2;
413*b7893ccfSSadaf Ebrahimi     VkCommandPoolCreateInfo pool_create_info{};
414*b7893ccfSSadaf Ebrahimi     pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
415*b7893ccfSSadaf Ebrahimi     pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
416*b7893ccfSSadaf Ebrahimi     pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
417*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(device(), &pool_create_info, nullptr, &commandpool_1);
418*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(device(), &pool_create_info, nullptr, &commandpool_2);
419*b7893ccfSSadaf Ebrahimi 
420*b7893ccfSSadaf Ebrahimi     VkCommandBufferAllocateInfo command_buffer_allocate_info{};
421*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
422*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.commandPool = commandpool_1;
423*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.commandBufferCount = 1;
424*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
425*b7893ccfSSadaf Ebrahimi     vkAllocateCommandBuffers(device(), &command_buffer_allocate_info, &commandBuffer);
426*b7893ccfSSadaf Ebrahimi 
427*b7893ccfSSadaf Ebrahimi     name_info.objectHandle = (uint64_t)commandBuffer;
428*b7893ccfSSadaf Ebrahimi     name_info.objectType = VK_OBJECT_TYPE_COMMAND_BUFFER;
429*b7893ccfSSadaf Ebrahimi     name_info.pObjectName = commandBuffer_name.c_str();
430*b7893ccfSSadaf Ebrahimi     fpvkSetDebugUtilsObjectNameEXT(device(), &name_info);
431*b7893ccfSSadaf Ebrahimi 
432*b7893ccfSSadaf Ebrahimi     VkCommandBufferBeginInfo cb_begin_Info = {};
433*b7893ccfSSadaf Ebrahimi     cb_begin_Info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
434*b7893ccfSSadaf Ebrahimi     cb_begin_Info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
435*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(commandBuffer, &cb_begin_Info);
436*b7893ccfSSadaf Ebrahimi 
437*b7893ccfSSadaf Ebrahimi     const VkRect2D scissor = {{-1, 0}, {16, 16}};
438*b7893ccfSSadaf Ebrahimi     const VkRect2D scissors[] = {scissor, scissor};
439*b7893ccfSSadaf Ebrahimi 
440*b7893ccfSSadaf Ebrahimi     auto command_label = lvl_init_struct<VkDebugUtilsLabelEXT>();
441*b7893ccfSSadaf Ebrahimi     command_label.pLabelName = "Command Label 0123";
442*b7893ccfSSadaf Ebrahimi     command_label.color[0] = 0.;
443*b7893ccfSSadaf Ebrahimi     command_label.color[1] = 1.;
444*b7893ccfSSadaf Ebrahimi     command_label.color[2] = 2.;
445*b7893ccfSSadaf Ebrahimi     command_label.color[3] = 3.0;
446*b7893ccfSSadaf Ebrahimi     bool command_label_test = false;
447*b7893ccfSSadaf Ebrahimi     auto command_label_callback = [command_label, &command_label_test](const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,
448*b7893ccfSSadaf Ebrahimi                                                                        DebugUtilsLabelCheckData *data) {
449*b7893ccfSSadaf Ebrahimi         data->count++;
450*b7893ccfSSadaf Ebrahimi         command_label_test = false;
451*b7893ccfSSadaf Ebrahimi         if (pCallbackData->cmdBufLabelCount == 1) {
452*b7893ccfSSadaf Ebrahimi             command_label_test = pCallbackData->pCmdBufLabels[0] == command_label;
453*b7893ccfSSadaf Ebrahimi         }
454*b7893ccfSSadaf Ebrahimi     };
455*b7893ccfSSadaf Ebrahimi     callback_data.callback = command_label_callback;
456*b7893ccfSSadaf Ebrahimi 
457*b7893ccfSSadaf Ebrahimi     fpvkCmdInsertDebugUtilsLabelEXT(commandBuffer, &command_label);
458*b7893ccfSSadaf Ebrahimi     // Test parameter_validation layer
459*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, commandBuffer_name);
460*b7893ccfSSadaf Ebrahimi     vkCmdSetScissor(commandBuffer, 1, 1, scissors);
461*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
462*b7893ccfSSadaf Ebrahimi 
463*b7893ccfSSadaf Ebrahimi     // Check the label test
464*b7893ccfSSadaf Ebrahimi     if (!command_label_test) {
465*b7893ccfSSadaf Ebrahimi         ADD_FAILURE() << "Command label '" << command_label.pLabelName << "' not passed to callback.";
466*b7893ccfSSadaf Ebrahimi     }
467*b7893ccfSSadaf Ebrahimi 
468*b7893ccfSSadaf Ebrahimi     // Test object_tracker layer
469*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, commandBuffer_name);
470*b7893ccfSSadaf Ebrahimi     vkFreeCommandBuffers(device(), commandpool_2, 1, &commandBuffer);
471*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
472*b7893ccfSSadaf Ebrahimi 
473*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(device(), commandpool_1, NULL);
474*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(device(), commandpool_2, NULL);
475*b7893ccfSSadaf Ebrahimi     fpvkDestroyDebugUtilsMessengerEXT(instance(), my_messenger, nullptr);
476*b7893ccfSSadaf Ebrahimi }
477*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidStructSType)478*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidStructSType) {
479*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan structure's sType field");
480*b7893ccfSSadaf Ebrahimi 
481*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
482*b7893ccfSSadaf Ebrahimi 
483*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
484*b7893ccfSSadaf Ebrahimi     // Zero struct memory, effectively setting sType to
485*b7893ccfSSadaf Ebrahimi     // VK_STRUCTURE_TYPE_APPLICATION_INFO
486*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
487*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_struct_type
488*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo alloc_info = {};
489*b7893ccfSSadaf Ebrahimi     VkDeviceMemory memory = VK_NULL_HANDLE;
490*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), &alloc_info, NULL, &memory);
491*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
492*b7893ccfSSadaf Ebrahimi 
493*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
494*b7893ccfSSadaf Ebrahimi     // Zero struct memory, effectively setting sType to
495*b7893ccfSSadaf Ebrahimi     // VK_STRUCTURE_TYPE_APPLICATION_INFO
496*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
497*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_struct_type_array
498*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
499*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
500*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
501*b7893ccfSSadaf Ebrahimi }
502*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidStructPNext)503*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidStructPNext) {
504*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
505*b7893ccfSSadaf Ebrahimi 
506*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
507*b7893ccfSSadaf Ebrahimi 
508*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
509*b7893ccfSSadaf Ebrahimi     // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
510*b7893ccfSSadaf Ebrahimi     // Need to pick a function that has no allowed pNext structure types.
511*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_struct_pnext
512*b7893ccfSSadaf Ebrahimi     VkEvent event = VK_NULL_HANDLE;
513*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_alloc_info = {};
514*b7893ccfSSadaf Ebrahimi     // Zero-initialization will provide the correct sType
515*b7893ccfSSadaf Ebrahimi     VkApplicationInfo app_info = {};
516*b7893ccfSSadaf Ebrahimi     event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
517*b7893ccfSSadaf Ebrahimi     event_alloc_info.pNext = &app_info;
518*b7893ccfSSadaf Ebrahimi     vkCreateEvent(device(), &event_alloc_info, NULL, &event);
519*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
520*b7893ccfSSadaf Ebrahimi 
521*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
522*b7893ccfSSadaf Ebrahimi                                          " chain includes a structure with unexpected VkStructureType ");
523*b7893ccfSSadaf Ebrahimi     // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
524*b7893ccfSSadaf Ebrahimi     // a function that has allowed pNext structure types and specify
525*b7893ccfSSadaf Ebrahimi     // a structure type that is not allowed.
526*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_struct_pnext
527*b7893ccfSSadaf Ebrahimi     VkDeviceMemory memory = VK_NULL_HANDLE;
528*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo memory_alloc_info = {};
529*b7893ccfSSadaf Ebrahimi     memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
530*b7893ccfSSadaf Ebrahimi     memory_alloc_info.pNext = &app_info;
531*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
532*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
533*b7893ccfSSadaf Ebrahimi }
534*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UnrecognizedValueOutOfRange)535*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UnrecognizedValueOutOfRange) {
536*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
537*b7893ccfSSadaf Ebrahimi 
538*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
539*b7893ccfSSadaf Ebrahimi                                          "does not fall within the begin..end range of the core VkFormat enumeration tokens");
540*b7893ccfSSadaf Ebrahimi     // Specify an invalid VkFormat value
541*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with
542*b7893ccfSSadaf Ebrahimi     // parameter_validation::validate_ranged_enum
543*b7893ccfSSadaf Ebrahimi     VkFormatProperties format_properties;
544*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
545*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
546*b7893ccfSSadaf Ebrahimi }
547*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UnrecognizedValueBadMask)548*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UnrecognizedValueBadMask) {
549*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
550*b7893ccfSSadaf Ebrahimi 
551*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
552*b7893ccfSSadaf Ebrahimi     // Specify an invalid VkFlags bitmask value
553*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_flags
554*b7893ccfSSadaf Ebrahimi     VkImageFormatProperties image_format_properties;
555*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
556*b7893ccfSSadaf Ebrahimi                                              static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
557*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
558*b7893ccfSSadaf Ebrahimi }
559*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UnrecognizedValueBadFlag)560*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UnrecognizedValueBadFlag) {
561*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
562*b7893ccfSSadaf Ebrahimi 
563*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
564*b7893ccfSSadaf Ebrahimi     // Specify an invalid VkFlags array entry
565*b7893ccfSSadaf Ebrahimi     // Expected to trigger an error with parameter_validation::validate_flags_array
566*b7893ccfSSadaf Ebrahimi     VkSemaphore semaphore;
567*b7893ccfSSadaf Ebrahimi     VkSemaphoreCreateInfo semaphore_create_info{};
568*b7893ccfSSadaf Ebrahimi     semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
569*b7893ccfSSadaf Ebrahimi     vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
570*b7893ccfSSadaf Ebrahimi     // `stage_flags` is set to a value which, currently, is not a defined stage flag
571*b7893ccfSSadaf Ebrahimi     // `VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM` works well for this
572*b7893ccfSSadaf Ebrahimi     VkPipelineStageFlags stage_flags = VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM;
573*b7893ccfSSadaf Ebrahimi     // `waitSemaphoreCount` *must* be greater than 0 to perform this check
574*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
575*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
576*b7893ccfSSadaf Ebrahimi     submit_info.waitSemaphoreCount = 1;
577*b7893ccfSSadaf Ebrahimi     submit_info.pWaitSemaphores = &semaphore;
578*b7893ccfSSadaf Ebrahimi     submit_info.pWaitDstStageMask = &stage_flags;
579*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
580*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), semaphore, nullptr);
581*b7893ccfSSadaf Ebrahimi 
582*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
583*b7893ccfSSadaf Ebrahimi }
584*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UnrecognizedValueBadBool)585*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UnrecognizedValueBadBool) {
586*b7893ccfSSadaf Ebrahimi     // Make sure using VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE doesn't trigger a false positive.
587*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
588*b7893ccfSSadaf Ebrahimi     if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME)) {
589*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME);
590*b7893ccfSSadaf Ebrahimi     } else {
591*b7893ccfSSadaf Ebrahimi         printf("%s VK_KHR_sampler_mirror_clamp_to_edge extension not supported, skipping test\n", kSkipPrefix);
592*b7893ccfSSadaf Ebrahimi         return;
593*b7893ccfSSadaf Ebrahimi     }
594*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
595*b7893ccfSSadaf Ebrahimi 
596*b7893ccfSSadaf Ebrahimi     // Specify an invalid VkBool32 value, expecting a warning with parameter_validation::validate_bool32
597*b7893ccfSSadaf Ebrahimi     VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
598*b7893ccfSSadaf Ebrahimi     sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
599*b7893ccfSSadaf Ebrahimi     sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
600*b7893ccfSSadaf Ebrahimi     sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
601*b7893ccfSSadaf Ebrahimi 
602*b7893ccfSSadaf Ebrahimi     // Not VK_TRUE or VK_FALSE
603*b7893ccfSSadaf Ebrahimi     sampler_info.anisotropyEnable = 3;
604*b7893ccfSSadaf Ebrahimi     CreateSamplerTest(*this, &sampler_info, "is neither VK_TRUE nor VK_FALSE");
605*b7893ccfSSadaf Ebrahimi }
606*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UnrecognizedValueMaxEnum)607*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UnrecognizedValueMaxEnum) {
608*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
609*b7893ccfSSadaf Ebrahimi 
610*b7893ccfSSadaf Ebrahimi     // Specify MAX_ENUM
611*b7893ccfSSadaf Ebrahimi     VkFormatProperties format_properties;
612*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end range");
613*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_MAX_ENUM, &format_properties);
614*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
615*b7893ccfSSadaf Ebrahimi }
616*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,SubmitSignaledFence)617*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, SubmitSignaledFence) {
618*b7893ccfSSadaf Ebrahimi     vk_testing::Fence testFence;
619*b7893ccfSSadaf Ebrahimi 
620*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
621*b7893ccfSSadaf Ebrahimi                                          "submitted in SIGNALED state.  Fences must be reset before being submitted");
622*b7893ccfSSadaf Ebrahimi 
623*b7893ccfSSadaf Ebrahimi     VkFenceCreateInfo fenceInfo = {};
624*b7893ccfSSadaf Ebrahimi     fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
625*b7893ccfSSadaf Ebrahimi     fenceInfo.pNext = NULL;
626*b7893ccfSSadaf Ebrahimi     fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
627*b7893ccfSSadaf Ebrahimi 
628*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
629*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitViewport());
630*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
631*b7893ccfSSadaf Ebrahimi 
632*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
633*b7893ccfSSadaf Ebrahimi     m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
634*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
635*b7893ccfSSadaf Ebrahimi 
636*b7893ccfSSadaf Ebrahimi     testFence.init(*m_device, fenceInfo);
637*b7893ccfSSadaf Ebrahimi 
638*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info;
639*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
640*b7893ccfSSadaf Ebrahimi     submit_info.pNext = NULL;
641*b7893ccfSSadaf Ebrahimi     submit_info.waitSemaphoreCount = 0;
642*b7893ccfSSadaf Ebrahimi     submit_info.pWaitSemaphores = NULL;
643*b7893ccfSSadaf Ebrahimi     submit_info.pWaitDstStageMask = NULL;
644*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
645*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
646*b7893ccfSSadaf Ebrahimi     submit_info.signalSemaphoreCount = 0;
647*b7893ccfSSadaf Ebrahimi     submit_info.pSignalSemaphores = NULL;
648*b7893ccfSSadaf Ebrahimi 
649*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
650*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
651*b7893ccfSSadaf Ebrahimi 
652*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
653*b7893ccfSSadaf Ebrahimi }
654*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,LeakAnObject)655*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, LeakAnObject) {
656*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
657*b7893ccfSSadaf Ebrahimi 
658*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
659*b7893ccfSSadaf Ebrahimi 
660*b7893ccfSSadaf Ebrahimi     // Workaround for overzealous layers checking even the guaranteed 0th queue family
661*b7893ccfSSadaf Ebrahimi     const auto q_props = vk_testing::PhysicalDevice(gpu()).queue_properties();
662*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(q_props.size() > 0);
663*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(q_props[0].queueCount > 0);
664*b7893ccfSSadaf Ebrahimi 
665*b7893ccfSSadaf Ebrahimi     const float q_priority[] = {1.0f};
666*b7893ccfSSadaf Ebrahimi     VkDeviceQueueCreateInfo queue_ci = {};
667*b7893ccfSSadaf Ebrahimi     queue_ci.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
668*b7893ccfSSadaf Ebrahimi     queue_ci.queueFamilyIndex = 0;
669*b7893ccfSSadaf Ebrahimi     queue_ci.queueCount = 1;
670*b7893ccfSSadaf Ebrahimi     queue_ci.pQueuePriorities = q_priority;
671*b7893ccfSSadaf Ebrahimi 
672*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo device_ci = {};
673*b7893ccfSSadaf Ebrahimi     device_ci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
674*b7893ccfSSadaf Ebrahimi     device_ci.queueCreateInfoCount = 1;
675*b7893ccfSSadaf Ebrahimi     device_ci.pQueueCreateInfos = &queue_ci;
676*b7893ccfSSadaf Ebrahimi 
677*b7893ccfSSadaf Ebrahimi     VkDevice leaky_device;
678*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_ci, nullptr, &leaky_device));
679*b7893ccfSSadaf Ebrahimi 
680*b7893ccfSSadaf Ebrahimi     const VkFenceCreateInfo fence_ci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};
681*b7893ccfSSadaf Ebrahimi     VkFence leaked_fence;
682*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateFence(leaky_device, &fence_ci, nullptr, &leaked_fence));
683*b7893ccfSSadaf Ebrahimi 
684*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyDevice-device-00378");
685*b7893ccfSSadaf Ebrahimi     vkDestroyDevice(leaky_device, nullptr);
686*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
687*b7893ccfSSadaf Ebrahimi }
688*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UseObjectWithWrongDevice)689*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
690*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION(
691*b7893ccfSSadaf Ebrahimi         "Try to destroy a render pass object using a device other than the one it was created on. This should generate a distinct "
692*b7893ccfSSadaf Ebrahimi         "error from the invalid handle error.");
693*b7893ccfSSadaf Ebrahimi     // Create first device and renderpass
694*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
695*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
696*b7893ccfSSadaf Ebrahimi 
697*b7893ccfSSadaf Ebrahimi     // Create second device
698*b7893ccfSSadaf Ebrahimi     float priorities[] = {1.0f};
699*b7893ccfSSadaf Ebrahimi     VkDeviceQueueCreateInfo queue_info{};
700*b7893ccfSSadaf Ebrahimi     queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
701*b7893ccfSSadaf Ebrahimi     queue_info.pNext = NULL;
702*b7893ccfSSadaf Ebrahimi     queue_info.flags = 0;
703*b7893ccfSSadaf Ebrahimi     queue_info.queueFamilyIndex = 0;
704*b7893ccfSSadaf Ebrahimi     queue_info.queueCount = 1;
705*b7893ccfSSadaf Ebrahimi     queue_info.pQueuePriorities = &priorities[0];
706*b7893ccfSSadaf Ebrahimi 
707*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo device_create_info = {};
708*b7893ccfSSadaf Ebrahimi     auto features = m_device->phy().features();
709*b7893ccfSSadaf Ebrahimi     device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
710*b7893ccfSSadaf Ebrahimi     device_create_info.pNext = NULL;
711*b7893ccfSSadaf Ebrahimi     device_create_info.queueCreateInfoCount = 1;
712*b7893ccfSSadaf Ebrahimi     device_create_info.pQueueCreateInfos = &queue_info;
713*b7893ccfSSadaf Ebrahimi     device_create_info.enabledLayerCount = 0;
714*b7893ccfSSadaf Ebrahimi     device_create_info.ppEnabledLayerNames = NULL;
715*b7893ccfSSadaf Ebrahimi     device_create_info.pEnabledFeatures = &features;
716*b7893ccfSSadaf Ebrahimi 
717*b7893ccfSSadaf Ebrahimi     VkDevice second_device;
718*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
719*b7893ccfSSadaf Ebrahimi 
720*b7893ccfSSadaf Ebrahimi     // Try to destroy the renderpass from the first device using the second device
721*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyRenderPass-renderPass-parent");
722*b7893ccfSSadaf Ebrahimi     vkDestroyRenderPass(second_device, m_renderPass, NULL);
723*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
724*b7893ccfSSadaf Ebrahimi 
725*b7893ccfSSadaf Ebrahimi     vkDestroyDevice(second_device, NULL);
726*b7893ccfSSadaf Ebrahimi }
727*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidAllocationCallbacks)728*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidAllocationCallbacks) {
729*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Test with invalid VkAllocationCallbacks");
730*b7893ccfSSadaf Ebrahimi 
731*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
732*b7893ccfSSadaf Ebrahimi 
733*b7893ccfSSadaf Ebrahimi     // vkCreateInstance, and vkCreateDevice tend to crash in the Loader Trampoline ATM, so choosing vkCreateCommandPool
734*b7893ccfSSadaf Ebrahimi     const VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0,
735*b7893ccfSSadaf Ebrahimi                                           DeviceObj()->QueueFamilyMatching(0, 0, true)};
736*b7893ccfSSadaf Ebrahimi     VkCommandPool cmdPool;
737*b7893ccfSSadaf Ebrahimi 
738*b7893ccfSSadaf Ebrahimi     struct Alloc {
739*b7893ccfSSadaf Ebrahimi         static VKAPI_ATTR void *VKAPI_CALL alloc(void *, size_t, size_t, VkSystemAllocationScope) { return nullptr; };
740*b7893ccfSSadaf Ebrahimi         static VKAPI_ATTR void *VKAPI_CALL realloc(void *, void *, size_t, size_t, VkSystemAllocationScope) { return nullptr; };
741*b7893ccfSSadaf Ebrahimi         static VKAPI_ATTR void VKAPI_CALL free(void *, void *){};
742*b7893ccfSSadaf Ebrahimi         static VKAPI_ATTR void VKAPI_CALL internalAlloc(void *, size_t, VkInternalAllocationType, VkSystemAllocationScope){};
743*b7893ccfSSadaf Ebrahimi         static VKAPI_ATTR void VKAPI_CALL internalFree(void *, size_t, VkInternalAllocationType, VkSystemAllocationScope){};
744*b7893ccfSSadaf Ebrahimi     };
745*b7893ccfSSadaf Ebrahimi 
746*b7893ccfSSadaf Ebrahimi     {
747*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAllocationCallbacks-pfnAllocation-00632");
748*b7893ccfSSadaf Ebrahimi         const VkAllocationCallbacks allocator = {nullptr, nullptr, Alloc::realloc, Alloc::free, nullptr, nullptr};
749*b7893ccfSSadaf Ebrahimi         vkCreateCommandPool(device(), &cpci, &allocator, &cmdPool);
750*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
751*b7893ccfSSadaf Ebrahimi     }
752*b7893ccfSSadaf Ebrahimi 
753*b7893ccfSSadaf Ebrahimi     {
754*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAllocationCallbacks-pfnReallocation-00633");
755*b7893ccfSSadaf Ebrahimi         const VkAllocationCallbacks allocator = {nullptr, Alloc::alloc, nullptr, Alloc::free, nullptr, nullptr};
756*b7893ccfSSadaf Ebrahimi         vkCreateCommandPool(device(), &cpci, &allocator, &cmdPool);
757*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
758*b7893ccfSSadaf Ebrahimi     }
759*b7893ccfSSadaf Ebrahimi 
760*b7893ccfSSadaf Ebrahimi     {
761*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAllocationCallbacks-pfnFree-00634");
762*b7893ccfSSadaf Ebrahimi         const VkAllocationCallbacks allocator = {nullptr, Alloc::alloc, Alloc::realloc, nullptr, nullptr, nullptr};
763*b7893ccfSSadaf Ebrahimi         vkCreateCommandPool(device(), &cpci, &allocator, &cmdPool);
764*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
765*b7893ccfSSadaf Ebrahimi     }
766*b7893ccfSSadaf Ebrahimi 
767*b7893ccfSSadaf Ebrahimi     {
768*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
769*b7893ccfSSadaf Ebrahimi                                              "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
770*b7893ccfSSadaf Ebrahimi         const VkAllocationCallbacks allocator = {nullptr, Alloc::alloc, Alloc::realloc, Alloc::free, nullptr, Alloc::internalFree};
771*b7893ccfSSadaf Ebrahimi         vkCreateCommandPool(device(), &cpci, &allocator, &cmdPool);
772*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
773*b7893ccfSSadaf Ebrahimi     }
774*b7893ccfSSadaf Ebrahimi 
775*b7893ccfSSadaf Ebrahimi     {
776*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
777*b7893ccfSSadaf Ebrahimi                                              "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
778*b7893ccfSSadaf Ebrahimi         const VkAllocationCallbacks allocator = {nullptr, Alloc::alloc, Alloc::realloc, Alloc::free, Alloc::internalAlloc, nullptr};
779*b7893ccfSSadaf Ebrahimi         vkCreateCommandPool(device(), &cpci, &allocator, &cmdPool);
780*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
781*b7893ccfSSadaf Ebrahimi     }
782*b7893ccfSSadaf Ebrahimi }
783*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,MismatchedQueueFamiliesOnSubmit)784*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
785*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION(
786*b7893ccfSSadaf Ebrahimi         "Submit command buffer created using one queue family and attempt to submit them on a queue created in a different queue "
787*b7893ccfSSadaf Ebrahimi         "family.");
788*b7893ccfSSadaf Ebrahimi 
789*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());  // assumes it initializes all queue families on vkCreateDevice
790*b7893ccfSSadaf Ebrahimi 
791*b7893ccfSSadaf Ebrahimi     // This test is meaningless unless we have multiple queue families
792*b7893ccfSSadaf Ebrahimi     auto queue_family_properties = m_device->phy().queue_properties();
793*b7893ccfSSadaf Ebrahimi     std::vector<uint32_t> queue_families;
794*b7893ccfSSadaf Ebrahimi     for (uint32_t i = 0; i < queue_family_properties.size(); ++i)
795*b7893ccfSSadaf Ebrahimi         if (queue_family_properties[i].queueCount > 0) queue_families.push_back(i);
796*b7893ccfSSadaf Ebrahimi 
797*b7893ccfSSadaf Ebrahimi     if (queue_families.size() < 2) {
798*b7893ccfSSadaf Ebrahimi         printf("%s Device only has one queue family; skipped.\n", kSkipPrefix);
799*b7893ccfSSadaf Ebrahimi         return;
800*b7893ccfSSadaf Ebrahimi     }
801*b7893ccfSSadaf Ebrahimi 
802*b7893ccfSSadaf Ebrahimi     const uint32_t queue_family = queue_families[0];
803*b7893ccfSSadaf Ebrahimi 
804*b7893ccfSSadaf Ebrahimi     const uint32_t other_queue_family = queue_families[1];
805*b7893ccfSSadaf Ebrahimi     VkQueue other_queue;
806*b7893ccfSSadaf Ebrahimi     vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
807*b7893ccfSSadaf Ebrahimi 
808*b7893ccfSSadaf Ebrahimi     VkCommandPoolObj cmd_pool(m_device, queue_family);
809*b7893ccfSSadaf Ebrahimi     VkCommandBufferObj cmd_buff(m_device, &cmd_pool);
810*b7893ccfSSadaf Ebrahimi 
811*b7893ccfSSadaf Ebrahimi     cmd_buff.begin();
812*b7893ccfSSadaf Ebrahimi     cmd_buff.end();
813*b7893ccfSSadaf Ebrahimi 
814*b7893ccfSSadaf Ebrahimi     // Submit on the wrong queue
815*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
816*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
817*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
818*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &cmd_buff.handle();
819*b7893ccfSSadaf Ebrahimi 
820*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkQueueSubmit-pCommandBuffers-00074");
821*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
822*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
823*b7893ccfSSadaf Ebrahimi }
824*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,TemporaryExternalSemaphore)825*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, TemporaryExternalSemaphore) {
826*b7893ccfSSadaf Ebrahimi #ifdef _WIN32
827*b7893ccfSSadaf Ebrahimi     const auto extension_name = VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME;
828*b7893ccfSSadaf Ebrahimi     const auto handle_type = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR;
829*b7893ccfSSadaf Ebrahimi #else
830*b7893ccfSSadaf Ebrahimi     const auto extension_name = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME;
831*b7893ccfSSadaf Ebrahimi     const auto handle_type = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
832*b7893ccfSSadaf Ebrahimi #endif
833*b7893ccfSSadaf Ebrahimi     // Check for external semaphore instance extensions
834*b7893ccfSSadaf Ebrahimi     if (InstanceExtensionSupported(VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME)) {
835*b7893ccfSSadaf Ebrahimi         m_instance_extension_names.push_back(VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME);
836*b7893ccfSSadaf Ebrahimi         m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
837*b7893ccfSSadaf Ebrahimi     } else {
838*b7893ccfSSadaf Ebrahimi         printf("%s External semaphore extension not supported, skipping test\n", kSkipPrefix);
839*b7893ccfSSadaf Ebrahimi         return;
840*b7893ccfSSadaf Ebrahimi     }
841*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
842*b7893ccfSSadaf Ebrahimi 
843*b7893ccfSSadaf Ebrahimi     // Check for external semaphore device extensions
844*b7893ccfSSadaf Ebrahimi     if (DeviceExtensionSupported(gpu(), nullptr, extension_name)) {
845*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(extension_name);
846*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME);
847*b7893ccfSSadaf Ebrahimi     } else {
848*b7893ccfSSadaf Ebrahimi         printf("%s External semaphore extension not supported, skipping test\n", kSkipPrefix);
849*b7893ccfSSadaf Ebrahimi         return;
850*b7893ccfSSadaf Ebrahimi     }
851*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
852*b7893ccfSSadaf Ebrahimi 
853*b7893ccfSSadaf Ebrahimi     // Check for external semaphore import and export capability
854*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceExternalSemaphoreInfoKHR esi = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR, nullptr,
855*b7893ccfSSadaf Ebrahimi                                                     handle_type};
856*b7893ccfSSadaf Ebrahimi     VkExternalSemaphorePropertiesKHR esp = {VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR, nullptr};
857*b7893ccfSSadaf Ebrahimi     auto vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
858*b7893ccfSSadaf Ebrahimi         (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)vkGetInstanceProcAddr(
859*b7893ccfSSadaf Ebrahimi             instance(), "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
860*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(gpu(), &esi, &esp);
861*b7893ccfSSadaf Ebrahimi 
862*b7893ccfSSadaf Ebrahimi     if (!(esp.externalSemaphoreFeatures & VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR) ||
863*b7893ccfSSadaf Ebrahimi         !(esp.externalSemaphoreFeatures & VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR)) {
864*b7893ccfSSadaf Ebrahimi         printf("%s External semaphore does not support importing and exporting, skipping test\n", kSkipPrefix);
865*b7893ccfSSadaf Ebrahimi         return;
866*b7893ccfSSadaf Ebrahimi     }
867*b7893ccfSSadaf Ebrahimi 
868*b7893ccfSSadaf Ebrahimi     VkResult err;
869*b7893ccfSSadaf Ebrahimi 
870*b7893ccfSSadaf Ebrahimi     // Create a semaphore to export payload from
871*b7893ccfSSadaf Ebrahimi     VkExportSemaphoreCreateInfoKHR esci = {VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR, nullptr, handle_type};
872*b7893ccfSSadaf Ebrahimi     VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &esci, 0};
873*b7893ccfSSadaf Ebrahimi 
874*b7893ccfSSadaf Ebrahimi     VkSemaphore export_semaphore;
875*b7893ccfSSadaf Ebrahimi     err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &export_semaphore);
876*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
877*b7893ccfSSadaf Ebrahimi 
878*b7893ccfSSadaf Ebrahimi     // Create a semaphore to import payload into
879*b7893ccfSSadaf Ebrahimi     sci.pNext = nullptr;
880*b7893ccfSSadaf Ebrahimi     VkSemaphore import_semaphore;
881*b7893ccfSSadaf Ebrahimi     err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &import_semaphore);
882*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
883*b7893ccfSSadaf Ebrahimi 
884*b7893ccfSSadaf Ebrahimi #ifdef _WIN32
885*b7893ccfSSadaf Ebrahimi     // Export semaphore payload to an opaque handle
886*b7893ccfSSadaf Ebrahimi     HANDLE handle = nullptr;
887*b7893ccfSSadaf Ebrahimi     VkSemaphoreGetWin32HandleInfoKHR ghi = {VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR, nullptr, export_semaphore,
888*b7893ccfSSadaf Ebrahimi                                             handle_type};
889*b7893ccfSSadaf Ebrahimi     auto vkGetSemaphoreWin32HandleKHR =
890*b7893ccfSSadaf Ebrahimi         (PFN_vkGetSemaphoreWin32HandleKHR)vkGetDeviceProcAddr(m_device->device(), "vkGetSemaphoreWin32HandleKHR");
891*b7893ccfSSadaf Ebrahimi     err = vkGetSemaphoreWin32HandleKHR(m_device->device(), &ghi, &handle);
892*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
893*b7893ccfSSadaf Ebrahimi 
894*b7893ccfSSadaf Ebrahimi     // Import opaque handle exported above *temporarily*
895*b7893ccfSSadaf Ebrahimi     VkImportSemaphoreWin32HandleInfoKHR ihi = {VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
896*b7893ccfSSadaf Ebrahimi                                                nullptr,
897*b7893ccfSSadaf Ebrahimi                                                import_semaphore,
898*b7893ccfSSadaf Ebrahimi                                                VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR,
899*b7893ccfSSadaf Ebrahimi                                                handle_type,
900*b7893ccfSSadaf Ebrahimi                                                handle,
901*b7893ccfSSadaf Ebrahimi                                                nullptr};
902*b7893ccfSSadaf Ebrahimi     auto vkImportSemaphoreWin32HandleKHR =
903*b7893ccfSSadaf Ebrahimi         (PFN_vkImportSemaphoreWin32HandleKHR)vkGetDeviceProcAddr(m_device->device(), "vkImportSemaphoreWin32HandleKHR");
904*b7893ccfSSadaf Ebrahimi     err = vkImportSemaphoreWin32HandleKHR(m_device->device(), &ihi);
905*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
906*b7893ccfSSadaf Ebrahimi #else
907*b7893ccfSSadaf Ebrahimi     // Export semaphore payload to an opaque handle
908*b7893ccfSSadaf Ebrahimi     int fd = 0;
909*b7893ccfSSadaf Ebrahimi     VkSemaphoreGetFdInfoKHR ghi = {VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, nullptr, export_semaphore, handle_type};
910*b7893ccfSSadaf Ebrahimi     auto vkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)vkGetDeviceProcAddr(m_device->device(), "vkGetSemaphoreFdKHR");
911*b7893ccfSSadaf Ebrahimi     err = vkGetSemaphoreFdKHR(m_device->device(), &ghi, &fd);
912*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
913*b7893ccfSSadaf Ebrahimi 
914*b7893ccfSSadaf Ebrahimi     // Import opaque handle exported above *temporarily*
915*b7893ccfSSadaf Ebrahimi     VkImportSemaphoreFdInfoKHR ihi = {VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, nullptr,     import_semaphore,
916*b7893ccfSSadaf Ebrahimi                                       VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR,          handle_type, fd};
917*b7893ccfSSadaf Ebrahimi     auto vkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)vkGetDeviceProcAddr(m_device->device(), "vkImportSemaphoreFdKHR");
918*b7893ccfSSadaf Ebrahimi     err = vkImportSemaphoreFdKHR(m_device->device(), &ihi);
919*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
920*b7893ccfSSadaf Ebrahimi #endif
921*b7893ccfSSadaf Ebrahimi 
922*b7893ccfSSadaf Ebrahimi     // Wait on the imported semaphore twice in vkQueueSubmit, the second wait should be an error
923*b7893ccfSSadaf Ebrahimi     VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
924*b7893ccfSSadaf Ebrahimi     VkSubmitInfo si[] = {
925*b7893ccfSSadaf Ebrahimi         {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, &flags, 0, nullptr, 1, &export_semaphore},
926*b7893ccfSSadaf Ebrahimi         {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &import_semaphore, &flags, 0, nullptr, 0, nullptr},
927*b7893ccfSSadaf Ebrahimi         {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, &flags, 0, nullptr, 1, &export_semaphore},
928*b7893ccfSSadaf Ebrahimi         {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &import_semaphore, &flags, 0, nullptr, 0, nullptr},
929*b7893ccfSSadaf Ebrahimi     };
930*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has no way to be signaled");
931*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 4, si, VK_NULL_HANDLE);
932*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
933*b7893ccfSSadaf Ebrahimi 
934*b7893ccfSSadaf Ebrahimi     auto index = m_device->graphics_queue_node_index_;
935*b7893ccfSSadaf Ebrahimi     if (m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) {
936*b7893ccfSSadaf Ebrahimi         // Wait on the imported semaphore twice in vkQueueBindSparse, the second wait should be an error
937*b7893ccfSSadaf Ebrahimi         VkBindSparseInfo bi[] = {
938*b7893ccfSSadaf Ebrahimi             {VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 1, &export_semaphore},
939*b7893ccfSSadaf Ebrahimi             {VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, nullptr, 1, &import_semaphore, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr},
940*b7893ccfSSadaf Ebrahimi             {VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 1, &export_semaphore},
941*b7893ccfSSadaf Ebrahimi             {VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, nullptr, 1, &import_semaphore, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr},
942*b7893ccfSSadaf Ebrahimi         };
943*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has no way to be signaled");
944*b7893ccfSSadaf Ebrahimi         vkQueueBindSparse(m_device->m_queue, 4, bi, VK_NULL_HANDLE);
945*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
946*b7893ccfSSadaf Ebrahimi     }
947*b7893ccfSSadaf Ebrahimi 
948*b7893ccfSSadaf Ebrahimi     // Cleanup
949*b7893ccfSSadaf Ebrahimi     err = vkQueueWaitIdle(m_device->m_queue);
950*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
951*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), export_semaphore, nullptr);
952*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), import_semaphore, nullptr);
953*b7893ccfSSadaf Ebrahimi }
954*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,TemporaryExternalFence)955*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, TemporaryExternalFence) {
956*b7893ccfSSadaf Ebrahimi #ifdef _WIN32
957*b7893ccfSSadaf Ebrahimi     const auto extension_name = VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME;
958*b7893ccfSSadaf Ebrahimi     const auto handle_type = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR;
959*b7893ccfSSadaf Ebrahimi #else
960*b7893ccfSSadaf Ebrahimi     const auto extension_name = VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME;
961*b7893ccfSSadaf Ebrahimi     const auto handle_type = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
962*b7893ccfSSadaf Ebrahimi #endif
963*b7893ccfSSadaf Ebrahimi     // Check for external fence instance extensions
964*b7893ccfSSadaf Ebrahimi     if (InstanceExtensionSupported(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME)) {
965*b7893ccfSSadaf Ebrahimi         m_instance_extension_names.push_back(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME);
966*b7893ccfSSadaf Ebrahimi         m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
967*b7893ccfSSadaf Ebrahimi     } else {
968*b7893ccfSSadaf Ebrahimi         printf("%s External fence extension not supported, skipping test\n", kSkipPrefix);
969*b7893ccfSSadaf Ebrahimi         return;
970*b7893ccfSSadaf Ebrahimi     }
971*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
972*b7893ccfSSadaf Ebrahimi 
973*b7893ccfSSadaf Ebrahimi     // Check for external fence device extensions
974*b7893ccfSSadaf Ebrahimi     if (DeviceExtensionSupported(gpu(), nullptr, extension_name)) {
975*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(extension_name);
976*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME);
977*b7893ccfSSadaf Ebrahimi     } else {
978*b7893ccfSSadaf Ebrahimi         printf("%s External fence extension not supported, skipping test\n", kSkipPrefix);
979*b7893ccfSSadaf Ebrahimi         return;
980*b7893ccfSSadaf Ebrahimi     }
981*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
982*b7893ccfSSadaf Ebrahimi 
983*b7893ccfSSadaf Ebrahimi     // Check for external fence import and export capability
984*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceExternalFenceInfoKHR efi = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR, nullptr, handle_type};
985*b7893ccfSSadaf Ebrahimi     VkExternalFencePropertiesKHR efp = {VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR, nullptr};
986*b7893ccfSSadaf Ebrahimi     auto vkGetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)vkGetInstanceProcAddr(
987*b7893ccfSSadaf Ebrahimi         instance(), "vkGetPhysicalDeviceExternalFencePropertiesKHR");
988*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceExternalFencePropertiesKHR(gpu(), &efi, &efp);
989*b7893ccfSSadaf Ebrahimi 
990*b7893ccfSSadaf Ebrahimi     if (!(efp.externalFenceFeatures & VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR) ||
991*b7893ccfSSadaf Ebrahimi         !(efp.externalFenceFeatures & VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR)) {
992*b7893ccfSSadaf Ebrahimi         printf("%s External fence does not support importing and exporting, skipping test\n", kSkipPrefix);
993*b7893ccfSSadaf Ebrahimi         return;
994*b7893ccfSSadaf Ebrahimi     }
995*b7893ccfSSadaf Ebrahimi 
996*b7893ccfSSadaf Ebrahimi     VkResult err;
997*b7893ccfSSadaf Ebrahimi 
998*b7893ccfSSadaf Ebrahimi     // Create a fence to export payload from
999*b7893ccfSSadaf Ebrahimi     VkFence export_fence;
1000*b7893ccfSSadaf Ebrahimi     {
1001*b7893ccfSSadaf Ebrahimi         VkExportFenceCreateInfoKHR efci = {VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR, nullptr, handle_type};
1002*b7893ccfSSadaf Ebrahimi         VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, &efci, 0};
1003*b7893ccfSSadaf Ebrahimi         err = vkCreateFence(m_device->device(), &fci, nullptr, &export_fence);
1004*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(err);
1005*b7893ccfSSadaf Ebrahimi     }
1006*b7893ccfSSadaf Ebrahimi 
1007*b7893ccfSSadaf Ebrahimi     // Create a fence to import payload into
1008*b7893ccfSSadaf Ebrahimi     VkFence import_fence;
1009*b7893ccfSSadaf Ebrahimi     {
1010*b7893ccfSSadaf Ebrahimi         VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
1011*b7893ccfSSadaf Ebrahimi         err = vkCreateFence(m_device->device(), &fci, nullptr, &import_fence);
1012*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(err);
1013*b7893ccfSSadaf Ebrahimi     }
1014*b7893ccfSSadaf Ebrahimi 
1015*b7893ccfSSadaf Ebrahimi #ifdef _WIN32
1016*b7893ccfSSadaf Ebrahimi     // Export fence payload to an opaque handle
1017*b7893ccfSSadaf Ebrahimi     HANDLE handle = nullptr;
1018*b7893ccfSSadaf Ebrahimi     {
1019*b7893ccfSSadaf Ebrahimi         VkFenceGetWin32HandleInfoKHR ghi = {VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR, nullptr, export_fence, handle_type};
1020*b7893ccfSSadaf Ebrahimi         auto vkGetFenceWin32HandleKHR =
1021*b7893ccfSSadaf Ebrahimi             (PFN_vkGetFenceWin32HandleKHR)vkGetDeviceProcAddr(m_device->device(), "vkGetFenceWin32HandleKHR");
1022*b7893ccfSSadaf Ebrahimi         err = vkGetFenceWin32HandleKHR(m_device->device(), &ghi, &handle);
1023*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(err);
1024*b7893ccfSSadaf Ebrahimi     }
1025*b7893ccfSSadaf Ebrahimi 
1026*b7893ccfSSadaf Ebrahimi     // Import opaque handle exported above
1027*b7893ccfSSadaf Ebrahimi     {
1028*b7893ccfSSadaf Ebrahimi         VkImportFenceWin32HandleInfoKHR ifi = {VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR,
1029*b7893ccfSSadaf Ebrahimi                                                nullptr,
1030*b7893ccfSSadaf Ebrahimi                                                import_fence,
1031*b7893ccfSSadaf Ebrahimi                                                VK_FENCE_IMPORT_TEMPORARY_BIT_KHR,
1032*b7893ccfSSadaf Ebrahimi                                                handle_type,
1033*b7893ccfSSadaf Ebrahimi                                                handle,
1034*b7893ccfSSadaf Ebrahimi                                                nullptr};
1035*b7893ccfSSadaf Ebrahimi         auto vkImportFenceWin32HandleKHR =
1036*b7893ccfSSadaf Ebrahimi             (PFN_vkImportFenceWin32HandleKHR)vkGetDeviceProcAddr(m_device->device(), "vkImportFenceWin32HandleKHR");
1037*b7893ccfSSadaf Ebrahimi         err = vkImportFenceWin32HandleKHR(m_device->device(), &ifi);
1038*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(err);
1039*b7893ccfSSadaf Ebrahimi     }
1040*b7893ccfSSadaf Ebrahimi #else
1041*b7893ccfSSadaf Ebrahimi     // Export fence payload to an opaque handle
1042*b7893ccfSSadaf Ebrahimi     int fd = 0;
1043*b7893ccfSSadaf Ebrahimi     {
1044*b7893ccfSSadaf Ebrahimi         VkFenceGetFdInfoKHR gfi = {VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, nullptr, export_fence, handle_type};
1045*b7893ccfSSadaf Ebrahimi         auto vkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)vkGetDeviceProcAddr(m_device->device(), "vkGetFenceFdKHR");
1046*b7893ccfSSadaf Ebrahimi         err = vkGetFenceFdKHR(m_device->device(), &gfi, &fd);
1047*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(err);
1048*b7893ccfSSadaf Ebrahimi     }
1049*b7893ccfSSadaf Ebrahimi 
1050*b7893ccfSSadaf Ebrahimi     // Import opaque handle exported above
1051*b7893ccfSSadaf Ebrahimi     {
1052*b7893ccfSSadaf Ebrahimi         VkImportFenceFdInfoKHR ifi = {VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR, nullptr,     import_fence,
1053*b7893ccfSSadaf Ebrahimi                                       VK_FENCE_IMPORT_TEMPORARY_BIT_KHR,          handle_type, fd};
1054*b7893ccfSSadaf Ebrahimi         auto vkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)vkGetDeviceProcAddr(m_device->device(), "vkImportFenceFdKHR");
1055*b7893ccfSSadaf Ebrahimi         err = vkImportFenceFdKHR(m_device->device(), &ifi);
1056*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(err);
1057*b7893ccfSSadaf Ebrahimi     }
1058*b7893ccfSSadaf Ebrahimi #endif
1059*b7893ccfSSadaf Ebrahimi 
1060*b7893ccfSSadaf Ebrahimi     // Undo the temporary import
1061*b7893ccfSSadaf Ebrahimi     vkResetFences(m_device->device(), 1, &import_fence);
1062*b7893ccfSSadaf Ebrahimi 
1063*b7893ccfSSadaf Ebrahimi     // Signal the previously imported fence twice, the second signal should produce a validation error
1064*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 0, nullptr, import_fence);
1065*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is already in use by another submission.");
1066*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 0, nullptr, import_fence);
1067*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1068*b7893ccfSSadaf Ebrahimi 
1069*b7893ccfSSadaf Ebrahimi     // Cleanup
1070*b7893ccfSSadaf Ebrahimi     err = vkQueueWaitIdle(m_device->m_queue);
1071*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1072*b7893ccfSSadaf Ebrahimi     vkDestroyFence(m_device->device(), export_fence, nullptr);
1073*b7893ccfSSadaf Ebrahimi     vkDestroyFence(m_device->device(), import_fence, nullptr);
1074*b7893ccfSSadaf Ebrahimi }
1075*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidCmdBufferEventDestroyed)1076*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
1077*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid due to an event dependency being destroyed.");
1078*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1079*b7893ccfSSadaf Ebrahimi 
1080*b7893ccfSSadaf Ebrahimi     VkEvent event;
1081*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo evci = {};
1082*b7893ccfSSadaf Ebrahimi     evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1083*b7893ccfSSadaf Ebrahimi     VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
1084*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(result);
1085*b7893ccfSSadaf Ebrahimi 
1086*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1087*b7893ccfSSadaf Ebrahimi     vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
1088*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1089*b7893ccfSSadaf Ebrahimi 
1090*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1091*b7893ccfSSadaf Ebrahimi                                          "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
1092*b7893ccfSSadaf Ebrahimi     // Destroy event dependency prior to submit to cause ERROR
1093*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(m_device->device(), event, NULL);
1094*b7893ccfSSadaf Ebrahimi 
1095*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1096*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1097*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1098*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1099*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1100*b7893ccfSSadaf Ebrahimi 
1101*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1102*b7893ccfSSadaf Ebrahimi }
1103*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidCmdBufferQueryPoolDestroyed)1104*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
1105*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid due to a query pool dependency being destroyed.");
1106*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1107*b7893ccfSSadaf Ebrahimi 
1108*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
1109*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo qpci{};
1110*b7893ccfSSadaf Ebrahimi     qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1111*b7893ccfSSadaf Ebrahimi     qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
1112*b7893ccfSSadaf Ebrahimi     qpci.queryCount = 1;
1113*b7893ccfSSadaf Ebrahimi     VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
1114*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(result);
1115*b7893ccfSSadaf Ebrahimi 
1116*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1117*b7893ccfSSadaf Ebrahimi     vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
1118*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1119*b7893ccfSSadaf Ebrahimi 
1120*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1121*b7893ccfSSadaf Ebrahimi                                          "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkQueryPool");
1122*b7893ccfSSadaf Ebrahimi     // Destroy query pool dependency prior to submit to cause ERROR
1123*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, NULL);
1124*b7893ccfSSadaf Ebrahimi 
1125*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1126*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1127*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1128*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1129*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1130*b7893ccfSSadaf Ebrahimi 
1131*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1132*b7893ccfSSadaf Ebrahimi }
1133*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,DeviceFeature2AndVertexAttributeDivisorExtensionUnenabled)1134*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, DeviceFeature2AndVertexAttributeDivisorExtensionUnenabled) {
1135*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION(
1136*b7893ccfSSadaf Ebrahimi         "Test unenabled VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME & "
1137*b7893ccfSSadaf Ebrahimi         "VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME.");
1138*b7893ccfSSadaf Ebrahimi 
1139*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vadf = {};
1140*b7893ccfSSadaf Ebrahimi     vadf.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
1141*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures2 pd_features2 = {};
1142*b7893ccfSSadaf Ebrahimi     pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
1143*b7893ccfSSadaf Ebrahimi     pd_features2.pNext = &vadf;
1144*b7893ccfSSadaf Ebrahimi 
1145*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1146*b7893ccfSSadaf Ebrahimi     vk_testing::QueueCreateInfoArray queue_info(m_device->queue_props);
1147*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo device_create_info = {};
1148*b7893ccfSSadaf Ebrahimi     device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1149*b7893ccfSSadaf Ebrahimi     device_create_info.pNext = &pd_features2;
1150*b7893ccfSSadaf Ebrahimi     device_create_info.queueCreateInfoCount = queue_info.size();
1151*b7893ccfSSadaf Ebrahimi     device_create_info.pQueueCreateInfos = queue_info.data();
1152*b7893ccfSSadaf Ebrahimi     VkDevice testDevice;
1153*b7893ccfSSadaf Ebrahimi 
1154*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1155*b7893ccfSSadaf Ebrahimi                                          "VK_KHR_get_physical_device_properties2 must be enabled when it creates an instance");
1156*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1157*b7893ccfSSadaf Ebrahimi                                          "VK_EXT_vertex_attribute_divisor must be enabled when it creates a device");
1158*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Failed to create device chain");
1159*b7893ccfSSadaf Ebrahimi     vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
1160*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1161*b7893ccfSSadaf Ebrahimi }
1162*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidDeviceMask)1163*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidDeviceMask) {
1164*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Invalid deviceMask.");
1165*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
1166*b7893ccfSSadaf Ebrahimi 
1167*b7893ccfSSadaf Ebrahimi     bool support_surface = true;
1168*b7893ccfSSadaf Ebrahimi     if (!AddSurfaceInstanceExtension()) {
1169*b7893ccfSSadaf Ebrahimi         printf("%s surface extensions not supported, skipping VkAcquireNextImageInfoKHR test\n", kSkipPrefix);
1170*b7893ccfSSadaf Ebrahimi         support_surface = false;
1171*b7893ccfSSadaf Ebrahimi     }
1172*b7893ccfSSadaf Ebrahimi 
1173*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
1174*b7893ccfSSadaf Ebrahimi 
1175*b7893ccfSSadaf Ebrahimi     if (support_surface) {
1176*b7893ccfSSadaf Ebrahimi         if (!AddSwapchainDeviceExtension()) {
1177*b7893ccfSSadaf Ebrahimi             printf("%s swapchain extensions not supported, skipping BindSwapchainImageMemory test\n", kSkipPrefix);
1178*b7893ccfSSadaf Ebrahimi             support_surface = false;
1179*b7893ccfSSadaf Ebrahimi         }
1180*b7893ccfSSadaf Ebrahimi     }
1181*b7893ccfSSadaf Ebrahimi 
1182*b7893ccfSSadaf Ebrahimi     if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
1183*b7893ccfSSadaf Ebrahimi         printf("%s Device Groups requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
1184*b7893ccfSSadaf Ebrahimi         return;
1185*b7893ccfSSadaf Ebrahimi     }
1186*b7893ccfSSadaf Ebrahimi     uint32_t physical_device_group_count = 0;
1187*b7893ccfSSadaf Ebrahimi     vkEnumeratePhysicalDeviceGroups(instance(), &physical_device_group_count, nullptr);
1188*b7893ccfSSadaf Ebrahimi 
1189*b7893ccfSSadaf Ebrahimi     if (physical_device_group_count == 0) {
1190*b7893ccfSSadaf Ebrahimi         printf("%s physical_device_group_count is 0, skipping test\n", kSkipPrefix);
1191*b7893ccfSSadaf Ebrahimi         return;
1192*b7893ccfSSadaf Ebrahimi     }
1193*b7893ccfSSadaf Ebrahimi 
1194*b7893ccfSSadaf Ebrahimi     std::vector<VkPhysicalDeviceGroupProperties> physical_device_group(physical_device_group_count,
1195*b7893ccfSSadaf Ebrahimi                                                                        {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
1196*b7893ccfSSadaf Ebrahimi     vkEnumeratePhysicalDeviceGroups(instance(), &physical_device_group_count, physical_device_group.data());
1197*b7893ccfSSadaf Ebrahimi     VkDeviceGroupDeviceCreateInfo create_device_pnext = {};
1198*b7893ccfSSadaf Ebrahimi     create_device_pnext.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
1199*b7893ccfSSadaf Ebrahimi     create_device_pnext.physicalDeviceCount = physical_device_group[0].physicalDeviceCount;
1200*b7893ccfSSadaf Ebrahimi     create_device_pnext.pPhysicalDevices = physical_device_group[0].physicalDevices;
1201*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &create_device_pnext, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
1202*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1203*b7893ccfSSadaf Ebrahimi 
1204*b7893ccfSSadaf Ebrahimi     if (!InitSwapchain()) {
1205*b7893ccfSSadaf Ebrahimi         printf("%s Cannot create surface or swapchain, skipping VkAcquireNextImageInfoKHR test\n", kSkipPrefix);
1206*b7893ccfSSadaf Ebrahimi         support_surface = false;
1207*b7893ccfSSadaf Ebrahimi     }
1208*b7893ccfSSadaf Ebrahimi 
1209*b7893ccfSSadaf Ebrahimi     // Test VkMemoryAllocateFlagsInfo
1210*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateFlagsInfo alloc_flags_info = {};
1211*b7893ccfSSadaf Ebrahimi     alloc_flags_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO;
1212*b7893ccfSSadaf Ebrahimi     alloc_flags_info.flags = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT;
1213*b7893ccfSSadaf Ebrahimi     alloc_flags_info.deviceMask = 0xFFFFFFFF;
1214*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo alloc_info = {};
1215*b7893ccfSSadaf Ebrahimi     alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1216*b7893ccfSSadaf Ebrahimi     alloc_info.pNext = &alloc_flags_info;
1217*b7893ccfSSadaf Ebrahimi     alloc_info.memoryTypeIndex = 0;
1218*b7893ccfSSadaf Ebrahimi     alloc_info.allocationSize = 32;
1219*b7893ccfSSadaf Ebrahimi 
1220*b7893ccfSSadaf Ebrahimi     VkDeviceMemory mem;
1221*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675");
1222*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1223*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1224*b7893ccfSSadaf Ebrahimi 
1225*b7893ccfSSadaf Ebrahimi     alloc_flags_info.deviceMask = 0;
1226*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676");
1227*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1228*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1229*b7893ccfSSadaf Ebrahimi 
1230*b7893ccfSSadaf Ebrahimi     // Test VkDeviceGroupCommandBufferBeginInfo
1231*b7893ccfSSadaf Ebrahimi     VkDeviceGroupCommandBufferBeginInfo dev_grp_cmd_buf_info = {};
1232*b7893ccfSSadaf Ebrahimi     dev_grp_cmd_buf_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO;
1233*b7893ccfSSadaf Ebrahimi     dev_grp_cmd_buf_info.deviceMask = 0xFFFFFFFF;
1234*b7893ccfSSadaf Ebrahimi     VkCommandBufferBeginInfo cmd_buf_info = {};
1235*b7893ccfSSadaf Ebrahimi     cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1236*b7893ccfSSadaf Ebrahimi     cmd_buf_info.pNext = &dev_grp_cmd_buf_info;
1237*b7893ccfSSadaf Ebrahimi 
1238*b7893ccfSSadaf Ebrahimi     m_commandBuffer->reset();
1239*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1240*b7893ccfSSadaf Ebrahimi                                          "VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106");
1241*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(m_commandBuffer->handle(), &cmd_buf_info);
1242*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1243*b7893ccfSSadaf Ebrahimi 
1244*b7893ccfSSadaf Ebrahimi     dev_grp_cmd_buf_info.deviceMask = 0;
1245*b7893ccfSSadaf Ebrahimi     m_commandBuffer->reset();
1246*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1247*b7893ccfSSadaf Ebrahimi                                          "VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107");
1248*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(m_commandBuffer->handle(), &cmd_buf_info);
1249*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1250*b7893ccfSSadaf Ebrahimi 
1251*b7893ccfSSadaf Ebrahimi     // Test VkDeviceGroupRenderPassBeginInfo
1252*b7893ccfSSadaf Ebrahimi     dev_grp_cmd_buf_info.deviceMask = 0x00000001;
1253*b7893ccfSSadaf Ebrahimi     m_commandBuffer->reset();
1254*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(m_commandBuffer->handle(), &cmd_buf_info);
1255*b7893ccfSSadaf Ebrahimi 
1256*b7893ccfSSadaf Ebrahimi     VkDeviceGroupRenderPassBeginInfo dev_grp_rp_info = {};
1257*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO;
1258*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.deviceMask = 0xFFFFFFFF;
1259*b7893ccfSSadaf Ebrahimi     m_renderPassBeginInfo.pNext = &dev_grp_rp_info;
1260*b7893ccfSSadaf Ebrahimi 
1261*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905");
1262*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907");
1263*b7893ccfSSadaf Ebrahimi     vkCmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1264*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1265*b7893ccfSSadaf Ebrahimi 
1266*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.deviceMask = 0;
1267*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906");
1268*b7893ccfSSadaf Ebrahimi     vkCmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1269*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1270*b7893ccfSSadaf Ebrahimi 
1271*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.deviceMask = 0x00000001;
1272*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.deviceRenderAreaCount = physical_device_group[0].physicalDeviceCount + 1;
1273*b7893ccfSSadaf Ebrahimi     std::vector<VkRect2D> device_render_areas(dev_grp_rp_info.deviceRenderAreaCount, m_renderPassBeginInfo.renderArea);
1274*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.pDeviceRenderAreas = device_render_areas.data();
1275*b7893ccfSSadaf Ebrahimi 
1276*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1277*b7893ccfSSadaf Ebrahimi                                          "VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908");
1278*b7893ccfSSadaf Ebrahimi     vkCmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1279*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1280*b7893ccfSSadaf Ebrahimi 
1281*b7893ccfSSadaf Ebrahimi     // Test vkCmdSetDeviceMask()
1282*b7893ccfSSadaf Ebrahimi     vkCmdSetDeviceMask(m_commandBuffer->handle(), 0x00000001);
1283*b7893ccfSSadaf Ebrahimi 
1284*b7893ccfSSadaf Ebrahimi     dev_grp_rp_info.deviceRenderAreaCount = physical_device_group[0].physicalDeviceCount;
1285*b7893ccfSSadaf Ebrahimi     vkCmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1286*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetDeviceMask-deviceMask-00108");
1287*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetDeviceMask-deviceMask-00110");
1288*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetDeviceMask-deviceMask-00111");
1289*b7893ccfSSadaf Ebrahimi     vkCmdSetDeviceMask(m_commandBuffer->handle(), 0xFFFFFFFF);
1290*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1291*b7893ccfSSadaf Ebrahimi 
1292*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetDeviceMask-deviceMask-00109");
1293*b7893ccfSSadaf Ebrahimi     vkCmdSetDeviceMask(m_commandBuffer->handle(), 0);
1294*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1295*b7893ccfSSadaf Ebrahimi 
1296*b7893ccfSSadaf Ebrahimi     VkSemaphoreCreateInfo semaphore_create_info = {};
1297*b7893ccfSSadaf Ebrahimi     semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1298*b7893ccfSSadaf Ebrahimi     VkSemaphore semaphore;
1299*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
1300*b7893ccfSSadaf Ebrahimi     VkSemaphore semaphore2;
1301*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2));
1302*b7893ccfSSadaf Ebrahimi     VkFenceCreateInfo fence_create_info = {};
1303*b7893ccfSSadaf Ebrahimi     fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1304*b7893ccfSSadaf Ebrahimi     VkFence fence;
1305*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
1306*b7893ccfSSadaf Ebrahimi 
1307*b7893ccfSSadaf Ebrahimi     if (support_surface) {
1308*b7893ccfSSadaf Ebrahimi         // Test VkAcquireNextImageInfoKHR
1309*b7893ccfSSadaf Ebrahimi         uint32_t imageIndex = 0;
1310*b7893ccfSSadaf Ebrahimi         VkAcquireNextImageInfoKHR acquire_next_image_info = {};
1311*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.sType = VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR;
1312*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.semaphore = semaphore;
1313*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.swapchain = m_swapchain;
1314*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.fence = fence;
1315*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.deviceMask = 0xFFFFFFFF;
1316*b7893ccfSSadaf Ebrahimi 
1317*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAcquireNextImageInfoKHR-deviceMask-01290");
1318*b7893ccfSSadaf Ebrahimi         vkAcquireNextImage2KHR(m_device->device(), &acquire_next_image_info, &imageIndex);
1319*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
1320*b7893ccfSSadaf Ebrahimi 
1321*b7893ccfSSadaf Ebrahimi         vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, std::numeric_limits<int>::max());
1322*b7893ccfSSadaf Ebrahimi         vkResetFences(m_device->device(), 1, &fence);
1323*b7893ccfSSadaf Ebrahimi 
1324*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.semaphore = semaphore2;
1325*b7893ccfSSadaf Ebrahimi         acquire_next_image_info.deviceMask = 0;
1326*b7893ccfSSadaf Ebrahimi 
1327*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAcquireNextImageInfoKHR-deviceMask-01291");
1328*b7893ccfSSadaf Ebrahimi         vkAcquireNextImage2KHR(m_device->device(), &acquire_next_image_info, &imageIndex);
1329*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
1330*b7893ccfSSadaf Ebrahimi         DestroySwapchain();
1331*b7893ccfSSadaf Ebrahimi     }
1332*b7893ccfSSadaf Ebrahimi 
1333*b7893ccfSSadaf Ebrahimi     // Test VkDeviceGroupSubmitInfo
1334*b7893ccfSSadaf Ebrahimi     VkDeviceGroupSubmitInfo device_group_submit_info = {};
1335*b7893ccfSSadaf Ebrahimi     device_group_submit_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO;
1336*b7893ccfSSadaf Ebrahimi     device_group_submit_info.commandBufferCount = 1;
1337*b7893ccfSSadaf Ebrahimi     std::array<uint32_t, 1> command_buffer_device_masks = {0xFFFFFFFF};
1338*b7893ccfSSadaf Ebrahimi     device_group_submit_info.pCommandBufferDeviceMasks = command_buffer_device_masks.data();
1339*b7893ccfSSadaf Ebrahimi 
1340*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1341*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1342*b7893ccfSSadaf Ebrahimi     submit_info.pNext = &device_group_submit_info;
1343*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1344*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1345*b7893ccfSSadaf Ebrahimi 
1346*b7893ccfSSadaf Ebrahimi     m_commandBuffer->reset();
1347*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(m_commandBuffer->handle(), &cmd_buf_info);
1348*b7893ccfSSadaf Ebrahimi     vkEndCommandBuffer(m_commandBuffer->handle());
1349*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1350*b7893ccfSSadaf Ebrahimi                                          "VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086");
1351*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1352*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1353*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
1354*b7893ccfSSadaf Ebrahimi 
1355*b7893ccfSSadaf Ebrahimi     vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, std::numeric_limits<int>::max());
1356*b7893ccfSSadaf Ebrahimi     vkDestroyFence(m_device->device(), fence, nullptr);
1357*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1358*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), semaphore2, nullptr);
1359*b7893ccfSSadaf Ebrahimi }
1360*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidationCacheTestBadMerge)1361*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidationCacheTestBadMerge) {
1362*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
1363*b7893ccfSSadaf Ebrahimi     if (DeviceExtensionSupported(gpu(), "VK_LAYER_LUNARG_core_validation", VK_EXT_VALIDATION_CACHE_EXTENSION_NAME)) {
1364*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_VALIDATION_CACHE_EXTENSION_NAME);
1365*b7893ccfSSadaf Ebrahimi     } else {
1366*b7893ccfSSadaf Ebrahimi         printf("%s %s not supported, skipping test\n", kSkipPrefix, VK_EXT_VALIDATION_CACHE_EXTENSION_NAME);
1367*b7893ccfSSadaf Ebrahimi         return;
1368*b7893ccfSSadaf Ebrahimi     }
1369*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
1370*b7893ccfSSadaf Ebrahimi 
1371*b7893ccfSSadaf Ebrahimi     // Load extension functions
1372*b7893ccfSSadaf Ebrahimi     auto fpCreateValidationCache =
1373*b7893ccfSSadaf Ebrahimi         (PFN_vkCreateValidationCacheEXT)vkGetDeviceProcAddr(m_device->device(), "vkCreateValidationCacheEXT");
1374*b7893ccfSSadaf Ebrahimi     auto fpDestroyValidationCache =
1375*b7893ccfSSadaf Ebrahimi         (PFN_vkDestroyValidationCacheEXT)vkGetDeviceProcAddr(m_device->device(), "vkDestroyValidationCacheEXT");
1376*b7893ccfSSadaf Ebrahimi     auto fpMergeValidationCaches =
1377*b7893ccfSSadaf Ebrahimi         (PFN_vkMergeValidationCachesEXT)vkGetDeviceProcAddr(m_device->device(), "vkMergeValidationCachesEXT");
1378*b7893ccfSSadaf Ebrahimi     if (!fpCreateValidationCache || !fpDestroyValidationCache || !fpMergeValidationCaches) {
1379*b7893ccfSSadaf Ebrahimi         printf("%s Failed to load function pointers for %s\n", kSkipPrefix, VK_EXT_VALIDATION_CACHE_EXTENSION_NAME);
1380*b7893ccfSSadaf Ebrahimi         return;
1381*b7893ccfSSadaf Ebrahimi     }
1382*b7893ccfSSadaf Ebrahimi 
1383*b7893ccfSSadaf Ebrahimi     VkValidationCacheCreateInfoEXT validationCacheCreateInfo;
1384*b7893ccfSSadaf Ebrahimi     validationCacheCreateInfo.sType = VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT;
1385*b7893ccfSSadaf Ebrahimi     validationCacheCreateInfo.pNext = NULL;
1386*b7893ccfSSadaf Ebrahimi     validationCacheCreateInfo.initialDataSize = 0;
1387*b7893ccfSSadaf Ebrahimi     validationCacheCreateInfo.pInitialData = NULL;
1388*b7893ccfSSadaf Ebrahimi     validationCacheCreateInfo.flags = 0;
1389*b7893ccfSSadaf Ebrahimi     VkValidationCacheEXT validationCache = VK_NULL_HANDLE;
1390*b7893ccfSSadaf Ebrahimi     VkResult res = fpCreateValidationCache(m_device->device(), &validationCacheCreateInfo, nullptr, &validationCache);
1391*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(res);
1392*b7893ccfSSadaf Ebrahimi 
1393*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkMergeValidationCachesEXT-dstCache-01536");
1394*b7893ccfSSadaf Ebrahimi     res = fpMergeValidationCaches(m_device->device(), validationCache, 1, &validationCache);
1395*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1396*b7893ccfSSadaf Ebrahimi 
1397*b7893ccfSSadaf Ebrahimi     fpDestroyValidationCache(m_device->device(), validationCache, nullptr);
1398*b7893ccfSSadaf Ebrahimi }
1399*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidQueueFamilyIndex)1400*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
1401*b7893ccfSSadaf Ebrahimi     // Miscellaneous queueFamilyIndex validation tests
1402*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1403*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1404*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo buffCI = {};
1405*b7893ccfSSadaf Ebrahimi     buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1406*b7893ccfSSadaf Ebrahimi     buffCI.size = 1024;
1407*b7893ccfSSadaf Ebrahimi     buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
1408*b7893ccfSSadaf Ebrahimi     buffCI.queueFamilyIndexCount = 2;
1409*b7893ccfSSadaf Ebrahimi     // Introduce failure by specifying invalid queue_family_index
1410*b7893ccfSSadaf Ebrahimi     uint32_t qfi[2];
1411*b7893ccfSSadaf Ebrahimi     qfi[0] = 777;
1412*b7893ccfSSadaf Ebrahimi     qfi[1] = 0;
1413*b7893ccfSSadaf Ebrahimi 
1414*b7893ccfSSadaf Ebrahimi     buffCI.pQueueFamilyIndices = qfi;
1415*b7893ccfSSadaf Ebrahimi     buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT;  // qfi only matters in CONCURRENT mode
1416*b7893ccfSSadaf Ebrahimi 
1417*b7893ccfSSadaf Ebrahimi     // Test for queue family index out of range
1418*b7893ccfSSadaf Ebrahimi     CreateBufferTest(*this, &buffCI, "VUID-VkBufferCreateInfo-sharingMode-01419");
1419*b7893ccfSSadaf Ebrahimi 
1420*b7893ccfSSadaf Ebrahimi     // Test for non-unique QFI in array
1421*b7893ccfSSadaf Ebrahimi     qfi[0] = 0;
1422*b7893ccfSSadaf Ebrahimi     CreateBufferTest(*this, &buffCI, "VUID-VkBufferCreateInfo-sharingMode-01419");
1423*b7893ccfSSadaf Ebrahimi 
1424*b7893ccfSSadaf Ebrahimi     if (m_device->queue_props.size() > 2) {
1425*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
1426*b7893ccfSSadaf Ebrahimi 
1427*b7893ccfSSadaf Ebrahimi         // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
1428*b7893ccfSSadaf Ebrahimi         buffCI.queueFamilyIndexCount = 2;
1429*b7893ccfSSadaf Ebrahimi         qfi[0] = 1;
1430*b7893ccfSSadaf Ebrahimi         qfi[1] = 2;
1431*b7893ccfSSadaf Ebrahimi         VkBufferObj ib;
1432*b7893ccfSSadaf Ebrahimi         ib.init(*m_device, buffCI);
1433*b7893ccfSSadaf Ebrahimi 
1434*b7893ccfSSadaf Ebrahimi         m_commandBuffer->begin();
1435*b7893ccfSSadaf Ebrahimi         vkCmdFillBuffer(m_commandBuffer->handle(), ib.handle(), 0, 16, 5);
1436*b7893ccfSSadaf Ebrahimi         m_commandBuffer->end();
1437*b7893ccfSSadaf Ebrahimi         m_commandBuffer->QueueCommandBuffer(false);
1438*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
1439*b7893ccfSSadaf Ebrahimi     }
1440*b7893ccfSSadaf Ebrahimi }
1441*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InvalidQueryPoolCreate)1442*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
1443*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
1444*b7893ccfSSadaf Ebrahimi 
1445*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1446*b7893ccfSSadaf Ebrahimi 
1447*b7893ccfSSadaf Ebrahimi     vk_testing::QueueCreateInfoArray queue_info(m_device->queue_props);
1448*b7893ccfSSadaf Ebrahimi 
1449*b7893ccfSSadaf Ebrahimi     VkDevice local_device;
1450*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo device_create_info = {};
1451*b7893ccfSSadaf Ebrahimi     auto features = m_device->phy().features();
1452*b7893ccfSSadaf Ebrahimi     // Intentionally disable pipeline stats
1453*b7893ccfSSadaf Ebrahimi     features.pipelineStatisticsQuery = VK_FALSE;
1454*b7893ccfSSadaf Ebrahimi     device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1455*b7893ccfSSadaf Ebrahimi     device_create_info.pNext = NULL;
1456*b7893ccfSSadaf Ebrahimi     device_create_info.queueCreateInfoCount = queue_info.size();
1457*b7893ccfSSadaf Ebrahimi     device_create_info.pQueueCreateInfos = queue_info.data();
1458*b7893ccfSSadaf Ebrahimi     device_create_info.enabledLayerCount = 0;
1459*b7893ccfSSadaf Ebrahimi     device_create_info.ppEnabledLayerNames = NULL;
1460*b7893ccfSSadaf Ebrahimi     device_create_info.pEnabledFeatures = &features;
1461*b7893ccfSSadaf Ebrahimi     VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
1462*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1463*b7893ccfSSadaf Ebrahimi 
1464*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo qpci{};
1465*b7893ccfSSadaf Ebrahimi     qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1466*b7893ccfSSadaf Ebrahimi     qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
1467*b7893ccfSSadaf Ebrahimi     qpci.queryCount = 1;
1468*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
1469*b7893ccfSSadaf Ebrahimi 
1470*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkQueryPoolCreateInfo-queryType-00791");
1471*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
1472*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1473*b7893ccfSSadaf Ebrahimi 
1474*b7893ccfSSadaf Ebrahimi     vkDestroyDevice(local_device, nullptr);
1475*b7893ccfSSadaf Ebrahimi }
1476*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,UnclosedQuery)1477*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, UnclosedQuery) {
1478*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("End a command buffer with a query still in progress.");
1479*b7893ccfSSadaf Ebrahimi 
1480*b7893ccfSSadaf Ebrahimi     const char *invalid_query = "VUID-vkEndCommandBuffer-commandBuffer-00061";
1481*b7893ccfSSadaf Ebrahimi 
1482*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1483*b7893ccfSSadaf Ebrahimi 
1484*b7893ccfSSadaf Ebrahimi     VkEvent event;
1485*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_create_info{};
1486*b7893ccfSSadaf Ebrahimi     event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1487*b7893ccfSSadaf Ebrahimi     vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
1488*b7893ccfSSadaf Ebrahimi 
1489*b7893ccfSSadaf Ebrahimi     VkQueue queue = VK_NULL_HANDLE;
1490*b7893ccfSSadaf Ebrahimi     vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
1491*b7893ccfSSadaf Ebrahimi 
1492*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1493*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
1494*b7893ccfSSadaf Ebrahimi 
1495*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
1496*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info = {};
1497*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1498*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
1499*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
1500*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
1501*b7893ccfSSadaf Ebrahimi 
1502*b7893ccfSSadaf Ebrahimi     vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
1503*b7893ccfSSadaf Ebrahimi     vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
1504*b7893ccfSSadaf Ebrahimi 
1505*b7893ccfSSadaf Ebrahimi     vkEndCommandBuffer(m_commandBuffer->handle());
1506*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1507*b7893ccfSSadaf Ebrahimi 
1508*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
1509*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(m_device->device(), event, nullptr);
1510*b7893ccfSSadaf Ebrahimi }
1511*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,QueryPreciseBit)1512*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, QueryPreciseBit) {
1513*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Check for correct Query Precise Bit circumstances.");
1514*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1515*b7893ccfSSadaf Ebrahimi 
1516*b7893ccfSSadaf Ebrahimi     // These tests require that the device support pipeline statistics query
1517*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures device_features = {};
1518*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1519*b7893ccfSSadaf Ebrahimi     if (VK_TRUE != device_features.pipelineStatisticsQuery) {
1520*b7893ccfSSadaf Ebrahimi         printf("%s Test requires unsupported pipelineStatisticsQuery feature. Skipped.\n", kSkipPrefix);
1521*b7893ccfSSadaf Ebrahimi         return;
1522*b7893ccfSSadaf Ebrahimi     }
1523*b7893ccfSSadaf Ebrahimi 
1524*b7893ccfSSadaf Ebrahimi     std::vector<const char *> device_extension_names;
1525*b7893ccfSSadaf Ebrahimi     auto features = m_device->phy().features();
1526*b7893ccfSSadaf Ebrahimi 
1527*b7893ccfSSadaf Ebrahimi     // Test for precise bit when query type is not OCCLUSION
1528*b7893ccfSSadaf Ebrahimi     if (features.occlusionQueryPrecise) {
1529*b7893ccfSSadaf Ebrahimi         VkEvent event;
1530*b7893ccfSSadaf Ebrahimi         VkEventCreateInfo event_create_info{};
1531*b7893ccfSSadaf Ebrahimi         event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1532*b7893ccfSSadaf Ebrahimi         vkCreateEvent(m_device->handle(), &event_create_info, nullptr, &event);
1533*b7893ccfSSadaf Ebrahimi 
1534*b7893ccfSSadaf Ebrahimi         m_commandBuffer->begin();
1535*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBeginQuery-queryType-00800");
1536*b7893ccfSSadaf Ebrahimi 
1537*b7893ccfSSadaf Ebrahimi         VkQueryPool query_pool;
1538*b7893ccfSSadaf Ebrahimi         VkQueryPoolCreateInfo query_pool_create_info = {};
1539*b7893ccfSSadaf Ebrahimi         query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1540*b7893ccfSSadaf Ebrahimi         query_pool_create_info.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
1541*b7893ccfSSadaf Ebrahimi         query_pool_create_info.queryCount = 1;
1542*b7893ccfSSadaf Ebrahimi         vkCreateQueryPool(m_device->handle(), &query_pool_create_info, nullptr, &query_pool);
1543*b7893ccfSSadaf Ebrahimi 
1544*b7893ccfSSadaf Ebrahimi         vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
1545*b7893ccfSSadaf Ebrahimi         vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, VK_QUERY_CONTROL_PRECISE_BIT);
1546*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
1547*b7893ccfSSadaf Ebrahimi 
1548*b7893ccfSSadaf Ebrahimi         m_commandBuffer->end();
1549*b7893ccfSSadaf Ebrahimi         vkDestroyQueryPool(m_device->handle(), query_pool, nullptr);
1550*b7893ccfSSadaf Ebrahimi         vkDestroyEvent(m_device->handle(), event, nullptr);
1551*b7893ccfSSadaf Ebrahimi     }
1552*b7893ccfSSadaf Ebrahimi 
1553*b7893ccfSSadaf Ebrahimi     // Test for precise bit when precise feature is not available
1554*b7893ccfSSadaf Ebrahimi     features.occlusionQueryPrecise = false;
1555*b7893ccfSSadaf Ebrahimi     VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1556*b7893ccfSSadaf Ebrahimi 
1557*b7893ccfSSadaf Ebrahimi     VkCommandPoolCreateInfo pool_create_info{};
1558*b7893ccfSSadaf Ebrahimi     pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1559*b7893ccfSSadaf Ebrahimi     pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
1560*b7893ccfSSadaf Ebrahimi 
1561*b7893ccfSSadaf Ebrahimi     VkCommandPool command_pool;
1562*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
1563*b7893ccfSSadaf Ebrahimi 
1564*b7893ccfSSadaf Ebrahimi     VkCommandBufferAllocateInfo cmd = {};
1565*b7893ccfSSadaf Ebrahimi     cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1566*b7893ccfSSadaf Ebrahimi     cmd.pNext = NULL;
1567*b7893ccfSSadaf Ebrahimi     cmd.commandPool = command_pool;
1568*b7893ccfSSadaf Ebrahimi     cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1569*b7893ccfSSadaf Ebrahimi     cmd.commandBufferCount = 1;
1570*b7893ccfSSadaf Ebrahimi 
1571*b7893ccfSSadaf Ebrahimi     VkCommandBuffer cmd_buffer;
1572*b7893ccfSSadaf Ebrahimi     VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
1573*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1574*b7893ccfSSadaf Ebrahimi 
1575*b7893ccfSSadaf Ebrahimi     VkEvent event;
1576*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_create_info{};
1577*b7893ccfSSadaf Ebrahimi     event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1578*b7893ccfSSadaf Ebrahimi     vkCreateEvent(test_device.handle(), &event_create_info, nullptr, &event);
1579*b7893ccfSSadaf Ebrahimi 
1580*b7893ccfSSadaf Ebrahimi     VkCommandBufferBeginInfo begin_info = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
1581*b7893ccfSSadaf Ebrahimi                                            VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, nullptr};
1582*b7893ccfSSadaf Ebrahimi 
1583*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(cmd_buffer, &begin_info);
1584*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBeginQuery-queryType-00800");
1585*b7893ccfSSadaf Ebrahimi 
1586*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
1587*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info = {};
1588*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1589*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
1590*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
1591*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(test_device.handle(), &query_pool_create_info, nullptr, &query_pool);
1592*b7893ccfSSadaf Ebrahimi 
1593*b7893ccfSSadaf Ebrahimi     vkCmdResetQueryPool(cmd_buffer, query_pool, 0, 1);
1594*b7893ccfSSadaf Ebrahimi     vkCmdBeginQuery(cmd_buffer, query_pool, 0, VK_QUERY_CONTROL_PRECISE_BIT);
1595*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1596*b7893ccfSSadaf Ebrahimi 
1597*b7893ccfSSadaf Ebrahimi     vkEndCommandBuffer(cmd_buffer);
1598*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(test_device.handle(), query_pool, nullptr);
1599*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(test_device.handle(), event, nullptr);
1600*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(test_device.handle(), command_pool, nullptr);
1601*b7893ccfSSadaf Ebrahimi }
1602*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,StageMaskGsTsEnabled)1603*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
1604*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION(
1605*b7893ccfSSadaf Ebrahimi         "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are disabled on the "
1606*b7893ccfSSadaf Ebrahimi         "device.");
1607*b7893ccfSSadaf Ebrahimi 
1608*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1609*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1610*b7893ccfSSadaf Ebrahimi 
1611*b7893ccfSSadaf Ebrahimi     std::vector<const char *> device_extension_names;
1612*b7893ccfSSadaf Ebrahimi     auto features = m_device->phy().features();
1613*b7893ccfSSadaf Ebrahimi     // Make sure gs & ts are disabled
1614*b7893ccfSSadaf Ebrahimi     features.geometryShader = false;
1615*b7893ccfSSadaf Ebrahimi     features.tessellationShader = false;
1616*b7893ccfSSadaf Ebrahimi     // The sacrificial device object
1617*b7893ccfSSadaf Ebrahimi     VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1618*b7893ccfSSadaf Ebrahimi 
1619*b7893ccfSSadaf Ebrahimi     VkCommandPoolCreateInfo pool_create_info{};
1620*b7893ccfSSadaf Ebrahimi     pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1621*b7893ccfSSadaf Ebrahimi     pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
1622*b7893ccfSSadaf Ebrahimi 
1623*b7893ccfSSadaf Ebrahimi     VkCommandPool command_pool;
1624*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
1625*b7893ccfSSadaf Ebrahimi 
1626*b7893ccfSSadaf Ebrahimi     VkCommandBufferAllocateInfo cmd = {};
1627*b7893ccfSSadaf Ebrahimi     cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1628*b7893ccfSSadaf Ebrahimi     cmd.pNext = NULL;
1629*b7893ccfSSadaf Ebrahimi     cmd.commandPool = command_pool;
1630*b7893ccfSSadaf Ebrahimi     cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
1631*b7893ccfSSadaf Ebrahimi     cmd.commandBufferCount = 1;
1632*b7893ccfSSadaf Ebrahimi 
1633*b7893ccfSSadaf Ebrahimi     VkCommandBuffer cmd_buffer;
1634*b7893ccfSSadaf Ebrahimi     VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
1635*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1636*b7893ccfSSadaf Ebrahimi 
1637*b7893ccfSSadaf Ebrahimi     VkEvent event;
1638*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo evci = {};
1639*b7893ccfSSadaf Ebrahimi     evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1640*b7893ccfSSadaf Ebrahimi     VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
1641*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(result);
1642*b7893ccfSSadaf Ebrahimi 
1643*b7893ccfSSadaf Ebrahimi     VkCommandBufferBeginInfo cbbi = {};
1644*b7893ccfSSadaf Ebrahimi     cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1645*b7893ccfSSadaf Ebrahimi     vkBeginCommandBuffer(cmd_buffer, &cbbi);
1646*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetEvent-stageMask-01150");
1647*b7893ccfSSadaf Ebrahimi     vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
1648*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1649*b7893ccfSSadaf Ebrahimi 
1650*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetEvent-stageMask-01151");
1651*b7893ccfSSadaf Ebrahimi     vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
1652*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1653*b7893ccfSSadaf Ebrahimi 
1654*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(test_device.handle(), event, NULL);
1655*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
1656*b7893ccfSSadaf Ebrahimi }
1657*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,DescriptorPoolInUseDestroyedSignaled)1658*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
1659*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
1660*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1661*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitViewport());
1662*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1663*b7893ccfSSadaf Ebrahimi 
1664*b7893ccfSSadaf Ebrahimi     // Create image to update the descriptor with
1665*b7893ccfSSadaf Ebrahimi     VkImageObj image(m_device);
1666*b7893ccfSSadaf Ebrahimi     image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1667*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(image.initialized());
1668*b7893ccfSSadaf Ebrahimi 
1669*b7893ccfSSadaf Ebrahimi     VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
1670*b7893ccfSSadaf Ebrahimi     // Create Sampler
1671*b7893ccfSSadaf Ebrahimi     VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
1672*b7893ccfSSadaf Ebrahimi     VkSampler sampler;
1673*b7893ccfSSadaf Ebrahimi     VkResult err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
1674*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1675*b7893ccfSSadaf Ebrahimi 
1676*b7893ccfSSadaf Ebrahimi     // Create PSO to be used for draw-time errors below
1677*b7893ccfSSadaf Ebrahimi     VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1678*b7893ccfSSadaf Ebrahimi 
1679*b7893ccfSSadaf Ebrahimi     CreatePipelineHelper pipe(*this);
1680*b7893ccfSSadaf Ebrahimi     pipe.InitInfo();
1681*b7893ccfSSadaf Ebrahimi     pipe.shader_stages_ = {pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
1682*b7893ccfSSadaf Ebrahimi     pipe.dsl_bindings_ = {
1683*b7893ccfSSadaf Ebrahimi         {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
1684*b7893ccfSSadaf Ebrahimi     };
1685*b7893ccfSSadaf Ebrahimi     const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
1686*b7893ccfSSadaf Ebrahimi     VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
1687*b7893ccfSSadaf Ebrahimi     dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
1688*b7893ccfSSadaf Ebrahimi     dyn_state_ci.dynamicStateCount = size(dyn_states);
1689*b7893ccfSSadaf Ebrahimi     dyn_state_ci.pDynamicStates = dyn_states;
1690*b7893ccfSSadaf Ebrahimi     pipe.dyn_state_ci_ = dyn_state_ci;
1691*b7893ccfSSadaf Ebrahimi     pipe.InitState();
1692*b7893ccfSSadaf Ebrahimi     pipe.CreateGraphicsPipeline();
1693*b7893ccfSSadaf Ebrahimi 
1694*b7893ccfSSadaf Ebrahimi     // Update descriptor with image and sampler
1695*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->WriteDescriptorImageInfo(0, view, sampler, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
1696*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->UpdateDescriptorSets();
1697*b7893ccfSSadaf Ebrahimi 
1698*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1699*b7893ccfSSadaf Ebrahimi     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1700*b7893ccfSSadaf Ebrahimi     vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
1701*b7893ccfSSadaf Ebrahimi     vkCmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
1702*b7893ccfSSadaf Ebrahimi                             &pipe.descriptor_set_->set_, 0, NULL);
1703*b7893ccfSSadaf Ebrahimi 
1704*b7893ccfSSadaf Ebrahimi     VkViewport viewport = {0, 0, 16, 16, 0, 1};
1705*b7893ccfSSadaf Ebrahimi     VkRect2D scissor = {{0, 0}, {16, 16}};
1706*b7893ccfSSadaf Ebrahimi     vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
1707*b7893ccfSSadaf Ebrahimi     vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
1708*b7893ccfSSadaf Ebrahimi 
1709*b7893ccfSSadaf Ebrahimi     m_commandBuffer->Draw(1, 0, 0, 0);
1710*b7893ccfSSadaf Ebrahimi     m_commandBuffer->EndRenderPass();
1711*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1712*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer to put pool in-flight
1713*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1714*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1715*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1716*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1717*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1718*b7893ccfSSadaf Ebrahimi     // Destroy pool while in-flight, causing error
1719*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyDescriptorPool-descriptorPool-00303");
1720*b7893ccfSSadaf Ebrahimi     vkDestroyDescriptorPool(m_device->device(), pipe.descriptor_set_->pool_, NULL);
1721*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1722*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
1723*b7893ccfSSadaf Ebrahimi     // Cleanup
1724*b7893ccfSSadaf Ebrahimi     vkDestroySampler(m_device->device(), sampler, NULL);
1725*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError(
1726*b7893ccfSSadaf Ebrahimi         "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
1727*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
1728*b7893ccfSSadaf Ebrahimi     // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
1729*b7893ccfSSadaf Ebrahimi }
1730*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,FramebufferInUseDestroyedSignaled)1731*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
1732*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use framebuffer.");
1733*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1734*b7893ccfSSadaf Ebrahimi     VkFormatProperties format_properties;
1735*b7893ccfSSadaf Ebrahimi     VkResult err = VK_SUCCESS;
1736*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
1737*b7893ccfSSadaf Ebrahimi 
1738*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1739*b7893ccfSSadaf Ebrahimi 
1740*b7893ccfSSadaf Ebrahimi     VkImageObj image(m_device);
1741*b7893ccfSSadaf Ebrahimi     image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1742*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(image.initialized());
1743*b7893ccfSSadaf Ebrahimi     VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
1744*b7893ccfSSadaf Ebrahimi 
1745*b7893ccfSSadaf Ebrahimi     VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
1746*b7893ccfSSadaf Ebrahimi     VkFramebuffer fb;
1747*b7893ccfSSadaf Ebrahimi     err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
1748*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1749*b7893ccfSSadaf Ebrahimi 
1750*b7893ccfSSadaf Ebrahimi     // Just use default renderpass with our framebuffer
1751*b7893ccfSSadaf Ebrahimi     m_renderPassBeginInfo.framebuffer = fb;
1752*b7893ccfSSadaf Ebrahimi     // Create Null cmd buffer for submit
1753*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1754*b7893ccfSSadaf Ebrahimi     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1755*b7893ccfSSadaf Ebrahimi     m_commandBuffer->EndRenderPass();
1756*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1757*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer to put it in-flight
1758*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1759*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1760*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1761*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1762*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1763*b7893ccfSSadaf Ebrahimi     // Destroy framebuffer while in-flight
1764*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyFramebuffer-framebuffer-00892");
1765*b7893ccfSSadaf Ebrahimi     vkDestroyFramebuffer(m_device->device(), fb, NULL);
1766*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1767*b7893ccfSSadaf Ebrahimi     // Wait for queue to complete so we can safely destroy everything
1768*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
1769*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
1770*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
1771*b7893ccfSSadaf Ebrahimi     vkDestroyFramebuffer(m_device->device(), fb, nullptr);
1772*b7893ccfSSadaf Ebrahimi }
1773*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,FramebufferImageInUseDestroyedSignaled)1774*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
1775*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
1776*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1777*b7893ccfSSadaf Ebrahimi     VkFormatProperties format_properties;
1778*b7893ccfSSadaf Ebrahimi     VkResult err = VK_SUCCESS;
1779*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
1780*b7893ccfSSadaf Ebrahimi 
1781*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1782*b7893ccfSSadaf Ebrahimi 
1783*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo image_ci = {};
1784*b7893ccfSSadaf Ebrahimi     image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1785*b7893ccfSSadaf Ebrahimi     image_ci.pNext = NULL;
1786*b7893ccfSSadaf Ebrahimi     image_ci.imageType = VK_IMAGE_TYPE_2D;
1787*b7893ccfSSadaf Ebrahimi     image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
1788*b7893ccfSSadaf Ebrahimi     image_ci.extent.width = 256;
1789*b7893ccfSSadaf Ebrahimi     image_ci.extent.height = 256;
1790*b7893ccfSSadaf Ebrahimi     image_ci.extent.depth = 1;
1791*b7893ccfSSadaf Ebrahimi     image_ci.mipLevels = 1;
1792*b7893ccfSSadaf Ebrahimi     image_ci.arrayLayers = 1;
1793*b7893ccfSSadaf Ebrahimi     image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
1794*b7893ccfSSadaf Ebrahimi     image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1795*b7893ccfSSadaf Ebrahimi     image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
1796*b7893ccfSSadaf Ebrahimi     image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1797*b7893ccfSSadaf Ebrahimi     image_ci.flags = 0;
1798*b7893ccfSSadaf Ebrahimi     VkImageObj image(m_device);
1799*b7893ccfSSadaf Ebrahimi     image.init(&image_ci);
1800*b7893ccfSSadaf Ebrahimi 
1801*b7893ccfSSadaf Ebrahimi     VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
1802*b7893ccfSSadaf Ebrahimi 
1803*b7893ccfSSadaf Ebrahimi     VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
1804*b7893ccfSSadaf Ebrahimi     VkFramebuffer fb;
1805*b7893ccfSSadaf Ebrahimi     err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
1806*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
1807*b7893ccfSSadaf Ebrahimi 
1808*b7893ccfSSadaf Ebrahimi     // Just use default renderpass with our framebuffer
1809*b7893ccfSSadaf Ebrahimi     m_renderPassBeginInfo.framebuffer = fb;
1810*b7893ccfSSadaf Ebrahimi     // Create Null cmd buffer for submit
1811*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1812*b7893ccfSSadaf Ebrahimi     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1813*b7893ccfSSadaf Ebrahimi     m_commandBuffer->EndRenderPass();
1814*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1815*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer to put it (and attached imageView) in-flight
1816*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1817*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1818*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1819*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1820*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer to put framebuffer and children in-flight
1821*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1822*b7893ccfSSadaf Ebrahimi     // Destroy image attached to framebuffer while in-flight
1823*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyImage-image-01000");
1824*b7893ccfSSadaf Ebrahimi     vkDestroyImage(m_device->device(), image.handle(), NULL);
1825*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1826*b7893ccfSSadaf Ebrahimi     // Wait for queue to complete so we can safely destroy image and other objects
1827*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
1828*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
1829*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
1830*b7893ccfSSadaf Ebrahimi     vkDestroyFramebuffer(m_device->device(), fb, nullptr);
1831*b7893ccfSSadaf Ebrahimi }
1832*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,EventInUseDestroyedSignaled)1833*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
1834*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1835*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1836*b7893ccfSSadaf Ebrahimi 
1837*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1838*b7893ccfSSadaf Ebrahimi 
1839*b7893ccfSSadaf Ebrahimi     VkEvent event;
1840*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_create_info = {};
1841*b7893ccfSSadaf Ebrahimi     event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1842*b7893ccfSSadaf Ebrahimi     vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
1843*b7893ccfSSadaf Ebrahimi     vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
1844*b7893ccfSSadaf Ebrahimi 
1845*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1846*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(m_device->device(), event, nullptr);
1847*b7893ccfSSadaf Ebrahimi 
1848*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1849*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1850*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1851*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1852*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
1853*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1854*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1855*b7893ccfSSadaf Ebrahimi }
1856*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,InUseDestroyedSignaled)1857*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, InUseDestroyedSignaled) {
1858*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION(
1859*b7893ccfSSadaf Ebrahimi         "Use vkCmdExecuteCommands with invalid state in primary and secondary command buffers. Delete objects that are in use. "
1860*b7893ccfSSadaf Ebrahimi         "Call VkQueueSubmit with an event that has been deleted.");
1861*b7893ccfSSadaf Ebrahimi 
1862*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1863*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1864*b7893ccfSSadaf Ebrahimi 
1865*b7893ccfSSadaf Ebrahimi     m_errorMonitor->ExpectSuccess();
1866*b7893ccfSSadaf Ebrahimi 
1867*b7893ccfSSadaf Ebrahimi     VkSemaphoreCreateInfo semaphore_create_info = {};
1868*b7893ccfSSadaf Ebrahimi     semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1869*b7893ccfSSadaf Ebrahimi     VkSemaphore semaphore;
1870*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
1871*b7893ccfSSadaf Ebrahimi     VkFenceCreateInfo fence_create_info = {};
1872*b7893ccfSSadaf Ebrahimi     fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1873*b7893ccfSSadaf Ebrahimi     VkFence fence;
1874*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
1875*b7893ccfSSadaf Ebrahimi 
1876*b7893ccfSSadaf Ebrahimi     VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
1877*b7893ccfSSadaf Ebrahimi 
1878*b7893ccfSSadaf Ebrahimi     CreatePipelineHelper pipe(*this);
1879*b7893ccfSSadaf Ebrahimi     pipe.InitInfo();
1880*b7893ccfSSadaf Ebrahimi     pipe.InitState();
1881*b7893ccfSSadaf Ebrahimi     pipe.CreateGraphicsPipeline();
1882*b7893ccfSSadaf Ebrahimi 
1883*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_test.GetBuffer(), 1024, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
1884*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->UpdateDescriptorSets();
1885*b7893ccfSSadaf Ebrahimi 
1886*b7893ccfSSadaf Ebrahimi     VkEvent event;
1887*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_create_info = {};
1888*b7893ccfSSadaf Ebrahimi     event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1889*b7893ccfSSadaf Ebrahimi     vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
1890*b7893ccfSSadaf Ebrahimi 
1891*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1892*b7893ccfSSadaf Ebrahimi 
1893*b7893ccfSSadaf Ebrahimi     vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
1894*b7893ccfSSadaf Ebrahimi 
1895*b7893ccfSSadaf Ebrahimi     vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
1896*b7893ccfSSadaf Ebrahimi     vkCmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
1897*b7893ccfSSadaf Ebrahimi                             &pipe.descriptor_set_->set_, 0, NULL);
1898*b7893ccfSSadaf Ebrahimi 
1899*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1900*b7893ccfSSadaf Ebrahimi 
1901*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1902*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1903*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1904*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1905*b7893ccfSSadaf Ebrahimi     submit_info.signalSemaphoreCount = 1;
1906*b7893ccfSSadaf Ebrahimi     submit_info.pSignalSemaphores = &semaphore;
1907*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
1908*b7893ccfSSadaf Ebrahimi     m_errorMonitor->Reset();  // resume logmsg processing
1909*b7893ccfSSadaf Ebrahimi 
1910*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyEvent-event-01145");
1911*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(m_device->device(), event, nullptr);
1912*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1913*b7893ccfSSadaf Ebrahimi 
1914*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroySemaphore-semaphore-01137");
1915*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1916*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1917*b7893ccfSSadaf Ebrahimi 
1918*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyFence-fence-01120");
1919*b7893ccfSSadaf Ebrahimi     vkDestroyFence(m_device->device(), fence, nullptr);
1920*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1921*b7893ccfSSadaf Ebrahimi 
1922*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
1923*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
1924*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
1925*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), semaphore, nullptr);
1926*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
1927*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
1928*b7893ccfSSadaf Ebrahimi     vkDestroyFence(m_device->device(), fence, nullptr);
1929*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
1930*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
1931*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(m_device->device(), event, nullptr);
1932*b7893ccfSSadaf Ebrahimi }
1933*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,QueryPoolPartialTimestamp)1934*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, QueryPoolPartialTimestamp) {
1935*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Request partial result on timestamp query.");
1936*b7893ccfSSadaf Ebrahimi 
1937*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1938*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1939*b7893ccfSSadaf Ebrahimi 
1940*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
1941*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_ci{};
1942*b7893ccfSSadaf Ebrahimi     query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1943*b7893ccfSSadaf Ebrahimi     query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
1944*b7893ccfSSadaf Ebrahimi     query_pool_ci.queryCount = 1;
1945*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
1946*b7893ccfSSadaf Ebrahimi 
1947*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1948*b7893ccfSSadaf Ebrahimi     vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
1949*b7893ccfSSadaf Ebrahimi     vkCmdWriteTimestamp(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, query_pool, 0);
1950*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1951*b7893ccfSSadaf Ebrahimi 
1952*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer and wait for it.
1953*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1954*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1955*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1956*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1957*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1958*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
1959*b7893ccfSSadaf Ebrahimi 
1960*b7893ccfSSadaf Ebrahimi     // Attempt to obtain partial results.
1961*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkGetQueryPoolResults-queryType-00818");
1962*b7893ccfSSadaf Ebrahimi     uint32_t data_space[16];
1963*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Cannot get query results on queryPool");
1964*b7893ccfSSadaf Ebrahimi     vkGetQueryPoolResults(m_device->handle(), query_pool, 0, 1, sizeof(data_space), &data_space, sizeof(uint32_t),
1965*b7893ccfSSadaf Ebrahimi                           VK_QUERY_RESULT_PARTIAL_BIT);
1966*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
1967*b7893ccfSSadaf Ebrahimi 
1968*b7893ccfSSadaf Ebrahimi     // Destroy query pool.
1969*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
1970*b7893ccfSSadaf Ebrahimi }
1971*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,QueryPoolInUseDestroyedSignaled)1972*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
1973*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use query pool.");
1974*b7893ccfSSadaf Ebrahimi 
1975*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
1976*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1977*b7893ccfSSadaf Ebrahimi 
1978*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
1979*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_ci{};
1980*b7893ccfSSadaf Ebrahimi     query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
1981*b7893ccfSSadaf Ebrahimi     query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
1982*b7893ccfSSadaf Ebrahimi     query_pool_ci.queryCount = 1;
1983*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
1984*b7893ccfSSadaf Ebrahimi 
1985*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
1986*b7893ccfSSadaf Ebrahimi     // Use query pool to create binding with cmd buffer
1987*b7893ccfSSadaf Ebrahimi     vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
1988*b7893ccfSSadaf Ebrahimi     vkCmdWriteTimestamp(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, query_pool, 0);
1989*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
1990*b7893ccfSSadaf Ebrahimi 
1991*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer and then destroy query pool while in-flight
1992*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
1993*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1994*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
1995*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
1996*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1997*b7893ccfSSadaf Ebrahimi 
1998*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyQueryPool-queryPool-00793");
1999*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
2000*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2001*b7893ccfSSadaf Ebrahimi 
2002*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
2003*b7893ccfSSadaf Ebrahimi     // Now that cmd buffer done we can safely destroy query_pool
2004*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
2005*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
2006*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
2007*b7893ccfSSadaf Ebrahimi }
2008*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,PipelineInUseDestroyedSignaled)2009*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
2010*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use pipeline.");
2011*b7893ccfSSadaf Ebrahimi 
2012*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2013*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2014*b7893ccfSSadaf Ebrahimi 
2015*b7893ccfSSadaf Ebrahimi     const VkPipelineLayoutObj pipeline_layout(m_device);
2016*b7893ccfSSadaf Ebrahimi 
2017*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyPipeline-pipeline-00765");
2018*b7893ccfSSadaf Ebrahimi     // Create PSO to be used for draw-time errors below
2019*b7893ccfSSadaf Ebrahimi 
2020*b7893ccfSSadaf Ebrahimi     // Store pipeline handle so we can actually delete it before test finishes
2021*b7893ccfSSadaf Ebrahimi     VkPipeline delete_this_pipeline;
2022*b7893ccfSSadaf Ebrahimi     {  // Scope pipeline so it will be auto-deleted
2023*b7893ccfSSadaf Ebrahimi         CreatePipelineHelper pipe(*this);
2024*b7893ccfSSadaf Ebrahimi         pipe.InitInfo();
2025*b7893ccfSSadaf Ebrahimi         pipe.InitState();
2026*b7893ccfSSadaf Ebrahimi         pipe.CreateGraphicsPipeline();
2027*b7893ccfSSadaf Ebrahimi 
2028*b7893ccfSSadaf Ebrahimi         delete_this_pipeline = pipe.pipeline_;
2029*b7893ccfSSadaf Ebrahimi 
2030*b7893ccfSSadaf Ebrahimi         m_commandBuffer->begin();
2031*b7893ccfSSadaf Ebrahimi         // Bind pipeline to cmd buffer
2032*b7893ccfSSadaf Ebrahimi         vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
2033*b7893ccfSSadaf Ebrahimi 
2034*b7893ccfSSadaf Ebrahimi         m_commandBuffer->end();
2035*b7893ccfSSadaf Ebrahimi 
2036*b7893ccfSSadaf Ebrahimi         VkSubmitInfo submit_info = {};
2037*b7893ccfSSadaf Ebrahimi         submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2038*b7893ccfSSadaf Ebrahimi         submit_info.commandBufferCount = 1;
2039*b7893ccfSSadaf Ebrahimi         submit_info.pCommandBuffers = &m_commandBuffer->handle();
2040*b7893ccfSSadaf Ebrahimi         // Submit cmd buffer and then pipeline destroyed while in-flight
2041*b7893ccfSSadaf Ebrahimi         vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2042*b7893ccfSSadaf Ebrahimi     }  // Pipeline deletion triggered here
2043*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2044*b7893ccfSSadaf Ebrahimi     // Make sure queue finished and then actually delete pipeline
2045*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
2046*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
2047*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
2048*b7893ccfSSadaf Ebrahimi     vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
2049*b7893ccfSSadaf Ebrahimi }
2050*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ImageViewInUseDestroyedSignaled)2051*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
2052*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use imageView.");
2053*b7893ccfSSadaf Ebrahimi 
2054*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2055*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2056*b7893ccfSSadaf Ebrahimi 
2057*b7893ccfSSadaf Ebrahimi     VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
2058*b7893ccfSSadaf Ebrahimi     VkSampler sampler;
2059*b7893ccfSSadaf Ebrahimi 
2060*b7893ccfSSadaf Ebrahimi     VkResult err;
2061*b7893ccfSSadaf Ebrahimi     err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
2062*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
2063*b7893ccfSSadaf Ebrahimi 
2064*b7893ccfSSadaf Ebrahimi     VkImageObj image(m_device);
2065*b7893ccfSSadaf Ebrahimi     image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2066*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(image.initialized());
2067*b7893ccfSSadaf Ebrahimi 
2068*b7893ccfSSadaf Ebrahimi     VkImageView view = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
2069*b7893ccfSSadaf Ebrahimi 
2070*b7893ccfSSadaf Ebrahimi     // Create PSO to use the sampler
2071*b7893ccfSSadaf Ebrahimi     VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2072*b7893ccfSSadaf Ebrahimi 
2073*b7893ccfSSadaf Ebrahimi     CreatePipelineHelper pipe(*this);
2074*b7893ccfSSadaf Ebrahimi     pipe.InitInfo();
2075*b7893ccfSSadaf Ebrahimi     pipe.shader_stages_ = {pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
2076*b7893ccfSSadaf Ebrahimi     pipe.dsl_bindings_ = {
2077*b7893ccfSSadaf Ebrahimi         {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
2078*b7893ccfSSadaf Ebrahimi     };
2079*b7893ccfSSadaf Ebrahimi     const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
2080*b7893ccfSSadaf Ebrahimi     VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
2081*b7893ccfSSadaf Ebrahimi     dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2082*b7893ccfSSadaf Ebrahimi     dyn_state_ci.dynamicStateCount = size(dyn_states);
2083*b7893ccfSSadaf Ebrahimi     dyn_state_ci.pDynamicStates = dyn_states;
2084*b7893ccfSSadaf Ebrahimi     pipe.dyn_state_ci_ = dyn_state_ci;
2085*b7893ccfSSadaf Ebrahimi     pipe.InitState();
2086*b7893ccfSSadaf Ebrahimi     pipe.CreateGraphicsPipeline();
2087*b7893ccfSSadaf Ebrahimi 
2088*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->WriteDescriptorImageInfo(0, view, sampler, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
2089*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->UpdateDescriptorSets();
2090*b7893ccfSSadaf Ebrahimi 
2091*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyImageView-imageView-01026");
2092*b7893ccfSSadaf Ebrahimi 
2093*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
2094*b7893ccfSSadaf Ebrahimi     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
2095*b7893ccfSSadaf Ebrahimi     // Bind pipeline to cmd buffer
2096*b7893ccfSSadaf Ebrahimi     vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
2097*b7893ccfSSadaf Ebrahimi     vkCmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
2098*b7893ccfSSadaf Ebrahimi                             &pipe.descriptor_set_->set_, 0, nullptr);
2099*b7893ccfSSadaf Ebrahimi 
2100*b7893ccfSSadaf Ebrahimi     VkViewport viewport = {0, 0, 16, 16, 0, 1};
2101*b7893ccfSSadaf Ebrahimi     VkRect2D scissor = {{0, 0}, {16, 16}};
2102*b7893ccfSSadaf Ebrahimi     vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
2103*b7893ccfSSadaf Ebrahimi     vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
2104*b7893ccfSSadaf Ebrahimi 
2105*b7893ccfSSadaf Ebrahimi     m_commandBuffer->Draw(1, 0, 0, 0);
2106*b7893ccfSSadaf Ebrahimi     m_commandBuffer->EndRenderPass();
2107*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
2108*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer then destroy sampler
2109*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
2110*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2111*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
2112*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
2113*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer and then destroy imageView while in-flight
2114*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2115*b7893ccfSSadaf Ebrahimi 
2116*b7893ccfSSadaf Ebrahimi     vkDestroyImageView(m_device->device(), view, nullptr);
2117*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2118*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
2119*b7893ccfSSadaf Ebrahimi     // Now we can actually destroy imageView
2120*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
2121*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
2122*b7893ccfSSadaf Ebrahimi     vkDestroySampler(m_device->device(), sampler, nullptr);
2123*b7893ccfSSadaf Ebrahimi }
2124*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,BufferViewInUseDestroyedSignaled)2125*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
2126*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use bufferView.");
2127*b7893ccfSSadaf Ebrahimi 
2128*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2129*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2130*b7893ccfSSadaf Ebrahimi 
2131*b7893ccfSSadaf Ebrahimi     uint32_t queue_family_index = 0;
2132*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo buffer_create_info = {};
2133*b7893ccfSSadaf Ebrahimi     buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2134*b7893ccfSSadaf Ebrahimi     buffer_create_info.size = 1024;
2135*b7893ccfSSadaf Ebrahimi     buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
2136*b7893ccfSSadaf Ebrahimi     buffer_create_info.queueFamilyIndexCount = 1;
2137*b7893ccfSSadaf Ebrahimi     buffer_create_info.pQueueFamilyIndices = &queue_family_index;
2138*b7893ccfSSadaf Ebrahimi     VkBufferObj buffer;
2139*b7893ccfSSadaf Ebrahimi     buffer.init(*m_device, buffer_create_info);
2140*b7893ccfSSadaf Ebrahimi 
2141*b7893ccfSSadaf Ebrahimi     VkBufferView view;
2142*b7893ccfSSadaf Ebrahimi     VkBufferViewCreateInfo bvci = {};
2143*b7893ccfSSadaf Ebrahimi     bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
2144*b7893ccfSSadaf Ebrahimi     bvci.buffer = buffer.handle();
2145*b7893ccfSSadaf Ebrahimi     bvci.format = VK_FORMAT_R32_SFLOAT;
2146*b7893ccfSSadaf Ebrahimi     bvci.range = VK_WHOLE_SIZE;
2147*b7893ccfSSadaf Ebrahimi 
2148*b7893ccfSSadaf Ebrahimi     VkResult err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
2149*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
2150*b7893ccfSSadaf Ebrahimi 
2151*b7893ccfSSadaf Ebrahimi     char const *fsSource =
2152*b7893ccfSSadaf Ebrahimi         "#version 450\n"
2153*b7893ccfSSadaf Ebrahimi         "\n"
2154*b7893ccfSSadaf Ebrahimi         "layout(set=0, binding=0, r32f) uniform readonly imageBuffer s;\n"
2155*b7893ccfSSadaf Ebrahimi         "layout(location=0) out vec4 x;\n"
2156*b7893ccfSSadaf Ebrahimi         "void main(){\n"
2157*b7893ccfSSadaf Ebrahimi         "   x = imageLoad(s, 0);\n"
2158*b7893ccfSSadaf Ebrahimi         "}\n";
2159*b7893ccfSSadaf Ebrahimi     VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2160*b7893ccfSSadaf Ebrahimi 
2161*b7893ccfSSadaf Ebrahimi     CreatePipelineHelper pipe(*this);
2162*b7893ccfSSadaf Ebrahimi     pipe.InitInfo();
2163*b7893ccfSSadaf Ebrahimi     pipe.shader_stages_ = {pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
2164*b7893ccfSSadaf Ebrahimi     pipe.dsl_bindings_ = {
2165*b7893ccfSSadaf Ebrahimi         {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
2166*b7893ccfSSadaf Ebrahimi     };
2167*b7893ccfSSadaf Ebrahimi     const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
2168*b7893ccfSSadaf Ebrahimi     VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
2169*b7893ccfSSadaf Ebrahimi     dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2170*b7893ccfSSadaf Ebrahimi     dyn_state_ci.dynamicStateCount = size(dyn_states);
2171*b7893ccfSSadaf Ebrahimi     dyn_state_ci.pDynamicStates = dyn_states;
2172*b7893ccfSSadaf Ebrahimi     pipe.dyn_state_ci_ = dyn_state_ci;
2173*b7893ccfSSadaf Ebrahimi     pipe.InitState();
2174*b7893ccfSSadaf Ebrahimi     pipe.CreateGraphicsPipeline();
2175*b7893ccfSSadaf Ebrahimi 
2176*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->WriteDescriptorBufferView(0, view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER);
2177*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->UpdateDescriptorSets();
2178*b7893ccfSSadaf Ebrahimi 
2179*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroyBufferView-bufferView-00936");
2180*b7893ccfSSadaf Ebrahimi 
2181*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
2182*b7893ccfSSadaf Ebrahimi     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
2183*b7893ccfSSadaf Ebrahimi     VkViewport viewport = {0, 0, 16, 16, 0, 1};
2184*b7893ccfSSadaf Ebrahimi     vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
2185*b7893ccfSSadaf Ebrahimi     VkRect2D scissor = {{0, 0}, {16, 16}};
2186*b7893ccfSSadaf Ebrahimi     vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
2187*b7893ccfSSadaf Ebrahimi     // Bind pipeline to cmd buffer
2188*b7893ccfSSadaf Ebrahimi     vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
2189*b7893ccfSSadaf Ebrahimi     vkCmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
2190*b7893ccfSSadaf Ebrahimi                             &pipe.descriptor_set_->set_, 0, nullptr);
2191*b7893ccfSSadaf Ebrahimi     m_commandBuffer->Draw(1, 0, 0, 0);
2192*b7893ccfSSadaf Ebrahimi     m_commandBuffer->EndRenderPass();
2193*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
2194*b7893ccfSSadaf Ebrahimi 
2195*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
2196*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2197*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
2198*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
2199*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer and then destroy bufferView while in-flight
2200*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2201*b7893ccfSSadaf Ebrahimi 
2202*b7893ccfSSadaf Ebrahimi     vkDestroyBufferView(m_device->device(), view, nullptr);
2203*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2204*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
2205*b7893ccfSSadaf Ebrahimi     // Now we can actually destroy bufferView
2206*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
2207*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
2208*b7893ccfSSadaf Ebrahimi     vkDestroyBufferView(m_device->device(), view, NULL);
2209*b7893ccfSSadaf Ebrahimi }
2210*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,SamplerInUseDestroyedSignaled)2211*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
2212*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Delete in-use sampler.");
2213*b7893ccfSSadaf Ebrahimi 
2214*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2215*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2216*b7893ccfSSadaf Ebrahimi 
2217*b7893ccfSSadaf Ebrahimi     VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
2218*b7893ccfSSadaf Ebrahimi     VkSampler sampler;
2219*b7893ccfSSadaf Ebrahimi 
2220*b7893ccfSSadaf Ebrahimi     VkResult err;
2221*b7893ccfSSadaf Ebrahimi     err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
2222*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
2223*b7893ccfSSadaf Ebrahimi 
2224*b7893ccfSSadaf Ebrahimi     VkImageObj image(m_device);
2225*b7893ccfSSadaf Ebrahimi     image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2226*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(image.initialized());
2227*b7893ccfSSadaf Ebrahimi 
2228*b7893ccfSSadaf Ebrahimi     VkImageView view = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
2229*b7893ccfSSadaf Ebrahimi 
2230*b7893ccfSSadaf Ebrahimi     // Create PSO to use the sampler
2231*b7893ccfSSadaf Ebrahimi     VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2232*b7893ccfSSadaf Ebrahimi 
2233*b7893ccfSSadaf Ebrahimi     CreatePipelineHelper pipe(*this);
2234*b7893ccfSSadaf Ebrahimi     pipe.InitInfo();
2235*b7893ccfSSadaf Ebrahimi     pipe.shader_stages_ = {pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
2236*b7893ccfSSadaf Ebrahimi     pipe.dsl_bindings_ = {
2237*b7893ccfSSadaf Ebrahimi         {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
2238*b7893ccfSSadaf Ebrahimi     };
2239*b7893ccfSSadaf Ebrahimi     const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
2240*b7893ccfSSadaf Ebrahimi     VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
2241*b7893ccfSSadaf Ebrahimi     dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
2242*b7893ccfSSadaf Ebrahimi     dyn_state_ci.dynamicStateCount = size(dyn_states);
2243*b7893ccfSSadaf Ebrahimi     dyn_state_ci.pDynamicStates = dyn_states;
2244*b7893ccfSSadaf Ebrahimi     pipe.dyn_state_ci_ = dyn_state_ci;
2245*b7893ccfSSadaf Ebrahimi     pipe.InitState();
2246*b7893ccfSSadaf Ebrahimi     pipe.CreateGraphicsPipeline();
2247*b7893ccfSSadaf Ebrahimi 
2248*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->WriteDescriptorImageInfo(0, view, sampler, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
2249*b7893ccfSSadaf Ebrahimi     pipe.descriptor_set_->UpdateDescriptorSets();
2250*b7893ccfSSadaf Ebrahimi 
2251*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkDestroySampler-sampler-01082");
2252*b7893ccfSSadaf Ebrahimi 
2253*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
2254*b7893ccfSSadaf Ebrahimi     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
2255*b7893ccfSSadaf Ebrahimi     // Bind pipeline to cmd buffer
2256*b7893ccfSSadaf Ebrahimi     vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
2257*b7893ccfSSadaf Ebrahimi     vkCmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
2258*b7893ccfSSadaf Ebrahimi                             &pipe.descriptor_set_->set_, 0, nullptr);
2259*b7893ccfSSadaf Ebrahimi 
2260*b7893ccfSSadaf Ebrahimi     VkViewport viewport = {0, 0, 16, 16, 0, 1};
2261*b7893ccfSSadaf Ebrahimi     VkRect2D scissor = {{0, 0}, {16, 16}};
2262*b7893ccfSSadaf Ebrahimi     vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
2263*b7893ccfSSadaf Ebrahimi     vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
2264*b7893ccfSSadaf Ebrahimi 
2265*b7893ccfSSadaf Ebrahimi     m_commandBuffer->Draw(1, 0, 0, 0);
2266*b7893ccfSSadaf Ebrahimi     m_commandBuffer->EndRenderPass();
2267*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
2268*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer then destroy sampler
2269*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
2270*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2271*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
2272*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
2273*b7893ccfSSadaf Ebrahimi     // Submit cmd buffer and then destroy sampler while in-flight
2274*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2275*b7893ccfSSadaf Ebrahimi 
2276*b7893ccfSSadaf Ebrahimi     vkDestroySampler(m_device->device(), sampler, nullptr);  // Destroyed too soon
2277*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2278*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
2279*b7893ccfSSadaf Ebrahimi 
2280*b7893ccfSSadaf Ebrahimi     // Now we can actually destroy sampler
2281*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
2282*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
2283*b7893ccfSSadaf Ebrahimi     vkDestroySampler(m_device->device(), sampler, NULL);  // Destroyed for real
2284*b7893ccfSSadaf Ebrahimi }
2285*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,QueueForwardProgressFenceWait)2286*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
2287*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already signaled but not waited on by the queue.");
2288*b7893ccfSSadaf Ebrahimi 
2289*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2290*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2291*b7893ccfSSadaf Ebrahimi 
2292*b7893ccfSSadaf Ebrahimi     const char *queue_forward_progress_message = "UNASSIGNED-CoreValidation-DrawState-QueueForwardProgress";
2293*b7893ccfSSadaf Ebrahimi 
2294*b7893ccfSSadaf Ebrahimi     VkCommandBufferObj cb1(m_device, m_commandPool);
2295*b7893ccfSSadaf Ebrahimi     cb1.begin();
2296*b7893ccfSSadaf Ebrahimi     cb1.end();
2297*b7893ccfSSadaf Ebrahimi 
2298*b7893ccfSSadaf Ebrahimi     VkSemaphoreCreateInfo semaphore_create_info = {};
2299*b7893ccfSSadaf Ebrahimi     semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
2300*b7893ccfSSadaf Ebrahimi     VkSemaphore semaphore;
2301*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
2302*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
2303*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2304*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
2305*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &cb1.handle();
2306*b7893ccfSSadaf Ebrahimi     submit_info.signalSemaphoreCount = 1;
2307*b7893ccfSSadaf Ebrahimi     submit_info.pSignalSemaphores = &semaphore;
2308*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2309*b7893ccfSSadaf Ebrahimi 
2310*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
2311*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
2312*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
2313*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
2314*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
2315*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2316*b7893ccfSSadaf Ebrahimi 
2317*b7893ccfSSadaf Ebrahimi     vkDeviceWaitIdle(m_device->device());
2318*b7893ccfSSadaf Ebrahimi     vkDestroySemaphore(m_device->device(), semaphore, nullptr);
2319*b7893ccfSSadaf Ebrahimi }
2320*b7893ccfSSadaf Ebrahimi 
2321*b7893ccfSSadaf Ebrahimi #if GTEST_IS_THREADSAFE
TEST_F(VkLayerTest,ThreadCommandBufferCollision)2322*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
2323*b7893ccfSSadaf Ebrahimi     test_platform_thread thread;
2324*b7893ccfSSadaf Ebrahimi 
2325*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
2326*b7893ccfSSadaf Ebrahimi 
2327*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2328*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitViewport());
2329*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2330*b7893ccfSSadaf Ebrahimi 
2331*b7893ccfSSadaf Ebrahimi     // Calls AllocateCommandBuffers
2332*b7893ccfSSadaf Ebrahimi     VkCommandBufferObj commandBuffer(m_device, m_commandPool);
2333*b7893ccfSSadaf Ebrahimi 
2334*b7893ccfSSadaf Ebrahimi     commandBuffer.begin();
2335*b7893ccfSSadaf Ebrahimi 
2336*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_info;
2337*b7893ccfSSadaf Ebrahimi     VkEvent event;
2338*b7893ccfSSadaf Ebrahimi     VkResult err;
2339*b7893ccfSSadaf Ebrahimi 
2340*b7893ccfSSadaf Ebrahimi     memset(&event_info, 0, sizeof(event_info));
2341*b7893ccfSSadaf Ebrahimi     event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2342*b7893ccfSSadaf Ebrahimi 
2343*b7893ccfSSadaf Ebrahimi     err = vkCreateEvent(device(), &event_info, NULL, &event);
2344*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
2345*b7893ccfSSadaf Ebrahimi 
2346*b7893ccfSSadaf Ebrahimi     err = vkResetEvent(device(), event);
2347*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(err);
2348*b7893ccfSSadaf Ebrahimi 
2349*b7893ccfSSadaf Ebrahimi     struct thread_data_struct data;
2350*b7893ccfSSadaf Ebrahimi     data.commandBuffer = commandBuffer.handle();
2351*b7893ccfSSadaf Ebrahimi     data.event = event;
2352*b7893ccfSSadaf Ebrahimi     data.bailout = false;
2353*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetBailout(&data.bailout);
2354*b7893ccfSSadaf Ebrahimi 
2355*b7893ccfSSadaf Ebrahimi     // First do some correct operations using multiple threads.
2356*b7893ccfSSadaf Ebrahimi     // Add many entries to command buffer from another thread.
2357*b7893ccfSSadaf Ebrahimi     test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
2358*b7893ccfSSadaf Ebrahimi     // Make non-conflicting calls from this thread at the same time.
2359*b7893ccfSSadaf Ebrahimi     for (int i = 0; i < 80000; i++) {
2360*b7893ccfSSadaf Ebrahimi         uint32_t count;
2361*b7893ccfSSadaf Ebrahimi         vkEnumeratePhysicalDevices(instance(), &count, NULL);
2362*b7893ccfSSadaf Ebrahimi     }
2363*b7893ccfSSadaf Ebrahimi     test_platform_thread_join(thread, NULL);
2364*b7893ccfSSadaf Ebrahimi 
2365*b7893ccfSSadaf Ebrahimi     // Then do some incorrect operations using multiple threads.
2366*b7893ccfSSadaf Ebrahimi     // Add many entries to command buffer from another thread.
2367*b7893ccfSSadaf Ebrahimi     test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
2368*b7893ccfSSadaf Ebrahimi     // Add many entries to command buffer from this thread at the same time.
2369*b7893ccfSSadaf Ebrahimi     AddToCommandBuffer(&data);
2370*b7893ccfSSadaf Ebrahimi 
2371*b7893ccfSSadaf Ebrahimi     test_platform_thread_join(thread, NULL);
2372*b7893ccfSSadaf Ebrahimi     commandBuffer.end();
2373*b7893ccfSSadaf Ebrahimi 
2374*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetBailout(NULL);
2375*b7893ccfSSadaf Ebrahimi 
2376*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2377*b7893ccfSSadaf Ebrahimi 
2378*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(device(), event, NULL);
2379*b7893ccfSSadaf Ebrahimi }
2380*b7893ccfSSadaf Ebrahimi #endif  // GTEST_IS_THREADSAFE
2381*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ExecuteUnrecordedPrimaryCB)2382*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ExecuteUnrecordedPrimaryCB) {
2383*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Attempt vkQueueSubmit with a CB in the initial state");
2384*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2385*b7893ccfSSadaf Ebrahimi     // never record m_commandBuffer
2386*b7893ccfSSadaf Ebrahimi 
2387*b7893ccfSSadaf Ebrahimi     VkSubmitInfo si = {};
2388*b7893ccfSSadaf Ebrahimi     si.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2389*b7893ccfSSadaf Ebrahimi     si.commandBufferCount = 1;
2390*b7893ccfSSadaf Ebrahimi     si.pCommandBuffers = &m_commandBuffer->handle();
2391*b7893ccfSSadaf Ebrahimi 
2392*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkQueueSubmit-pCommandBuffers-00072");
2393*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
2394*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2395*b7893ccfSSadaf Ebrahimi }
2396*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,Maintenance1AndNegativeViewport)2397*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, Maintenance1AndNegativeViewport) {
2398*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Attempt to enable AMD_negative_viewport_height and Maintenance1_KHR extension simultaneously");
2399*b7893ccfSSadaf Ebrahimi 
2400*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2401*b7893ccfSSadaf Ebrahimi     if (!((DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) &&
2402*b7893ccfSSadaf Ebrahimi           (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME)))) {
2403*b7893ccfSSadaf Ebrahimi         printf("%s Maintenance1 and AMD_negative viewport height extensions not supported, skipping test\n", kSkipPrefix);
2404*b7893ccfSSadaf Ebrahimi         return;
2405*b7893ccfSSadaf Ebrahimi     }
2406*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
2407*b7893ccfSSadaf Ebrahimi 
2408*b7893ccfSSadaf Ebrahimi     vk_testing::QueueCreateInfoArray queue_info(m_device->queue_props);
2409*b7893ccfSSadaf Ebrahimi     const char *extension_names[2] = {"VK_KHR_maintenance1", "VK_AMD_negative_viewport_height"};
2410*b7893ccfSSadaf Ebrahimi     VkDevice testDevice;
2411*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo device_create_info = {};
2412*b7893ccfSSadaf Ebrahimi     auto features = m_device->phy().features();
2413*b7893ccfSSadaf Ebrahimi     device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2414*b7893ccfSSadaf Ebrahimi     device_create_info.pNext = NULL;
2415*b7893ccfSSadaf Ebrahimi     device_create_info.queueCreateInfoCount = queue_info.size();
2416*b7893ccfSSadaf Ebrahimi     device_create_info.pQueueCreateInfos = queue_info.data();
2417*b7893ccfSSadaf Ebrahimi     device_create_info.enabledLayerCount = 0;
2418*b7893ccfSSadaf Ebrahimi     device_create_info.ppEnabledLayerNames = NULL;
2419*b7893ccfSSadaf Ebrahimi     device_create_info.enabledExtensionCount = 2;
2420*b7893ccfSSadaf Ebrahimi     device_create_info.ppEnabledExtensionNames = (const char *const *)extension_names;
2421*b7893ccfSSadaf Ebrahimi     device_create_info.pEnabledFeatures = &features;
2422*b7893ccfSSadaf Ebrahimi 
2423*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374");
2424*b7893ccfSSadaf Ebrahimi     // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
2425*b7893ccfSSadaf Ebrahimi     // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
2426*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
2427*b7893ccfSSadaf Ebrahimi     vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2428*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2429*b7893ccfSSadaf Ebrahimi }
2430*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,HostQueryResetNotEnabled)2431*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, HostQueryResetNotEnabled) {
2432*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Use vkResetQueryPoolEXT without enabling the feature");
2433*b7893ccfSSadaf Ebrahimi 
2434*b7893ccfSSadaf Ebrahimi     if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
2435*b7893ccfSSadaf Ebrahimi         printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
2436*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2437*b7893ccfSSadaf Ebrahimi         return;
2438*b7893ccfSSadaf Ebrahimi     }
2439*b7893ccfSSadaf Ebrahimi 
2440*b7893ccfSSadaf Ebrahimi     m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2441*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2442*b7893ccfSSadaf Ebrahimi 
2443*b7893ccfSSadaf Ebrahimi     if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
2444*b7893ccfSSadaf Ebrahimi         printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2445*b7893ccfSSadaf Ebrahimi         return;
2446*b7893ccfSSadaf Ebrahimi     }
2447*b7893ccfSSadaf Ebrahimi 
2448*b7893ccfSSadaf Ebrahimi     m_device_extension_names.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2449*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
2450*b7893ccfSSadaf Ebrahimi 
2451*b7893ccfSSadaf Ebrahimi     auto fpvkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vkGetDeviceProcAddr(m_device->device(), "vkResetQueryPoolEXT");
2452*b7893ccfSSadaf Ebrahimi 
2453*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
2454*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info{};
2455*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
2456*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
2457*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
2458*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
2459*b7893ccfSSadaf Ebrahimi 
2460*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkResetQueryPoolEXT-None-02665");
2461*b7893ccfSSadaf Ebrahimi     fpvkResetQueryPoolEXT(m_device->device(), query_pool, 0, 1);
2462*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2463*b7893ccfSSadaf Ebrahimi 
2464*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
2465*b7893ccfSSadaf Ebrahimi }
2466*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,HostQueryResetBadFirstQuery)2467*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, HostQueryResetBadFirstQuery) {
2468*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Bad firstQuery in vkResetQueryPoolEXT");
2469*b7893ccfSSadaf Ebrahimi 
2470*b7893ccfSSadaf Ebrahimi     if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
2471*b7893ccfSSadaf Ebrahimi         printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
2472*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2473*b7893ccfSSadaf Ebrahimi         return;
2474*b7893ccfSSadaf Ebrahimi     }
2475*b7893ccfSSadaf Ebrahimi 
2476*b7893ccfSSadaf Ebrahimi     m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2477*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2478*b7893ccfSSadaf Ebrahimi 
2479*b7893ccfSSadaf Ebrahimi     if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
2480*b7893ccfSSadaf Ebrahimi         printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2481*b7893ccfSSadaf Ebrahimi         return;
2482*b7893ccfSSadaf Ebrahimi     }
2483*b7893ccfSSadaf Ebrahimi 
2484*b7893ccfSSadaf Ebrahimi     m_device_extension_names.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2485*b7893ccfSSadaf Ebrahimi 
2486*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceHostQueryResetFeaturesEXT host_query_reset_features{};
2487*b7893ccfSSadaf Ebrahimi     host_query_reset_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
2488*b7893ccfSSadaf Ebrahimi     host_query_reset_features.hostQueryReset = VK_TRUE;
2489*b7893ccfSSadaf Ebrahimi 
2490*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures2 pd_features2{};
2491*b7893ccfSSadaf Ebrahimi     pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2492*b7893ccfSSadaf Ebrahimi     pd_features2.pNext = &host_query_reset_features;
2493*b7893ccfSSadaf Ebrahimi 
2494*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
2495*b7893ccfSSadaf Ebrahimi 
2496*b7893ccfSSadaf Ebrahimi     auto fpvkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vkGetDeviceProcAddr(m_device->device(), "vkResetQueryPoolEXT");
2497*b7893ccfSSadaf Ebrahimi 
2498*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
2499*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info{};
2500*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
2501*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
2502*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
2503*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
2504*b7893ccfSSadaf Ebrahimi 
2505*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkResetQueryPoolEXT-firstQuery-02666");
2506*b7893ccfSSadaf Ebrahimi     fpvkResetQueryPoolEXT(m_device->device(), query_pool, 1, 0);
2507*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2508*b7893ccfSSadaf Ebrahimi 
2509*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
2510*b7893ccfSSadaf Ebrahimi }
2511*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,HostQueryResetBadRange)2512*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, HostQueryResetBadRange) {
2513*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Bad range in vkResetQueryPoolEXT");
2514*b7893ccfSSadaf Ebrahimi 
2515*b7893ccfSSadaf Ebrahimi     if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
2516*b7893ccfSSadaf Ebrahimi         printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
2517*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2518*b7893ccfSSadaf Ebrahimi         return;
2519*b7893ccfSSadaf Ebrahimi     }
2520*b7893ccfSSadaf Ebrahimi 
2521*b7893ccfSSadaf Ebrahimi     m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2522*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2523*b7893ccfSSadaf Ebrahimi 
2524*b7893ccfSSadaf Ebrahimi     if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
2525*b7893ccfSSadaf Ebrahimi         printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2526*b7893ccfSSadaf Ebrahimi         return;
2527*b7893ccfSSadaf Ebrahimi     }
2528*b7893ccfSSadaf Ebrahimi 
2529*b7893ccfSSadaf Ebrahimi     m_device_extension_names.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2530*b7893ccfSSadaf Ebrahimi 
2531*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceHostQueryResetFeaturesEXT host_query_reset_features{};
2532*b7893ccfSSadaf Ebrahimi     host_query_reset_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
2533*b7893ccfSSadaf Ebrahimi     host_query_reset_features.hostQueryReset = VK_TRUE;
2534*b7893ccfSSadaf Ebrahimi 
2535*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures2 pd_features2{};
2536*b7893ccfSSadaf Ebrahimi     pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2537*b7893ccfSSadaf Ebrahimi     pd_features2.pNext = &host_query_reset_features;
2538*b7893ccfSSadaf Ebrahimi 
2539*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
2540*b7893ccfSSadaf Ebrahimi 
2541*b7893ccfSSadaf Ebrahimi     auto fpvkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vkGetDeviceProcAddr(m_device->device(), "vkResetQueryPoolEXT");
2542*b7893ccfSSadaf Ebrahimi 
2543*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
2544*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info{};
2545*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
2546*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
2547*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
2548*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
2549*b7893ccfSSadaf Ebrahimi 
2550*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkResetQueryPoolEXT-firstQuery-02667");
2551*b7893ccfSSadaf Ebrahimi     fpvkResetQueryPoolEXT(m_device->device(), query_pool, 0, 2);
2552*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2553*b7893ccfSSadaf Ebrahimi 
2554*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
2555*b7893ccfSSadaf Ebrahimi }
2556*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,HostQueryResetInvalidQueryPool)2557*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, HostQueryResetInvalidQueryPool) {
2558*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Invalid queryPool in vkResetQueryPoolEXT");
2559*b7893ccfSSadaf Ebrahimi 
2560*b7893ccfSSadaf Ebrahimi     if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
2561*b7893ccfSSadaf Ebrahimi         printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
2562*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2563*b7893ccfSSadaf Ebrahimi         return;
2564*b7893ccfSSadaf Ebrahimi     }
2565*b7893ccfSSadaf Ebrahimi 
2566*b7893ccfSSadaf Ebrahimi     m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2567*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2568*b7893ccfSSadaf Ebrahimi 
2569*b7893ccfSSadaf Ebrahimi     if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
2570*b7893ccfSSadaf Ebrahimi         printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2571*b7893ccfSSadaf Ebrahimi         return;
2572*b7893ccfSSadaf Ebrahimi     }
2573*b7893ccfSSadaf Ebrahimi 
2574*b7893ccfSSadaf Ebrahimi     m_device_extension_names.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2575*b7893ccfSSadaf Ebrahimi 
2576*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceHostQueryResetFeaturesEXT host_query_reset_features{};
2577*b7893ccfSSadaf Ebrahimi     host_query_reset_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
2578*b7893ccfSSadaf Ebrahimi     host_query_reset_features.hostQueryReset = VK_TRUE;
2579*b7893ccfSSadaf Ebrahimi 
2580*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures2 pd_features2{};
2581*b7893ccfSSadaf Ebrahimi     pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2582*b7893ccfSSadaf Ebrahimi     pd_features2.pNext = &host_query_reset_features;
2583*b7893ccfSSadaf Ebrahimi 
2584*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
2585*b7893ccfSSadaf Ebrahimi 
2586*b7893ccfSSadaf Ebrahimi     auto fpvkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vkGetDeviceProcAddr(m_device->device(), "vkResetQueryPoolEXT");
2587*b7893ccfSSadaf Ebrahimi 
2588*b7893ccfSSadaf Ebrahimi     // Create and destroy a query pool.
2589*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
2590*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info{};
2591*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
2592*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
2593*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
2594*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
2595*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
2596*b7893ccfSSadaf Ebrahimi 
2597*b7893ccfSSadaf Ebrahimi     // Attempt to reuse the query pool handle.
2598*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkResetQueryPoolEXT-queryPool-parameter");
2599*b7893ccfSSadaf Ebrahimi     fpvkResetQueryPoolEXT(m_device->device(), query_pool, 0, 1);
2600*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2601*b7893ccfSSadaf Ebrahimi }
2602*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,HostQueryResetWrongDevice)2603*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, HostQueryResetWrongDevice) {
2604*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Device not matching queryPool in vkResetQueryPoolEXT");
2605*b7893ccfSSadaf Ebrahimi 
2606*b7893ccfSSadaf Ebrahimi     if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
2607*b7893ccfSSadaf Ebrahimi         printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
2608*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2609*b7893ccfSSadaf Ebrahimi         return;
2610*b7893ccfSSadaf Ebrahimi     }
2611*b7893ccfSSadaf Ebrahimi 
2612*b7893ccfSSadaf Ebrahimi     m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2613*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2614*b7893ccfSSadaf Ebrahimi 
2615*b7893ccfSSadaf Ebrahimi     if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
2616*b7893ccfSSadaf Ebrahimi         printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2617*b7893ccfSSadaf Ebrahimi         return;
2618*b7893ccfSSadaf Ebrahimi     }
2619*b7893ccfSSadaf Ebrahimi 
2620*b7893ccfSSadaf Ebrahimi     m_device_extension_names.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
2621*b7893ccfSSadaf Ebrahimi 
2622*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceHostQueryResetFeaturesEXT host_query_reset_features{};
2623*b7893ccfSSadaf Ebrahimi     host_query_reset_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
2624*b7893ccfSSadaf Ebrahimi     host_query_reset_features.hostQueryReset = VK_TRUE;
2625*b7893ccfSSadaf Ebrahimi 
2626*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures2 pd_features2{};
2627*b7893ccfSSadaf Ebrahimi     pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
2628*b7893ccfSSadaf Ebrahimi     pd_features2.pNext = &host_query_reset_features;
2629*b7893ccfSSadaf Ebrahimi 
2630*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
2631*b7893ccfSSadaf Ebrahimi 
2632*b7893ccfSSadaf Ebrahimi     auto fpvkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vkGetDeviceProcAddr(m_device->device(), "vkResetQueryPoolEXT");
2633*b7893ccfSSadaf Ebrahimi 
2634*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
2635*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_create_info{};
2636*b7893ccfSSadaf Ebrahimi     query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
2637*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
2638*b7893ccfSSadaf Ebrahimi     query_pool_create_info.queryCount = 1;
2639*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
2640*b7893ccfSSadaf Ebrahimi 
2641*b7893ccfSSadaf Ebrahimi     // Create a second device with the feature enabled.
2642*b7893ccfSSadaf Ebrahimi     vk_testing::QueueCreateInfoArray queue_info(m_device->queue_props);
2643*b7893ccfSSadaf Ebrahimi     auto features = m_device->phy().features();
2644*b7893ccfSSadaf Ebrahimi 
2645*b7893ccfSSadaf Ebrahimi     VkDeviceCreateInfo device_create_info = {};
2646*b7893ccfSSadaf Ebrahimi     device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2647*b7893ccfSSadaf Ebrahimi     device_create_info.pNext = &host_query_reset_features;
2648*b7893ccfSSadaf Ebrahimi     device_create_info.queueCreateInfoCount = queue_info.size();
2649*b7893ccfSSadaf Ebrahimi     device_create_info.pQueueCreateInfos = queue_info.data();
2650*b7893ccfSSadaf Ebrahimi     device_create_info.pEnabledFeatures = &features;
2651*b7893ccfSSadaf Ebrahimi     device_create_info.enabledExtensionCount = m_device_extension_names.size();
2652*b7893ccfSSadaf Ebrahimi     device_create_info.ppEnabledExtensionNames = m_device_extension_names.data();
2653*b7893ccfSSadaf Ebrahimi 
2654*b7893ccfSSadaf Ebrahimi     VkDevice second_device;
2655*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, nullptr, &second_device));
2656*b7893ccfSSadaf Ebrahimi 
2657*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkResetQueryPoolEXT-queryPool-parent");
2658*b7893ccfSSadaf Ebrahimi     // Run vkResetQueryPoolExt on the wrong device.
2659*b7893ccfSSadaf Ebrahimi     fpvkResetQueryPoolEXT(second_device, query_pool, 0, 1);
2660*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2661*b7893ccfSSadaf Ebrahimi 
2662*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
2663*b7893ccfSSadaf Ebrahimi     vkDestroyDevice(second_device, nullptr);
2664*b7893ccfSSadaf Ebrahimi }
2665*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ResetEventThenSet)2666*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ResetEventThenSet) {
2667*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
2668*b7893ccfSSadaf Ebrahimi 
2669*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init());
2670*b7893ccfSSadaf Ebrahimi     VkEvent event;
2671*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo event_create_info{};
2672*b7893ccfSSadaf Ebrahimi     event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
2673*b7893ccfSSadaf Ebrahimi     vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
2674*b7893ccfSSadaf Ebrahimi 
2675*b7893ccfSSadaf Ebrahimi     VkCommandPool command_pool;
2676*b7893ccfSSadaf Ebrahimi     VkCommandPoolCreateInfo pool_create_info{};
2677*b7893ccfSSadaf Ebrahimi     pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2678*b7893ccfSSadaf Ebrahimi     pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2679*b7893ccfSSadaf Ebrahimi     pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2680*b7893ccfSSadaf Ebrahimi     vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
2681*b7893ccfSSadaf Ebrahimi 
2682*b7893ccfSSadaf Ebrahimi     VkCommandBuffer command_buffer;
2683*b7893ccfSSadaf Ebrahimi     VkCommandBufferAllocateInfo command_buffer_allocate_info{};
2684*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2685*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.commandPool = command_pool;
2686*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.commandBufferCount = 1;
2687*b7893ccfSSadaf Ebrahimi     command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2688*b7893ccfSSadaf Ebrahimi     vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
2689*b7893ccfSSadaf Ebrahimi 
2690*b7893ccfSSadaf Ebrahimi     VkQueue queue = VK_NULL_HANDLE;
2691*b7893ccfSSadaf Ebrahimi     vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
2692*b7893ccfSSadaf Ebrahimi 
2693*b7893ccfSSadaf Ebrahimi     {
2694*b7893ccfSSadaf Ebrahimi         VkCommandBufferBeginInfo begin_info{};
2695*b7893ccfSSadaf Ebrahimi         begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2696*b7893ccfSSadaf Ebrahimi         vkBeginCommandBuffer(command_buffer, &begin_info);
2697*b7893ccfSSadaf Ebrahimi 
2698*b7893ccfSSadaf Ebrahimi         vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
2699*b7893ccfSSadaf Ebrahimi         vkEndCommandBuffer(command_buffer);
2700*b7893ccfSSadaf Ebrahimi     }
2701*b7893ccfSSadaf Ebrahimi     {
2702*b7893ccfSSadaf Ebrahimi         VkSubmitInfo submit_info{};
2703*b7893ccfSSadaf Ebrahimi         submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2704*b7893ccfSSadaf Ebrahimi         submit_info.commandBufferCount = 1;
2705*b7893ccfSSadaf Ebrahimi         submit_info.pCommandBuffers = &command_buffer;
2706*b7893ccfSSadaf Ebrahimi         submit_info.signalSemaphoreCount = 0;
2707*b7893ccfSSadaf Ebrahimi         submit_info.pSignalSemaphores = nullptr;
2708*b7893ccfSSadaf Ebrahimi         vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
2709*b7893ccfSSadaf Ebrahimi     }
2710*b7893ccfSSadaf Ebrahimi     {
2711*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a command buffer.");
2712*b7893ccfSSadaf Ebrahimi         vkSetEvent(m_device->device(), event);
2713*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
2714*b7893ccfSSadaf Ebrahimi     }
2715*b7893ccfSSadaf Ebrahimi 
2716*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(queue);
2717*b7893ccfSSadaf Ebrahimi 
2718*b7893ccfSSadaf Ebrahimi     vkDestroyEvent(m_device->device(), event, nullptr);
2719*b7893ccfSSadaf Ebrahimi     vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
2720*b7893ccfSSadaf Ebrahimi     vkDestroyCommandPool(m_device->device(), command_pool, NULL);
2721*b7893ccfSSadaf Ebrahimi }
2722*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ShadingRateImageNV)2723*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ShadingRateImageNV) {
2724*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Test VK_NV_shading_rate_image.");
2725*b7893ccfSSadaf Ebrahimi 
2726*b7893ccfSSadaf Ebrahimi     if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
2727*b7893ccfSSadaf Ebrahimi         m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2728*b7893ccfSSadaf Ebrahimi     } else {
2729*b7893ccfSSadaf Ebrahimi         printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
2730*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2731*b7893ccfSSadaf Ebrahimi         return;
2732*b7893ccfSSadaf Ebrahimi     }
2733*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
2734*b7893ccfSSadaf Ebrahimi     std::array<const char *, 1> required_device_extensions = {{VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME}};
2735*b7893ccfSSadaf Ebrahimi     for (auto device_extension : required_device_extensions) {
2736*b7893ccfSSadaf Ebrahimi         if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
2737*b7893ccfSSadaf Ebrahimi             m_device_extension_names.push_back(device_extension);
2738*b7893ccfSSadaf Ebrahimi         } else {
2739*b7893ccfSSadaf Ebrahimi             printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
2740*b7893ccfSSadaf Ebrahimi             return;
2741*b7893ccfSSadaf Ebrahimi         }
2742*b7893ccfSSadaf Ebrahimi     }
2743*b7893ccfSSadaf Ebrahimi 
2744*b7893ccfSSadaf Ebrahimi     if (DeviceIsMockICD() || DeviceSimulation()) {
2745*b7893ccfSSadaf Ebrahimi         printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
2746*b7893ccfSSadaf Ebrahimi         return;
2747*b7893ccfSSadaf Ebrahimi     }
2748*b7893ccfSSadaf Ebrahimi 
2749*b7893ccfSSadaf Ebrahimi     PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
2750*b7893ccfSSadaf Ebrahimi         (PFN_vkGetPhysicalDeviceFeatures2KHR)vkGetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
2751*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
2752*b7893ccfSSadaf Ebrahimi 
2753*b7893ccfSSadaf Ebrahimi     // Create a device that enables shading_rate_image but disables multiViewport
2754*b7893ccfSSadaf Ebrahimi     auto shading_rate_image_features = lvl_init_struct<VkPhysicalDeviceShadingRateImageFeaturesNV>();
2755*b7893ccfSSadaf Ebrahimi     auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&shading_rate_image_features);
2756*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
2757*b7893ccfSSadaf Ebrahimi 
2758*b7893ccfSSadaf Ebrahimi     features2.features.multiViewport = VK_FALSE;
2759*b7893ccfSSadaf Ebrahimi 
2760*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
2761*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2762*b7893ccfSSadaf Ebrahimi 
2763*b7893ccfSSadaf Ebrahimi     // Test shading rate image creation
2764*b7893ccfSSadaf Ebrahimi     VkResult result = VK_RESULT_MAX_ENUM;
2765*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo image_create_info = {};
2766*b7893ccfSSadaf Ebrahimi     image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2767*b7893ccfSSadaf Ebrahimi     image_create_info.pNext = NULL;
2768*b7893ccfSSadaf Ebrahimi     image_create_info.imageType = VK_IMAGE_TYPE_2D;
2769*b7893ccfSSadaf Ebrahimi     image_create_info.format = VK_FORMAT_R8_UINT;
2770*b7893ccfSSadaf Ebrahimi     image_create_info.extent.width = 4;
2771*b7893ccfSSadaf Ebrahimi     image_create_info.extent.height = 4;
2772*b7893ccfSSadaf Ebrahimi     image_create_info.extent.depth = 1;
2773*b7893ccfSSadaf Ebrahimi     image_create_info.mipLevels = 1;
2774*b7893ccfSSadaf Ebrahimi     image_create_info.arrayLayers = 1;
2775*b7893ccfSSadaf Ebrahimi     image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2776*b7893ccfSSadaf Ebrahimi     image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2777*b7893ccfSSadaf Ebrahimi     image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2778*b7893ccfSSadaf Ebrahimi     image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV;
2779*b7893ccfSSadaf Ebrahimi     image_create_info.queueFamilyIndexCount = 0;
2780*b7893ccfSSadaf Ebrahimi     image_create_info.pQueueFamilyIndices = NULL;
2781*b7893ccfSSadaf Ebrahimi     image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2782*b7893ccfSSadaf Ebrahimi     image_create_info.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
2783*b7893ccfSSadaf Ebrahimi 
2784*b7893ccfSSadaf Ebrahimi     // image type must be 2D
2785*b7893ccfSSadaf Ebrahimi     image_create_info.imageType = VK_IMAGE_TYPE_3D;
2786*b7893ccfSSadaf Ebrahimi     CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-imageType-02082");
2787*b7893ccfSSadaf Ebrahimi 
2788*b7893ccfSSadaf Ebrahimi     image_create_info.imageType = VK_IMAGE_TYPE_2D;
2789*b7893ccfSSadaf Ebrahimi 
2790*b7893ccfSSadaf Ebrahimi     // must be single sample
2791*b7893ccfSSadaf Ebrahimi     image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
2792*b7893ccfSSadaf Ebrahimi     CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-samples-02083");
2793*b7893ccfSSadaf Ebrahimi 
2794*b7893ccfSSadaf Ebrahimi     image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2795*b7893ccfSSadaf Ebrahimi 
2796*b7893ccfSSadaf Ebrahimi     // tiling must be optimal
2797*b7893ccfSSadaf Ebrahimi     image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2798*b7893ccfSSadaf Ebrahimi     CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-tiling-02084");
2799*b7893ccfSSadaf Ebrahimi 
2800*b7893ccfSSadaf Ebrahimi     image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2801*b7893ccfSSadaf Ebrahimi 
2802*b7893ccfSSadaf Ebrahimi     // Should succeed.
2803*b7893ccfSSadaf Ebrahimi     VkImageObj image(m_device);
2804*b7893ccfSSadaf Ebrahimi     image.init(&image_create_info);
2805*b7893ccfSSadaf Ebrahimi 
2806*b7893ccfSSadaf Ebrahimi     // Test image view creation
2807*b7893ccfSSadaf Ebrahimi     VkImageView view;
2808*b7893ccfSSadaf Ebrahimi     VkImageViewCreateInfo ivci = {};
2809*b7893ccfSSadaf Ebrahimi     ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2810*b7893ccfSSadaf Ebrahimi     ivci.image = image.handle();
2811*b7893ccfSSadaf Ebrahimi     ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
2812*b7893ccfSSadaf Ebrahimi     ivci.format = VK_FORMAT_R8_UINT;
2813*b7893ccfSSadaf Ebrahimi     ivci.subresourceRange.layerCount = 1;
2814*b7893ccfSSadaf Ebrahimi     ivci.subresourceRange.baseMipLevel = 0;
2815*b7893ccfSSadaf Ebrahimi     ivci.subresourceRange.levelCount = 1;
2816*b7893ccfSSadaf Ebrahimi     ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2817*b7893ccfSSadaf Ebrahimi 
2818*b7893ccfSSadaf Ebrahimi     // view type must be 2D or 2D_ARRAY
2819*b7893ccfSSadaf Ebrahimi     ivci.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
2820*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-02086");
2821*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-01003");
2822*b7893ccfSSadaf Ebrahimi     result = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
2823*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2824*b7893ccfSSadaf Ebrahimi     if (VK_SUCCESS == result) {
2825*b7893ccfSSadaf Ebrahimi         vkDestroyImageView(m_device->device(), view, NULL);
2826*b7893ccfSSadaf Ebrahimi         view = VK_NULL_HANDLE;
2827*b7893ccfSSadaf Ebrahimi     }
2828*b7893ccfSSadaf Ebrahimi     ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
2829*b7893ccfSSadaf Ebrahimi 
2830*b7893ccfSSadaf Ebrahimi     // format must be R8_UINT
2831*b7893ccfSSadaf Ebrahimi     ivci.format = VK_FORMAT_R8_UNORM;
2832*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-02087");
2833*b7893ccfSSadaf Ebrahimi     result = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
2834*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2835*b7893ccfSSadaf Ebrahimi     if (VK_SUCCESS == result) {
2836*b7893ccfSSadaf Ebrahimi         vkDestroyImageView(m_device->device(), view, NULL);
2837*b7893ccfSSadaf Ebrahimi         view = VK_NULL_HANDLE;
2838*b7893ccfSSadaf Ebrahimi     }
2839*b7893ccfSSadaf Ebrahimi     ivci.format = VK_FORMAT_R8_UINT;
2840*b7893ccfSSadaf Ebrahimi 
2841*b7893ccfSSadaf Ebrahimi     vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
2842*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
2843*b7893ccfSSadaf Ebrahimi 
2844*b7893ccfSSadaf Ebrahimi     // Test pipeline creation
2845*b7893ccfSSadaf Ebrahimi     VkPipelineViewportShadingRateImageStateCreateInfoNV vsrisci = {
2846*b7893ccfSSadaf Ebrahimi         VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV};
2847*b7893ccfSSadaf Ebrahimi 
2848*b7893ccfSSadaf Ebrahimi     VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
2849*b7893ccfSSadaf Ebrahimi     VkViewport viewports[20] = {viewport, viewport};
2850*b7893ccfSSadaf Ebrahimi     VkRect2D scissor = {{0, 0}, {64, 64}};
2851*b7893ccfSSadaf Ebrahimi     VkRect2D scissors[20] = {scissor, scissor};
2852*b7893ccfSSadaf Ebrahimi     VkDynamicState dynPalette = VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV;
2853*b7893ccfSSadaf Ebrahimi     VkPipelineDynamicStateCreateInfo dyn = {VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, nullptr, 0, 1, &dynPalette};
2854*b7893ccfSSadaf Ebrahimi 
2855*b7893ccfSSadaf Ebrahimi     // viewportCount must be 0 or 1 when multiViewport is disabled
2856*b7893ccfSSadaf Ebrahimi     {
2857*b7893ccfSSadaf Ebrahimi         const auto break_vp = [&](CreatePipelineHelper &helper) {
2858*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.viewportCount = 2;
2859*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pViewports = viewports;
2860*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.scissorCount = 2;
2861*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pScissors = scissors;
2862*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pNext = &vsrisci;
2863*b7893ccfSSadaf Ebrahimi             helper.dyn_state_ci_ = dyn;
2864*b7893ccfSSadaf Ebrahimi 
2865*b7893ccfSSadaf Ebrahimi             vsrisci.shadingRateImageEnable = VK_TRUE;
2866*b7893ccfSSadaf Ebrahimi             vsrisci.viewportCount = 2;
2867*b7893ccfSSadaf Ebrahimi         };
2868*b7893ccfSSadaf Ebrahimi         CreatePipelineHelper::OneshotTest(
2869*b7893ccfSSadaf Ebrahimi             *this, break_vp, VK_DEBUG_REPORT_ERROR_BIT_EXT,
2870*b7893ccfSSadaf Ebrahimi             vector<std::string>({"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02054",
2871*b7893ccfSSadaf Ebrahimi                                  "VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216",
2872*b7893ccfSSadaf Ebrahimi                                  "VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217"}));
2873*b7893ccfSSadaf Ebrahimi     }
2874*b7893ccfSSadaf Ebrahimi 
2875*b7893ccfSSadaf Ebrahimi     // viewportCounts must match
2876*b7893ccfSSadaf Ebrahimi     {
2877*b7893ccfSSadaf Ebrahimi         const auto break_vp = [&](CreatePipelineHelper &helper) {
2878*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.viewportCount = 1;
2879*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pViewports = viewports;
2880*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.scissorCount = 1;
2881*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pScissors = scissors;
2882*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pNext = &vsrisci;
2883*b7893ccfSSadaf Ebrahimi             helper.dyn_state_ci_ = dyn;
2884*b7893ccfSSadaf Ebrahimi 
2885*b7893ccfSSadaf Ebrahimi             vsrisci.shadingRateImageEnable = VK_TRUE;
2886*b7893ccfSSadaf Ebrahimi             vsrisci.viewportCount = 0;
2887*b7893ccfSSadaf Ebrahimi         };
2888*b7893ccfSSadaf Ebrahimi         CreatePipelineHelper::OneshotTest(
2889*b7893ccfSSadaf Ebrahimi             *this, break_vp, VK_DEBUG_REPORT_ERROR_BIT_EXT,
2890*b7893ccfSSadaf Ebrahimi             vector<std::string>({"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-shadingRateImageEnable-02056"}));
2891*b7893ccfSSadaf Ebrahimi     }
2892*b7893ccfSSadaf Ebrahimi 
2893*b7893ccfSSadaf Ebrahimi     // pShadingRatePalettes must not be NULL.
2894*b7893ccfSSadaf Ebrahimi     {
2895*b7893ccfSSadaf Ebrahimi         const auto break_vp = [&](CreatePipelineHelper &helper) {
2896*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.viewportCount = 1;
2897*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pViewports = viewports;
2898*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.scissorCount = 1;
2899*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pScissors = scissors;
2900*b7893ccfSSadaf Ebrahimi             helper.vp_state_ci_.pNext = &vsrisci;
2901*b7893ccfSSadaf Ebrahimi 
2902*b7893ccfSSadaf Ebrahimi             vsrisci.shadingRateImageEnable = VK_TRUE;
2903*b7893ccfSSadaf Ebrahimi             vsrisci.viewportCount = 1;
2904*b7893ccfSSadaf Ebrahimi         };
2905*b7893ccfSSadaf Ebrahimi         CreatePipelineHelper::OneshotTest(
2906*b7893ccfSSadaf Ebrahimi             *this, break_vp, VK_DEBUG_REPORT_ERROR_BIT_EXT,
2907*b7893ccfSSadaf Ebrahimi             vector<std::string>({"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pDynamicStates-02057"}));
2908*b7893ccfSSadaf Ebrahimi     }
2909*b7893ccfSSadaf Ebrahimi 
2910*b7893ccfSSadaf Ebrahimi     // Create an image without the SRI bit
2911*b7893ccfSSadaf Ebrahimi     VkImageObj nonSRIimage(m_device);
2912*b7893ccfSSadaf Ebrahimi     nonSRIimage.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2913*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(nonSRIimage.initialized());
2914*b7893ccfSSadaf Ebrahimi     VkImageView nonSRIview = nonSRIimage.targetView(VK_FORMAT_B8G8R8A8_UNORM);
2915*b7893ccfSSadaf Ebrahimi 
2916*b7893ccfSSadaf Ebrahimi     // Test SRI layout on non-SRI image
2917*b7893ccfSSadaf Ebrahimi     VkImageMemoryBarrier img_barrier = {};
2918*b7893ccfSSadaf Ebrahimi     img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
2919*b7893ccfSSadaf Ebrahimi     img_barrier.pNext = nullptr;
2920*b7893ccfSSadaf Ebrahimi     img_barrier.srcAccessMask = 0;
2921*b7893ccfSSadaf Ebrahimi     img_barrier.dstAccessMask = 0;
2922*b7893ccfSSadaf Ebrahimi     img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
2923*b7893ccfSSadaf Ebrahimi     img_barrier.newLayout = VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV;
2924*b7893ccfSSadaf Ebrahimi     img_barrier.image = nonSRIimage.handle();
2925*b7893ccfSSadaf Ebrahimi     img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
2926*b7893ccfSSadaf Ebrahimi     img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
2927*b7893ccfSSadaf Ebrahimi     img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2928*b7893ccfSSadaf Ebrahimi     img_barrier.subresourceRange.baseArrayLayer = 0;
2929*b7893ccfSSadaf Ebrahimi     img_barrier.subresourceRange.baseMipLevel = 0;
2930*b7893ccfSSadaf Ebrahimi     img_barrier.subresourceRange.layerCount = 1;
2931*b7893ccfSSadaf Ebrahimi     img_barrier.subresourceRange.levelCount = 1;
2932*b7893ccfSSadaf Ebrahimi 
2933*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
2934*b7893ccfSSadaf Ebrahimi 
2935*b7893ccfSSadaf Ebrahimi     // Error trying to convert it to SRI layout
2936*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageMemoryBarrier-oldLayout-02088");
2937*b7893ccfSSadaf Ebrahimi     vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0,
2938*b7893ccfSSadaf Ebrahimi                          nullptr, 0, nullptr, 1, &img_barrier);
2939*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2940*b7893ccfSSadaf Ebrahimi 
2941*b7893ccfSSadaf Ebrahimi     // succeed converting it to GENERAL
2942*b7893ccfSSadaf Ebrahimi     img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
2943*b7893ccfSSadaf Ebrahimi     vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0,
2944*b7893ccfSSadaf Ebrahimi                          nullptr, 0, nullptr, 1, &img_barrier);
2945*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
2946*b7893ccfSSadaf Ebrahimi 
2947*b7893ccfSSadaf Ebrahimi     // Test vkCmdBindShadingRateImageNV errors
2948*b7893ccfSSadaf Ebrahimi     auto vkCmdBindShadingRateImageNV =
2949*b7893ccfSSadaf Ebrahimi         (PFN_vkCmdBindShadingRateImageNV)vkGetDeviceProcAddr(m_device->device(), "vkCmdBindShadingRateImageNV");
2950*b7893ccfSSadaf Ebrahimi 
2951*b7893ccfSSadaf Ebrahimi     // if the view is non-NULL, it must be R8_UINT, USAGE_SRI, image layout must match, layout must be valid
2952*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBindShadingRateImageNV-imageView-02060");
2953*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBindShadingRateImageNV-imageView-02061");
2954*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBindShadingRateImageNV-imageView-02062");
2955*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBindShadingRateImageNV-imageLayout-02063");
2956*b7893ccfSSadaf Ebrahimi     vkCmdBindShadingRateImageNV(m_commandBuffer->handle(), nonSRIview, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
2957*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2958*b7893ccfSSadaf Ebrahimi 
2959*b7893ccfSSadaf Ebrahimi     // Test vkCmdSetViewportShadingRatePaletteNV errors
2960*b7893ccfSSadaf Ebrahimi     auto vkCmdSetViewportShadingRatePaletteNV =
2961*b7893ccfSSadaf Ebrahimi         (PFN_vkCmdSetViewportShadingRatePaletteNV)vkGetDeviceProcAddr(m_device->device(), "vkCmdSetViewportShadingRatePaletteNV");
2962*b7893ccfSSadaf Ebrahimi 
2963*b7893ccfSSadaf Ebrahimi     VkShadingRatePaletteEntryNV paletteEntries[100] = {};
2964*b7893ccfSSadaf Ebrahimi     VkShadingRatePaletteNV palette = {100, paletteEntries};
2965*b7893ccfSSadaf Ebrahimi     VkShadingRatePaletteNV palettes[] = {palette, palette};
2966*b7893ccfSSadaf Ebrahimi 
2967*b7893ccfSSadaf Ebrahimi     // errors on firstViewport/viewportCount
2968*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2969*b7893ccfSSadaf Ebrahimi                                          "VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02066");
2970*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2971*b7893ccfSSadaf Ebrahimi                                          "VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02067");
2972*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2973*b7893ccfSSadaf Ebrahimi                                          "VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02068");
2974*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2975*b7893ccfSSadaf Ebrahimi                                          "VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-02069");
2976*b7893ccfSSadaf Ebrahimi     vkCmdSetViewportShadingRatePaletteNV(m_commandBuffer->handle(), 20, 2, palettes);
2977*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2978*b7893ccfSSadaf Ebrahimi 
2979*b7893ccfSSadaf Ebrahimi     // shadingRatePaletteEntryCount must be in range
2980*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2981*b7893ccfSSadaf Ebrahimi                                          "VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-02071");
2982*b7893ccfSSadaf Ebrahimi     vkCmdSetViewportShadingRatePaletteNV(m_commandBuffer->handle(), 0, 1, palettes);
2983*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
2984*b7893ccfSSadaf Ebrahimi 
2985*b7893ccfSSadaf Ebrahimi     VkCoarseSampleLocationNV locations[100] = {
2986*b7893ccfSSadaf Ebrahimi         {0, 0, 0},    {0, 0, 1}, {0, 1, 0}, {0, 1, 1}, {0, 1, 1},  // duplicate
2987*b7893ccfSSadaf Ebrahimi         {1000, 0, 0},                                              // pixelX too large
2988*b7893ccfSSadaf Ebrahimi         {0, 1000, 0},                                              // pixelY too large
2989*b7893ccfSSadaf Ebrahimi         {0, 0, 1000},                                              // sample too large
2990*b7893ccfSSadaf Ebrahimi     };
2991*b7893ccfSSadaf Ebrahimi 
2992*b7893ccfSSadaf Ebrahimi     // Test custom sample orders, both via pipeline state and via dynamic state
2993*b7893ccfSSadaf Ebrahimi     {
2994*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdBadShadingRate = {VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV, 1, 1,
2995*b7893ccfSSadaf Ebrahimi                                                              locations};
2996*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdBadSampleCount = {VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV, 3, 1,
2997*b7893ccfSSadaf Ebrahimi                                                              locations};
2998*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdBadSampleLocationCount = {VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV,
2999*b7893ccfSSadaf Ebrahimi                                                                      2, 2, locations};
3000*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdDuplicateLocations = {VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV, 2,
3001*b7893ccfSSadaf Ebrahimi                                                                  1 * 2 * 2, &locations[1]};
3002*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdOutOfRangeLocations = {VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV, 2,
3003*b7893ccfSSadaf Ebrahimi                                                                   1 * 2 * 2, &locations[4]};
3004*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdTooLargeSampleLocationCount = {
3005*b7893ccfSSadaf Ebrahimi             VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV, 4, 64, &locations[8]};
3006*b7893ccfSSadaf Ebrahimi         VkCoarseSampleOrderCustomNV sampOrdGood = {VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV, 2, 1 * 2 * 2,
3007*b7893ccfSSadaf Ebrahimi                                                    &locations[0]};
3008*b7893ccfSSadaf Ebrahimi 
3009*b7893ccfSSadaf Ebrahimi         VkPipelineViewportCoarseSampleOrderStateCreateInfoNV csosci = {
3010*b7893ccfSSadaf Ebrahimi             VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV};
3011*b7893ccfSSadaf Ebrahimi         csosci.sampleOrderType = VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV;
3012*b7893ccfSSadaf Ebrahimi         csosci.customSampleOrderCount = 1;
3013*b7893ccfSSadaf Ebrahimi 
3014*b7893ccfSSadaf Ebrahimi         using std::vector;
3015*b7893ccfSSadaf Ebrahimi         struct TestCase {
3016*b7893ccfSSadaf Ebrahimi             const VkCoarseSampleOrderCustomNV *order;
3017*b7893ccfSSadaf Ebrahimi             vector<std::string> vuids;
3018*b7893ccfSSadaf Ebrahimi         };
3019*b7893ccfSSadaf Ebrahimi 
3020*b7893ccfSSadaf Ebrahimi         vector<TestCase> test_cases = {
3021*b7893ccfSSadaf Ebrahimi             {&sampOrdBadShadingRate, {"VUID-VkCoarseSampleOrderCustomNV-shadingRate-02073"}},
3022*b7893ccfSSadaf Ebrahimi             {&sampOrdBadSampleCount,
3023*b7893ccfSSadaf Ebrahimi              {"VUID-VkCoarseSampleOrderCustomNV-sampleCount-02074", "VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02075"}},
3024*b7893ccfSSadaf Ebrahimi             {&sampOrdBadSampleLocationCount, {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02075"}},
3025*b7893ccfSSadaf Ebrahimi             {&sampOrdDuplicateLocations, {"VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077"}},
3026*b7893ccfSSadaf Ebrahimi             {&sampOrdOutOfRangeLocations,
3027*b7893ccfSSadaf Ebrahimi              {"VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077", "VUID-VkCoarseSampleLocationNV-pixelX-02078",
3028*b7893ccfSSadaf Ebrahimi               "VUID-VkCoarseSampleLocationNV-pixelY-02079", "VUID-VkCoarseSampleLocationNV-sample-02080"}},
3029*b7893ccfSSadaf Ebrahimi             {&sampOrdTooLargeSampleLocationCount,
3030*b7893ccfSSadaf Ebrahimi              {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02076",
3031*b7893ccfSSadaf Ebrahimi               "VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077"}},
3032*b7893ccfSSadaf Ebrahimi             {&sampOrdGood, {}},
3033*b7893ccfSSadaf Ebrahimi         };
3034*b7893ccfSSadaf Ebrahimi 
3035*b7893ccfSSadaf Ebrahimi         for (const auto &test_case : test_cases) {
3036*b7893ccfSSadaf Ebrahimi             const auto break_vp = [&](CreatePipelineHelper &helper) {
3037*b7893ccfSSadaf Ebrahimi                 helper.vp_state_ci_.pNext = &csosci;
3038*b7893ccfSSadaf Ebrahimi                 csosci.pCustomSampleOrders = test_case.order;
3039*b7893ccfSSadaf Ebrahimi             };
3040*b7893ccfSSadaf Ebrahimi             CreatePipelineHelper::OneshotTest(*this, break_vp, VK_DEBUG_REPORT_ERROR_BIT_EXT, test_case.vuids);
3041*b7893ccfSSadaf Ebrahimi         }
3042*b7893ccfSSadaf Ebrahimi 
3043*b7893ccfSSadaf Ebrahimi         // Test vkCmdSetCoarseSampleOrderNV errors
3044*b7893ccfSSadaf Ebrahimi         auto vkCmdSetCoarseSampleOrderNV =
3045*b7893ccfSSadaf Ebrahimi             (PFN_vkCmdSetCoarseSampleOrderNV)vkGetDeviceProcAddr(m_device->device(), "vkCmdSetCoarseSampleOrderNV");
3046*b7893ccfSSadaf Ebrahimi 
3047*b7893ccfSSadaf Ebrahimi         for (const auto &test_case : test_cases) {
3048*b7893ccfSSadaf Ebrahimi             for (uint32_t i = 0; i < test_case.vuids.size(); ++i) {
3049*b7893ccfSSadaf Ebrahimi                 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, test_case.vuids[i]);
3050*b7893ccfSSadaf Ebrahimi             }
3051*b7893ccfSSadaf Ebrahimi             vkCmdSetCoarseSampleOrderNV(m_commandBuffer->handle(), VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, 1, test_case.order);
3052*b7893ccfSSadaf Ebrahimi             if (test_case.vuids.size()) {
3053*b7893ccfSSadaf Ebrahimi                 m_errorMonitor->VerifyFound();
3054*b7893ccfSSadaf Ebrahimi             } else {
3055*b7893ccfSSadaf Ebrahimi                 m_errorMonitor->VerifyNotFound();
3056*b7893ccfSSadaf Ebrahimi             }
3057*b7893ccfSSadaf Ebrahimi         }
3058*b7893ccfSSadaf Ebrahimi 
3059*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3060*b7893ccfSSadaf Ebrahimi                                              "VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-02081");
3061*b7893ccfSSadaf Ebrahimi         vkCmdSetCoarseSampleOrderNV(m_commandBuffer->handle(), VK_COARSE_SAMPLE_ORDER_TYPE_PIXEL_MAJOR_NV, 1, &sampOrdGood);
3062*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
3063*b7893ccfSSadaf Ebrahimi     }
3064*b7893ccfSSadaf Ebrahimi 
3065*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
3066*b7893ccfSSadaf Ebrahimi 
3067*b7893ccfSSadaf Ebrahimi     vkDestroyImageView(m_device->device(), view, NULL);
3068*b7893ccfSSadaf Ebrahimi }
3069*b7893ccfSSadaf Ebrahimi 
3070*b7893ccfSSadaf Ebrahimi #ifdef VK_USE_PLATFORM_ANDROID_KHR
3071*b7893ccfSSadaf Ebrahimi #include "android_ndk_types.h"
3072*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferImageCreate)3073*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferImageCreate) {
3074*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer image create info.");
3075*b7893ccfSSadaf Ebrahimi 
3076*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3077*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3078*b7893ccfSSadaf Ebrahimi 
3079*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3080*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3081*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3082*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3083*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3084*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3085*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3086*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3087*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3088*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3089*b7893ccfSSadaf Ebrahimi     } else {
3090*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3091*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3092*b7893ccfSSadaf Ebrahimi         return;
3093*b7893ccfSSadaf Ebrahimi     }
3094*b7893ccfSSadaf Ebrahimi 
3095*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3096*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3097*b7893ccfSSadaf Ebrahimi 
3098*b7893ccfSSadaf Ebrahimi     VkImage img = VK_NULL_HANDLE;
3099*b7893ccfSSadaf Ebrahimi     auto reset_img = [&img, dev]() {
3100*b7893ccfSSadaf Ebrahimi         if (VK_NULL_HANDLE != img) vkDestroyImage(dev, img, NULL);
3101*b7893ccfSSadaf Ebrahimi         img = VK_NULL_HANDLE;
3102*b7893ccfSSadaf Ebrahimi     };
3103*b7893ccfSSadaf Ebrahimi 
3104*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo ici = {};
3105*b7893ccfSSadaf Ebrahimi     ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3106*b7893ccfSSadaf Ebrahimi     ici.pNext = nullptr;
3107*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_2D;
3108*b7893ccfSSadaf Ebrahimi     ici.arrayLayers = 1;
3109*b7893ccfSSadaf Ebrahimi     ici.extent = {64, 64, 1};
3110*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_UNDEFINED;
3111*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 1;
3112*b7893ccfSSadaf Ebrahimi     ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3113*b7893ccfSSadaf Ebrahimi     ici.samples = VK_SAMPLE_COUNT_1_BIT;
3114*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_OPTIMAL;
3115*b7893ccfSSadaf Ebrahimi     ici.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3116*b7893ccfSSadaf Ebrahimi 
3117*b7893ccfSSadaf Ebrahimi     // undefined format
3118*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-01975");
3119*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("VUID_Undefined");
3120*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3121*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3122*b7893ccfSSadaf Ebrahimi     reset_img();
3123*b7893ccfSSadaf Ebrahimi 
3124*b7893ccfSSadaf Ebrahimi     // also undefined format
3125*b7893ccfSSadaf Ebrahimi     VkExternalFormatANDROID efa = {};
3126*b7893ccfSSadaf Ebrahimi     efa.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
3127*b7893ccfSSadaf Ebrahimi     efa.externalFormat = 0;
3128*b7893ccfSSadaf Ebrahimi     ici.pNext = &efa;
3129*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-01975");
3130*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3131*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3132*b7893ccfSSadaf Ebrahimi     reset_img();
3133*b7893ccfSSadaf Ebrahimi 
3134*b7893ccfSSadaf Ebrahimi     // undefined format with an unknown external format
3135*b7893ccfSSadaf Ebrahimi     efa.externalFormat = 0xBADC0DE;
3136*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkExternalFormatANDROID-externalFormat-01894");
3137*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3138*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3139*b7893ccfSSadaf Ebrahimi     reset_img();
3140*b7893ccfSSadaf Ebrahimi 
3141*b7893ccfSSadaf Ebrahimi     AHardwareBuffer *ahb;
3142*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_Desc ahb_desc = {};
3143*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
3144*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3145*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 64;
3146*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 64;
3147*b7893ccfSSadaf Ebrahimi     ahb_desc.layers = 1;
3148*b7893ccfSSadaf Ebrahimi     // Allocate an AHardwareBuffer
3149*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_allocate(&ahb_desc, &ahb);
3150*b7893ccfSSadaf Ebrahimi 
3151*b7893ccfSSadaf Ebrahimi     // Retrieve it's properties to make it's external format 'known' (AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM)
3152*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferFormatPropertiesANDROID ahb_fmt_props = {};
3153*b7893ccfSSadaf Ebrahimi     ahb_fmt_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
3154*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
3155*b7893ccfSSadaf Ebrahimi     ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
3156*b7893ccfSSadaf Ebrahimi     ahb_props.pNext = &ahb_fmt_props;
3157*b7893ccfSSadaf Ebrahimi     PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
3158*b7893ccfSSadaf Ebrahimi         (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vkGetDeviceProcAddr(dev, "vkGetAndroidHardwareBufferPropertiesANDROID");
3159*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(pfn_GetAHBProps != nullptr);
3160*b7893ccfSSadaf Ebrahimi     pfn_GetAHBProps(dev, ahb, &ahb_props);
3161*b7893ccfSSadaf Ebrahimi 
3162*b7893ccfSSadaf Ebrahimi     // a defined image format with a non-zero external format
3163*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_R8G8B8A8_UNORM;
3164*b7893ccfSSadaf Ebrahimi     efa.externalFormat = ahb_fmt_props.externalFormat;
3165*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-01974");
3166*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3167*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3168*b7893ccfSSadaf Ebrahimi     reset_img();
3169*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_UNDEFINED;
3170*b7893ccfSSadaf Ebrahimi 
3171*b7893ccfSSadaf Ebrahimi     // external format while MUTABLE
3172*b7893ccfSSadaf Ebrahimi     ici.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
3173*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-02396");
3174*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3175*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3176*b7893ccfSSadaf Ebrahimi     reset_img();
3177*b7893ccfSSadaf Ebrahimi     ici.flags = 0;
3178*b7893ccfSSadaf Ebrahimi 
3179*b7893ccfSSadaf Ebrahimi     // external format while usage other than SAMPLED
3180*b7893ccfSSadaf Ebrahimi     ici.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
3181*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-02397");
3182*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3183*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3184*b7893ccfSSadaf Ebrahimi     reset_img();
3185*b7893ccfSSadaf Ebrahimi     ici.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3186*b7893ccfSSadaf Ebrahimi 
3187*b7893ccfSSadaf Ebrahimi     // external format while tiline other than OPTIMAL
3188*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_LINEAR;
3189*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-02398");
3190*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3191*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3192*b7893ccfSSadaf Ebrahimi     reset_img();
3193*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_OPTIMAL;
3194*b7893ccfSSadaf Ebrahimi 
3195*b7893ccfSSadaf Ebrahimi     // imageType
3196*b7893ccfSSadaf Ebrahimi     VkExternalMemoryImageCreateInfo emici = {};
3197*b7893ccfSSadaf Ebrahimi     emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
3198*b7893ccfSSadaf Ebrahimi     emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
3199*b7893ccfSSadaf Ebrahimi     ici.pNext = &emici;  // remove efa from chain, insert emici
3200*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_R8G8B8A8_UNORM;
3201*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_3D;
3202*b7893ccfSSadaf Ebrahimi     ici.extent = {64, 64, 64};
3203*b7893ccfSSadaf Ebrahimi 
3204*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-02393");
3205*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3206*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3207*b7893ccfSSadaf Ebrahimi     reset_img();
3208*b7893ccfSSadaf Ebrahimi 
3209*b7893ccfSSadaf Ebrahimi     // wrong mipLevels
3210*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_2D;
3211*b7893ccfSSadaf Ebrahimi     ici.extent = {64, 64, 1};
3212*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 6;  // should be 7
3213*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageCreateInfo-pNext-02394");
3214*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3215*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3216*b7893ccfSSadaf Ebrahimi     reset_img();
3217*b7893ccfSSadaf Ebrahimi }
3218*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferFetchUnboundImageInfo)3219*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferFetchUnboundImageInfo) {
3220*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer retreive image properties while memory unbound.");
3221*b7893ccfSSadaf Ebrahimi 
3222*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3223*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3224*b7893ccfSSadaf Ebrahimi 
3225*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3226*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3227*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3228*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3229*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3230*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3231*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3232*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3233*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3234*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3235*b7893ccfSSadaf Ebrahimi     } else {
3236*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3237*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3238*b7893ccfSSadaf Ebrahimi         return;
3239*b7893ccfSSadaf Ebrahimi     }
3240*b7893ccfSSadaf Ebrahimi 
3241*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3242*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3243*b7893ccfSSadaf Ebrahimi 
3244*b7893ccfSSadaf Ebrahimi     VkImage img = VK_NULL_HANDLE;
3245*b7893ccfSSadaf Ebrahimi     auto reset_img = [&img, dev]() {
3246*b7893ccfSSadaf Ebrahimi         if (VK_NULL_HANDLE != img) vkDestroyImage(dev, img, NULL);
3247*b7893ccfSSadaf Ebrahimi         img = VK_NULL_HANDLE;
3248*b7893ccfSSadaf Ebrahimi     };
3249*b7893ccfSSadaf Ebrahimi 
3250*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo ici = {};
3251*b7893ccfSSadaf Ebrahimi     ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3252*b7893ccfSSadaf Ebrahimi     ici.pNext = nullptr;
3253*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_2D;
3254*b7893ccfSSadaf Ebrahimi     ici.arrayLayers = 1;
3255*b7893ccfSSadaf Ebrahimi     ici.extent = {64, 64, 1};
3256*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_R8G8B8A8_UNORM;
3257*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 1;
3258*b7893ccfSSadaf Ebrahimi     ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3259*b7893ccfSSadaf Ebrahimi     ici.samples = VK_SAMPLE_COUNT_1_BIT;
3260*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_LINEAR;
3261*b7893ccfSSadaf Ebrahimi     ici.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3262*b7893ccfSSadaf Ebrahimi 
3263*b7893ccfSSadaf Ebrahimi     VkExternalMemoryImageCreateInfo emici = {};
3264*b7893ccfSSadaf Ebrahimi     emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
3265*b7893ccfSSadaf Ebrahimi     emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
3266*b7893ccfSSadaf Ebrahimi     ici.pNext = &emici;
3267*b7893ccfSSadaf Ebrahimi 
3268*b7893ccfSSadaf Ebrahimi     m_errorMonitor->ExpectSuccess();
3269*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3270*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
3271*b7893ccfSSadaf Ebrahimi 
3272*b7893ccfSSadaf Ebrahimi     // attempt to fetch layout from unbound image
3273*b7893ccfSSadaf Ebrahimi     VkImageSubresource sub_rsrc = {};
3274*b7893ccfSSadaf Ebrahimi     sub_rsrc.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3275*b7893ccfSSadaf Ebrahimi     VkSubresourceLayout sub_layout = {};
3276*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkGetImageSubresourceLayout-image-01895");
3277*b7893ccfSSadaf Ebrahimi     vkGetImageSubresourceLayout(dev, img, &sub_rsrc, &sub_layout);
3278*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3279*b7893ccfSSadaf Ebrahimi 
3280*b7893ccfSSadaf Ebrahimi     // attempt to get memory reqs from unbound image
3281*b7893ccfSSadaf Ebrahimi     VkImageMemoryRequirementsInfo2 imri = {};
3282*b7893ccfSSadaf Ebrahimi     imri.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2;
3283*b7893ccfSSadaf Ebrahimi     imri.image = img;
3284*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements2 mem_reqs = {};
3285*b7893ccfSSadaf Ebrahimi     mem_reqs.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
3286*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageMemoryRequirementsInfo2-image-01897");
3287*b7893ccfSSadaf Ebrahimi     vkGetImageMemoryRequirements2(dev, &imri, &mem_reqs);
3288*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3289*b7893ccfSSadaf Ebrahimi 
3290*b7893ccfSSadaf Ebrahimi     reset_img();
3291*b7893ccfSSadaf Ebrahimi }
3292*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferMemoryAllocation)3293*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferMemoryAllocation) {
3294*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer memory allocation.");
3295*b7893ccfSSadaf Ebrahimi 
3296*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3297*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3298*b7893ccfSSadaf Ebrahimi 
3299*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3300*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3301*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3302*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3303*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3304*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3305*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3306*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3307*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3308*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3309*b7893ccfSSadaf Ebrahimi     } else {
3310*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3311*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3312*b7893ccfSSadaf Ebrahimi         return;
3313*b7893ccfSSadaf Ebrahimi     }
3314*b7893ccfSSadaf Ebrahimi 
3315*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3316*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3317*b7893ccfSSadaf Ebrahimi 
3318*b7893ccfSSadaf Ebrahimi     VkImage img = VK_NULL_HANDLE;
3319*b7893ccfSSadaf Ebrahimi     auto reset_img = [&img, dev]() {
3320*b7893ccfSSadaf Ebrahimi         if (VK_NULL_HANDLE != img) vkDestroyImage(dev, img, NULL);
3321*b7893ccfSSadaf Ebrahimi         img = VK_NULL_HANDLE;
3322*b7893ccfSSadaf Ebrahimi     };
3323*b7893ccfSSadaf Ebrahimi     VkDeviceMemory mem_handle = VK_NULL_HANDLE;
3324*b7893ccfSSadaf Ebrahimi     auto reset_mem = [&mem_handle, dev]() {
3325*b7893ccfSSadaf Ebrahimi         if (VK_NULL_HANDLE != mem_handle) vkFreeMemory(dev, mem_handle, NULL);
3326*b7893ccfSSadaf Ebrahimi         mem_handle = VK_NULL_HANDLE;
3327*b7893ccfSSadaf Ebrahimi     };
3328*b7893ccfSSadaf Ebrahimi 
3329*b7893ccfSSadaf Ebrahimi     PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
3330*b7893ccfSSadaf Ebrahimi         (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vkGetDeviceProcAddr(dev, "vkGetAndroidHardwareBufferPropertiesANDROID");
3331*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(pfn_GetAHBProps != nullptr);
3332*b7893ccfSSadaf Ebrahimi 
3333*b7893ccfSSadaf Ebrahimi     // AHB structs
3334*b7893ccfSSadaf Ebrahimi     AHardwareBuffer *ahb = nullptr;
3335*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_Desc ahb_desc = {};
3336*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferFormatPropertiesANDROID ahb_fmt_props = {};
3337*b7893ccfSSadaf Ebrahimi     ahb_fmt_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
3338*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
3339*b7893ccfSSadaf Ebrahimi     ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
3340*b7893ccfSSadaf Ebrahimi     ahb_props.pNext = &ahb_fmt_props;
3341*b7893ccfSSadaf Ebrahimi     VkImportAndroidHardwareBufferInfoANDROID iahbi = {};
3342*b7893ccfSSadaf Ebrahimi     iahbi.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
3343*b7893ccfSSadaf Ebrahimi 
3344*b7893ccfSSadaf Ebrahimi     // destroy and re-acquire an AHB, and fetch it's properties
3345*b7893ccfSSadaf Ebrahimi     auto recreate_ahb = [&ahb, &iahbi, &ahb_desc, &ahb_props, dev, pfn_GetAHBProps]() {
3346*b7893ccfSSadaf Ebrahimi         if (ahb) AHardwareBuffer_release(ahb);
3347*b7893ccfSSadaf Ebrahimi         ahb = nullptr;
3348*b7893ccfSSadaf Ebrahimi         AHardwareBuffer_allocate(&ahb_desc, &ahb);
3349*b7893ccfSSadaf Ebrahimi         if (ahb) {
3350*b7893ccfSSadaf Ebrahimi             pfn_GetAHBProps(dev, ahb, &ahb_props);
3351*b7893ccfSSadaf Ebrahimi             iahbi.buffer = ahb;
3352*b7893ccfSSadaf Ebrahimi         }
3353*b7893ccfSSadaf Ebrahimi     };
3354*b7893ccfSSadaf Ebrahimi 
3355*b7893ccfSSadaf Ebrahimi     // Allocate an AHardwareBuffer
3356*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
3357*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3358*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 64;
3359*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 64;
3360*b7893ccfSSadaf Ebrahimi     ahb_desc.layers = 1;
3361*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3362*b7893ccfSSadaf Ebrahimi 
3363*b7893ccfSSadaf Ebrahimi     // Create an image w/ external format
3364*b7893ccfSSadaf Ebrahimi     VkExternalFormatANDROID efa = {};
3365*b7893ccfSSadaf Ebrahimi     efa.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
3366*b7893ccfSSadaf Ebrahimi     efa.externalFormat = ahb_fmt_props.externalFormat;
3367*b7893ccfSSadaf Ebrahimi 
3368*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo ici = {};
3369*b7893ccfSSadaf Ebrahimi     ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3370*b7893ccfSSadaf Ebrahimi     ici.pNext = &efa;
3371*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_2D;
3372*b7893ccfSSadaf Ebrahimi     ici.arrayLayers = 1;
3373*b7893ccfSSadaf Ebrahimi     ici.extent = {64, 64, 1};
3374*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_UNDEFINED;
3375*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 1;
3376*b7893ccfSSadaf Ebrahimi     ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3377*b7893ccfSSadaf Ebrahimi     ici.samples = VK_SAMPLE_COUNT_1_BIT;
3378*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_OPTIMAL;
3379*b7893ccfSSadaf Ebrahimi     ici.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3380*b7893ccfSSadaf Ebrahimi     VkResult res = vkCreateImage(dev, &ici, NULL, &img);
3381*b7893ccfSSadaf Ebrahimi     ASSERT_VK_SUCCESS(res);
3382*b7893ccfSSadaf Ebrahimi 
3383*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo mai = {};
3384*b7893ccfSSadaf Ebrahimi     mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3385*b7893ccfSSadaf Ebrahimi     mai.pNext = &iahbi;  // Chained import struct
3386*b7893ccfSSadaf Ebrahimi     mai.allocationSize = ahb_props.allocationSize;
3387*b7893ccfSSadaf Ebrahimi     mai.memoryTypeIndex = 32;
3388*b7893ccfSSadaf Ebrahimi     // Set index to match one of the bits in ahb_props
3389*b7893ccfSSadaf Ebrahimi     for (int i = 0; i < 32; i++) {
3390*b7893ccfSSadaf Ebrahimi         if (ahb_props.memoryTypeBits & (1 << i)) {
3391*b7893ccfSSadaf Ebrahimi             mai.memoryTypeIndex = i;
3392*b7893ccfSSadaf Ebrahimi             break;
3393*b7893ccfSSadaf Ebrahimi         }
3394*b7893ccfSSadaf Ebrahimi     }
3395*b7893ccfSSadaf Ebrahimi     ASSERT_NE(32, mai.memoryTypeIndex);
3396*b7893ccfSSadaf Ebrahimi 
3397*b7893ccfSSadaf Ebrahimi     // Import w/ non-dedicated memory allocation
3398*b7893ccfSSadaf Ebrahimi 
3399*b7893ccfSSadaf Ebrahimi     // Import requires format AHB_FMT_BLOB and usage AHB_USAGE_GPU_DATA_BUFFER
3400*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02384");
3401*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3402*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3403*b7893ccfSSadaf Ebrahimi     reset_mem();
3404*b7893ccfSSadaf Ebrahimi 
3405*b7893ccfSSadaf Ebrahimi     // Allocation size mismatch
3406*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
3407*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
3408*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 1;
3409*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3410*b7893ccfSSadaf Ebrahimi     mai.allocationSize = ahb_props.allocationSize + 1;
3411*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-allocationSize-02383");
3412*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3413*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3414*b7893ccfSSadaf Ebrahimi     mai.allocationSize = ahb_props.allocationSize;
3415*b7893ccfSSadaf Ebrahimi     reset_mem();
3416*b7893ccfSSadaf Ebrahimi 
3417*b7893ccfSSadaf Ebrahimi     // memoryTypeIndex mismatch
3418*b7893ccfSSadaf Ebrahimi     mai.memoryTypeIndex++;
3419*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-memoryTypeIndex-02385");
3420*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3421*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3422*b7893ccfSSadaf Ebrahimi     mai.memoryTypeIndex--;
3423*b7893ccfSSadaf Ebrahimi     reset_mem();
3424*b7893ccfSSadaf Ebrahimi 
3425*b7893ccfSSadaf Ebrahimi     // Insert dedicated image memory allocation to mai chain
3426*b7893ccfSSadaf Ebrahimi     VkMemoryDedicatedAllocateInfo mdai = {};
3427*b7893ccfSSadaf Ebrahimi     mdai.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
3428*b7893ccfSSadaf Ebrahimi     mdai.image = img;
3429*b7893ccfSSadaf Ebrahimi     mdai.buffer = VK_NULL_HANDLE;
3430*b7893ccfSSadaf Ebrahimi     mdai.pNext = mai.pNext;
3431*b7893ccfSSadaf Ebrahimi     mai.pNext = &mdai;
3432*b7893ccfSSadaf Ebrahimi 
3433*b7893ccfSSadaf Ebrahimi     // Dedicated allocation with unmatched usage bits
3434*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
3435*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT;
3436*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 64;
3437*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3438*b7893ccfSSadaf Ebrahimi     mai.allocationSize = ahb_props.allocationSize;
3439*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02390");
3440*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3441*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3442*b7893ccfSSadaf Ebrahimi     reset_mem();
3443*b7893ccfSSadaf Ebrahimi 
3444*b7893ccfSSadaf Ebrahimi     // Dedicated allocation with incomplete mip chain
3445*b7893ccfSSadaf Ebrahimi     reset_img();
3446*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 2;
3447*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3448*b7893ccfSSadaf Ebrahimi     mdai.image = img;
3449*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE;
3450*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3451*b7893ccfSSadaf Ebrahimi 
3452*b7893ccfSSadaf Ebrahimi     if (ahb) {
3453*b7893ccfSSadaf Ebrahimi         mai.allocationSize = ahb_props.allocationSize;
3454*b7893ccfSSadaf Ebrahimi         for (int i = 0; i < 32; i++) {
3455*b7893ccfSSadaf Ebrahimi             if (ahb_props.memoryTypeBits & (1 << i)) {
3456*b7893ccfSSadaf Ebrahimi                 mai.memoryTypeIndex = i;
3457*b7893ccfSSadaf Ebrahimi                 break;
3458*b7893ccfSSadaf Ebrahimi             }
3459*b7893ccfSSadaf Ebrahimi         }
3460*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02389");
3461*b7893ccfSSadaf Ebrahimi         vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3462*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
3463*b7893ccfSSadaf Ebrahimi         reset_mem();
3464*b7893ccfSSadaf Ebrahimi     } else {
3465*b7893ccfSSadaf Ebrahimi         // ERROR: AHardwareBuffer_allocate() with MIPMAP_COMPLETE fails. It returns -12, NO_MEMORY.
3466*b7893ccfSSadaf Ebrahimi         // The problem seems to happen in Pixel 2, not Pixel 3.
3467*b7893ccfSSadaf Ebrahimi         printf("%s AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE not supported, skipping tests\n", kSkipPrefix);
3468*b7893ccfSSadaf Ebrahimi     }
3469*b7893ccfSSadaf Ebrahimi 
3470*b7893ccfSSadaf Ebrahimi     // Dedicated allocation with mis-matched dimension
3471*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3472*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 32;
3473*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 128;
3474*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3475*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02388");
3476*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3477*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3478*b7893ccfSSadaf Ebrahimi     reset_mem();
3479*b7893ccfSSadaf Ebrahimi 
3480*b7893ccfSSadaf Ebrahimi     // Dedicated allocation with mis-matched VkFormat
3481*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3482*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 64;
3483*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 64;
3484*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3485*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 1;
3486*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_B8G8R8A8_UNORM;
3487*b7893ccfSSadaf Ebrahimi     ici.pNext = NULL;
3488*b7893ccfSSadaf Ebrahimi     VkImage img2;
3489*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img2);
3490*b7893ccfSSadaf Ebrahimi     mdai.image = img2;
3491*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02387");
3492*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3493*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3494*b7893ccfSSadaf Ebrahimi     vkDestroyImage(dev, img2, NULL);
3495*b7893ccfSSadaf Ebrahimi     mdai.image = img;
3496*b7893ccfSSadaf Ebrahimi     reset_mem();
3497*b7893ccfSSadaf Ebrahimi 
3498*b7893ccfSSadaf Ebrahimi     // Missing required ahb usage
3499*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
3500*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3501*b7893ccfSSadaf Ebrahimi                                          "VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884");
3502*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3503*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3504*b7893ccfSSadaf Ebrahimi 
3505*b7893ccfSSadaf Ebrahimi     // Dedicated allocation with missing usage bits
3506*b7893ccfSSadaf Ebrahimi     // Setting up this test also triggers a slew of others
3507*b7893ccfSSadaf Ebrahimi     mai.allocationSize = ahb_props.allocationSize + 1;
3508*b7893ccfSSadaf Ebrahimi     mai.memoryTypeIndex = 0;
3509*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02390");
3510*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-memoryTypeIndex-02385");
3511*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-allocationSize-02383");
3512*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02386");
3513*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3514*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3515*b7893ccfSSadaf Ebrahimi     reset_mem();
3516*b7893ccfSSadaf Ebrahimi 
3517*b7893ccfSSadaf Ebrahimi     // Non-import allocation - replace import struct in chain with export struct
3518*b7893ccfSSadaf Ebrahimi     VkExportMemoryAllocateInfo emai = {};
3519*b7893ccfSSadaf Ebrahimi     emai.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
3520*b7893ccfSSadaf Ebrahimi     emai.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
3521*b7893ccfSSadaf Ebrahimi     mai.pNext = &emai;
3522*b7893ccfSSadaf Ebrahimi     emai.pNext = &mdai;  // still dedicated
3523*b7893ccfSSadaf Ebrahimi     mdai.pNext = nullptr;
3524*b7893ccfSSadaf Ebrahimi 
3525*b7893ccfSSadaf Ebrahimi     // Export with allocation size non-zero
3526*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3527*b7893ccfSSadaf Ebrahimi     recreate_ahb();
3528*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-01874");
3529*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3530*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3531*b7893ccfSSadaf Ebrahimi     reset_mem();
3532*b7893ccfSSadaf Ebrahimi 
3533*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_release(ahb);
3534*b7893ccfSSadaf Ebrahimi     reset_mem();
3535*b7893ccfSSadaf Ebrahimi     reset_img();
3536*b7893ccfSSadaf Ebrahimi }
3537*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferCreateYCbCrSampler)3538*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferCreateYCbCrSampler) {
3539*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer YCbCr sampler creation.");
3540*b7893ccfSSadaf Ebrahimi 
3541*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3542*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3543*b7893ccfSSadaf Ebrahimi 
3544*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3545*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3546*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3547*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3548*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3549*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3550*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3551*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3552*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3553*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3554*b7893ccfSSadaf Ebrahimi     } else {
3555*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3556*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3557*b7893ccfSSadaf Ebrahimi         return;
3558*b7893ccfSSadaf Ebrahimi     }
3559*b7893ccfSSadaf Ebrahimi 
3560*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3561*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3562*b7893ccfSSadaf Ebrahimi 
3563*b7893ccfSSadaf Ebrahimi     VkSamplerYcbcrConversion ycbcr_conv = VK_NULL_HANDLE;
3564*b7893ccfSSadaf Ebrahimi     VkSamplerYcbcrConversionCreateInfo sycci = {};
3565*b7893ccfSSadaf Ebrahimi     sycci.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO;
3566*b7893ccfSSadaf Ebrahimi     sycci.format = VK_FORMAT_UNDEFINED;
3567*b7893ccfSSadaf Ebrahimi     sycci.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
3568*b7893ccfSSadaf Ebrahimi     sycci.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL;
3569*b7893ccfSSadaf Ebrahimi 
3570*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904");
3571*b7893ccfSSadaf Ebrahimi     vkCreateSamplerYcbcrConversion(dev, &sycci, NULL, &ycbcr_conv);
3572*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3573*b7893ccfSSadaf Ebrahimi 
3574*b7893ccfSSadaf Ebrahimi     VkExternalFormatANDROID efa = {};
3575*b7893ccfSSadaf Ebrahimi     efa.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
3576*b7893ccfSSadaf Ebrahimi     efa.externalFormat = AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
3577*b7893ccfSSadaf Ebrahimi     sycci.format = VK_FORMAT_R8G8B8A8_UNORM;
3578*b7893ccfSSadaf Ebrahimi     sycci.pNext = &efa;
3579*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904");
3580*b7893ccfSSadaf Ebrahimi     vkCreateSamplerYcbcrConversion(dev, &sycci, NULL, &ycbcr_conv);
3581*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3582*b7893ccfSSadaf Ebrahimi }
3583*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferPhysDevImageFormatProp2)3584*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferPhysDevImageFormatProp2) {
3585*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer GetPhysicalDeviceImageFormatProperties.");
3586*b7893ccfSSadaf Ebrahimi 
3587*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3588*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3589*b7893ccfSSadaf Ebrahimi 
3590*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3591*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3592*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3593*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3594*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3595*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3596*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3597*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3598*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3599*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3600*b7893ccfSSadaf Ebrahimi     } else {
3601*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping test\n", kSkipPrefix,
3602*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3603*b7893ccfSSadaf Ebrahimi         return;
3604*b7893ccfSSadaf Ebrahimi     }
3605*b7893ccfSSadaf Ebrahimi 
3606*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3607*b7893ccfSSadaf Ebrahimi 
3608*b7893ccfSSadaf Ebrahimi     if ((m_instance_api_version < VK_API_VERSION_1_1) &&
3609*b7893ccfSSadaf Ebrahimi         !InstanceExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
3610*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping test\n", kSkipPrefix,
3611*b7893ccfSSadaf Ebrahimi                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3612*b7893ccfSSadaf Ebrahimi         return;
3613*b7893ccfSSadaf Ebrahimi     }
3614*b7893ccfSSadaf Ebrahimi 
3615*b7893ccfSSadaf Ebrahimi     VkImageFormatProperties2 ifp = {};
3616*b7893ccfSSadaf Ebrahimi     ifp.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
3617*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceImageFormatInfo2 pdifi = {};
3618*b7893ccfSSadaf Ebrahimi     pdifi.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
3619*b7893ccfSSadaf Ebrahimi     pdifi.format = VK_FORMAT_R8G8B8A8_UNORM;
3620*b7893ccfSSadaf Ebrahimi     pdifi.tiling = VK_IMAGE_TILING_OPTIMAL;
3621*b7893ccfSSadaf Ebrahimi     pdifi.type = VK_IMAGE_TYPE_2D;
3622*b7893ccfSSadaf Ebrahimi     pdifi.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
3623*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferUsageANDROID ahbu = {};
3624*b7893ccfSSadaf Ebrahimi     ahbu.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID;
3625*b7893ccfSSadaf Ebrahimi     ahbu.androidHardwareBufferUsage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3626*b7893ccfSSadaf Ebrahimi     ifp.pNext = &ahbu;
3627*b7893ccfSSadaf Ebrahimi 
3628*b7893ccfSSadaf Ebrahimi     // AHB_usage chained to input without a matching external image format struc chained to output
3629*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3630*b7893ccfSSadaf Ebrahimi                                          "VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868");
3631*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceImageFormatProperties2(m_device->phy().handle(), &pdifi, &ifp);
3632*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3633*b7893ccfSSadaf Ebrahimi 
3634*b7893ccfSSadaf Ebrahimi     // output struct chained, but does not include VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID usage
3635*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceExternalImageFormatInfo pdeifi = {};
3636*b7893ccfSSadaf Ebrahimi     pdeifi.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO;
3637*b7893ccfSSadaf Ebrahimi     pdeifi.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
3638*b7893ccfSSadaf Ebrahimi     pdifi.pNext = &pdeifi;
3639*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3640*b7893ccfSSadaf Ebrahimi                                          "VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868");
3641*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceImageFormatProperties2(m_device->phy().handle(), &pdifi, &ifp);
3642*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3643*b7893ccfSSadaf Ebrahimi }
3644*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferCreateImageView)3645*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferCreateImageView) {
3646*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer image view creation.");
3647*b7893ccfSSadaf Ebrahimi 
3648*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3649*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3650*b7893ccfSSadaf Ebrahimi 
3651*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3652*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3653*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3654*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3655*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3656*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3657*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3658*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3659*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3660*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3661*b7893ccfSSadaf Ebrahimi     } else {
3662*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3663*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3664*b7893ccfSSadaf Ebrahimi         return;
3665*b7893ccfSSadaf Ebrahimi     }
3666*b7893ccfSSadaf Ebrahimi 
3667*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3668*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3669*b7893ccfSSadaf Ebrahimi 
3670*b7893ccfSSadaf Ebrahimi     // Allocate an AHB and fetch its properties
3671*b7893ccfSSadaf Ebrahimi     AHardwareBuffer *ahb = nullptr;
3672*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_Desc ahb_desc = {};
3673*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
3674*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3675*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 64;
3676*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 64;
3677*b7893ccfSSadaf Ebrahimi     ahb_desc.layers = 1;
3678*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_allocate(&ahb_desc, &ahb);
3679*b7893ccfSSadaf Ebrahimi 
3680*b7893ccfSSadaf Ebrahimi     // Retrieve AHB properties to make it's external format 'known'
3681*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferFormatPropertiesANDROID ahb_fmt_props = {};
3682*b7893ccfSSadaf Ebrahimi     ahb_fmt_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
3683*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
3684*b7893ccfSSadaf Ebrahimi     ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
3685*b7893ccfSSadaf Ebrahimi     ahb_props.pNext = &ahb_fmt_props;
3686*b7893ccfSSadaf Ebrahimi     PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
3687*b7893ccfSSadaf Ebrahimi         (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vkGetDeviceProcAddr(dev, "vkGetAndroidHardwareBufferPropertiesANDROID");
3688*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(pfn_GetAHBProps != nullptr);
3689*b7893ccfSSadaf Ebrahimi     pfn_GetAHBProps(dev, ahb, &ahb_props);
3690*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_release(ahb);
3691*b7893ccfSSadaf Ebrahimi 
3692*b7893ccfSSadaf Ebrahimi     // Give image an external format
3693*b7893ccfSSadaf Ebrahimi     VkExternalFormatANDROID efa = {};
3694*b7893ccfSSadaf Ebrahimi     efa.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
3695*b7893ccfSSadaf Ebrahimi     efa.externalFormat = ahb_fmt_props.externalFormat;
3696*b7893ccfSSadaf Ebrahimi 
3697*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
3698*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3699*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 64;
3700*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 1;
3701*b7893ccfSSadaf Ebrahimi     ahb_desc.layers = 1;
3702*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_allocate(&ahb_desc, &ahb);
3703*b7893ccfSSadaf Ebrahimi 
3704*b7893ccfSSadaf Ebrahimi     // Create another VkExternalFormatANDROID for test VUID-VkImageViewCreateInfo-image-02400
3705*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferFormatPropertiesANDROID ahb_fmt_props_Ycbcr = {};
3706*b7893ccfSSadaf Ebrahimi     ahb_fmt_props_Ycbcr.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
3707*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferPropertiesANDROID ahb_props_Ycbcr = {};
3708*b7893ccfSSadaf Ebrahimi     ahb_props_Ycbcr.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
3709*b7893ccfSSadaf Ebrahimi     ahb_props_Ycbcr.pNext = &ahb_fmt_props_Ycbcr;
3710*b7893ccfSSadaf Ebrahimi     pfn_GetAHBProps(dev, ahb, &ahb_props_Ycbcr);
3711*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_release(ahb);
3712*b7893ccfSSadaf Ebrahimi 
3713*b7893ccfSSadaf Ebrahimi     VkExternalFormatANDROID efa_Ycbcr = {};
3714*b7893ccfSSadaf Ebrahimi     efa_Ycbcr.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
3715*b7893ccfSSadaf Ebrahimi     efa_Ycbcr.externalFormat = ahb_fmt_props_Ycbcr.externalFormat;
3716*b7893ccfSSadaf Ebrahimi 
3717*b7893ccfSSadaf Ebrahimi     // Create the image
3718*b7893ccfSSadaf Ebrahimi     VkImage img = VK_NULL_HANDLE;
3719*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo ici = {};
3720*b7893ccfSSadaf Ebrahimi     ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3721*b7893ccfSSadaf Ebrahimi     ici.pNext = &efa;
3722*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_2D;
3723*b7893ccfSSadaf Ebrahimi     ici.arrayLayers = 1;
3724*b7893ccfSSadaf Ebrahimi     ici.extent = {64, 64, 1};
3725*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_UNDEFINED;
3726*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 1;
3727*b7893ccfSSadaf Ebrahimi     ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3728*b7893ccfSSadaf Ebrahimi     ici.samples = VK_SAMPLE_COUNT_1_BIT;
3729*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_OPTIMAL;
3730*b7893ccfSSadaf Ebrahimi     ici.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3731*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3732*b7893ccfSSadaf Ebrahimi 
3733*b7893ccfSSadaf Ebrahimi     // Set up memory allocation
3734*b7893ccfSSadaf Ebrahimi     VkDeviceMemory img_mem = VK_NULL_HANDLE;
3735*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo mai = {};
3736*b7893ccfSSadaf Ebrahimi     mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3737*b7893ccfSSadaf Ebrahimi     mai.allocationSize = 64 * 64 * 4;
3738*b7893ccfSSadaf Ebrahimi     mai.memoryTypeIndex = 0;
3739*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &img_mem);
3740*b7893ccfSSadaf Ebrahimi 
3741*b7893ccfSSadaf Ebrahimi     // It shouldn't use vkGetImageMemoryRequirements for AndroidHardwareBuffer.
3742*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-DrawState-InvalidImage");
3743*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements img_mem_reqs = {};
3744*b7893ccfSSadaf Ebrahimi     vkGetImageMemoryRequirements(m_device->device(), img, &img_mem_reqs);
3745*b7893ccfSSadaf Ebrahimi     vkBindImageMemory(dev, img, img_mem, 0);
3746*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3747*b7893ccfSSadaf Ebrahimi 
3748*b7893ccfSSadaf Ebrahimi     // Bind image to memory
3749*b7893ccfSSadaf Ebrahimi     vkDestroyImage(dev, img, NULL);
3750*b7893ccfSSadaf Ebrahimi     vkFreeMemory(dev, img_mem, NULL);
3751*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
3752*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &img_mem);
3753*b7893ccfSSadaf Ebrahimi     vkBindImageMemory(dev, img, img_mem, 0);
3754*b7893ccfSSadaf Ebrahimi 
3755*b7893ccfSSadaf Ebrahimi     // Create a YCbCr conversion, with different external format, chain to view
3756*b7893ccfSSadaf Ebrahimi     VkSamplerYcbcrConversion ycbcr_conv = VK_NULL_HANDLE;
3757*b7893ccfSSadaf Ebrahimi     VkSamplerYcbcrConversionCreateInfo sycci = {};
3758*b7893ccfSSadaf Ebrahimi     sycci.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO;
3759*b7893ccfSSadaf Ebrahimi     sycci.pNext = &efa_Ycbcr;
3760*b7893ccfSSadaf Ebrahimi     sycci.format = VK_FORMAT_UNDEFINED;
3761*b7893ccfSSadaf Ebrahimi     sycci.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
3762*b7893ccfSSadaf Ebrahimi     sycci.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL;
3763*b7893ccfSSadaf Ebrahimi     vkCreateSamplerYcbcrConversion(dev, &sycci, NULL, &ycbcr_conv);
3764*b7893ccfSSadaf Ebrahimi     VkSamplerYcbcrConversionInfo syci = {};
3765*b7893ccfSSadaf Ebrahimi     syci.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO;
3766*b7893ccfSSadaf Ebrahimi     syci.conversion = ycbcr_conv;
3767*b7893ccfSSadaf Ebrahimi 
3768*b7893ccfSSadaf Ebrahimi     // Create a view
3769*b7893ccfSSadaf Ebrahimi     VkImageView image_view = VK_NULL_HANDLE;
3770*b7893ccfSSadaf Ebrahimi     VkImageViewCreateInfo ivci = {};
3771*b7893ccfSSadaf Ebrahimi     ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3772*b7893ccfSSadaf Ebrahimi     ivci.pNext = &syci;
3773*b7893ccfSSadaf Ebrahimi     ivci.image = img;
3774*b7893ccfSSadaf Ebrahimi     ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3775*b7893ccfSSadaf Ebrahimi     ivci.format = VK_FORMAT_UNDEFINED;
3776*b7893ccfSSadaf Ebrahimi     ivci.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
3777*b7893ccfSSadaf Ebrahimi 
3778*b7893ccfSSadaf Ebrahimi     auto reset_view = [&image_view, dev]() {
3779*b7893ccfSSadaf Ebrahimi         if (VK_NULL_HANDLE != image_view) vkDestroyImageView(dev, image_view, NULL);
3780*b7893ccfSSadaf Ebrahimi         image_view = VK_NULL_HANDLE;
3781*b7893ccfSSadaf Ebrahimi     };
3782*b7893ccfSSadaf Ebrahimi 
3783*b7893ccfSSadaf Ebrahimi     // Up to this point, no errors expected
3784*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
3785*b7893ccfSSadaf Ebrahimi 
3786*b7893ccfSSadaf Ebrahimi     // Chained ycbcr conversion has different (external) format than image
3787*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-02400");
3788*b7893ccfSSadaf Ebrahimi     // Also causes "unsupported format" - should be removed in future spec update
3789*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-None-02273");
3790*b7893ccfSSadaf Ebrahimi     vkCreateImageView(dev, &ivci, NULL, &image_view);
3791*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3792*b7893ccfSSadaf Ebrahimi 
3793*b7893ccfSSadaf Ebrahimi     reset_view();
3794*b7893ccfSSadaf Ebrahimi     vkDestroySamplerYcbcrConversion(dev, ycbcr_conv, NULL);
3795*b7893ccfSSadaf Ebrahimi     sycci.pNext = &efa;
3796*b7893ccfSSadaf Ebrahimi     vkCreateSamplerYcbcrConversion(dev, &sycci, NULL, &ycbcr_conv);
3797*b7893ccfSSadaf Ebrahimi     syci.conversion = ycbcr_conv;
3798*b7893ccfSSadaf Ebrahimi 
3799*b7893ccfSSadaf Ebrahimi     // View component swizzle not IDENTITY
3800*b7893ccfSSadaf Ebrahimi     ivci.components.r = VK_COMPONENT_SWIZZLE_B;
3801*b7893ccfSSadaf Ebrahimi     ivci.components.b = VK_COMPONENT_SWIZZLE_R;
3802*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-02401");
3803*b7893ccfSSadaf Ebrahimi     // Also causes "unsupported format" - should be removed in future spec update
3804*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-None-02273");
3805*b7893ccfSSadaf Ebrahimi     vkCreateImageView(dev, &ivci, NULL, &image_view);
3806*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3807*b7893ccfSSadaf Ebrahimi 
3808*b7893ccfSSadaf Ebrahimi     reset_view();
3809*b7893ccfSSadaf Ebrahimi     ivci.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
3810*b7893ccfSSadaf Ebrahimi     ivci.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
3811*b7893ccfSSadaf Ebrahimi 
3812*b7893ccfSSadaf Ebrahimi     // View with external format, when format is not UNDEFINED
3813*b7893ccfSSadaf Ebrahimi     ivci.format = VK_FORMAT_R5G6B5_UNORM_PACK16;
3814*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-02399");
3815*b7893ccfSSadaf Ebrahimi     // Also causes "view format different from image format"
3816*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkImageViewCreateInfo-image-01019");
3817*b7893ccfSSadaf Ebrahimi     vkCreateImageView(dev, &ivci, NULL, &image_view);
3818*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3819*b7893ccfSSadaf Ebrahimi 
3820*b7893ccfSSadaf Ebrahimi     reset_view();
3821*b7893ccfSSadaf Ebrahimi     vkDestroySamplerYcbcrConversion(dev, ycbcr_conv, NULL);
3822*b7893ccfSSadaf Ebrahimi     vkDestroyImageView(dev, image_view, NULL);
3823*b7893ccfSSadaf Ebrahimi     vkDestroyImage(dev, img, NULL);
3824*b7893ccfSSadaf Ebrahimi     vkFreeMemory(dev, img_mem, NULL);
3825*b7893ccfSSadaf Ebrahimi }
3826*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferImportBuffer)3827*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferImportBuffer) {
3828*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer import as buffer.");
3829*b7893ccfSSadaf Ebrahimi 
3830*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3831*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3832*b7893ccfSSadaf Ebrahimi 
3833*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3834*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3835*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3836*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3837*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3838*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3839*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3840*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3841*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3842*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3843*b7893ccfSSadaf Ebrahimi     } else {
3844*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3845*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3846*b7893ccfSSadaf Ebrahimi         return;
3847*b7893ccfSSadaf Ebrahimi     }
3848*b7893ccfSSadaf Ebrahimi 
3849*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3850*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3851*b7893ccfSSadaf Ebrahimi 
3852*b7893ccfSSadaf Ebrahimi     VkDeviceMemory mem_handle = VK_NULL_HANDLE;
3853*b7893ccfSSadaf Ebrahimi     auto reset_mem = [&mem_handle, dev]() {
3854*b7893ccfSSadaf Ebrahimi         if (VK_NULL_HANDLE != mem_handle) vkFreeMemory(dev, mem_handle, NULL);
3855*b7893ccfSSadaf Ebrahimi         mem_handle = VK_NULL_HANDLE;
3856*b7893ccfSSadaf Ebrahimi     };
3857*b7893ccfSSadaf Ebrahimi 
3858*b7893ccfSSadaf Ebrahimi     PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
3859*b7893ccfSSadaf Ebrahimi         (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vkGetDeviceProcAddr(dev, "vkGetAndroidHardwareBufferPropertiesANDROID");
3860*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(pfn_GetAHBProps != nullptr);
3861*b7893ccfSSadaf Ebrahimi 
3862*b7893ccfSSadaf Ebrahimi     // AHB structs
3863*b7893ccfSSadaf Ebrahimi     AHardwareBuffer *ahb = nullptr;
3864*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_Desc ahb_desc = {};
3865*b7893ccfSSadaf Ebrahimi     VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
3866*b7893ccfSSadaf Ebrahimi     ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
3867*b7893ccfSSadaf Ebrahimi     VkImportAndroidHardwareBufferInfoANDROID iahbi = {};
3868*b7893ccfSSadaf Ebrahimi     iahbi.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
3869*b7893ccfSSadaf Ebrahimi 
3870*b7893ccfSSadaf Ebrahimi     // Allocate an AHardwareBuffer
3871*b7893ccfSSadaf Ebrahimi     ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
3872*b7893ccfSSadaf Ebrahimi     ahb_desc.usage = AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA;
3873*b7893ccfSSadaf Ebrahimi     ahb_desc.width = 512;
3874*b7893ccfSSadaf Ebrahimi     ahb_desc.height = 1;
3875*b7893ccfSSadaf Ebrahimi     ahb_desc.layers = 1;
3876*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_allocate(&ahb_desc, &ahb);
3877*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884");
3878*b7893ccfSSadaf Ebrahimi     pfn_GetAHBProps(dev, ahb, &ahb_props);
3879*b7893ccfSSadaf Ebrahimi     iahbi.buffer = ahb;
3880*b7893ccfSSadaf Ebrahimi 
3881*b7893ccfSSadaf Ebrahimi     // Create export and import buffers
3882*b7893ccfSSadaf Ebrahimi     VkExternalMemoryBufferCreateInfo ext_buf_info = {};
3883*b7893ccfSSadaf Ebrahimi     ext_buf_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR;
3884*b7893ccfSSadaf Ebrahimi     ext_buf_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
3885*b7893ccfSSadaf Ebrahimi 
3886*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo bci = {};
3887*b7893ccfSSadaf Ebrahimi     bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
3888*b7893ccfSSadaf Ebrahimi     bci.pNext = &ext_buf_info;
3889*b7893ccfSSadaf Ebrahimi     bci.size = ahb_props.allocationSize;
3890*b7893ccfSSadaf Ebrahimi     bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
3891*b7893ccfSSadaf Ebrahimi 
3892*b7893ccfSSadaf Ebrahimi     VkBuffer buf = VK_NULL_HANDLE;
3893*b7893ccfSSadaf Ebrahimi     vkCreateBuffer(dev, &bci, NULL, &buf);
3894*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements mem_reqs;
3895*b7893ccfSSadaf Ebrahimi     vkGetBufferMemoryRequirements(dev, buf, &mem_reqs);
3896*b7893ccfSSadaf Ebrahimi 
3897*b7893ccfSSadaf Ebrahimi     // Allocation info
3898*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo mai = vk_testing::DeviceMemory::get_resource_alloc_info(*m_device, mem_reqs, 0);
3899*b7893ccfSSadaf Ebrahimi     mai.pNext = &iahbi;  // Chained import struct
3900*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceMemoryProperties memory_info;
3901*b7893ccfSSadaf Ebrahimi     vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3902*b7893ccfSSadaf Ebrahimi     unsigned int i;
3903*b7893ccfSSadaf Ebrahimi     for (i = 0; i < memory_info.memoryTypeCount; i++) {
3904*b7893ccfSSadaf Ebrahimi         if ((ahb_props.memoryTypeBits & (1 << i))) {
3905*b7893ccfSSadaf Ebrahimi             mai.memoryTypeIndex = i;
3906*b7893ccfSSadaf Ebrahimi             break;
3907*b7893ccfSSadaf Ebrahimi         }
3908*b7893ccfSSadaf Ebrahimi     }
3909*b7893ccfSSadaf Ebrahimi     if (i >= memory_info.memoryTypeCount) {
3910*b7893ccfSSadaf Ebrahimi         printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
3911*b7893ccfSSadaf Ebrahimi         AHardwareBuffer_release(ahb);
3912*b7893ccfSSadaf Ebrahimi         reset_mem();
3913*b7893ccfSSadaf Ebrahimi         vkDestroyBuffer(dev, buf, NULL);
3914*b7893ccfSSadaf Ebrahimi         return;
3915*b7893ccfSSadaf Ebrahimi     }
3916*b7893ccfSSadaf Ebrahimi 
3917*b7893ccfSSadaf Ebrahimi     // Import as buffer requires format AHB_FMT_BLOB and usage AHB_USAGE_GPU_DATA_BUFFER
3918*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3919*b7893ccfSSadaf Ebrahimi                                          "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881");
3920*b7893ccfSSadaf Ebrahimi     // Also causes "non-dedicated allocation format/usage" error
3921*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkMemoryAllocateInfo-pNext-02384");
3922*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3923*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3924*b7893ccfSSadaf Ebrahimi 
3925*b7893ccfSSadaf Ebrahimi     AHardwareBuffer_release(ahb);
3926*b7893ccfSSadaf Ebrahimi     reset_mem();
3927*b7893ccfSSadaf Ebrahimi     vkDestroyBuffer(dev, buf, NULL);
3928*b7893ccfSSadaf Ebrahimi }
3929*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,AndroidHardwareBufferExporttBuffer)3930*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, AndroidHardwareBufferExporttBuffer) {
3931*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Verify AndroidHardwareBuffer export memory as AHB.");
3932*b7893ccfSSadaf Ebrahimi 
3933*b7893ccfSSadaf Ebrahimi     SetTargetApiVersion(VK_API_VERSION_1_1);
3934*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
3935*b7893ccfSSadaf Ebrahimi 
3936*b7893ccfSSadaf Ebrahimi     if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
3937*b7893ccfSSadaf Ebrahimi         // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
3938*b7893ccfSSadaf Ebrahimi         (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
3939*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3940*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3941*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3942*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3943*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3944*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
3945*b7893ccfSSadaf Ebrahimi         m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
3946*b7893ccfSSadaf Ebrahimi     } else {
3947*b7893ccfSSadaf Ebrahimi         printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
3948*b7893ccfSSadaf Ebrahimi                VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
3949*b7893ccfSSadaf Ebrahimi         return;
3950*b7893ccfSSadaf Ebrahimi     }
3951*b7893ccfSSadaf Ebrahimi 
3952*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
3953*b7893ccfSSadaf Ebrahimi     VkDevice dev = m_device->device();
3954*b7893ccfSSadaf Ebrahimi 
3955*b7893ccfSSadaf Ebrahimi     VkDeviceMemory mem_handle = VK_NULL_HANDLE;
3956*b7893ccfSSadaf Ebrahimi 
3957*b7893ccfSSadaf Ebrahimi     // Allocate device memory, no linked export struct indicating AHB handle type
3958*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo mai = {};
3959*b7893ccfSSadaf Ebrahimi     mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3960*b7893ccfSSadaf Ebrahimi     mai.allocationSize = 65536;
3961*b7893ccfSSadaf Ebrahimi     mai.memoryTypeIndex = 0;
3962*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
3963*b7893ccfSSadaf Ebrahimi 
3964*b7893ccfSSadaf Ebrahimi     PFN_vkGetMemoryAndroidHardwareBufferANDROID pfn_GetMemAHB =
3965*b7893ccfSSadaf Ebrahimi         (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vkGetDeviceProcAddr(dev, "vkGetMemoryAndroidHardwareBufferANDROID");
3966*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(pfn_GetMemAHB != nullptr);
3967*b7893ccfSSadaf Ebrahimi 
3968*b7893ccfSSadaf Ebrahimi     VkMemoryGetAndroidHardwareBufferInfoANDROID mgahbi = {};
3969*b7893ccfSSadaf Ebrahimi     mgahbi.sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
3970*b7893ccfSSadaf Ebrahimi     mgahbi.memory = mem_handle;
3971*b7893ccfSSadaf Ebrahimi     AHardwareBuffer *ahb = nullptr;
3972*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3973*b7893ccfSSadaf Ebrahimi                                          "VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882");
3974*b7893ccfSSadaf Ebrahimi     pfn_GetMemAHB(dev, &mgahbi, &ahb);
3975*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
3976*b7893ccfSSadaf Ebrahimi 
3977*b7893ccfSSadaf Ebrahimi     if (ahb) AHardwareBuffer_release(ahb);
3978*b7893ccfSSadaf Ebrahimi     ahb = nullptr;
3979*b7893ccfSSadaf Ebrahimi     if (VK_NULL_HANDLE != mem_handle) vkFreeMemory(dev, mem_handle, NULL);
3980*b7893ccfSSadaf Ebrahimi     mem_handle = VK_NULL_HANDLE;
3981*b7893ccfSSadaf Ebrahimi 
3982*b7893ccfSSadaf Ebrahimi     // Add an export struct with AHB handle type to allocation info
3983*b7893ccfSSadaf Ebrahimi     VkExportMemoryAllocateInfo emai = {};
3984*b7893ccfSSadaf Ebrahimi     emai.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
3985*b7893ccfSSadaf Ebrahimi     emai.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
3986*b7893ccfSSadaf Ebrahimi     mai.pNext = &emai;
3987*b7893ccfSSadaf Ebrahimi 
3988*b7893ccfSSadaf Ebrahimi     // Create an image, do not bind memory
3989*b7893ccfSSadaf Ebrahimi     VkImage img = VK_NULL_HANDLE;
3990*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo ici = {};
3991*b7893ccfSSadaf Ebrahimi     ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3992*b7893ccfSSadaf Ebrahimi     ici.imageType = VK_IMAGE_TYPE_2D;
3993*b7893ccfSSadaf Ebrahimi     ici.arrayLayers = 1;
3994*b7893ccfSSadaf Ebrahimi     ici.extent = {128, 128, 1};
3995*b7893ccfSSadaf Ebrahimi     ici.format = VK_FORMAT_R8G8B8A8_UNORM;
3996*b7893ccfSSadaf Ebrahimi     ici.mipLevels = 1;
3997*b7893ccfSSadaf Ebrahimi     ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3998*b7893ccfSSadaf Ebrahimi     ici.samples = VK_SAMPLE_COUNT_1_BIT;
3999*b7893ccfSSadaf Ebrahimi     ici.tiling = VK_IMAGE_TILING_OPTIMAL;
4000*b7893ccfSSadaf Ebrahimi     ici.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4001*b7893ccfSSadaf Ebrahimi     vkCreateImage(dev, &ici, NULL, &img);
4002*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(VK_NULL_HANDLE != img);
4003*b7893ccfSSadaf Ebrahimi 
4004*b7893ccfSSadaf Ebrahimi     // Add image to allocation chain as dedicated info, re-allocate
4005*b7893ccfSSadaf Ebrahimi     VkMemoryDedicatedAllocateInfo mdai = {VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO};
4006*b7893ccfSSadaf Ebrahimi     mdai.image = img;
4007*b7893ccfSSadaf Ebrahimi     emai.pNext = &mdai;
4008*b7893ccfSSadaf Ebrahimi     mai.allocationSize = 0;
4009*b7893ccfSSadaf Ebrahimi     vkAllocateMemory(dev, &mai, NULL, &mem_handle);
4010*b7893ccfSSadaf Ebrahimi     mgahbi.memory = mem_handle;
4011*b7893ccfSSadaf Ebrahimi 
4012*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4013*b7893ccfSSadaf Ebrahimi                                          "VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883");
4014*b7893ccfSSadaf Ebrahimi     pfn_GetMemAHB(dev, &mgahbi, &ahb);
4015*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4016*b7893ccfSSadaf Ebrahimi 
4017*b7893ccfSSadaf Ebrahimi     if (ahb) AHardwareBuffer_release(ahb);
4018*b7893ccfSSadaf Ebrahimi     if (VK_NULL_HANDLE != mem_handle) vkFreeMemory(dev, mem_handle, NULL);
4019*b7893ccfSSadaf Ebrahimi     vkDestroyImage(dev, img, NULL);
4020*b7893ccfSSadaf Ebrahimi }
4021*b7893ccfSSadaf Ebrahimi 
4022*b7893ccfSSadaf Ebrahimi #endif  // VK_USE_PLATFORM_ANDROID_KHR
4023*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateStride)4024*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateStride) {
4025*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate Stride.");
4026*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
4027*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitViewport());
4028*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4029*b7893ccfSSadaf Ebrahimi 
4030*b7893ccfSSadaf Ebrahimi     VkQueryPool query_pool;
4031*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo query_pool_ci{};
4032*b7893ccfSSadaf Ebrahimi     query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4033*b7893ccfSSadaf Ebrahimi     query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
4034*b7893ccfSSadaf Ebrahimi     query_pool_ci.queryCount = 1;
4035*b7893ccfSSadaf Ebrahimi     vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
4036*b7893ccfSSadaf Ebrahimi 
4037*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
4038*b7893ccfSSadaf Ebrahimi     vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
4039*b7893ccfSSadaf Ebrahimi     vkCmdWriteTimestamp(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, query_pool, 0);
4040*b7893ccfSSadaf Ebrahimi     m_commandBuffer->end();
4041*b7893ccfSSadaf Ebrahimi 
4042*b7893ccfSSadaf Ebrahimi     VkSubmitInfo submit_info = {};
4043*b7893ccfSSadaf Ebrahimi     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4044*b7893ccfSSadaf Ebrahimi     submit_info.commandBufferCount = 1;
4045*b7893ccfSSadaf Ebrahimi     submit_info.pCommandBuffers = &m_commandBuffer->handle();
4046*b7893ccfSSadaf Ebrahimi     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4047*b7893ccfSSadaf Ebrahimi     vkQueueWaitIdle(m_device->m_queue);
4048*b7893ccfSSadaf Ebrahimi 
4049*b7893ccfSSadaf Ebrahimi     char data_space;
4050*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkGetQueryPoolResults-flags-00814");
4051*b7893ccfSSadaf Ebrahimi     vkGetQueryPoolResults(m_device->handle(), query_pool, 0, 1, sizeof(data_space), &data_space, 1, VK_QUERY_RESULT_WAIT_BIT);
4052*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4053*b7893ccfSSadaf Ebrahimi 
4054*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkGetQueryPoolResults-flags-00815");
4055*b7893ccfSSadaf Ebrahimi     vkGetQueryPoolResults(m_device->handle(), query_pool, 0, 1, sizeof(data_space), &data_space, 1,
4056*b7893ccfSSadaf Ebrahimi                           (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT));
4057*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4058*b7893ccfSSadaf Ebrahimi 
4059*b7893ccfSSadaf Ebrahimi     char data_space4[4] = "";
4060*b7893ccfSSadaf Ebrahimi     m_errorMonitor->ExpectSuccess();
4061*b7893ccfSSadaf Ebrahimi     vkGetQueryPoolResults(m_device->handle(), query_pool, 0, 1, sizeof(data_space4), &data_space4, 4, VK_QUERY_RESULT_WAIT_BIT);
4062*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4063*b7893ccfSSadaf Ebrahimi 
4064*b7893ccfSSadaf Ebrahimi     char data_space8[8] = "";
4065*b7893ccfSSadaf Ebrahimi     m_errorMonitor->ExpectSuccess();
4066*b7893ccfSSadaf Ebrahimi     vkGetQueryPoolResults(m_device->handle(), query_pool, 0, 1, sizeof(data_space8), &data_space8, 8,
4067*b7893ccfSSadaf Ebrahimi                           (VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT));
4068*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4069*b7893ccfSSadaf Ebrahimi 
4070*b7893ccfSSadaf Ebrahimi     uint32_t qfi = 0;
4071*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo buff_create_info = {};
4072*b7893ccfSSadaf Ebrahimi     buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4073*b7893ccfSSadaf Ebrahimi     buff_create_info.size = 128;
4074*b7893ccfSSadaf Ebrahimi     buff_create_info.usage =
4075*b7893ccfSSadaf Ebrahimi         VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
4076*b7893ccfSSadaf Ebrahimi     buff_create_info.queueFamilyIndexCount = 1;
4077*b7893ccfSSadaf Ebrahimi     buff_create_info.pQueueFamilyIndices = &qfi;
4078*b7893ccfSSadaf Ebrahimi     VkBufferObj buffer;
4079*b7893ccfSSadaf Ebrahimi     buffer.init(*m_device, buff_create_info);
4080*b7893ccfSSadaf Ebrahimi 
4081*b7893ccfSSadaf Ebrahimi     m_commandBuffer->reset();
4082*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
4083*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdCopyQueryPoolResults-flags-00822");
4084*b7893ccfSSadaf Ebrahimi     vkCmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 0, 1, buffer.handle(), 1, 1, 0);
4085*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4086*b7893ccfSSadaf Ebrahimi 
4087*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdCopyQueryPoolResults-flags-00823");
4088*b7893ccfSSadaf Ebrahimi     vkCmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 0, 1, buffer.handle(), 1, 1, VK_QUERY_RESULT_64_BIT);
4089*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4090*b7893ccfSSadaf Ebrahimi 
4091*b7893ccfSSadaf Ebrahimi     m_errorMonitor->ExpectSuccess();
4092*b7893ccfSSadaf Ebrahimi     vkCmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 0, 1, buffer.handle(), 4, 4, 0);
4093*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4094*b7893ccfSSadaf Ebrahimi 
4095*b7893ccfSSadaf Ebrahimi     m_errorMonitor->ExpectSuccess();
4096*b7893ccfSSadaf Ebrahimi     vkCmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 0, 1, buffer.handle(), 8, 8, VK_QUERY_RESULT_64_BIT);
4097*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4098*b7893ccfSSadaf Ebrahimi 
4099*b7893ccfSSadaf Ebrahimi     if (m_device->phy().features().multiDrawIndirect) {
4100*b7893ccfSSadaf Ebrahimi         CreatePipelineHelper helper(*this);
4101*b7893ccfSSadaf Ebrahimi         helper.InitInfo();
4102*b7893ccfSSadaf Ebrahimi         helper.InitState();
4103*b7893ccfSSadaf Ebrahimi         helper.CreateGraphicsPipeline();
4104*b7893ccfSSadaf Ebrahimi         m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4105*b7893ccfSSadaf Ebrahimi         vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, helper.pipeline_);
4106*b7893ccfSSadaf Ebrahimi 
4107*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDrawIndirect-drawCount-00476");
4108*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDrawIndirect-drawCount-00488");
4109*b7893ccfSSadaf Ebrahimi         vkCmdDrawIndirect(m_commandBuffer->handle(), buffer.handle(), 0, 100, 2);
4110*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4111*b7893ccfSSadaf Ebrahimi 
4112*b7893ccfSSadaf Ebrahimi         m_errorMonitor->ExpectSuccess();
4113*b7893ccfSSadaf Ebrahimi         vkCmdDrawIndirect(m_commandBuffer->handle(), buffer.handle(), 0, 2, 24);
4114*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyNotFound();
4115*b7893ccfSSadaf Ebrahimi 
4116*b7893ccfSSadaf Ebrahimi         vkCmdBindIndexBuffer(m_commandBuffer->handle(), buffer.handle(), 0, VK_INDEX_TYPE_UINT16);
4117*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528");
4118*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
4119*b7893ccfSSadaf Ebrahimi         vkCmdDrawIndexedIndirect(m_commandBuffer->handle(), buffer.handle(), 0, 100, 2);
4120*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4121*b7893ccfSSadaf Ebrahimi 
4122*b7893ccfSSadaf Ebrahimi         m_errorMonitor->ExpectSuccess();
4123*b7893ccfSSadaf Ebrahimi         vkCmdDrawIndexedIndirect(m_commandBuffer->handle(), buffer.handle(), 0, 2, 24);
4124*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyNotFound();
4125*b7893ccfSSadaf Ebrahimi 
4126*b7893ccfSSadaf Ebrahimi         vkCmdEndRenderPass(m_commandBuffer->handle());
4127*b7893ccfSSadaf Ebrahimi         m_commandBuffer->end();
4128*b7893ccfSSadaf Ebrahimi 
4129*b7893ccfSSadaf Ebrahimi     } else {
4130*b7893ccfSSadaf Ebrahimi         printf("%s Test requires unsupported multiDrawIndirect feature. Skipped.\n", kSkipPrefix);
4131*b7893ccfSSadaf Ebrahimi     }
4132*b7893ccfSSadaf Ebrahimi     vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
4133*b7893ccfSSadaf Ebrahimi }
4134*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,WarningSwapchainCreateInfoPreTransform)4135*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, WarningSwapchainCreateInfoPreTransform) {
4136*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Print warning when preTransform doesn't match curretTransform");
4137*b7893ccfSSadaf Ebrahimi 
4138*b7893ccfSSadaf Ebrahimi     if (!AddSurfaceInstanceExtension()) {
4139*b7893ccfSSadaf Ebrahimi         printf("%s surface extensions not supported, skipping test\n", kSkipPrefix);
4140*b7893ccfSSadaf Ebrahimi         return;
4141*b7893ccfSSadaf Ebrahimi     }
4142*b7893ccfSSadaf Ebrahimi 
4143*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
4144*b7893ccfSSadaf Ebrahimi 
4145*b7893ccfSSadaf Ebrahimi     if (!AddSwapchainDeviceExtension()) {
4146*b7893ccfSSadaf Ebrahimi         printf("%s swapchain extensions not supported, skipping test\n", kSkipPrefix);
4147*b7893ccfSSadaf Ebrahimi         return;
4148*b7893ccfSSadaf Ebrahimi     }
4149*b7893ccfSSadaf Ebrahimi 
4150*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitState());
4151*b7893ccfSSadaf Ebrahimi     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4152*b7893ccfSSadaf Ebrahimi 
4153*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
4154*b7893ccfSSadaf Ebrahimi                                          "UNASSIGNED-CoreValidation-SwapchainPreTransform");
4155*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetUnexpectedError("VUID-VkSwapchainCreateInfoKHR-preTransform-01279");
4156*b7893ccfSSadaf Ebrahimi     InitSwapchain(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR);
4157*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4158*b7893ccfSSadaf Ebrahimi }
4159*b7893ccfSSadaf Ebrahimi 
InitFrameworkForRayTracingTest(VkRenderFramework * renderFramework,std::vector<const char * > & instance_extension_names,std::vector<const char * > & device_extension_names,void * user_data)4160*b7893ccfSSadaf Ebrahimi bool InitFrameworkForRayTracingTest(VkRenderFramework *renderFramework, std::vector<const char *> &instance_extension_names,
4161*b7893ccfSSadaf Ebrahimi                                     std::vector<const char *> &device_extension_names, void *user_data) {
4162*b7893ccfSSadaf Ebrahimi     const std::array<const char *, 1> required_instance_extensions = {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME};
4163*b7893ccfSSadaf Ebrahimi     for (const char *required_instance_extension : required_instance_extensions) {
4164*b7893ccfSSadaf Ebrahimi         if (renderFramework->InstanceExtensionSupported(required_instance_extension)) {
4165*b7893ccfSSadaf Ebrahimi             instance_extension_names.push_back(required_instance_extension);
4166*b7893ccfSSadaf Ebrahimi         } else {
4167*b7893ccfSSadaf Ebrahimi             printf("%s %s instance extension not supported, skipping test\n", kSkipPrefix, required_instance_extension);
4168*b7893ccfSSadaf Ebrahimi             return false;
4169*b7893ccfSSadaf Ebrahimi         }
4170*b7893ccfSSadaf Ebrahimi     }
4171*b7893ccfSSadaf Ebrahimi     renderFramework->InitFramework(myDbgFunc, user_data);
4172*b7893ccfSSadaf Ebrahimi 
4173*b7893ccfSSadaf Ebrahimi     if (renderFramework->DeviceIsMockICD() || renderFramework->DeviceSimulation()) {
4174*b7893ccfSSadaf Ebrahimi         printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
4175*b7893ccfSSadaf Ebrahimi         return false;
4176*b7893ccfSSadaf Ebrahimi     }
4177*b7893ccfSSadaf Ebrahimi 
4178*b7893ccfSSadaf Ebrahimi     const std::array<const char *, 2> required_device_extensions = {
4179*b7893ccfSSadaf Ebrahimi         VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
4180*b7893ccfSSadaf Ebrahimi         VK_NV_RAY_TRACING_EXTENSION_NAME,
4181*b7893ccfSSadaf Ebrahimi     };
4182*b7893ccfSSadaf Ebrahimi     for (const char *required_device_extension : required_device_extensions) {
4183*b7893ccfSSadaf Ebrahimi         if (renderFramework->DeviceExtensionSupported(renderFramework->gpu(), nullptr, required_device_extension)) {
4184*b7893ccfSSadaf Ebrahimi             device_extension_names.push_back(required_device_extension);
4185*b7893ccfSSadaf Ebrahimi         } else {
4186*b7893ccfSSadaf Ebrahimi             printf("%s %s device extension not supported, skipping test\n", kSkipPrefix, required_device_extension);
4187*b7893ccfSSadaf Ebrahimi             return false;
4188*b7893ccfSSadaf Ebrahimi         }
4189*b7893ccfSSadaf Ebrahimi     }
4190*b7893ccfSSadaf Ebrahimi     renderFramework->InitState();
4191*b7893ccfSSadaf Ebrahimi     return true;
4192*b7893ccfSSadaf Ebrahimi }
4193*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateGeometryNV)4194*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateGeometryNV) {
4195*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate acceleration structure geometries.");
4196*b7893ccfSSadaf Ebrahimi     if (!InitFrameworkForRayTracingTest(this, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
4197*b7893ccfSSadaf Ebrahimi         return;
4198*b7893ccfSSadaf Ebrahimi     }
4199*b7893ccfSSadaf Ebrahimi 
4200*b7893ccfSSadaf Ebrahimi     VkBufferObj vbo;
4201*b7893ccfSSadaf Ebrahimi     vbo.init(*m_device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
4202*b7893ccfSSadaf Ebrahimi              VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
4203*b7893ccfSSadaf Ebrahimi 
4204*b7893ccfSSadaf Ebrahimi     VkBufferObj ibo;
4205*b7893ccfSSadaf Ebrahimi     ibo.init(*m_device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
4206*b7893ccfSSadaf Ebrahimi              VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
4207*b7893ccfSSadaf Ebrahimi 
4208*b7893ccfSSadaf Ebrahimi     VkBufferObj tbo;
4209*b7893ccfSSadaf Ebrahimi     tbo.init(*m_device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
4210*b7893ccfSSadaf Ebrahimi              VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
4211*b7893ccfSSadaf Ebrahimi 
4212*b7893ccfSSadaf Ebrahimi     VkBufferObj aabbbo;
4213*b7893ccfSSadaf Ebrahimi     aabbbo.init(*m_device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
4214*b7893ccfSSadaf Ebrahimi                 VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
4215*b7893ccfSSadaf Ebrahimi 
4216*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo unbound_buffer_ci = {};
4217*b7893ccfSSadaf Ebrahimi     unbound_buffer_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4218*b7893ccfSSadaf Ebrahimi     unbound_buffer_ci.size = 1024;
4219*b7893ccfSSadaf Ebrahimi     unbound_buffer_ci.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV;
4220*b7893ccfSSadaf Ebrahimi     VkBufferObj unbound_buffer;
4221*b7893ccfSSadaf Ebrahimi     unbound_buffer.init_no_mem(*m_device, unbound_buffer_ci);
4222*b7893ccfSSadaf Ebrahimi 
4223*b7893ccfSSadaf Ebrahimi     const std::vector<float> vertices = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f};
4224*b7893ccfSSadaf Ebrahimi     const std::vector<uint32_t> indicies = {0, 1, 2};
4225*b7893ccfSSadaf Ebrahimi     const std::vector<float> aabbs = {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f};
4226*b7893ccfSSadaf Ebrahimi     const std::vector<float> transforms = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f};
4227*b7893ccfSSadaf Ebrahimi 
4228*b7893ccfSSadaf Ebrahimi     uint8_t *mapped_vbo_buffer_data = (uint8_t *)vbo.memory().map();
4229*b7893ccfSSadaf Ebrahimi     std::memcpy(mapped_vbo_buffer_data, (uint8_t *)vertices.data(), sizeof(float) * vertices.size());
4230*b7893ccfSSadaf Ebrahimi     vbo.memory().unmap();
4231*b7893ccfSSadaf Ebrahimi 
4232*b7893ccfSSadaf Ebrahimi     uint8_t *mapped_ibo_buffer_data = (uint8_t *)ibo.memory().map();
4233*b7893ccfSSadaf Ebrahimi     std::memcpy(mapped_ibo_buffer_data, (uint8_t *)indicies.data(), sizeof(uint32_t) * indicies.size());
4234*b7893ccfSSadaf Ebrahimi     ibo.memory().unmap();
4235*b7893ccfSSadaf Ebrahimi 
4236*b7893ccfSSadaf Ebrahimi     uint8_t *mapped_tbo_buffer_data = (uint8_t *)tbo.memory().map();
4237*b7893ccfSSadaf Ebrahimi     std::memcpy(mapped_tbo_buffer_data, (uint8_t *)transforms.data(), sizeof(float) * transforms.size());
4238*b7893ccfSSadaf Ebrahimi     tbo.memory().unmap();
4239*b7893ccfSSadaf Ebrahimi 
4240*b7893ccfSSadaf Ebrahimi     uint8_t *mapped_aabbbo_buffer_data = (uint8_t *)aabbbo.memory().map();
4241*b7893ccfSSadaf Ebrahimi     std::memcpy(mapped_aabbbo_buffer_data, (uint8_t *)aabbs.data(), sizeof(float) * aabbs.size());
4242*b7893ccfSSadaf Ebrahimi     aabbbo.memory().unmap();
4243*b7893ccfSSadaf Ebrahimi 
4244*b7893ccfSSadaf Ebrahimi     VkGeometryNV valid_geometry_triangles = {};
4245*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
4246*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_NV;
4247*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
4248*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.vertexData = vbo.handle();
4249*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.vertexOffset = 0;
4250*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.vertexCount = 3;
4251*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.vertexStride = 12;
4252*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
4253*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.indexData = ibo.handle();
4254*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.indexOffset = 0;
4255*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.indexCount = 3;
4256*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
4257*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.transformData = tbo.handle();
4258*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.triangles.transformOffset = 0;
4259*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.aabbs = {};
4260*b7893ccfSSadaf Ebrahimi     valid_geometry_triangles.geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
4261*b7893ccfSSadaf Ebrahimi 
4262*b7893ccfSSadaf Ebrahimi     VkGeometryNV valid_geometry_aabbs = {};
4263*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
4264*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometryType = VK_GEOMETRY_TYPE_AABBS_NV;
4265*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.triangles = {};
4266*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
4267*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.aabbs = {};
4268*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
4269*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.aabbs.aabbData = aabbbo.handle();
4270*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.aabbs.numAABBs = 1;
4271*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.aabbs.offset = 0;
4272*b7893ccfSSadaf Ebrahimi     valid_geometry_aabbs.geometry.aabbs.stride = 24;
4273*b7893ccfSSadaf Ebrahimi 
4274*b7893ccfSSadaf Ebrahimi     PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV = reinterpret_cast<PFN_vkCreateAccelerationStructureNV>(
4275*b7893ccfSSadaf Ebrahimi         vkGetDeviceProcAddr(m_device->handle(), "vkCreateAccelerationStructureNV"));
4276*b7893ccfSSadaf Ebrahimi     assert(vkCreateAccelerationStructureNV != nullptr);
4277*b7893ccfSSadaf Ebrahimi 
4278*b7893ccfSSadaf Ebrahimi     const auto GetCreateInfo = [](const VkGeometryNV &geometry) {
4279*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = {};
4280*b7893ccfSSadaf Ebrahimi         as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
4281*b7893ccfSSadaf Ebrahimi         as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
4282*b7893ccfSSadaf Ebrahimi         as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4283*b7893ccfSSadaf Ebrahimi         as_create_info.info.instanceCount = 0;
4284*b7893ccfSSadaf Ebrahimi         as_create_info.info.geometryCount = 1;
4285*b7893ccfSSadaf Ebrahimi         as_create_info.info.pGeometries = &geometry;
4286*b7893ccfSSadaf Ebrahimi         return as_create_info;
4287*b7893ccfSSadaf Ebrahimi     };
4288*b7893ccfSSadaf Ebrahimi 
4289*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureNV as;
4290*b7893ccfSSadaf Ebrahimi 
4291*b7893ccfSSadaf Ebrahimi     // Invalid vertex format.
4292*b7893ccfSSadaf Ebrahimi     {
4293*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4294*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.vertexFormat = VK_FORMAT_R64_UINT;
4295*b7893ccfSSadaf Ebrahimi 
4296*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4297*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-vertexFormat-02430");
4298*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4299*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4300*b7893ccfSSadaf Ebrahimi     }
4301*b7893ccfSSadaf Ebrahimi     // Invalid vertex offset - not multiple of component size.
4302*b7893ccfSSadaf Ebrahimi     {
4303*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4304*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.vertexOffset = 1;
4305*b7893ccfSSadaf Ebrahimi 
4306*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4307*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-vertexOffset-02429");
4308*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4309*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4310*b7893ccfSSadaf Ebrahimi     }
4311*b7893ccfSSadaf Ebrahimi     // Invalid vertex offset - bigger than buffer.
4312*b7893ccfSSadaf Ebrahimi     {
4313*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4314*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.vertexOffset = 12 * 1024;
4315*b7893ccfSSadaf Ebrahimi 
4316*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4317*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-vertexOffset-02428");
4318*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4319*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4320*b7893ccfSSadaf Ebrahimi     }
4321*b7893ccfSSadaf Ebrahimi     // Invalid vertex buffer - no such buffer.
4322*b7893ccfSSadaf Ebrahimi     {
4323*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4324*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.vertexData = VkBuffer(123456789);
4325*b7893ccfSSadaf Ebrahimi 
4326*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4327*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-vertexData-parameter");
4328*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4329*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4330*b7893ccfSSadaf Ebrahimi     }
4331*b7893ccfSSadaf Ebrahimi     // Invalid vertex buffer - no memory bound.
4332*b7893ccfSSadaf Ebrahimi     {
4333*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4334*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.vertexData = unbound_buffer.handle();
4335*b7893ccfSSadaf Ebrahimi 
4336*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4337*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-vertexOffset-02428");
4338*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4339*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4340*b7893ccfSSadaf Ebrahimi     }
4341*b7893ccfSSadaf Ebrahimi 
4342*b7893ccfSSadaf Ebrahimi     // Invalid index offset - not multiple of index size.
4343*b7893ccfSSadaf Ebrahimi     {
4344*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4345*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexOffset = 1;
4346*b7893ccfSSadaf Ebrahimi 
4347*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4348*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-indexOffset-02432");
4349*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4350*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4351*b7893ccfSSadaf Ebrahimi     }
4352*b7893ccfSSadaf Ebrahimi     // Invalid index offset - bigger than buffer.
4353*b7893ccfSSadaf Ebrahimi     {
4354*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4355*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexOffset = 2048;
4356*b7893ccfSSadaf Ebrahimi 
4357*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4358*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-indexOffset-02431");
4359*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4360*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4361*b7893ccfSSadaf Ebrahimi     }
4362*b7893ccfSSadaf Ebrahimi     // Invalid index count - must be 0 if type is VK_INDEX_TYPE_NONE_NV.
4363*b7893ccfSSadaf Ebrahimi     {
4364*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4365*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexType = VK_INDEX_TYPE_NONE_NV;
4366*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexData = VK_NULL_HANDLE;
4367*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexCount = 1;
4368*b7893ccfSSadaf Ebrahimi 
4369*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4370*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-indexCount-02436");
4371*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4372*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4373*b7893ccfSSadaf Ebrahimi     }
4374*b7893ccfSSadaf Ebrahimi     // Invalid index data - must be VK_NULL_HANDLE if type is VK_INDEX_TYPE_NONE_NV.
4375*b7893ccfSSadaf Ebrahimi     {
4376*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4377*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexType = VK_INDEX_TYPE_NONE_NV;
4378*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexData = ibo.handle();
4379*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.indexCount = 0;
4380*b7893ccfSSadaf Ebrahimi 
4381*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4382*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-indexData-02434");
4383*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4384*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4385*b7893ccfSSadaf Ebrahimi     }
4386*b7893ccfSSadaf Ebrahimi 
4387*b7893ccfSSadaf Ebrahimi     // Invalid transform offset - not multiple of 16.
4388*b7893ccfSSadaf Ebrahimi     {
4389*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4390*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.transformOffset = 1;
4391*b7893ccfSSadaf Ebrahimi 
4392*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4393*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-transformOffset-02438");
4394*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4395*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4396*b7893ccfSSadaf Ebrahimi     }
4397*b7893ccfSSadaf Ebrahimi     // Invalid transform offset - bigger than buffer.
4398*b7893ccfSSadaf Ebrahimi     {
4399*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_triangles;
4400*b7893ccfSSadaf Ebrahimi         geometry.geometry.triangles.transformOffset = 2048;
4401*b7893ccfSSadaf Ebrahimi 
4402*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4403*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryTrianglesNV-transformOffset-02437");
4404*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4405*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4406*b7893ccfSSadaf Ebrahimi     }
4407*b7893ccfSSadaf Ebrahimi 
4408*b7893ccfSSadaf Ebrahimi     // Invalid aabb offset - not multiple of 8.
4409*b7893ccfSSadaf Ebrahimi     {
4410*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_aabbs;
4411*b7893ccfSSadaf Ebrahimi         geometry.geometry.aabbs.offset = 1;
4412*b7893ccfSSadaf Ebrahimi 
4413*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4414*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryAABBNV-offset-02440");
4415*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4416*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4417*b7893ccfSSadaf Ebrahimi     }
4418*b7893ccfSSadaf Ebrahimi     // Invalid aabb offset - bigger than buffer.
4419*b7893ccfSSadaf Ebrahimi     {
4420*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_aabbs;
4421*b7893ccfSSadaf Ebrahimi         geometry.geometry.aabbs.offset = 8 * 1024;
4422*b7893ccfSSadaf Ebrahimi 
4423*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4424*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryAABBNV-offset-02439");
4425*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4426*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4427*b7893ccfSSadaf Ebrahimi     }
4428*b7893ccfSSadaf Ebrahimi     // Invalid aabb stride - not multiple of 8.
4429*b7893ccfSSadaf Ebrahimi     {
4430*b7893ccfSSadaf Ebrahimi         VkGeometryNV geometry = valid_geometry_aabbs;
4431*b7893ccfSSadaf Ebrahimi         geometry.geometry.aabbs.stride = 1;
4432*b7893ccfSSadaf Ebrahimi 
4433*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
4434*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGeometryAABBNV-stride-02441");
4435*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
4436*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4437*b7893ccfSSadaf Ebrahimi     }
4438*b7893ccfSSadaf Ebrahimi }
4439*b7893ccfSSadaf Ebrahimi 
GetSimpleGeometryForAccelerationStructureTests(const VkDeviceObj & device,VkBufferObj * vbo,VkBufferObj * ibo,VkGeometryNV * geometry)4440*b7893ccfSSadaf Ebrahimi void GetSimpleGeometryForAccelerationStructureTests(const VkDeviceObj &device, VkBufferObj *vbo, VkBufferObj *ibo,
4441*b7893ccfSSadaf Ebrahimi                                                     VkGeometryNV *geometry) {
4442*b7893ccfSSadaf Ebrahimi     vbo->init(device, 1024);
4443*b7893ccfSSadaf Ebrahimi     ibo->init(device, 1024);
4444*b7893ccfSSadaf Ebrahimi 
4445*b7893ccfSSadaf Ebrahimi     *geometry = {};
4446*b7893ccfSSadaf Ebrahimi     geometry->sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
4447*b7893ccfSSadaf Ebrahimi     geometry->geometryType = VK_GEOMETRY_TYPE_TRIANGLES_NV;
4448*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
4449*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.vertexData = vbo->handle();
4450*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.vertexOffset = 0;
4451*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.vertexCount = 3;
4452*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.vertexStride = 12;
4453*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
4454*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.indexData = ibo->handle();
4455*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.indexOffset = 0;
4456*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.indexCount = 3;
4457*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
4458*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.transformData = VK_NULL_HANDLE;
4459*b7893ccfSSadaf Ebrahimi     geometry->geometry.triangles.transformOffset = 0;
4460*b7893ccfSSadaf Ebrahimi     geometry->geometry.aabbs = {};
4461*b7893ccfSSadaf Ebrahimi     geometry->geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
4462*b7893ccfSSadaf Ebrahimi }
4463*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateCreateAccelerationStructureNV)4464*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateCreateAccelerationStructureNV) {
4465*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate acceleration structure creation.");
4466*b7893ccfSSadaf Ebrahimi     if (!InitFrameworkForRayTracingTest(this, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
4467*b7893ccfSSadaf Ebrahimi         return;
4468*b7893ccfSSadaf Ebrahimi     }
4469*b7893ccfSSadaf Ebrahimi 
4470*b7893ccfSSadaf Ebrahimi     PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV = reinterpret_cast<PFN_vkCreateAccelerationStructureNV>(
4471*b7893ccfSSadaf Ebrahimi         vkGetDeviceProcAddr(m_device->handle(), "vkCreateAccelerationStructureNV"));
4472*b7893ccfSSadaf Ebrahimi     assert(vkCreateAccelerationStructureNV != nullptr);
4473*b7893ccfSSadaf Ebrahimi 
4474*b7893ccfSSadaf Ebrahimi     VkBufferObj vbo;
4475*b7893ccfSSadaf Ebrahimi     VkBufferObj ibo;
4476*b7893ccfSSadaf Ebrahimi     VkGeometryNV geometry;
4477*b7893ccfSSadaf Ebrahimi     GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
4478*b7893ccfSSadaf Ebrahimi 
4479*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureCreateInfoNV as_create_info = {};
4480*b7893ccfSSadaf Ebrahimi     as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
4481*b7893ccfSSadaf Ebrahimi     as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
4482*b7893ccfSSadaf Ebrahimi 
4483*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureNV as = VK_NULL_HANDLE;
4484*b7893ccfSSadaf Ebrahimi 
4485*b7893ccfSSadaf Ebrahimi     // Top level can not have geometry
4486*b7893ccfSSadaf Ebrahimi     {
4487*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV bad_top_level_create_info = as_create_info;
4488*b7893ccfSSadaf Ebrahimi         bad_top_level_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
4489*b7893ccfSSadaf Ebrahimi         bad_top_level_create_info.info.instanceCount = 0;
4490*b7893ccfSSadaf Ebrahimi         bad_top_level_create_info.info.geometryCount = 1;
4491*b7893ccfSSadaf Ebrahimi         bad_top_level_create_info.info.pGeometries = &geometry;
4492*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAccelerationStructureInfoNV-type-02425");
4493*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &bad_top_level_create_info, nullptr, &as);
4494*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4495*b7893ccfSSadaf Ebrahimi     }
4496*b7893ccfSSadaf Ebrahimi 
4497*b7893ccfSSadaf Ebrahimi     // Bot level can not have instances
4498*b7893ccfSSadaf Ebrahimi     {
4499*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV bad_bot_level_create_info = as_create_info;
4500*b7893ccfSSadaf Ebrahimi         bad_bot_level_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4501*b7893ccfSSadaf Ebrahimi         bad_bot_level_create_info.info.instanceCount = 1;
4502*b7893ccfSSadaf Ebrahimi         bad_bot_level_create_info.info.geometryCount = 0;
4503*b7893ccfSSadaf Ebrahimi         bad_bot_level_create_info.info.pGeometries = nullptr;
4504*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAccelerationStructureInfoNV-type-02426");
4505*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &bad_bot_level_create_info, nullptr, &as);
4506*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4507*b7893ccfSSadaf Ebrahimi     }
4508*b7893ccfSSadaf Ebrahimi 
4509*b7893ccfSSadaf Ebrahimi     // Can not prefer both fast trace and fast build
4510*b7893ccfSSadaf Ebrahimi     {
4511*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV bad_flags_level_create_info = as_create_info;
4512*b7893ccfSSadaf Ebrahimi         bad_flags_level_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4513*b7893ccfSSadaf Ebrahimi         bad_flags_level_create_info.info.instanceCount = 0;
4514*b7893ccfSSadaf Ebrahimi         bad_flags_level_create_info.info.geometryCount = 1;
4515*b7893ccfSSadaf Ebrahimi         bad_flags_level_create_info.info.pGeometries = &geometry;
4516*b7893ccfSSadaf Ebrahimi         bad_flags_level_create_info.info.flags =
4517*b7893ccfSSadaf Ebrahimi             VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV | VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV;
4518*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAccelerationStructureInfoNV-flags-02592");
4519*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &bad_flags_level_create_info, nullptr, &as);
4520*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4521*b7893ccfSSadaf Ebrahimi     }
4522*b7893ccfSSadaf Ebrahimi 
4523*b7893ccfSSadaf Ebrahimi     // Can not have geometry or instance for compacting
4524*b7893ccfSSadaf Ebrahimi     {
4525*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV bad_compacting_as_create_info = as_create_info;
4526*b7893ccfSSadaf Ebrahimi         bad_compacting_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4527*b7893ccfSSadaf Ebrahimi         bad_compacting_as_create_info.info.instanceCount = 0;
4528*b7893ccfSSadaf Ebrahimi         bad_compacting_as_create_info.info.geometryCount = 1;
4529*b7893ccfSSadaf Ebrahimi         bad_compacting_as_create_info.info.pGeometries = &geometry;
4530*b7893ccfSSadaf Ebrahimi         bad_compacting_as_create_info.info.flags = 0;
4531*b7893ccfSSadaf Ebrahimi         bad_compacting_as_create_info.compactedSize = 1024;
4532*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4533*b7893ccfSSadaf Ebrahimi                                              "VUID-VkAccelerationStructureCreateInfoNV-compactedSize-02421");
4534*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &bad_compacting_as_create_info, nullptr, &as);
4535*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4536*b7893ccfSSadaf Ebrahimi     }
4537*b7893ccfSSadaf Ebrahimi 
4538*b7893ccfSSadaf Ebrahimi     // Can not mix different geometry types into single bottom level acceleration structure
4539*b7893ccfSSadaf Ebrahimi     {
4540*b7893ccfSSadaf Ebrahimi         VkGeometryNV aabb_geometry = {};
4541*b7893ccfSSadaf Ebrahimi         aabb_geometry.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
4542*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometryType = VK_GEOMETRY_TYPE_AABBS_NV;
4543*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
4544*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.aabbs = {};
4545*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
4546*b7893ccfSSadaf Ebrahimi         // Buffer contents do not matter for this test.
4547*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.aabbs.aabbData = geometry.geometry.triangles.vertexData;
4548*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.aabbs.numAABBs = 1;
4549*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.aabbs.offset = 0;
4550*b7893ccfSSadaf Ebrahimi         aabb_geometry.geometry.aabbs.stride = 24;
4551*b7893ccfSSadaf Ebrahimi 
4552*b7893ccfSSadaf Ebrahimi         std::vector<VkGeometryNV> geometries = {geometry, aabb_geometry};
4553*b7893ccfSSadaf Ebrahimi 
4554*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureCreateInfoNV mix_geometry_types_as_create_info = as_create_info;
4555*b7893ccfSSadaf Ebrahimi         mix_geometry_types_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4556*b7893ccfSSadaf Ebrahimi         mix_geometry_types_as_create_info.info.instanceCount = 0;
4557*b7893ccfSSadaf Ebrahimi         mix_geometry_types_as_create_info.info.geometryCount = static_cast<uint32_t>(geometries.size());
4558*b7893ccfSSadaf Ebrahimi         mix_geometry_types_as_create_info.info.pGeometries = geometries.data();
4559*b7893ccfSSadaf Ebrahimi         mix_geometry_types_as_create_info.info.flags = 0;
4560*b7893ccfSSadaf Ebrahimi 
4561*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4562*b7893ccfSSadaf Ebrahimi                                              "UNASSIGNED-VkAccelerationStructureInfoNV-pGeometries-XXXX");
4563*b7893ccfSSadaf Ebrahimi         vkCreateAccelerationStructureNV(m_device->handle(), &mix_geometry_types_as_create_info, nullptr, &as);
4564*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4565*b7893ccfSSadaf Ebrahimi     }
4566*b7893ccfSSadaf Ebrahimi }
4567*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateBindAccelerationStructureNV)4568*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateBindAccelerationStructureNV) {
4569*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate acceleration structure binding.");
4570*b7893ccfSSadaf Ebrahimi     if (!InitFrameworkForRayTracingTest(this, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
4571*b7893ccfSSadaf Ebrahimi         return;
4572*b7893ccfSSadaf Ebrahimi     }
4573*b7893ccfSSadaf Ebrahimi 
4574*b7893ccfSSadaf Ebrahimi     PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV =
4575*b7893ccfSSadaf Ebrahimi         reinterpret_cast<PFN_vkBindAccelerationStructureMemoryNV>(
4576*b7893ccfSSadaf Ebrahimi             vkGetDeviceProcAddr(m_device->handle(), "vkBindAccelerationStructureMemoryNV"));
4577*b7893ccfSSadaf Ebrahimi     assert(vkBindAccelerationStructureMemoryNV != nullptr);
4578*b7893ccfSSadaf Ebrahimi 
4579*b7893ccfSSadaf Ebrahimi     VkBufferObj vbo;
4580*b7893ccfSSadaf Ebrahimi     VkBufferObj ibo;
4581*b7893ccfSSadaf Ebrahimi     VkGeometryNV geometry;
4582*b7893ccfSSadaf Ebrahimi     GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
4583*b7893ccfSSadaf Ebrahimi 
4584*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureCreateInfoNV as_create_info = {};
4585*b7893ccfSSadaf Ebrahimi     as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
4586*b7893ccfSSadaf Ebrahimi     as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
4587*b7893ccfSSadaf Ebrahimi     as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4588*b7893ccfSSadaf Ebrahimi     as_create_info.info.geometryCount = 1;
4589*b7893ccfSSadaf Ebrahimi     as_create_info.info.pGeometries = &geometry;
4590*b7893ccfSSadaf Ebrahimi     as_create_info.info.instanceCount = 0;
4591*b7893ccfSSadaf Ebrahimi 
4592*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureObj as(*m_device, as_create_info, false);
4593*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4594*b7893ccfSSadaf Ebrahimi 
4595*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements as_memory_requirements = as.memory_requirements().memoryRequirements;
4596*b7893ccfSSadaf Ebrahimi 
4597*b7893ccfSSadaf Ebrahimi     VkBindAccelerationStructureMemoryInfoNV as_bind_info = {};
4598*b7893ccfSSadaf Ebrahimi     as_bind_info.sType = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV;
4599*b7893ccfSSadaf Ebrahimi     as_bind_info.accelerationStructure = as.handle();
4600*b7893ccfSSadaf Ebrahimi 
4601*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo as_memory_alloc = {};
4602*b7893ccfSSadaf Ebrahimi     as_memory_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4603*b7893ccfSSadaf Ebrahimi     as_memory_alloc.allocationSize = as_memory_requirements.size;
4604*b7893ccfSSadaf Ebrahimi     ASSERT_TRUE(m_device->phy().set_memory_type(as_memory_requirements.memoryTypeBits, &as_memory_alloc, 0));
4605*b7893ccfSSadaf Ebrahimi 
4606*b7893ccfSSadaf Ebrahimi     // Can not bind already freed memory
4607*b7893ccfSSadaf Ebrahimi     {
4608*b7893ccfSSadaf Ebrahimi         VkDeviceMemory as_memory_freed = VK_NULL_HANDLE;
4609*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc, NULL, &as_memory_freed));
4610*b7893ccfSSadaf Ebrahimi         vkFreeMemory(device(), as_memory_freed, NULL);
4611*b7893ccfSSadaf Ebrahimi 
4612*b7893ccfSSadaf Ebrahimi         VkBindAccelerationStructureMemoryInfoNV as_bind_info_freed = as_bind_info;
4613*b7893ccfSSadaf Ebrahimi         as_bind_info_freed.memory = as_memory_freed;
4614*b7893ccfSSadaf Ebrahimi         as_bind_info_freed.memoryOffset = 0;
4615*b7893ccfSSadaf Ebrahimi 
4616*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4617*b7893ccfSSadaf Ebrahimi                                              "VUID-VkBindAccelerationStructureMemoryInfoNV-memory-parameter");
4618*b7893ccfSSadaf Ebrahimi         (void)vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_freed);
4619*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4620*b7893ccfSSadaf Ebrahimi     }
4621*b7893ccfSSadaf Ebrahimi 
4622*b7893ccfSSadaf Ebrahimi     // Can not bind with bad alignment
4623*b7893ccfSSadaf Ebrahimi     if (as_memory_requirements.alignment > 1) {
4624*b7893ccfSSadaf Ebrahimi         VkMemoryAllocateInfo as_memory_alloc_bad_alignment = as_memory_alloc;
4625*b7893ccfSSadaf Ebrahimi         as_memory_alloc_bad_alignment.allocationSize += 1;
4626*b7893ccfSSadaf Ebrahimi 
4627*b7893ccfSSadaf Ebrahimi         VkDeviceMemory as_memory_bad_alignment = VK_NULL_HANDLE;
4628*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc_bad_alignment, NULL, &as_memory_bad_alignment));
4629*b7893ccfSSadaf Ebrahimi 
4630*b7893ccfSSadaf Ebrahimi         VkBindAccelerationStructureMemoryInfoNV as_bind_info_bad_alignment = as_bind_info;
4631*b7893ccfSSadaf Ebrahimi         as_bind_info_bad_alignment.memory = as_memory_bad_alignment;
4632*b7893ccfSSadaf Ebrahimi         as_bind_info_bad_alignment.memoryOffset = 1;
4633*b7893ccfSSadaf Ebrahimi 
4634*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4635*b7893ccfSSadaf Ebrahimi                                              "VUID-VkBindAccelerationStructureMemoryInfoNV-memoryOffset-02594");
4636*b7893ccfSSadaf Ebrahimi         (void)vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_bad_alignment);
4637*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4638*b7893ccfSSadaf Ebrahimi 
4639*b7893ccfSSadaf Ebrahimi         vkFreeMemory(device(), as_memory_bad_alignment, NULL);
4640*b7893ccfSSadaf Ebrahimi     }
4641*b7893ccfSSadaf Ebrahimi 
4642*b7893ccfSSadaf Ebrahimi     // Can not bind with offset outside the allocation
4643*b7893ccfSSadaf Ebrahimi     {
4644*b7893ccfSSadaf Ebrahimi         VkDeviceMemory as_memory_bad_offset = VK_NULL_HANDLE;
4645*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc, NULL, &as_memory_bad_offset));
4646*b7893ccfSSadaf Ebrahimi 
4647*b7893ccfSSadaf Ebrahimi         VkBindAccelerationStructureMemoryInfoNV as_bind_info_bad_offset = as_bind_info;
4648*b7893ccfSSadaf Ebrahimi         as_bind_info_bad_offset.memory = as_memory_bad_offset;
4649*b7893ccfSSadaf Ebrahimi         as_bind_info_bad_offset.memoryOffset =
4650*b7893ccfSSadaf Ebrahimi             (as_memory_alloc.allocationSize + as_memory_requirements.alignment) & ~(as_memory_requirements.alignment - 1);
4651*b7893ccfSSadaf Ebrahimi 
4652*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4653*b7893ccfSSadaf Ebrahimi                                              "VUID-VkBindAccelerationStructureMemoryInfoNV-memoryOffset-02451");
4654*b7893ccfSSadaf Ebrahimi         (void)vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_bad_offset);
4655*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4656*b7893ccfSSadaf Ebrahimi 
4657*b7893ccfSSadaf Ebrahimi         vkFreeMemory(device(), as_memory_bad_offset, NULL);
4658*b7893ccfSSadaf Ebrahimi     }
4659*b7893ccfSSadaf Ebrahimi 
4660*b7893ccfSSadaf Ebrahimi     // Can not bind with offset that doesn't leave enough size
4661*b7893ccfSSadaf Ebrahimi     {
4662*b7893ccfSSadaf Ebrahimi         VkDeviceSize offset = (as_memory_requirements.size - 1) & ~(as_memory_requirements.alignment - 1);
4663*b7893ccfSSadaf Ebrahimi         if (offset > 0 && (as_memory_requirements.size < (as_memory_alloc.allocationSize - as_memory_requirements.alignment))) {
4664*b7893ccfSSadaf Ebrahimi             VkDeviceMemory as_memory_bad_offset = VK_NULL_HANDLE;
4665*b7893ccfSSadaf Ebrahimi             ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc, NULL, &as_memory_bad_offset));
4666*b7893ccfSSadaf Ebrahimi 
4667*b7893ccfSSadaf Ebrahimi             VkBindAccelerationStructureMemoryInfoNV as_bind_info_bad_offset = as_bind_info;
4668*b7893ccfSSadaf Ebrahimi             as_bind_info_bad_offset.memory = as_memory_bad_offset;
4669*b7893ccfSSadaf Ebrahimi             as_bind_info_bad_offset.memoryOffset = offset;
4670*b7893ccfSSadaf Ebrahimi 
4671*b7893ccfSSadaf Ebrahimi             m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4672*b7893ccfSSadaf Ebrahimi                                                  "VUID-VkBindAccelerationStructureMemoryInfoNV-size-02595");
4673*b7893ccfSSadaf Ebrahimi             (void)vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_bad_offset);
4674*b7893ccfSSadaf Ebrahimi             m_errorMonitor->VerifyFound();
4675*b7893ccfSSadaf Ebrahimi 
4676*b7893ccfSSadaf Ebrahimi             vkFreeMemory(device(), as_memory_bad_offset, NULL);
4677*b7893ccfSSadaf Ebrahimi         }
4678*b7893ccfSSadaf Ebrahimi     }
4679*b7893ccfSSadaf Ebrahimi 
4680*b7893ccfSSadaf Ebrahimi     // Can not bind with memory that has unsupported memory type
4681*b7893ccfSSadaf Ebrahimi     {
4682*b7893ccfSSadaf Ebrahimi         VkPhysicalDeviceMemoryProperties memory_properties = {};
4683*b7893ccfSSadaf Ebrahimi         vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
4684*b7893ccfSSadaf Ebrahimi 
4685*b7893ccfSSadaf Ebrahimi         uint32_t supported_memory_type_bits = as_memory_requirements.memoryTypeBits;
4686*b7893ccfSSadaf Ebrahimi         uint32_t unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~supported_memory_type_bits;
4687*b7893ccfSSadaf Ebrahimi         if (unsupported_mem_type_bits != 0) {
4688*b7893ccfSSadaf Ebrahimi             VkMemoryAllocateInfo as_memory_alloc_bad_type = as_memory_alloc;
4689*b7893ccfSSadaf Ebrahimi             ASSERT_TRUE(m_device->phy().set_memory_type(unsupported_mem_type_bits, &as_memory_alloc_bad_type, 0));
4690*b7893ccfSSadaf Ebrahimi 
4691*b7893ccfSSadaf Ebrahimi             VkDeviceMemory as_memory_bad_type = VK_NULL_HANDLE;
4692*b7893ccfSSadaf Ebrahimi             ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc_bad_type, NULL, &as_memory_bad_type));
4693*b7893ccfSSadaf Ebrahimi 
4694*b7893ccfSSadaf Ebrahimi             VkBindAccelerationStructureMemoryInfoNV as_bind_info_bad_type = as_bind_info;
4695*b7893ccfSSadaf Ebrahimi             as_bind_info_bad_type.memory = as_memory_bad_type;
4696*b7893ccfSSadaf Ebrahimi 
4697*b7893ccfSSadaf Ebrahimi             m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4698*b7893ccfSSadaf Ebrahimi                                                  "VUID-VkBindAccelerationStructureMemoryInfoNV-memory-02593");
4699*b7893ccfSSadaf Ebrahimi             (void)vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_bad_type);
4700*b7893ccfSSadaf Ebrahimi             m_errorMonitor->VerifyFound();
4701*b7893ccfSSadaf Ebrahimi 
4702*b7893ccfSSadaf Ebrahimi             vkFreeMemory(device(), as_memory_bad_type, NULL);
4703*b7893ccfSSadaf Ebrahimi         }
4704*b7893ccfSSadaf Ebrahimi     }
4705*b7893ccfSSadaf Ebrahimi 
4706*b7893ccfSSadaf Ebrahimi     // Can not bind memory twice
4707*b7893ccfSSadaf Ebrahimi     {
4708*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureObj as_twice(*m_device, as_create_info, false);
4709*b7893ccfSSadaf Ebrahimi 
4710*b7893ccfSSadaf Ebrahimi         VkDeviceMemory as_memory_twice_1 = VK_NULL_HANDLE;
4711*b7893ccfSSadaf Ebrahimi         VkDeviceMemory as_memory_twice_2 = VK_NULL_HANDLE;
4712*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc, NULL, &as_memory_twice_1));
4713*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(vkAllocateMemory(device(), &as_memory_alloc, NULL, &as_memory_twice_2));
4714*b7893ccfSSadaf Ebrahimi         VkBindAccelerationStructureMemoryInfoNV as_bind_info_twice_1 = as_bind_info;
4715*b7893ccfSSadaf Ebrahimi         VkBindAccelerationStructureMemoryInfoNV as_bind_info_twice_2 = as_bind_info;
4716*b7893ccfSSadaf Ebrahimi         as_bind_info_twice_1.accelerationStructure = as_twice.handle();
4717*b7893ccfSSadaf Ebrahimi         as_bind_info_twice_2.accelerationStructure = as_twice.handle();
4718*b7893ccfSSadaf Ebrahimi         as_bind_info_twice_1.memory = as_memory_twice_1;
4719*b7893ccfSSadaf Ebrahimi         as_bind_info_twice_2.memory = as_memory_twice_2;
4720*b7893ccfSSadaf Ebrahimi 
4721*b7893ccfSSadaf Ebrahimi         ASSERT_VK_SUCCESS(vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_twice_1));
4722*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyNotFound();
4723*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4724*b7893ccfSSadaf Ebrahimi                                              "VUID-VkBindAccelerationStructureMemoryInfoNV-accelerationStructure-02450");
4725*b7893ccfSSadaf Ebrahimi         (void)vkBindAccelerationStructureMemoryNV(device(), 1, &as_bind_info_twice_2);
4726*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4727*b7893ccfSSadaf Ebrahimi 
4728*b7893ccfSSadaf Ebrahimi         vkFreeMemory(device(), as_memory_twice_1, NULL);
4729*b7893ccfSSadaf Ebrahimi         vkFreeMemory(device(), as_memory_twice_2, NULL);
4730*b7893ccfSSadaf Ebrahimi     }
4731*b7893ccfSSadaf Ebrahimi }
4732*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateCmdBuildAccelerationStructureNV)4733*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateCmdBuildAccelerationStructureNV) {
4734*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate acceleration structure building.");
4735*b7893ccfSSadaf Ebrahimi     if (!InitFrameworkForRayTracingTest(this, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
4736*b7893ccfSSadaf Ebrahimi         return;
4737*b7893ccfSSadaf Ebrahimi     }
4738*b7893ccfSSadaf Ebrahimi 
4739*b7893ccfSSadaf Ebrahimi     PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
4740*b7893ccfSSadaf Ebrahimi         reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
4741*b7893ccfSSadaf Ebrahimi             vkGetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
4742*b7893ccfSSadaf Ebrahimi     assert(vkCmdBuildAccelerationStructureNV != nullptr);
4743*b7893ccfSSadaf Ebrahimi 
4744*b7893ccfSSadaf Ebrahimi     VkBufferObj vbo;
4745*b7893ccfSSadaf Ebrahimi     VkBufferObj ibo;
4746*b7893ccfSSadaf Ebrahimi     VkGeometryNV geometry;
4747*b7893ccfSSadaf Ebrahimi     GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
4748*b7893ccfSSadaf Ebrahimi 
4749*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
4750*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
4751*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
4752*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4753*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.instanceCount = 0;
4754*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.geometryCount = 1;
4755*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.pGeometries = &geometry;
4756*b7893ccfSSadaf Ebrahimi 
4757*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureObj bot_level_as(*m_device, bot_level_as_create_info);
4758*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4759*b7893ccfSSadaf Ebrahimi 
4760*b7893ccfSSadaf Ebrahimi     VkBufferObj bot_level_as_scratch;
4761*b7893ccfSSadaf Ebrahimi     bot_level_as.create_scratch_buffer(*m_device, &bot_level_as_scratch);
4762*b7893ccfSSadaf Ebrahimi 
4763*b7893ccfSSadaf Ebrahimi     // Command buffer must be in recording state
4764*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4765*b7893ccfSSadaf Ebrahimi                                          "VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-recording");
4766*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
4767*b7893ccfSSadaf Ebrahimi                                       bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
4768*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4769*b7893ccfSSadaf Ebrahimi 
4770*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
4771*b7893ccfSSadaf Ebrahimi 
4772*b7893ccfSSadaf Ebrahimi     // Incompatible type
4773*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureInfoNV as_build_info_with_incompatible_type = bot_level_as_create_info.info;
4774*b7893ccfSSadaf Ebrahimi     as_build_info_with_incompatible_type.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
4775*b7893ccfSSadaf Ebrahimi     as_build_info_with_incompatible_type.instanceCount = 1;
4776*b7893ccfSSadaf Ebrahimi     as_build_info_with_incompatible_type.geometryCount = 0;
4777*b7893ccfSSadaf Ebrahimi 
4778*b7893ccfSSadaf Ebrahimi     // This is duplicated since it triggers one error for different types and one error for lower instance count - the
4779*b7893ccfSSadaf Ebrahimi     // build info is incompatible but still needs to be valid to get past the stateless checks.
4780*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488");
4781*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488");
4782*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &as_build_info_with_incompatible_type, VK_NULL_HANDLE, 0, VK_FALSE,
4783*b7893ccfSSadaf Ebrahimi                                       bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
4784*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4785*b7893ccfSSadaf Ebrahimi 
4786*b7893ccfSSadaf Ebrahimi     // Incompatible flags
4787*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureInfoNV as_build_info_with_incompatible_flags = bot_level_as_create_info.info;
4788*b7893ccfSSadaf Ebrahimi     as_build_info_with_incompatible_flags.flags = VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_NV;
4789*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488");
4790*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &as_build_info_with_incompatible_flags, VK_NULL_HANDLE, 0,
4791*b7893ccfSSadaf Ebrahimi                                       VK_FALSE, bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
4792*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4793*b7893ccfSSadaf Ebrahimi 
4794*b7893ccfSSadaf Ebrahimi     // Incompatible build size
4795*b7893ccfSSadaf Ebrahimi     VkGeometryNV geometry_with_more_vertices = geometry;
4796*b7893ccfSSadaf Ebrahimi     geometry_with_more_vertices.geometry.triangles.vertexCount += 1;
4797*b7893ccfSSadaf Ebrahimi 
4798*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureInfoNV as_build_info_with_incompatible_geometry = bot_level_as_create_info.info;
4799*b7893ccfSSadaf Ebrahimi     as_build_info_with_incompatible_geometry.pGeometries = &geometry_with_more_vertices;
4800*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488");
4801*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &as_build_info_with_incompatible_geometry, VK_NULL_HANDLE, 0,
4802*b7893ccfSSadaf Ebrahimi                                       VK_FALSE, bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
4803*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4804*b7893ccfSSadaf Ebrahimi 
4805*b7893ccfSSadaf Ebrahimi     // Scratch buffer too small
4806*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo too_small_scratch_buffer_info = {};
4807*b7893ccfSSadaf Ebrahimi     too_small_scratch_buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4808*b7893ccfSSadaf Ebrahimi     too_small_scratch_buffer_info.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV;
4809*b7893ccfSSadaf Ebrahimi     too_small_scratch_buffer_info.size = 1;
4810*b7893ccfSSadaf Ebrahimi     VkBufferObj too_small_scratch_buffer(*m_device, too_small_scratch_buffer_info);
4811*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-update-02491");
4812*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
4813*b7893ccfSSadaf Ebrahimi                                       bot_level_as.handle(), VK_NULL_HANDLE, too_small_scratch_buffer.handle(), 0);
4814*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4815*b7893ccfSSadaf Ebrahimi 
4816*b7893ccfSSadaf Ebrahimi     // Scratch buffer with offset too small
4817*b7893ccfSSadaf Ebrahimi     VkDeviceSize scratch_buffer_offset = 5;
4818*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-update-02491");
4819*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
4820*b7893ccfSSadaf Ebrahimi                                       bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), scratch_buffer_offset);
4821*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4822*b7893ccfSSadaf Ebrahimi 
4823*b7893ccfSSadaf Ebrahimi     // Src must have been built before
4824*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureObj bot_level_as_updated(*m_device, bot_level_as_create_info);
4825*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-update-02489");
4826*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_TRUE,
4827*b7893ccfSSadaf Ebrahimi                                       bot_level_as_updated.handle(), bot_level_as.handle(), bot_level_as_scratch.handle(), 0);
4828*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4829*b7893ccfSSadaf Ebrahimi 
4830*b7893ccfSSadaf Ebrahimi     // Src must have been built before with the VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV flag
4831*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
4832*b7893ccfSSadaf Ebrahimi                                       bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
4833*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4834*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBuildAccelerationStructureNV-update-02489");
4835*b7893ccfSSadaf Ebrahimi     vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_TRUE,
4836*b7893ccfSSadaf Ebrahimi                                       bot_level_as_updated.handle(), bot_level_as.handle(), bot_level_as_scratch.handle(), 0);
4837*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4838*b7893ccfSSadaf Ebrahimi }
4839*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateGetAccelerationStructureHandleNV)4840*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateGetAccelerationStructureHandleNV) {
4841*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate acceleration structure handle querying.");
4842*b7893ccfSSadaf Ebrahimi     if (!InitFrameworkForRayTracingTest(this, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
4843*b7893ccfSSadaf Ebrahimi         return;
4844*b7893ccfSSadaf Ebrahimi     }
4845*b7893ccfSSadaf Ebrahimi 
4846*b7893ccfSSadaf Ebrahimi     PFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV =
4847*b7893ccfSSadaf Ebrahimi         reinterpret_cast<PFN_vkGetAccelerationStructureHandleNV>(
4848*b7893ccfSSadaf Ebrahimi             vkGetDeviceProcAddr(m_device->handle(), "vkGetAccelerationStructureHandleNV"));
4849*b7893ccfSSadaf Ebrahimi     assert(vkGetAccelerationStructureHandleNV != nullptr);
4850*b7893ccfSSadaf Ebrahimi 
4851*b7893ccfSSadaf Ebrahimi     VkBufferObj vbo;
4852*b7893ccfSSadaf Ebrahimi     VkBufferObj ibo;
4853*b7893ccfSSadaf Ebrahimi     VkGeometryNV geometry;
4854*b7893ccfSSadaf Ebrahimi     GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
4855*b7893ccfSSadaf Ebrahimi 
4856*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
4857*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
4858*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
4859*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4860*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.instanceCount = 0;
4861*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.geometryCount = 1;
4862*b7893ccfSSadaf Ebrahimi     bot_level_as_create_info.info.pGeometries = &geometry;
4863*b7893ccfSSadaf Ebrahimi 
4864*b7893ccfSSadaf Ebrahimi     // Not enough space for the handle
4865*b7893ccfSSadaf Ebrahimi     {
4866*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureObj bot_level_as(*m_device, bot_level_as_create_info);
4867*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyNotFound();
4868*b7893ccfSSadaf Ebrahimi 
4869*b7893ccfSSadaf Ebrahimi         uint64_t handle = 0;
4870*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4871*b7893ccfSSadaf Ebrahimi                                              "VUID-vkGetAccelerationStructureHandleNV-dataSize-02240");
4872*b7893ccfSSadaf Ebrahimi         vkGetAccelerationStructureHandleNV(m_device->handle(), bot_level_as.handle(), sizeof(uint8_t), &handle);
4873*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4874*b7893ccfSSadaf Ebrahimi     }
4875*b7893ccfSSadaf Ebrahimi 
4876*b7893ccfSSadaf Ebrahimi     // No memory bound to acceleration structure
4877*b7893ccfSSadaf Ebrahimi     {
4878*b7893ccfSSadaf Ebrahimi         VkAccelerationStructureObj bot_level_as(*m_device, bot_level_as_create_info, /*init_memory=*/false);
4879*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyNotFound();
4880*b7893ccfSSadaf Ebrahimi 
4881*b7893ccfSSadaf Ebrahimi         uint64_t handle = 0;
4882*b7893ccfSSadaf Ebrahimi         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4883*b7893ccfSSadaf Ebrahimi                                              "UNASSIGNED-vkGetAccelerationStructureHandleNV-accelerationStructure-XXXX");
4884*b7893ccfSSadaf Ebrahimi         vkGetAccelerationStructureHandleNV(m_device->handle(), bot_level_as.handle(), sizeof(uint64_t), &handle);
4885*b7893ccfSSadaf Ebrahimi         m_errorMonitor->VerifyFound();
4886*b7893ccfSSadaf Ebrahimi     }
4887*b7893ccfSSadaf Ebrahimi }
4888*b7893ccfSSadaf Ebrahimi 
TEST_F(VkLayerTest,ValidateCmdCopyAccelerationStructureNV)4889*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ValidateCmdCopyAccelerationStructureNV) {
4890*b7893ccfSSadaf Ebrahimi     TEST_DESCRIPTION("Validate acceleration structure copying.");
4891*b7893ccfSSadaf Ebrahimi     if (!InitFrameworkForRayTracingTest(this, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
4892*b7893ccfSSadaf Ebrahimi         return;
4893*b7893ccfSSadaf Ebrahimi     }
4894*b7893ccfSSadaf Ebrahimi 
4895*b7893ccfSSadaf Ebrahimi     PFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV = reinterpret_cast<PFN_vkCmdCopyAccelerationStructureNV>(
4896*b7893ccfSSadaf Ebrahimi         vkGetDeviceProcAddr(m_device->handle(), "vkCmdCopyAccelerationStructureNV"));
4897*b7893ccfSSadaf Ebrahimi     assert(vkCmdCopyAccelerationStructureNV != nullptr);
4898*b7893ccfSSadaf Ebrahimi 
4899*b7893ccfSSadaf Ebrahimi     VkBufferObj vbo;
4900*b7893ccfSSadaf Ebrahimi     VkBufferObj ibo;
4901*b7893ccfSSadaf Ebrahimi     VkGeometryNV geometry;
4902*b7893ccfSSadaf Ebrahimi     GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
4903*b7893ccfSSadaf Ebrahimi 
4904*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureCreateInfoNV as_create_info = {};
4905*b7893ccfSSadaf Ebrahimi     as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
4906*b7893ccfSSadaf Ebrahimi     as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
4907*b7893ccfSSadaf Ebrahimi     as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
4908*b7893ccfSSadaf Ebrahimi     as_create_info.info.instanceCount = 0;
4909*b7893ccfSSadaf Ebrahimi     as_create_info.info.geometryCount = 1;
4910*b7893ccfSSadaf Ebrahimi     as_create_info.info.pGeometries = &geometry;
4911*b7893ccfSSadaf Ebrahimi 
4912*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureObj src_as(*m_device, as_create_info);
4913*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureObj dst_as(*m_device, as_create_info);
4914*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureObj dst_as_without_mem(*m_device, as_create_info, false);
4915*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyNotFound();
4916*b7893ccfSSadaf Ebrahimi 
4917*b7893ccfSSadaf Ebrahimi     // Command buffer must be in recording state
4918*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4919*b7893ccfSSadaf Ebrahimi                                          "VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-recording");
4920*b7893ccfSSadaf Ebrahimi     vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as.handle(), src_as.handle(),
4921*b7893ccfSSadaf Ebrahimi                                      VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV);
4922*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4923*b7893ccfSSadaf Ebrahimi 
4924*b7893ccfSSadaf Ebrahimi     m_commandBuffer->begin();
4925*b7893ccfSSadaf Ebrahimi 
4926*b7893ccfSSadaf Ebrahimi     // Src must have been created with allow compaction flag
4927*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdCopyAccelerationStructureNV-src-02497");
4928*b7893ccfSSadaf Ebrahimi     vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as.handle(), src_as.handle(),
4929*b7893ccfSSadaf Ebrahimi                                      VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV);
4930*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4931*b7893ccfSSadaf Ebrahimi 
4932*b7893ccfSSadaf Ebrahimi     // Dst must have been bound with memory
4933*b7893ccfSSadaf Ebrahimi     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4934*b7893ccfSSadaf Ebrahimi                                          "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkAccelerationStructureNV");
4935*b7893ccfSSadaf Ebrahimi     vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as_without_mem.handle(), src_as.handle(),
4936*b7893ccfSSadaf Ebrahimi                                      VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV);
4937*b7893ccfSSadaf Ebrahimi     m_errorMonitor->VerifyFound();
4938*b7893ccfSSadaf Ebrahimi }
4939