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