blob: 08c84cb746290aca36c2a7686b5a210f81ac1c0e [file] [log] [blame]
unknown088160a2019-05-23 17:43:13 -06001/*
sfricke-samsung6886c4b2021-01-16 08:37:35 -08002 * Copyright (c) 2015-2021 The Khronos Group Inc.
3 * Copyright (c) 2015-2021 Valve Corporation
4 * Copyright (c) 2015-2021 LunarG, Inc.
5 * Copyright (c) 2015-2021 Google, Inc.
Tobias Hector04f2ab22020-12-01 10:59:33 +00006 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
unknown088160a2019-05-23 17:43:13 -06007 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Author: Chia-I Wu <olvaffe@gmail.com>
15 * Author: Chris Forbes <chrisf@ijw.co.nz>
16 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
17 * Author: Mark Lobodzinski <mark@lunarg.com>
18 * Author: Mike Stroyan <mike@LunarG.com>
19 * Author: Tobin Ehlis <tobine@google.com>
20 * Author: Tony Barbour <tony@LunarG.com>
21 * Author: Cody Northrop <cnorthrop@google.com>
22 * Author: Dave Houlton <daveh@lunarg.com>
23 * Author: Jeremy Kniager <jeremyk@lunarg.com>
24 * Author: Shannon McPherson <shannon@lunarg.com>
25 * Author: John Zulauf <jzulauf@lunarg.com>
Tobias Hector04f2ab22020-12-01 10:59:33 +000026 * Author: Tobias Hector <tobias.hector@amd.com>
unknown088160a2019-05-23 17:43:13 -060027 */
28
29#include "cast_utils.h"
30#include "layer_validation_tests.h"
31
32TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
33 TEST_DESCRIPTION("Allocate command buffers from one command pool and attempt to delete them from another.");
34
Mark Lobodzinski20310782020-02-28 14:25:17 -070035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkFreeCommandBuffers-pCommandBuffers-parent");
unknown088160a2019-05-23 17:43:13 -060036
37 ASSERT_NO_FATAL_FAILURE(Init());
38 VkCommandPool command_pool_one;
39 VkCommandPool command_pool_two;
40
41 VkCommandPoolCreateInfo pool_create_info{};
42 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
43 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
44 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
45
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060046 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
unknown088160a2019-05-23 17:43:13 -060047
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060048 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
unknown088160a2019-05-23 17:43:13 -060049
50 VkCommandBuffer cb;
51 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
52 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
53 command_buffer_allocate_info.commandPool = command_pool_one;
54 command_buffer_allocate_info.commandBufferCount = 1;
55 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060056 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
unknown088160a2019-05-23 17:43:13 -060057
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060058 vk::FreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
unknown088160a2019-05-23 17:43:13 -060059
60 m_errorMonitor->VerifyFound();
61
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060062 vk::DestroyCommandPool(m_device->device(), command_pool_one, NULL);
63 vk::DestroyCommandPool(m_device->device(), command_pool_two, NULL);
unknown088160a2019-05-23 17:43:13 -060064}
65
66TEST_F(VkLayerTest, InvalidSecondaryCommandBufferBarrier) {
67 TEST_DESCRIPTION("Add an invalid image barrier in a secondary command buffer");
68 ASSERT_NO_FATAL_FAILURE(Init());
69
70 // A renderpass with a single subpass that declared a self-dependency
71 VkAttachmentDescription attach[] = {
72 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
73 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
74 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
75 };
76 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
77 VkSubpassDescription subpasses[] = {
78 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
79 };
80 VkSubpassDependency dep = {0,
81 0,
82 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
83 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
84 VK_ACCESS_SHADER_WRITE_BIT,
85 VK_ACCESS_SHADER_WRITE_BIT,
86 VK_DEPENDENCY_BY_REGION_BIT};
87 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 1, &dep};
88 VkRenderPass rp;
89
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060090 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
unknown088160a2019-05-23 17:43:13 -060091 ASSERT_VK_SUCCESS(err);
92
93 VkImageObj image(m_device);
94 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
95 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
96 // Second image that img_barrier will incorrectly use
97 VkImageObj image2(m_device);
98 image2.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
99
100 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
101 VkFramebuffer fb;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600102 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
unknown088160a2019-05-23 17:43:13 -0600103 ASSERT_VK_SUCCESS(err);
104
105 m_commandBuffer->begin();
106
107 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
108 nullptr,
109 rp,
110 fb,
111 {{
112 0,
113 0,
114 },
115 {32, 32}},
116 0,
117 nullptr};
118
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600119 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600120
121 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
122 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
123
124 VkCommandBufferInheritanceInfo cbii = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
125 nullptr,
126 rp,
127 0,
128 VK_NULL_HANDLE, // Set to NULL FB handle intentionally to flesh out any errors
129 VK_FALSE,
130 0,
131 0};
132 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
133 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
134 &cbii};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600135 vk::BeginCommandBuffer(secondary.handle(), &cbbi);
unknown088160a2019-05-23 17:43:13 -0600136 VkImageMemoryBarrier img_barrier = {};
137 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
138 img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
139 img_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
140 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
141 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
142 img_barrier.image = image2.handle(); // Image mis-matches with FB image
143 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
144 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
145 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
146 img_barrier.subresourceRange.baseArrayLayer = 0;
147 img_barrier.subresourceRange.baseMipLevel = 0;
148 img_barrier.subresourceRange.layerCount = 1;
149 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600150 vk::CmdPipelineBarrier(secondary.handle(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
151 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
unknown088160a2019-05-23 17:43:13 -0600152 secondary.end();
153
Shannon McPherson93970b12020-06-12 14:34:35 -0600154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600155 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600156 m_errorMonitor->VerifyFound();
157
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600158 vk::DestroyFramebuffer(m_device->device(), fb, nullptr);
159 vk::DestroyRenderPass(m_device->device(), rp, nullptr);
unknown088160a2019-05-23 17:43:13 -0600160}
161
162TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
163 TEST_DESCRIPTION(
164 "Run a simple draw calls to validate failure when Depth Bias dynamic state is required but not correctly bound.");
165
166 ASSERT_NO_FATAL_FAILURE(Init());
167 // Dynamic depth bias
Mark Lobodzinski20310782020-02-28 14:25:17 -0700168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bias state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600169 VKTriangleTest(BsoFailDepthBias);
170 m_errorMonitor->VerifyFound();
171}
172
173TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
174 TEST_DESCRIPTION(
175 "Run a simple draw calls to validate failure when Line Width dynamic state is required but not correctly bound.");
176
177 ASSERT_NO_FATAL_FAILURE(Init());
178 // Dynamic line width
Mark Lobodzinski20310782020-02-28 14:25:17 -0700179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line width state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600180 VKTriangleTest(BsoFailLineWidth);
181 m_errorMonitor->VerifyFound();
182}
183
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500184TEST_F(VkLayerTest, DynamicLineStippleNotBound) {
185 TEST_DESCRIPTION(
186 "Run a simple draw calls to validate failure when Line Stipple dynamic state is required but not correctly bound.");
187
188 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
189 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
190 } else {
191 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
192 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
193 return;
194 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -0700195 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500196 std::array<const char *, 1> required_device_extensions = {{VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME}};
197 for (auto device_extension : required_device_extensions) {
198 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
199 m_device_extension_names.push_back(device_extension);
200 } else {
201 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
202 return;
203 }
204 }
205
206 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600207 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500208 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
209
Mark Lobodzinski07d0a612020-12-30 15:42:31 -0700210 auto line_rasterization_features = LvlInitStruct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
211 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&line_rasterization_features);
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500212 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
213
214 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
215 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
216 return;
217 }
218
219 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
220
Mark Lobodzinski20310782020-02-28 14:25:17 -0700221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500222 VKTriangleTest(BsoFailLineStipple);
223 m_errorMonitor->VerifyFound();
224}
225
unknown088160a2019-05-23 17:43:13 -0600226TEST_F(VkLayerTest, DynamicViewportNotBound) {
227 TEST_DESCRIPTION(
228 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
229
230 ASSERT_NO_FATAL_FAILURE(Init());
231 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700232 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600233 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
234 VKTriangleTest(BsoFailViewport);
235 m_errorMonitor->VerifyFound();
236}
237
238TEST_F(VkLayerTest, DynamicScissorNotBound) {
239 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
240
241 ASSERT_NO_FATAL_FAILURE(Init());
242 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600244 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
245 VKTriangleTest(BsoFailScissor);
246 m_errorMonitor->VerifyFound();
247}
248
249TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
250 TEST_DESCRIPTION(
251 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
252
253 ASSERT_NO_FATAL_FAILURE(Init());
254 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700255 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600256 VKTriangleTest(BsoFailBlend);
257 m_errorMonitor->VerifyFound();
258}
259
260TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
261 TEST_DESCRIPTION(
262 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
263
264 ASSERT_NO_FATAL_FAILURE(Init());
265 if (!m_device->phy().features().depthBounds) {
266 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
267 return;
268 }
269 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600271 VKTriangleTest(BsoFailDepthBounds);
272 m_errorMonitor->VerifyFound();
273}
274
275TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
276 TEST_DESCRIPTION(
277 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
278
279 ASSERT_NO_FATAL_FAILURE(Init());
280 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600282 VKTriangleTest(BsoFailStencilReadMask);
283 m_errorMonitor->VerifyFound();
284}
285
286TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
287 TEST_DESCRIPTION(
288 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
289
290 ASSERT_NO_FATAL_FAILURE(Init());
291 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700292 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600293 VKTriangleTest(BsoFailStencilWriteMask);
294 m_errorMonitor->VerifyFound();
295}
296
297TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
298 TEST_DESCRIPTION(
299 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
300
301 ASSERT_NO_FATAL_FAILURE(Init());
302 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600304 VKTriangleTest(BsoFailStencilReference);
305 m_errorMonitor->VerifyFound();
306}
307
308TEST_F(VkLayerTest, IndexBufferNotBound) {
309 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
310
311 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600313 VKTriangleTest(BsoFailIndexBuffer);
314 m_errorMonitor->VerifyFound();
315}
316
317TEST_F(VkLayerTest, IndexBufferBadSize) {
318 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
319
320 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600322 VKTriangleTest(BsoFailIndexBufferBadSize);
323 m_errorMonitor->VerifyFound();
324}
325
326TEST_F(VkLayerTest, IndexBufferBadOffset) {
327 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
328
329 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600331 VKTriangleTest(BsoFailIndexBufferBadOffset);
332 m_errorMonitor->VerifyFound();
333}
334
335TEST_F(VkLayerTest, IndexBufferBadBindSize) {
336 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
337
338 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600340 VKTriangleTest(BsoFailIndexBufferBadMapSize);
341 m_errorMonitor->VerifyFound();
342}
343
344TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
345 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
346
347 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600349 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
350 m_errorMonitor->VerifyFound();
351}
352
353TEST_F(VkLayerTest, MissingClearAttachment) {
354 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
355 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700356 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600357
358 VKTriangleTest(BsoFailCmdClearAttachments);
359 m_errorMonitor->VerifyFound();
360}
361
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700362TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
363 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700365
366 ASSERT_NO_FATAL_FAILURE(Init());
367
368 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
369 secondary.begin();
370 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
371 secondary.end();
372
373 VkSubmitInfo submit_info;
374 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
375 submit_info.pNext = NULL;
376 submit_info.waitSemaphoreCount = 0;
377 submit_info.pWaitSemaphores = NULL;
378 submit_info.pWaitDstStageMask = NULL;
379 submit_info.commandBufferCount = 1;
380 submit_info.pCommandBuffers = &secondary.handle();
381 submit_info.signalSemaphoreCount = 0;
382 submit_info.pSignalSemaphores = NULL;
383
384 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
385 m_errorMonitor->VerifyFound();
386}
387
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700388TEST_F(VkLayerTest, Sync2SecondaryCommandbufferAsPrimary) {
389 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit2KHR.");
390 SetTargetApiVersion(VK_API_VERSION_1_2);
391 ASSERT_NO_FATAL_FAILURE(InitFramework());
392 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
393 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
394 } else {
395 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
396 return;
397 }
398
399 if (!CheckSynchronization2SupportAndInitState(this)) {
400 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
401 return;
402 }
403 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferSubmitInfoKHR-commandBuffer-03890");
405
406 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
407 secondary.begin();
408 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
409 secondary.end();
410
411 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
412 cb_info.commandBuffer = secondary.handle();
413
414 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
415 submit_info.commandBufferInfoCount = 1;
416 submit_info.pCommandBufferInfos = &cb_info;
417
418 fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
419 m_errorMonitor->VerifyFound();
420}
421
unknown088160a2019-05-23 17:43:13 -0600422TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600424 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
425
426 ASSERT_NO_FATAL_FAILURE(Init());
427 ASSERT_NO_FATAL_FAILURE(InitViewport());
428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
429
430 // We luck out b/c by default the framework creates CB w/ the
431 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
432 m_commandBuffer->begin();
433 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
434 m_commandBuffer->end();
435
436 // Bypass framework since it does the waits automatically
437 VkResult err = VK_SUCCESS;
438 VkSubmitInfo submit_info;
439 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
440 submit_info.pNext = NULL;
441 submit_info.waitSemaphoreCount = 0;
442 submit_info.pWaitSemaphores = NULL;
443 submit_info.pWaitDstStageMask = NULL;
444 submit_info.commandBufferCount = 1;
445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
446 submit_info.signalSemaphoreCount = 0;
447 submit_info.pSignalSemaphores = NULL;
448
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600449 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600450 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600451 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600452
453 // Cause validation error by re-submitting cmd buffer that should only be
454 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600455 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
456 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600457
458 m_errorMonitor->VerifyFound();
459}
460
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700461TEST_F(VkLayerTest, Sync2CommandBufferTwoSubmits) {
462 SetTargetApiVersion(VK_API_VERSION_1_2);
463 ASSERT_NO_FATAL_FAILURE(InitFramework());
464 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
465 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
466 } else {
467 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
468 return;
469 }
470
471 if (!CheckSynchronization2SupportAndInitState(this)) {
472 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
473 return;
474 }
475 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
476
477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
478 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
479 ASSERT_NO_FATAL_FAILURE(InitViewport());
480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
481
482 // We luck out b/c by default the framework creates CB w/ the
483 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
484 m_commandBuffer->begin();
485 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
486 m_commandBuffer->end();
487
488 // Bypass framework since it does the waits automatically
489 VkResult err = VK_SUCCESS;
490 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
491 cb_info.commandBuffer = m_commandBuffer->handle();
492
493 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
494 submit_info.commandBufferInfoCount = 1;
495 submit_info.pCommandBufferInfos = &cb_info;
496
497 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
498 ASSERT_VK_SUCCESS(err);
499 vk::QueueWaitIdle(m_device->m_queue);
500
501 // Cause validation error by re-submitting cmd buffer that should only be
502 // submitted once
503 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
504 vk::QueueWaitIdle(m_device->m_queue);
505
506 m_errorMonitor->VerifyFound();
507}
508
unknown088160a2019-05-23 17:43:13 -0600509TEST_F(VkLayerTest, InvalidPushConstants) {
510 ASSERT_NO_FATAL_FAILURE(Init());
511 ASSERT_NO_FATAL_FAILURE(InitViewport());
512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
513
514 VkPipelineLayout pipeline_layout;
515 VkPushConstantRange pc_range = {};
516 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
517 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
518 pipeline_layout_ci.pushConstantRangeCount = 1;
519 pipeline_layout_ci.pPushConstantRanges = &pc_range;
520
521 //
522 // Check for invalid push constant ranges in pipeline layouts.
523 //
524 struct PipelineLayoutTestCase {
525 VkPushConstantRange const range;
526 char const *msg;
527 };
528
529 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
530 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700531 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
532 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
533 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
534 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
535 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
537 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
538 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
539 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
540 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600541 }};
542
543 // Check for invalid offset and size
544 for (const auto &iter : range_tests) {
545 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700546 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600547 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600548 m_errorMonitor->VerifyFound();
549 }
550
551 // Check for invalid stage flag
552 pc_range.offset = 0;
553 pc_range.size = 16;
554 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700555 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600556 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600557 m_errorMonitor->VerifyFound();
558
559 // Check for duplicate stage flags in a list of push constant ranges.
560 // A shader can only have one push constant block and that block is mapped
561 // to the push constant range that has that shader's stage flag set.
562 // The shader's stage flag can only appear once in all the ranges, so the
563 // implementation can find the one and only range to map it to.
564 const uint32_t ranges_per_test = 5;
565 struct DuplicateStageFlagsTestCase {
566 VkPushConstantRange const ranges[ranges_per_test];
567 std::vector<char const *> const msg;
568 };
569 // Overlapping ranges are OK, but a stage flag can appear only once.
570 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
571 {
572 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
573 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
574 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
575 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
576 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
577 {
578 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
579 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
580 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
581 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
582 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
583 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
584 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
585 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
586 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
587 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
588 }},
589 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
590 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
591 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
592 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
593 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
594 {
595 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
596 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
597 }},
598 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
599 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
600 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
601 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
602 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
603 {
604 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
605 }},
606 },
607 };
608
609 for (const auto &iter : duplicate_stageFlags_tests) {
610 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
611 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600613 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600614 m_errorMonitor->VerifyFound();
615 }
616
617 //
618 // CmdPushConstants tests
619 //
620
621 // Setup a pipeline layout with ranges: [0,32) [16,80)
622 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
623 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
624 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
625
626 const uint8_t dummy_values[100] = {};
627
628 m_commandBuffer->begin();
629 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
630
631 // Check for invalid stage flag
632 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600634 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600635 m_errorMonitor->VerifyFound();
636
637 // Positive tests for the overlapping ranges
638 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600639 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
640 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600641 m_errorMonitor->VerifyNotFound();
642 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600643 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600644 m_errorMonitor->VerifyNotFound();
645 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600646 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
647 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600648 m_errorMonitor->VerifyNotFound();
649
650 // Wrong cmd stages for extant range
651 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600653 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600655 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
656 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600657 m_errorMonitor->VerifyFound();
658
659 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600661 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
662 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600663 m_errorMonitor->VerifyFound();
664
665 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600667 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
668 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600669 m_errorMonitor->VerifyFound();
670
671 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600673 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600674 m_errorMonitor->VerifyFound();
675
676 m_commandBuffer->EndRenderPass();
677 m_commandBuffer->end();
678}
679
680TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600682
683 ASSERT_NO_FATAL_FAILURE(Init());
684 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
685 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600686 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600687
688 m_errorMonitor->VerifyFound();
689}
690
691TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
692 ASSERT_NO_FATAL_FAILURE(Init());
693
694 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
695
696 // Force the failure by not setting the Renderpass and Framebuffer fields
697 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
698 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
699
700 VkCommandBufferBeginInfo cmd_buf_info = {};
701 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
702 cmd_buf_info.pNext = NULL;
703 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
704 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
705
amhagana448ea52021-11-02 14:09:14 -0400706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-06002");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600707 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600708 m_errorMonitor->VerifyFound();
709}
710
711TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
712 ASSERT_NO_FATAL_FAILURE(Init());
713
Mark Lobodzinski20310782020-02-28 14:25:17 -0700714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600715
716 // A pool we can reset in.
717 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
718 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
719
720 secondary.begin();
721 secondary.end();
722
723 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600724 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600725
726 // rerecording of secondary
727 secondary.reset(); // explicit reset here.
728 secondary.begin();
729 secondary.end();
730
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600731 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600732 m_errorMonitor->VerifyFound();
733}
734
735TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
736 ASSERT_NO_FATAL_FAILURE(Init());
737
Mark Lobodzinski20310782020-02-28 14:25:17 -0700738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600739
740 // A pool we can reset in.
741 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
742 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
743
744 secondary.begin();
745 secondary.end();
746
747 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600748 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600749
750 // rerecording of secondary
751 secondary.begin(); // implicit reset in begin
752 secondary.end();
753
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600754 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600755 m_errorMonitor->VerifyFound();
756}
757
758TEST_F(VkLayerTest, CascadedInvalidation) {
759 ASSERT_NO_FATAL_FAILURE(Init());
760
761 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
762 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600763 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600764
765 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
766 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600767 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600768 secondary.end();
769
770 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600771 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600772 m_commandBuffer->end();
773
774 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600775 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600776
Mark Lobodzinski20310782020-02-28 14:25:17 -0700777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600778 m_commandBuffer->QueueCommandBuffer(false);
779 m_errorMonitor->VerifyFound();
780}
781
782TEST_F(VkLayerTest, CommandBufferResetErrors) {
783 // Cause error due to Begin while recording CB
784 // Then cause 2 errors for attempting to reset CB w/o having
785 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
786 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600788
789 ASSERT_NO_FATAL_FAILURE(Init());
790
791 // Calls AllocateCommandBuffers
792 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
793
794 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
795 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
796 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
797 VkCommandBufferBeginInfo cmd_buf_info = {};
798 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
799 cmd_buf_info.pNext = NULL;
800 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
801 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
802
803 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600804 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600805 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600806 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600807 m_errorMonitor->VerifyFound();
808
Mark Lobodzinski20310782020-02-28 14:25:17 -0700809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600810 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
811 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600812 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600813 m_errorMonitor->VerifyFound();
814
Mark Lobodzinski20310782020-02-28 14:25:17 -0700815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600816 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600817 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600818 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600819 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600820 m_errorMonitor->VerifyFound();
821}
822
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700823TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
824 ASSERT_NO_FATAL_FAILURE(Init());
825
826 // Calls AllocateCommandBuffers
827 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
828
829 VkCommandBufferBeginInfo cmd_buf_info = {};
830 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
831 cmd_buf_info.pNext = NULL;
832 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
833
834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
835 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
836 m_errorMonitor->VerifyFound();
837}
838
unknown088160a2019-05-23 17:43:13 -0600839TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
840 // Call CmdClearAttachmentss outside of an active RenderPass
841
sfricke-samsung85584a72021-09-30 21:43:38 -0700842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearAttachments: This call must be issued inside an active render pass");
unknown088160a2019-05-23 17:43:13 -0600843
844 ASSERT_NO_FATAL_FAILURE(Init());
845 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
846
847 // Start no RenderPass
848 m_commandBuffer->begin();
849
850 VkClearAttachment color_attachment;
851 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
852 color_attachment.clearValue.color.float32[0] = 0;
853 color_attachment.clearValue.color.float32[1] = 0;
854 color_attachment.clearValue.color.float32[2] = 0;
855 color_attachment.clearValue.color.float32[3] = 0;
856 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600857 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600858 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600859
860 m_errorMonitor->VerifyFound();
861}
862
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600863TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
864 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
865
Mark Lobodzinski20310782020-02-28 14:25:17 -0700866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600867
868 ASSERT_NO_FATAL_FAILURE(Init());
869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
870
871 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600872 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600873
874 VkClearAttachment color_attachment;
875 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
876 color_attachment.clearValue.color.float32[0] = 0;
877 color_attachment.clearValue.color.float32[1] = 0;
878 color_attachment.clearValue.color.float32[2] = 0;
879 color_attachment.clearValue.color.float32[3] = 0;
880 color_attachment.colorAttachment = 0;
881 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600882 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600883
884 m_errorMonitor->VerifyFound();
885}
886
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700887TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
888 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
889
890 ASSERT_NO_FATAL_FAILURE(Init());
891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
892
893 m_commandBuffer->begin();
894 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
895
896 VkClearAttachment color_attachment;
897 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
898 color_attachment.clearValue.color.float32[0] = 0;
899 color_attachment.clearValue.color.float32[1] = 0;
900 color_attachment.clearValue.color.float32[2] = 0;
901 color_attachment.clearValue.color.float32[3] = 0;
902 color_attachment.colorAttachment = 0;
903 VkClearRect clear_rect = {};
904 clear_rect.rect.offset = {0, 0};
905 clear_rect.baseArrayLayer = 0;
906 clear_rect.layerCount = 1;
907
908 clear_rect.rect.extent = {0, 1};
909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
910 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
911 m_errorMonitor->VerifyFound();
912
913 clear_rect.rect.extent = {1, 0};
914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
915 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
916 m_errorMonitor->VerifyFound();
917}
918
sfricke-samsung6141db32020-10-26 03:31:38 -0700919TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
920 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
921
922 ASSERT_NO_FATAL_FAILURE(Init());
923 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
924
925 m_commandBuffer->begin();
926 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
927
928 VkClearAttachment attachment;
929 attachment.clearValue.color.float32[0] = 0;
930 attachment.clearValue.color.float32[1] = 0;
931 attachment.clearValue.color.float32[2] = 0;
932 attachment.clearValue.color.float32[3] = 0;
933 attachment.colorAttachment = 0;
934 VkClearRect clear_rect = {};
935 clear_rect.rect.offset = {0, 0};
936 clear_rect.rect.extent = {1, 1};
937 clear_rect.baseArrayLayer = 0;
938 clear_rect.layerCount = 1;
939
940 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
942 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
943 m_errorMonitor->VerifyFound();
944
945 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
947 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
948 m_errorMonitor->VerifyFound();
949
950 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
951 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
952 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
953 m_errorMonitor->VerifyFound();
954
955 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
957 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
958 m_errorMonitor->VerifyFound();
959}
960
sfricke-samsung91f4a542020-10-21 00:29:17 -0700961TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
962 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
963
964 ASSERT_NO_FATAL_FAILURE(Init());
965 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
966
967 m_commandBuffer->begin();
968 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
969
970 VkClearAttachment color_attachment;
971 color_attachment.clearValue.color.float32[0] = 0;
972 color_attachment.clearValue.color.float32[1] = 0;
973 color_attachment.clearValue.color.float32[2] = 0;
974 color_attachment.clearValue.color.float32[3] = 0;
975 color_attachment.colorAttachment = 0;
976 VkClearRect clear_rect = {};
977 clear_rect.rect.offset = {0, 0};
978 clear_rect.rect.extent = {1, 1};
979 clear_rect.baseArrayLayer = 0;
980 clear_rect.layerCount = 1;
981
982 color_attachment.aspectMask = 0;
983 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
984 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
985 m_errorMonitor->VerifyFound();
986
987 color_attachment.aspectMask = 0xffffffff;
988 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
989 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
990 m_errorMonitor->VerifyFound();
991}
992
sfricke-samsung87b09512020-10-26 03:35:42 -0700993TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
994 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
995
996 ASSERT_NO_FATAL_FAILURE(Init());
997 // Creates a color attachment
998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
999
1000 m_commandBuffer->begin();
1001 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
1002
1003 VkClearAttachment attachment;
1004 attachment.clearValue.color.float32[0] = 0;
1005 attachment.clearValue.color.float32[1] = 0;
1006 attachment.clearValue.color.float32[2] = 0;
1007 attachment.clearValue.color.float32[3] = 0;
1008 attachment.colorAttachment = 0;
1009 VkClearRect clear_rect = {};
1010 clear_rect.rect.offset = {0, 0};
1011 clear_rect.rect.extent = {1, 1};
1012 clear_rect.baseArrayLayer = 0;
1013 clear_rect.layerCount = 1;
1014
1015 m_errorMonitor->ExpectSuccess();
1016 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1017 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1018 m_errorMonitor->VerifyNotFound();
1019
1020 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
1021 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1022 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1023 m_errorMonitor->VerifyFound();
1024
1025 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
1026 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1027 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1028 m_errorMonitor->VerifyFound();
1029}
1030
unknown088160a2019-05-23 17:43:13 -06001031TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1032 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1033
1034 ASSERT_NO_FATAL_FAILURE(Init());
1035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1036
1037 // An empty primary command buffer
1038 VkCommandBufferObj cb(m_device, m_commandPool);
1039 cb.begin();
1040 cb.end();
1041
1042 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001043 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001044 VkCommandBuffer handle = cb.handle();
1045
Mark Lobodzinski20310782020-02-28 14:25:17 -07001046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001047 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001048 m_errorMonitor->VerifyFound();
1049
1050 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1051
1052 m_commandBuffer->EndRenderPass();
1053 m_commandBuffer->end();
1054}
1055
Petr Kraus8e53cf02020-01-03 05:30:04 +01001056TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1057 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1058
1059 ASSERT_NO_FATAL_FAILURE(Init());
1060
1061 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1062 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1063 secondary_cb.begin();
1064 secondary_cb.end();
1065
1066 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001067 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001068 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1069 m_errorMonitor->VerifyFound();
1070}
1071
unknown088160a2019-05-23 17:43:13 -06001072TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1073 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1074
1075 ASSERT_NO_FATAL_FAILURE(Init());
1076 ASSERT_NO_FATAL_FAILURE(InitViewport());
1077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1078
1079 const VkPipelineLayoutObj pipeline_layout(m_device);
1080
1081 struct VboEntry {
1082 uint16_t input0[2];
1083 uint32_t input1;
1084 float input2[4];
1085 };
1086
1087 const unsigned vbo_entry_count = 3;
1088 const VboEntry vbo_data[vbo_entry_count] = {};
1089
1090 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1091 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1092
1093 VkVertexInputBindingDescription input_binding;
1094 input_binding.binding = 0;
1095 input_binding.stride = sizeof(VboEntry);
1096 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1097
1098 VkVertexInputAttributeDescription input_attribs[3];
1099
1100 input_attribs[0].binding = 0;
1101 // Location switch between attrib[0] and attrib[1] is intentional
1102 input_attribs[0].location = 1;
1103 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1104 input_attribs[0].offset = offsetof(VboEntry, input1);
1105
1106 input_attribs[1].binding = 0;
1107 input_attribs[1].location = 0;
1108 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1109 input_attribs[1].offset = offsetof(VboEntry, input0);
1110
1111 input_attribs[2].binding = 0;
1112 input_attribs[2].location = 2;
1113 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1114 input_attribs[2].offset = offsetof(VboEntry, input2);
1115
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001116 char const *vsSource = R"glsl(
1117 #version 450
1118 layout(location = 0) in vec2 input0;
1119 layout(location = 1) in vec4 input1;
1120 layout(location = 2) in vec4 input2;
1121 void main(){
1122 gl_Position = input1 + input2;
1123 gl_Position.xy += input0;
1124 }
1125 )glsl";
unknown088160a2019-05-23 17:43:13 -06001126
1127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001128 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001129
1130 VkPipelineObj pipe1(m_device);
1131 pipe1.AddDefaultColorAttachment();
1132 pipe1.AddShader(&vs);
1133 pipe1.AddShader(&fs);
1134 pipe1.AddVertexInputBindings(&input_binding, 1);
1135 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1136 pipe1.SetViewport(m_viewports);
1137 pipe1.SetScissor(m_scissors);
1138 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1139
1140 input_binding.stride = 6;
1141
1142 VkPipelineObj pipe2(m_device);
1143 pipe2.AddDefaultColorAttachment();
1144 pipe2.AddShader(&vs);
1145 pipe2.AddShader(&fs);
1146 pipe2.AddVertexInputBindings(&input_binding, 1);
1147 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1148 pipe2.SetViewport(m_viewports);
1149 pipe2.SetScissor(m_scissors);
1150 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1151
1152 m_commandBuffer->begin();
1153 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1154
1155 // Test with invalid buffer offset
1156 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001157 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1158 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001159 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
1160 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
1161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001162 m_commandBuffer->Draw(1, 0, 0, 0);
1163 m_errorMonitor->VerifyFound();
1164
1165 // Test with invalid buffer stride
1166 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001167 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1168 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001169 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -06001170 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -07001171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001172 m_commandBuffer->Draw(1, 0, 0, 0);
1173 m_errorMonitor->VerifyFound();
1174
1175 m_commandBuffer->EndRenderPass();
1176 m_commandBuffer->end();
1177}
1178
1179TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1180 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001181 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001182
1183 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1184
1185 secondary.begin();
1186 secondary.end();
1187
1188 VkCommandBufferBeginInfo cbbi = {
1189 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1190 nullptr,
1191 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1192 nullptr,
1193 };
1194
1195 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001196 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001197 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001198 m_errorMonitor->VerifyFound();
1199 m_commandBuffer->end();
1200}
1201
1202TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1203 ASSERT_NO_FATAL_FAILURE(Init());
1204
John Zulauff1640d12019-08-13 15:39:58 -06001205 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001206
1207 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1208
1209 VkCommandBufferInheritanceInfo inh = {
1210 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1211 nullptr,
1212 };
1213 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1214
1215 secondary.begin(&cbbi);
1216 secondary.end();
1217
1218 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001219 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001220 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001221 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001222 m_errorMonitor->VerifyFound();
1223 m_commandBuffer->end();
1224}
1225
1226TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1227 ASSERT_NO_FATAL_FAILURE(Init());
1228
1229 // variation on previous test executing the same CB twice in the same
1230 // CmdExecuteCommands call
1231
John Zulauff1640d12019-08-13 15:39:58 -06001232 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001233
1234 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1235
1236 VkCommandBufferInheritanceInfo inh = {
1237 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1238 nullptr,
1239 };
1240 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1241
1242 secondary.begin(&cbbi);
1243 secondary.end();
1244
1245 m_commandBuffer->begin();
1246 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001247 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001248 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001249 m_errorMonitor->VerifyFound();
1250 m_commandBuffer->end();
1251}
1252
1253TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1254 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1255 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1256 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1257 ASSERT_NO_FATAL_FAILURE(Init());
1258
1259 VkCommandBuffer cmd_bufs[2];
1260 VkCommandBufferAllocateInfo alloc_info;
1261 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1262 alloc_info.pNext = NULL;
1263 alloc_info.commandBufferCount = 2;
1264 alloc_info.commandPool = m_commandPool->handle();
1265 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001266 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001267
1268 VkCommandBufferBeginInfo cb_binfo;
1269 cb_binfo.pNext = NULL;
1270 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1271 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1272 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001273 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001274 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001275 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1276 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001277 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1278
1279 VkSubmitInfo submit_info = {};
1280 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1281 submit_info.commandBufferCount = 2;
1282 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001284 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001285 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001286 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001287
1288 // Set one time use and now look for one time submit
1289 duplicates[0] = duplicates[1] = cmd_bufs[1];
1290 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001291 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1292 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1293 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001294 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001295 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001296 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001297 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001298}
1299
1300TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1301 TEST_DESCRIPTION(
1302 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1303
Mark Lobodzinski20310782020-02-28 14:25:17 -07001304 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001305
1306 ASSERT_NO_FATAL_FAILURE(Init());
1307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1308
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001309 char const *fsSource = R"glsl(
1310 #version 450
1311 layout(set=0, binding=0) uniform sampler3D s;
1312 layout(location=0) out vec4 color;
1313 void main() {
1314 color = texture(s, vec3(0));
1315 }
1316 )glsl";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001317 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001318 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1319
1320 VkPipelineObj pipe(m_device);
1321 pipe.AddShader(&vs);
1322 pipe.AddShader(&fs);
1323 pipe.AddDefaultColorAttachment();
1324
1325 VkTextureObj texture(m_device, nullptr);
1326 VkSamplerObj sampler(m_device);
1327
1328 VkDescriptorSetObj descriptorSet(m_device);
1329 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1331
1332 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1333 ASSERT_VK_SUCCESS(err);
1334
1335 m_commandBuffer->begin();
1336 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1337
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001338 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001339 m_commandBuffer->BindDescriptorSet(descriptorSet);
1340
1341 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001342 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001343 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001344 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001345
1346 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001347 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001348
1349 m_errorMonitor->VerifyFound();
1350
1351 m_commandBuffer->EndRenderPass();
1352 m_commandBuffer->end();
1353}
1354
1355TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1356 TEST_DESCRIPTION(
1357 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1358 "vice versa.");
1359
Mark Lobodzinski20310782020-02-28 14:25:17 -07001360 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001361
1362 ASSERT_NO_FATAL_FAILURE(Init());
1363 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1364
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001365 char const *fsSource = R"glsl(
1366 #version 450
1367 layout(set=0, binding=0) uniform sampler2DMS s;
1368 layout(location=0) out vec4 color;
1369 void main() {
1370 color = texelFetch(s, ivec2(0), 0);
1371 }
1372 )glsl";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001373 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001374 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1375
1376 VkPipelineObj pipe(m_device);
1377 pipe.AddShader(&vs);
1378 pipe.AddShader(&fs);
1379 pipe.AddDefaultColorAttachment();
1380
1381 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1382 VkSamplerObj sampler(m_device);
1383
1384 VkDescriptorSetObj descriptorSet(m_device);
1385 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1386 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1387
1388 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1389 ASSERT_VK_SUCCESS(err);
1390
1391 m_commandBuffer->begin();
1392 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1393
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001394 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001395 m_commandBuffer->BindDescriptorSet(descriptorSet);
1396
1397 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001398 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001399 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001400 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001401
1402 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001403 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001404
1405 m_errorMonitor->VerifyFound();
1406
1407 m_commandBuffer->EndRenderPass();
1408 m_commandBuffer->end();
1409}
1410
1411TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1412 TEST_DESCRIPTION(
1413 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1414
Mark Lobodzinski20310782020-02-28 14:25:17 -07001415 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001416
1417 ASSERT_NO_FATAL_FAILURE(Init());
1418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1419
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001420 char const *fsSource = R"glsl(
1421 #version 450
1422 layout(set=0, binding=0) uniform isampler2D s;
1423 layout(location=0) out vec4 color;
1424 void main() {
1425 color = texelFetch(s, ivec2(0), 0);
1426 }
1427 )glsl";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001428 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001429 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1430
1431 VkPipelineObj pipe(m_device);
1432 pipe.AddShader(&vs);
1433 pipe.AddShader(&fs);
1434 pipe.AddDefaultColorAttachment();
1435
1436 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1437 VkSamplerObj sampler(m_device);
1438
1439 VkDescriptorSetObj descriptorSet(m_device);
1440 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1441 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1442
1443 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1444 ASSERT_VK_SUCCESS(err);
1445
1446 m_commandBuffer->begin();
1447 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1448
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001449 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001450 m_commandBuffer->BindDescriptorSet(descriptorSet);
1451
1452 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001453 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001454 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001455 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001456
1457 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001458 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001459
1460 m_errorMonitor->VerifyFound();
1461
1462 m_commandBuffer->EndRenderPass();
1463 m_commandBuffer->end();
1464}
1465
unknown088160a2019-05-23 17:43:13 -06001466TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1467 TEST_DESCRIPTION(
1468 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001469 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1470 bool maintenance1 = false;
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001471 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
1472 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung30b094c2020-05-30 11:42:11 -07001473 maintenance1 = true;
1474 }
1475 ASSERT_NO_FATAL_FAILURE(InitState());
1476
1477 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1478 VkFormatProperties format_props;
1479 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1480 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1481 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1482 return;
1483 }
unknown088160a2019-05-23 17:43:13 -06001484
1485 // Create two images to copy between
1486 VkImageObj src_image_obj(m_device);
1487 VkImageObj dst_image_obj(m_device);
1488
1489 VkImageCreateInfo image_create_info = {};
1490 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1491 image_create_info.pNext = NULL;
1492 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001493 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001494 image_create_info.extent.width = 32;
1495 image_create_info.extent.height = 32;
1496 image_create_info.extent.depth = 1;
1497 image_create_info.mipLevels = 1;
1498 image_create_info.arrayLayers = 4;
1499 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1500 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1501 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1502 image_create_info.flags = 0;
1503
1504 src_image_obj.init(&image_create_info);
1505 ASSERT_TRUE(src_image_obj.initialized());
1506
1507 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1508 dst_image_obj.init(&image_create_info);
1509 ASSERT_TRUE(dst_image_obj.initialized());
1510
1511 m_commandBuffer->begin();
1512 VkImageCopy copyRegion;
1513 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1514 copyRegion.srcSubresource.mipLevel = 0;
1515 copyRegion.srcSubresource.baseArrayLayer = 0;
1516 copyRegion.srcSubresource.layerCount = 1;
1517 copyRegion.srcOffset.x = 0;
1518 copyRegion.srcOffset.y = 0;
1519 copyRegion.srcOffset.z = 0;
1520 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1521 copyRegion.dstSubresource.mipLevel = 0;
1522 copyRegion.dstSubresource.baseArrayLayer = 0;
1523 // Introduce failure by forcing the dst layerCount to differ from src
1524 copyRegion.dstSubresource.layerCount = 3;
1525 copyRegion.dstOffset.x = 0;
1526 copyRegion.dstOffset.y = 0;
1527 copyRegion.dstOffset.z = 0;
1528 copyRegion.extent.width = 1;
1529 copyRegion.extent.height = 1;
1530 copyRegion.extent.depth = 1;
1531
sfricke-samsung30b094c2020-05-30 11:42:11 -07001532 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1533 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001534 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1535 &copyRegion);
1536 m_errorMonitor->VerifyFound();
1537}
1538
1539TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1540 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1541
Jeff Leger465acf52020-10-12 18:07:16 -04001542 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1543
1544 bool copy_commands2 = false;
1545 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1546 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1547 copy_commands2 = true;
1548 }
1549 ASSERT_NO_FATAL_FAILURE(InitState());
1550
1551 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001552 if (copy_commands2) {
1553 vkCmdCopyBufferToImage2Function =
1554 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001555 }
unknown088160a2019-05-23 17:43:13 -06001556
1557 VkPhysicalDeviceFeatures device_features = {};
1558 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1559 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1560 if (device_features.textureCompressionBC) {
1561 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1562 } else if (device_features.textureCompressionETC2) {
1563 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1564 } else if (device_features.textureCompressionASTC_LDR) {
1565 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1566 } else {
1567 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1568 return;
1569 }
1570
1571 VkImageCreateInfo ci;
1572 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1573 ci.pNext = NULL;
1574 ci.flags = 0;
1575 ci.imageType = VK_IMAGE_TYPE_2D;
1576 ci.format = compressed_format;
1577 ci.extent = {32, 32, 1};
1578 ci.mipLevels = 6;
1579 ci.arrayLayers = 1;
1580 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1581 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1582 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1583 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1584 ci.queueFamilyIndexCount = 0;
1585 ci.pQueueFamilyIndices = NULL;
1586 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1587
1588 VkImageObj image(m_device);
1589 image.init(&ci);
1590 ASSERT_TRUE(image.initialized());
1591
1592 VkImageObj odd_image(m_device);
1593 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1594 odd_image.init(&ci);
1595 ASSERT_TRUE(odd_image.initialized());
1596
1597 // Allocate buffers
1598 VkMemoryPropertyFlags reqs = 0;
1599 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1600 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1601 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1602 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1603 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1604
1605 VkBufferImageCopy region = {};
1606 region.bufferRowLength = 0;
1607 region.bufferImageHeight = 0;
1608 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1609 region.imageSubresource.layerCount = 1;
1610 region.imageOffset = {0, 0, 0};
1611 region.bufferOffset = 0;
1612
1613 // start recording
1614 m_commandBuffer->begin();
1615
locke-lunargdf00db02020-03-04 19:00:57 -07001616 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001617 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001618 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1619 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001620 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001621 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1622 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001623 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001624 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1625 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1626
unknown088160a2019-05-23 17:43:13 -06001627 // Mip level copies that work - 5 levels
1628 m_errorMonitor->ExpectSuccess();
1629
1630 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1631 region.imageExtent = {32, 32, 1};
1632 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001633 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001634
1635 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1636 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001637 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001638
1639 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1640 region.imageExtent = {8, 8, 1};
1641 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001642 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001643
1644 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1645 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001646 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001647
1648 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1649 region.imageExtent = {4, 4, 1};
1650 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001651 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001652
1653 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1654 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001655 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001656
1657 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1658 region.imageExtent = {2, 2, 1};
1659 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001660
1661 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1662 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001663 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001664
1665 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1666 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001667 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001668
1669 region.imageExtent = {1, 1, 1};
1670 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001671
1672 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1673 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001674 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001675
1676 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1677 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001678 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001679 m_errorMonitor->VerifyNotFound();
1680
1681 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001683 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001684 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001685 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001686 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001687 m_errorMonitor->VerifyFound();
1688
1689 // Copy width < compressed block size, but not the full mip width
1690 region.imageExtent = {1, 2, 1};
1691 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001692 // width not a multiple of compressed block width
1693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001695 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001696 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001697 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001698
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001699 m_errorMonitor->SetDesiredFailureMsg(
1700 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001701 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001702 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001703 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001704 m_errorMonitor->VerifyFound();
1705
1706 // Copy height < compressed block size but not the full mip height
1707 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001708 m_errorMonitor->SetDesiredFailureMsg(
1709 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001711 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001712 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001713 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001714
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001715 m_errorMonitor->SetDesiredFailureMsg(
1716 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001718 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001719 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001720 m_errorMonitor->VerifyFound();
1721
1722 // Offsets must be multiple of compressed block size
1723 region.imageOffset = {1, 1, 0};
1724 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001725 // imageOffset not a multiple of block size
1726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001728 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001729 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001730 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001731
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001732 m_errorMonitor->SetDesiredFailureMsg(
1733 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001735 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001736 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001737 m_errorMonitor->VerifyFound();
1738
Jeff Leger465acf52020-10-12 18:07:16 -04001739 // Equivalent test using KHR_copy_commands2
1740 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1741 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1742 NULL,
1743 region.bufferOffset,
1744 region.bufferRowLength,
1745 region.bufferImageHeight,
1746 region.imageSubresource,
1747 region.imageOffset,
1748 region.imageExtent};
1749 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1750 NULL,
1751 buffer_16.handle(),
1752 image.handle(),
1753 VK_IMAGE_LAYOUT_GENERAL,
1754 1,
1755 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001756 m_errorMonitor->SetDesiredFailureMsg(
1757 kErrorBit, "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001758 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1759 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1760 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1761 m_errorMonitor->VerifyFound();
1762 }
1763
unknown088160a2019-05-23 17:43:13 -06001764 // Offset + extent width = mip width - should succeed
1765 region.imageOffset = {4, 4, 0};
1766 region.imageExtent = {3, 4, 1};
1767 region.imageSubresource.mipLevel = 2;
1768 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001769
1770 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1771 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001772 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1773 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001774
1775 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1776 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001777 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1778 &region);
unknown088160a2019-05-23 17:43:13 -06001779 m_errorMonitor->VerifyNotFound();
1780
unknown088160a2019-05-23 17:43:13 -06001781 // Offset + extent width < mip width and not a multiple of block width - should fail
1782 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001783 m_errorMonitor->SetDesiredFailureMsg(
1784 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001786 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001787 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1788 &region);
unknown088160a2019-05-23 17:43:13 -06001789 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001790 m_errorMonitor->SetDesiredFailureMsg(
1791 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001793 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001794 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1795 &region);
unknown088160a2019-05-23 17:43:13 -06001796 m_errorMonitor->VerifyFound();
1797}
1798
1799TEST_F(VkLayerTest, ImageBufferCopyTests) {
1800 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001801
1802 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1803 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1804 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1805 if (mp_extensions) {
1806 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1807 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001808 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001809 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001810 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1811 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1812 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1813 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001814 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001815 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1816 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1817 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1818 }
1819 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001820
1821 // Bail if any dimension of transfer granularity is 0.
1822 auto index = m_device->graphics_queue_node_index_;
1823 auto queue_family_properties = m_device->phy().queue_properties();
1824 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1825 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1826 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1827 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1828 return;
1829 }
1830
sfricke-samsung6d97e562020-01-07 22:01:00 -08001831 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1832 // and invalidates the entire command buffer. This prevents from having to reset the commmand buffer every scope rgba
Mark Lobodzinski20310782020-02-28 14:25:17 -07001833 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1834 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001835 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001836 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1837 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1838 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1839 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1840 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001841 // compression
1842 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1843 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1844 // multi-planar
1845 VkImageObj image_multi_planar(m_device); // 128^2 texels in plane_0 and 64^2 texels in plane_1
unknown088160a2019-05-23 17:43:13 -06001846
sfricke-samsung6d97e562020-01-07 22:01:00 -08001847 // Verify R8G8B8A8_UINT format is supported for transfer
1848 bool missing_rgba_support = false;
1849 VkFormatProperties props = {0, 0, 0};
1850 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1851 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1852 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1853 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1854
1855 if (!missing_rgba_support) {
1856 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1857 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1858 VK_IMAGE_TILING_OPTIMAL, 0);
1859 ASSERT_TRUE(image_64k.initialized());
1860
1861 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1862 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1863 VK_IMAGE_TILING_OPTIMAL, 0);
1864 ASSERT_TRUE(image_16k.initialized());
1865 }
unknown088160a2019-05-23 17:43:13 -06001866
1867 // Verify all needed Depth/Stencil formats are supported
1868 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001869 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001870 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1871 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1872 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001873 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001874 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1875 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1876 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001877 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001878 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1879 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1880 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001881 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001882 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1883 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1884 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1885
1886 if (!missing_ds_support) {
1887 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1888 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1889 ASSERT_TRUE(image_16k_depth.initialized());
1890
1891 ds_image_4D_1S.Init(
1892 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1893 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1894 VK_IMAGE_TILING_OPTIMAL, 0);
1895 ASSERT_TRUE(ds_image_4D_1S.initialized());
1896
1897 ds_image_3D_1S.Init(
1898 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1899 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1900 VK_IMAGE_TILING_OPTIMAL, 0);
1901 ASSERT_TRUE(ds_image_3D_1S.initialized());
1902
1903 ds_image_2D.Init(
1904 256, 256, 1, VK_FORMAT_D16_UNORM,
1905 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1906 VK_IMAGE_TILING_OPTIMAL, 0);
1907 ASSERT_TRUE(ds_image_2D.initialized());
1908
1909 ds_image_1S.Init(
1910 256, 256, 1, VK_FORMAT_S8_UINT,
1911 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1912 VK_IMAGE_TILING_OPTIMAL, 0);
1913 ASSERT_TRUE(ds_image_1S.initialized());
1914 }
1915
1916 // Allocate buffers
1917 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1918 VkMemoryPropertyFlags reqs = 0;
1919 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1920 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1921 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1922 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1923
1924 VkBufferImageCopy region = {};
1925 region.bufferRowLength = 0;
1926 region.bufferImageHeight = 0;
1927 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1928 region.imageSubresource.layerCount = 1;
1929 region.imageOffset = {0, 0, 0};
1930 region.imageExtent = {64, 64, 1};
1931 region.bufferOffset = 0;
1932
locke-lunargdf00db02020-03-04 19:00:57 -07001933 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001934 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001935 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1936 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001937 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001938 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1939 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001940 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001941 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1942 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1943
sfricke-samsung6d97e562020-01-07 22:01:00 -08001944 if (missing_rgba_support) {
1945 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001946
sfricke-samsung6d97e562020-01-07 22:01:00 -08001947 // start recording for future tests
1948 m_commandBuffer->begin();
1949 } else {
1950 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001951 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001952 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1953 &region);
unknown088160a2019-05-23 17:43:13 -06001954 m_errorMonitor->VerifyFound();
1955
Mark Lobodzinski20310782020-02-28 14:25:17 -07001956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001957 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1958 &region);
1959 m_errorMonitor->VerifyFound();
1960
1961 // start recording
1962 m_commandBuffer->begin();
1963
1964 // successful copies
1965 m_errorMonitor->ExpectSuccess();
1966 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1967 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001968
1969 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1970 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001971 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1972 &region);
1973 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001974
1975 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1976 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001977 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1978 &region);
1979 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001980
1981 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1982 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001983 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1984 &region);
1985 region.imageOffset.x = 0;
1986 region.imageExtent.height = 64;
1987 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001988
1989 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1990 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001991 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1992 &region);
1993 m_errorMonitor->VerifyNotFound();
1994
1995 // image/buffer too small (extent too large) on copy to image
1996 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001997 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001998 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1999 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2000 &region);
2001 m_errorMonitor->VerifyFound();
2002
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002003 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002004 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002005 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08002006 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2007 &region);
2008 m_errorMonitor->VerifyFound();
2009
2010 // image/buffer too small (offset) on copy to image
2011 region.imageExtent = {64, 64, 1};
2012 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07002013 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002014 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2015 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2016 &region);
2017 m_errorMonitor->VerifyFound();
2018
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002019 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2020 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002021 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002022 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08002023 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2024 &region);
2025 m_errorMonitor->VerifyFound();
2026
2027 // image/buffer too small on copy to buffer
2028 region.imageExtent = {64, 64, 1};
2029 region.imageOffset = {0, 0, 0};
2030 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002031 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002032 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
2033 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2034 &region);
2035 m_errorMonitor->VerifyFound();
2036
2037 region.imageExtent = {64, 65, 1};
2038 region.bufferOffset = 0;
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002039 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002041 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08002042 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
2043 &region);
2044 m_errorMonitor->VerifyFound();
2045
2046 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002048 region.imageExtent = {64, 64, 1};
2049 region.bufferRowLength = 68;
2050 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2051 &region);
2052 m_errorMonitor->VerifyFound();
2053
2054 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002055 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002056 region.imageExtent.width = 0;
2057 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2058 &region);
2059 m_errorMonitor->VerifyFound();
2060
2061 // aspect bits
2062 region.imageExtent = {64, 64, 1};
2063 region.bufferRowLength = 0;
2064 region.bufferImageHeight = 0;
2065 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002066 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002067 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2068 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2069 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2070 buffer_16k.handle(), 1, &region);
2071 m_errorMonitor->VerifyFound();
2072
Mark Lobodzinski20310782020-02-28 14:25:17 -07002073 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002074 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002075 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2076 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2077 buffer_16k.handle(), 1, &region);
2078 m_errorMonitor->VerifyFound();
2079 }
2080
Mark Lobodzinski20310782020-02-28 14:25:17 -07002081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002082 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002083 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2084 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2085 &region);
2086 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002087 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002088
2089 // Out-of-range mip levels should fail
2090 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002091 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002092 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06221");
2093 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002094 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002095 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002096 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002097 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002098 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2099 &region);
2100 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002102 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2103 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002104 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002105 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002106 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002107 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002108 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2109 &region);
2110 m_errorMonitor->VerifyFound();
2111 region.imageSubresource.mipLevel = 0;
2112
2113 // Out-of-range array layers should fail
2114 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2115 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002117 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2118 &region);
2119 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002120 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002121 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2122 &region);
2123 m_errorMonitor->VerifyFound();
2124 region.imageSubresource.baseArrayLayer = 0;
2125
2126 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002128 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2129 buffer_16k.handle(), 1, &region);
2130 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002132 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2133 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002134 m_errorMonitor->VerifyFound();
2135 }
2136
unknown088160a2019-05-23 17:43:13 -06002137 // Test Depth/Stencil copies
2138 if (missing_ds_support) {
2139 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2140 } else {
2141 VkBufferImageCopy ds_region = {};
2142 ds_region.bufferOffset = 0;
2143 ds_region.bufferRowLength = 0;
2144 ds_region.bufferImageHeight = 0;
2145 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2146 ds_region.imageSubresource.mipLevel = 0;
2147 ds_region.imageSubresource.baseArrayLayer = 0;
2148 ds_region.imageSubresource.layerCount = 1;
2149 ds_region.imageOffset = {0, 0, 0};
2150 ds_region.imageExtent = {256, 256, 1};
2151
2152 // Depth copies that should succeed
2153 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002154 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2155 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002156 m_errorMonitor->VerifyNotFound();
2157
2158 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002159 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2160 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002161 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2162 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002163 m_errorMonitor->VerifyNotFound();
2164
2165 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002166 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2167 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002168 m_errorMonitor->VerifyNotFound();
2169
2170 // Depth copies that should fail
2171 ds_region.bufferOffset = 4;
2172 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002173 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002174 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002175 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2176 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002177 m_errorMonitor->VerifyFound();
2178
2179 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002180 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002181 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002182 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002183 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002184 m_errorMonitor->VerifyFound();
2185
2186 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002187 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002188 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002189 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2190 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002191 m_errorMonitor->VerifyFound();
2192
sfricke-samsung5a019492021-01-25 10:32:08 -08002193 ds_region.bufferOffset = 5;
2194 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2196 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2197 buffer_128k.handle(), 1, &ds_region);
2198 m_errorMonitor->VerifyFound();
2199 ds_region.imageExtent = {256, 256, 1};
2200
unknown088160a2019-05-23 17:43:13 -06002201 // Stencil copies that should succeed
2202 ds_region.bufferOffset = 0;
2203 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2204 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002205 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2206 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002207 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2208 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002209 m_errorMonitor->VerifyNotFound();
2210
2211 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002212 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2213 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002214 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2215 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002216 m_errorMonitor->VerifyNotFound();
2217
2218 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002219 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2220 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002221 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2222 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002223 m_errorMonitor->VerifyNotFound();
2224
2225 // Stencil copies that should fail
2226 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002227 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002228 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002229 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2230 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002231 m_errorMonitor->VerifyFound();
2232
2233 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002234 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002235 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2236 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002237 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2238 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002239 m_errorMonitor->VerifyFound();
2240
2241 ds_region.bufferRowLength = 0;
2242 ds_region.bufferOffset = 4;
2243 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002244 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002245 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002246 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2247 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002248 m_errorMonitor->VerifyFound();
2249 }
2250
2251 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002252 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002253 VkPhysicalDeviceFeatures device_features = {};
2254 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2255 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2256 device_features.textureCompressionASTC_LDR)) {
2257 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2258 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002259 // Verify transfer support for each compression format used blow
2260 bool missing_bc_support = false;
2261 bool missing_etc_support = false;
2262 bool missing_astc_support = false;
2263 bool missing_compression_support = false;
2264
2265 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2266 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2267 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2268 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2269
2270 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2271 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2272 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2273 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2274
2275 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2276 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2277 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2278 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2279
2280 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002281 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2282 0);
2283 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2284 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002285 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002286 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2287 VK_IMAGE_TILING_OPTIMAL, 0);
2288 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2289 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002290 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002291 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2292 VK_IMAGE_TILING_OPTIMAL, 0);
2293 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2294 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002295 } else {
2296 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002297 }
unknown088160a2019-05-23 17:43:13 -06002298
sfricke-samsung6d97e562020-01-07 22:01:00 -08002299 if (missing_compression_support) {
2300 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2301 } else {
2302 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002303 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002304 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002305 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2306 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002307 m_errorMonitor->ExpectSuccess();
2308 region.imageExtent = {128, 128, 1};
2309 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2310 buffer_16k.handle(), 1, &region);
2311 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002312
sfricke-samsung6d97e562020-01-07 22:01:00 -08002313 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002314 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002315 region.bufferOffset = 16;
2316 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2317 buffer_16k.handle(), 1, &region);
2318 m_errorMonitor->VerifyFound();
2319 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002320
sfricke-samsung6d97e562020-01-07 22:01:00 -08002321 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002322 m_errorMonitor->SetDesiredFailureMsg(
2323 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002325 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2326 region.imageExtent.width = 66;
2327 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2328 buffer_16k.handle(), 1, &region);
2329 m_errorMonitor->VerifyFound();
2330 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002331
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002332 m_errorMonitor->SetDesiredFailureMsg(
2333 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002334 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002335 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2336 region.imageExtent.height = 2;
2337 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2338 buffer_16k.handle(), 1, &region);
2339 m_errorMonitor->VerifyFound();
2340 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002341
sfricke-samsung6d97e562020-01-07 22:01:00 -08002342 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002343
sfricke-samsung6d97e562020-01-07 22:01:00 -08002344 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2345 m_errorMonitor->ExpectSuccess();
2346 region.imageExtent.width = 66;
2347 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002348 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2349 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002350 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2351 buffer_16k.handle(), 1, &region);
2352 region.imageExtent.width = 16;
2353 region.imageOffset.x = 0;
2354 region.imageExtent.height = 2;
2355 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002356 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2357 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002358 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2359 buffer_16k.handle(), 1, &region);
2360 m_errorMonitor->VerifyNotFound();
2361 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002362
sfricke-samsung6d97e562020-01-07 22:01:00 -08002363 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002365 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002366 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002367 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002368 region.imageExtent = {64, 64, 1};
2369 region.bufferOffset = 24;
2370 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2371 buffer_16k.handle(), 1, &region);
2372 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002373
sfricke-samsung6d97e562020-01-07 22:01:00 -08002374 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002375 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002376 region.bufferOffset = 0;
2377 region.bufferRowLength = 130;
2378 region.bufferImageHeight = 0;
2379 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2380 buffer_64k.handle(), 1, &region);
2381 m_errorMonitor->VerifyFound();
2382
2383 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002384 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002385 region.bufferRowLength = 0;
2386 region.bufferImageHeight = 130;
2387 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2388 buffer_64k.handle(), 1, &region);
2389 m_errorMonitor->VerifyFound();
2390 }
2391 }
2392
2393 // Test multi-planar formats, if supported
2394 if (!mp_extensions) {
2395 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2396 } else {
2397 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2398 // being required with samplerYcbcrConversion feature
2399 bool missing_mp_support = false;
2400 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2401 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2402 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2403 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2404
2405 if (missing_mp_support) {
2406 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2407 } else {
2408 VkBufferImageCopy mp_region = {};
2409 mp_region.bufferOffset = 0;
2410 mp_region.bufferRowLength = 0;
2411 mp_region.bufferImageHeight = 0;
2412 mp_region.imageSubresource.mipLevel = 0;
2413 mp_region.imageSubresource.baseArrayLayer = 0;
2414 mp_region.imageSubresource.layerCount = 1;
2415 mp_region.imageOffset = {0, 0, 0};
2416 mp_region.imageExtent = {128, 128, 1};
2417
2418 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2419 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2420 VK_IMAGE_TILING_OPTIMAL, 0);
2421 ASSERT_TRUE(image_multi_planar.initialized());
2422
2423 // Copies into a mutli-planar image aspect properly
2424 m_errorMonitor->ExpectSuccess();
2425 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002426 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2427 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002428 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2429 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2430 m_errorMonitor->VerifyNotFound();
2431
2432 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002433 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002434 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2435 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2436 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2437 m_errorMonitor->VerifyFound();
2438
2439 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002441 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2442 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2443 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2444 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002445
2446 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002447 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002448 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2449 mp_region.bufferOffset = 5;
2450 mp_region.imageExtent = {8, 8, 1};
2451 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2452 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2453 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002454 }
unknown088160a2019-05-23 17:43:13 -06002455 }
2456}
2457
2458TEST_F(VkLayerTest, MiscImageLayerTests) {
2459 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2460
2461 ASSERT_NO_FATAL_FAILURE(Init());
2462
2463 // TODO: Ideally we should check if a format is supported, before using it.
2464 VkImageObj image(m_device);
2465 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2466 ASSERT_TRUE(image.initialized());
2467 VkBufferObj buffer;
2468 VkMemoryPropertyFlags reqs = 0;
2469 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2470 VkBufferImageCopy region = {};
2471 region.bufferRowLength = 128;
2472 region.bufferImageHeight = 128;
2473 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2474 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2475 region.imageSubresource.layerCount = 1;
2476 region.imageExtent.height = 4;
2477 region.imageExtent.width = 4;
2478 region.imageExtent.depth = 1;
2479
2480 VkImageObj image2(m_device);
2481 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2482 ASSERT_TRUE(image2.initialized());
2483 VkBufferObj buffer2;
2484 VkMemoryPropertyFlags reqs2 = 0;
2485 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002486 m_commandBuffer->begin();
2487
2488 // Image must have offset.z of 0 and extent.depth of 1
2489 // Introduce failure by setting imageExtent.depth to 0
2490 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002491 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002492 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2493 &region);
unknown088160a2019-05-23 17:43:13 -06002494 m_errorMonitor->VerifyFound();
2495
2496 region.imageExtent.depth = 1;
2497
2498 // Image must have offset.z of 0 and extent.depth of 1
2499 // Introduce failure by setting imageOffset.z to 4
2500 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2501 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002502 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002504 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-06217");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002505 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2506 &region);
unknown088160a2019-05-23 17:43:13 -06002507 m_errorMonitor->VerifyFound();
2508
2509 region.imageOffset.z = 0;
2510 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2511 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2512 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002514 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2515 &region);
unknown088160a2019-05-23 17:43:13 -06002516 m_errorMonitor->VerifyFound();
2517
unknown088160a2019-05-23 17:43:13 -06002518 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2519 region.bufferOffset = 0;
2520 region.imageExtent.height = 128;
2521 region.imageExtent.width = 128;
2522 // Introduce failure by setting bufferRowLength > 0 but less than width
2523 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002524 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002525 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2526 &region);
unknown088160a2019-05-23 17:43:13 -06002527 m_errorMonitor->VerifyFound();
2528
2529 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2530 region.bufferRowLength = 128;
2531 // Introduce failure by setting bufferRowHeight > 0 but less than height
2532 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002533 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002534 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2535 &region);
unknown088160a2019-05-23 17:43:13 -06002536 m_errorMonitor->VerifyFound();
2537
2538 region.bufferImageHeight = 128;
2539 VkImageObj intImage1(m_device);
2540 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2541 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2542 VkImageObj intImage2(m_device);
2543 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2544 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2545 VkImageBlit blitRegion = {};
2546 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2547 blitRegion.srcSubresource.baseArrayLayer = 0;
2548 blitRegion.srcSubresource.layerCount = 1;
2549 blitRegion.srcSubresource.mipLevel = 0;
2550 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2551 blitRegion.dstSubresource.baseArrayLayer = 0;
2552 blitRegion.dstSubresource.layerCount = 1;
2553 blitRegion.dstSubresource.mipLevel = 0;
2554 blitRegion.srcOffsets[0] = {128, 0, 0};
2555 blitRegion.srcOffsets[1] = {128, 128, 1};
2556 blitRegion.dstOffsets[0] = {0, 128, 0};
2557 blitRegion.dstOffsets[1] = {128, 128, 1};
2558
2559 // Look for NULL-blit warning
sfricke-samsung85584a72021-09-30 21:43:38 -07002560 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
2561 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002562 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2563 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002564 m_errorMonitor->VerifyFound();
2565}
2566
2567TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2568 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002569 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2570
2571 bool copy_commands2 = false;
2572 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2573 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2574 copy_commands2 = true;
2575 }
2576 ASSERT_NO_FATAL_FAILURE(InitState());
2577
2578 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2579 if (copy_commands2) {
2580 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2581 }
unknown088160a2019-05-23 17:43:13 -06002582
sfricke-samsung30b094c2020-05-30 11:42:11 -07002583 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2584 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2585 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2586 return;
2587 }
2588
unknown088160a2019-05-23 17:43:13 -06002589 VkImageCreateInfo ci;
2590 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2591 ci.pNext = NULL;
2592 ci.flags = 0;
2593 ci.imageType = VK_IMAGE_TYPE_1D;
2594 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2595 ci.extent = {32, 1, 1};
2596 ci.mipLevels = 1;
2597 ci.arrayLayers = 1;
2598 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2599 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2600 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2601 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2602 ci.queueFamilyIndexCount = 0;
2603 ci.pQueueFamilyIndices = NULL;
2604 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2605
2606 // Create 1D image
2607 VkImageObj image_1D(m_device);
2608 image_1D.init(&ci);
2609 ASSERT_TRUE(image_1D.initialized());
2610
2611 // 2D image
2612 ci.imageType = VK_IMAGE_TYPE_2D;
2613 ci.extent = {32, 32, 1};
2614 VkImageObj image_2D(m_device);
2615 image_2D.init(&ci);
2616 ASSERT_TRUE(image_2D.initialized());
2617
2618 // 3D image
2619 ci.imageType = VK_IMAGE_TYPE_3D;
2620 ci.extent = {32, 32, 8};
2621 VkImageObj image_3D(m_device);
2622 image_3D.init(&ci);
2623 ASSERT_TRUE(image_3D.initialized());
2624
2625 // 2D image array
2626 ci.imageType = VK_IMAGE_TYPE_2D;
2627 ci.extent = {32, 32, 1};
2628 ci.arrayLayers = 8;
2629 VkImageObj image_2D_array(m_device);
2630 image_2D_array.init(&ci);
2631 ASSERT_TRUE(image_2D_array.initialized());
2632
2633 m_commandBuffer->begin();
2634
2635 VkImageCopy copy_region;
2636 copy_region.extent = {32, 1, 1};
2637 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2638 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2639 copy_region.srcSubresource.mipLevel = 0;
2640 copy_region.dstSubresource.mipLevel = 0;
2641 copy_region.srcSubresource.baseArrayLayer = 0;
2642 copy_region.dstSubresource.baseArrayLayer = 0;
2643 copy_region.srcSubresource.layerCount = 1;
2644 copy_region.dstSubresource.layerCount = 1;
2645 copy_region.srcOffset = {0, 0, 0};
2646 copy_region.dstOffset = {0, 0, 0};
2647
2648 // Sanity check
2649 m_errorMonitor->ExpectSuccess();
2650 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2651 &copy_region);
2652 m_errorMonitor->VerifyNotFound();
2653
Jeff Leger465acf52020-10-12 18:07:16 -04002654 // Equivalent sanity check using KHR_copy_commands2
2655 if (copy_commands2 && vkCmdCopyImage2Function) {
2656 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2657 NULL,
2658 copy_region.srcSubresource,
2659 copy_region.srcOffset,
2660 copy_region.dstSubresource,
2661 copy_region.dstOffset,
2662 copy_region.extent};
2663 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2664 NULL,
2665 image_1D.image(),
2666 VK_IMAGE_LAYOUT_GENERAL,
2667 image_2D.image(),
2668 VK_IMAGE_LAYOUT_GENERAL,
2669 1,
2670 &region2};
2671 m_errorMonitor->ExpectSuccess();
2672 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2673 m_errorMonitor->VerifyNotFound();
2674 }
2675
unknown088160a2019-05-23 17:43:13 -06002676 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2677 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002678 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2679 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002680 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2681 &copy_region);
2682 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002683
2684 // Equivalent test using KHR_copy_commands2
2685 if (copy_commands2 && vkCmdCopyImage2Function) {
2686 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2687 NULL,
2688 copy_region.srcSubresource,
2689 copy_region.srcOffset,
2690 copy_region.dstSubresource,
2691 copy_region.dstOffset,
2692 copy_region.extent};
2693 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2694 NULL,
2695 image_1D.image(),
2696 VK_IMAGE_LAYOUT_GENERAL,
2697 image_2D.image(),
2698 VK_IMAGE_LAYOUT_GENERAL,
2699 1,
2700 &region2};
2701 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2703 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2704 m_errorMonitor->VerifyFound();
2705 }
2706
unknown088160a2019-05-23 17:43:13 -06002707 copy_region.srcOffset.y = 0;
2708 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002711 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2712 &copy_region);
2713 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002714
2715 // Equivalent test using KHR_copy_commands2
2716 if (copy_commands2 && vkCmdCopyImage2Function) {
2717 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2718 NULL,
2719 copy_region.srcSubresource,
2720 copy_region.srcOffset,
2721 copy_region.dstSubresource,
2722 copy_region.dstOffset,
2723 copy_region.extent};
2724 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2725 NULL,
2726 image_2D.image(),
2727 VK_IMAGE_LAYOUT_GENERAL,
2728 image_1D.image(),
2729 VK_IMAGE_LAYOUT_GENERAL,
2730 1,
2731 &region2};
2732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2734 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2735 m_errorMonitor->VerifyFound();
2736 }
2737
unknown088160a2019-05-23 17:43:13 -06002738 copy_region.dstOffset.y = 0;
2739
2740 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2741 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002742 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002744 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2745 &copy_region);
2746 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002747
2748 // Equivalent test using KHR_copy_commands2
2749 if (copy_commands2 && vkCmdCopyImage2Function) {
2750 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2751 NULL,
2752 copy_region.srcSubresource,
2753 copy_region.srcOffset,
2754 copy_region.dstSubresource,
2755 copy_region.dstOffset,
2756 copy_region.extent};
2757 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2758 NULL,
2759 image_1D.image(),
2760 VK_IMAGE_LAYOUT_GENERAL,
2761 image_2D.image(),
2762 VK_IMAGE_LAYOUT_GENERAL,
2763 1,
2764 &region2};
2765 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2767 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2768 m_errorMonitor->VerifyFound();
2769 }
2770
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002773 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2774 &copy_region);
2775 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002776
2777 // Equivalent test using KHR_copy_commands2
2778 if (copy_commands2 && vkCmdCopyImage2Function) {
2779 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2780 NULL,
2781 copy_region.srcSubresource,
2782 copy_region.srcOffset,
2783 copy_region.dstSubresource,
2784 copy_region.dstOffset,
2785 copy_region.extent};
2786 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2787 NULL,
2788 image_2D.image(),
2789 VK_IMAGE_LAYOUT_GENERAL,
2790 image_1D.image(),
2791 VK_IMAGE_LAYOUT_GENERAL,
2792 1,
2793 &region2};
2794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2796 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2797 m_errorMonitor->VerifyFound();
2798 }
2799
unknown088160a2019-05-23 17:43:13 -06002800 copy_region.extent.height = 1;
2801
2802 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2803 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2805 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002806 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2807 &copy_region);
2808 m_errorMonitor->VerifyFound();
2809 copy_region.srcOffset.z = 0;
2810 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002811 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002813 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2814 &copy_region);
2815 m_errorMonitor->VerifyFound();
2816 copy_region.dstOffset.z = 0;
2817
2818 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2819 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002822 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002824 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002825 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002826 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002827 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2828 &copy_region);
2829 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002830 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002831 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002832 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002834 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002836 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002837 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2838 &copy_region);
2839 m_errorMonitor->VerifyFound();
2840 copy_region.extent.depth = 1;
2841
2842 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2843 copy_region.extent = {16, 16, 1};
2844 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002845 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002847 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002848 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2849 &copy_region);
2850 m_errorMonitor->VerifyFound();
2851 copy_region.srcOffset.z = 0;
2852 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002853 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002855 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002856 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2857 &copy_region);
2858 m_errorMonitor->VerifyFound();
2859 copy_region.dstOffset.z = 0;
2860
2861 // 3D texture accessing an array layer other than 0. VU 09c0011a
2862 copy_region.extent = {4, 4, 1};
2863 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002864 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002866 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2867 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2868 &copy_region);
2869 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002870 copy_region.srcSubresource.baseArrayLayer = 0;
2871
unknown088160a2019-05-23 17:43:13 -06002872 m_commandBuffer->end();
2873}
2874
2875TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2876 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002877 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07002878 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
2879 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06002880 } else {
2881 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2882 return;
2883 }
2884 ASSERT_NO_FATAL_FAILURE(InitState());
2885
2886 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2887 VkFormatProperties format_props;
2888 // TODO: Remove this check if or when devsim handles extensions.
2889 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2890 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002891 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002892 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2893 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2894 return;
2895 }
2896
2897 VkImageCreateInfo ci;
2898 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2899 ci.pNext = NULL;
2900 ci.flags = 0;
2901 ci.imageType = VK_IMAGE_TYPE_1D;
2902 ci.format = image_format;
2903 ci.extent = {32, 1, 1};
2904 ci.mipLevels = 1;
2905 ci.arrayLayers = 1;
2906 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2907 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2908 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2909 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2910 ci.queueFamilyIndexCount = 0;
2911 ci.pQueueFamilyIndices = NULL;
2912 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2913
2914 // Create 1D image
2915 VkImageObj image_1D(m_device);
2916 image_1D.init(&ci);
2917 ASSERT_TRUE(image_1D.initialized());
2918
2919 // 2D image
2920 ci.imageType = VK_IMAGE_TYPE_2D;
2921 ci.extent = {32, 32, 1};
2922 VkImageObj image_2D(m_device);
2923 image_2D.init(&ci);
2924 ASSERT_TRUE(image_2D.initialized());
2925
2926 // 3D image
2927 ci.imageType = VK_IMAGE_TYPE_3D;
2928 ci.extent = {32, 32, 8};
2929 VkImageObj image_3D(m_device);
2930 image_3D.init(&ci);
2931 ASSERT_TRUE(image_3D.initialized());
2932
2933 // 2D image array
2934 ci.imageType = VK_IMAGE_TYPE_2D;
2935 ci.extent = {32, 32, 1};
2936 ci.arrayLayers = 8;
2937 VkImageObj image_2D_array(m_device);
2938 image_2D_array.init(&ci);
2939 ASSERT_TRUE(image_2D_array.initialized());
2940
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002941 // second 2D image array
2942 ci.imageType = VK_IMAGE_TYPE_2D;
2943 ci.extent = {32, 32, 1};
2944 ci.arrayLayers = 8;
2945 VkImageObj image_2D_array_2(m_device);
2946 image_2D_array_2.init(&ci);
2947 ASSERT_TRUE(image_2D_array_2.initialized());
2948
unknown088160a2019-05-23 17:43:13 -06002949 m_commandBuffer->begin();
2950
2951 VkImageCopy copy_region;
2952 copy_region.extent = {32, 1, 1};
2953 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2954 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2955 copy_region.srcSubresource.mipLevel = 0;
2956 copy_region.dstSubresource.mipLevel = 0;
2957 copy_region.srcSubresource.baseArrayLayer = 0;
2958 copy_region.dstSubresource.baseArrayLayer = 0;
2959 copy_region.srcSubresource.layerCount = 1;
2960 copy_region.dstSubresource.layerCount = 1;
2961 copy_region.srcOffset = {0, 0, 0};
2962 copy_region.dstOffset = {0, 0, 0};
2963
2964 // Copy from layer not present
2965 copy_region.srcSubresource.baseArrayLayer = 4;
2966 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002967 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002968 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2969 &copy_region);
2970 m_errorMonitor->VerifyFound();
2971 copy_region.srcSubresource.baseArrayLayer = 0;
2972 copy_region.srcSubresource.layerCount = 1;
2973
2974 // Copy to layer not present
2975 copy_region.dstSubresource.baseArrayLayer = 1;
2976 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002977 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002978 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2979 &copy_region);
2980 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002981 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002982 copy_region.dstSubresource.layerCount = 1;
2983
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002984 // both 2D and extent.depth not 1
2985 // Need two 2D array images to prevent other errors
2986 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002988 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2989 1, &copy_region);
2990 m_errorMonitor->VerifyFound();
2991 copy_region.extent = {32, 1, 1};
2992
2993 // 2D src / 3D dst and depth not equal to src layerCount
2994 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002995 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002996 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002997 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2998 &copy_region);
2999 m_errorMonitor->VerifyFound();
3000 copy_region.extent = {32, 1, 1};
3001
3002 // 3D src / 2D dst and depth not equal to dst layerCount
3003 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003004 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08003006 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3007 &copy_region);
3008 m_errorMonitor->VerifyFound();
3009 copy_region.extent = {32, 1, 1};
3010
unknown088160a2019-05-23 17:43:13 -06003011 m_commandBuffer->end();
3012}
3013
3014TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
3015 // Image copy tests on compressed images with block alignment errors
3016 SetTargetApiVersion(VK_API_VERSION_1_1);
3017 ASSERT_NO_FATAL_FAILURE(Init());
3018
3019 // Select a compressed format and verify support
3020 VkPhysicalDeviceFeatures device_features = {};
3021 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
3022 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
3023 if (device_features.textureCompressionBC) {
3024 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
3025 } else if (device_features.textureCompressionETC2) {
3026 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
3027 } else if (device_features.textureCompressionASTC_LDR) {
3028 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
3029 }
3030
3031 VkImageCreateInfo ci;
3032 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3033 ci.pNext = NULL;
3034 ci.flags = 0;
3035 ci.imageType = VK_IMAGE_TYPE_2D;
3036 ci.format = compressed_format;
3037 ci.extent = {64, 64, 1};
3038 ci.mipLevels = 1;
3039 ci.arrayLayers = 1;
3040 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3041 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3042 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3043 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3044 ci.queueFamilyIndexCount = 0;
3045 ci.pQueueFamilyIndices = NULL;
3046 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3047
3048 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003049 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
3050 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06003051 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
3052 return;
3053 }
3054
3055 // Create images
3056 VkImageObj image_1(m_device);
3057 image_1.init(&ci);
3058 ASSERT_TRUE(image_1.initialized());
3059
3060 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3061 VkImageObj image_2(m_device);
3062 image_2.init(&ci);
3063 ASSERT_TRUE(image_2.initialized());
3064
3065 m_commandBuffer->begin();
3066
3067 VkImageCopy copy_region;
3068 copy_region.extent = {48, 48, 1};
3069 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3070 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3071 copy_region.srcSubresource.mipLevel = 0;
3072 copy_region.dstSubresource.mipLevel = 0;
3073 copy_region.srcSubresource.baseArrayLayer = 0;
3074 copy_region.dstSubresource.baseArrayLayer = 0;
3075 copy_region.srcSubresource.layerCount = 1;
3076 copy_region.dstSubresource.layerCount = 1;
3077 copy_region.srcOffset = {0, 0, 0};
3078 copy_region.dstOffset = {0, 0, 0};
3079
3080 // Sanity check
3081 m_errorMonitor->ExpectSuccess();
3082 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3083 m_errorMonitor->VerifyNotFound();
3084
3085 std::string vuid;
3086 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3087 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3088
3089 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3090 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003091 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003092 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003095 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3096 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3097 m_errorMonitor->VerifyFound();
3098 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003099 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003101 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3102 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3103 m_errorMonitor->VerifyFound();
3104 copy_region.srcOffset = {0, 0, 0};
3105
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003106 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003107 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003108 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003110 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3111 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3112 m_errorMonitor->VerifyFound();
3113 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003114 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3115 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003116 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3117 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3118 m_errorMonitor->VerifyFound();
3119 copy_region.dstOffset = {0, 0, 0};
3120
3121 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003122 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003123 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003126 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3127 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3128 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003129 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003130 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003133 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3134 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3135 m_errorMonitor->VerifyFound();
3136
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003137 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003138 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003139 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3140 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003141 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3142 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3143 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003144 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003145 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3147 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003148 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3149 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3150 m_errorMonitor->VerifyFound();
3151
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003152 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3153 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003154 // There are currently no supported compressed formats with a block depth other than 1,
3155 // so impossible to create a 'not a multiple' condition for depth.
3156 m_commandBuffer->end();
3157}
3158
3159TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3160 // Image copy tests on single-plane _422 formats with block alignment errors
3161
3162 // Enable KHR multiplane req'd extensions
3163 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3164 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3165 if (mp_extensions) {
3166 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3167 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003168 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003169 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003170 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3171 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3172 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3173 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003174 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003175 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3176 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3177 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3178 } else {
3179 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3180 return;
3181 }
3182 ASSERT_NO_FATAL_FAILURE(InitState());
3183
3184 // Select a _422 format and verify support
3185 VkImageCreateInfo ci = {};
3186 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3187 ci.pNext = NULL;
3188 ci.flags = 0;
3189 ci.imageType = VK_IMAGE_TYPE_2D;
3190 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3191 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3192 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3193 ci.mipLevels = 1;
3194 ci.arrayLayers = 1;
3195 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3196 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3197 ci.queueFamilyIndexCount = 0;
3198 ci.pQueueFamilyIndices = NULL;
3199 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3200
3201 // Verify formats
3202 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3203 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3204 if (!supported) {
3205 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3206 return; // Assume there's low ROI on searching for different mp formats
3207 }
3208
3209 // Create images
3210 ci.extent = {64, 64, 1};
3211 VkImageObj image_422(m_device);
3212 image_422.init(&ci);
3213 ASSERT_TRUE(image_422.initialized());
3214
3215 ci.extent = {64, 64, 1};
3216 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3217 VkImageObj image_ucmp(m_device);
3218 image_ucmp.init(&ci);
3219 ASSERT_TRUE(image_ucmp.initialized());
3220
3221 m_commandBuffer->begin();
3222
3223 VkImageCopy copy_region;
3224 copy_region.extent = {48, 48, 1};
3225 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3226 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3227 copy_region.srcSubresource.mipLevel = 0;
3228 copy_region.dstSubresource.mipLevel = 0;
3229 copy_region.srcSubresource.baseArrayLayer = 0;
3230 copy_region.dstSubresource.baseArrayLayer = 0;
3231 copy_region.srcSubresource.layerCount = 1;
3232 copy_region.dstSubresource.layerCount = 1;
3233 copy_region.srcOffset = {0, 0, 0};
3234 copy_region.dstOffset = {0, 0, 0};
3235
3236 // Src offsets must be multiples of compressed block sizes
3237 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003238 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003240 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3241 &copy_region);
3242 m_errorMonitor->VerifyFound();
3243 copy_region.srcOffset = {0, 0, 0};
3244
3245 // Dst offsets must be multiples of compressed block sizes
3246 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003247 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003250 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3251 &copy_region);
3252 m_errorMonitor->VerifyFound();
3253 copy_region.dstOffset = {0, 0, 0};
3254
3255 // Copy extent must be multiples of compressed block sizes if not full width/height
3256 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003257 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003259 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3260 &copy_region);
3261 m_errorMonitor->VerifyFound();
3262
unknown357e1782019-09-25 17:57:40 -06003263 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003264 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3265 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003266 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003267 copy_region.dstOffset = {0, 0, 0};
3268
3269 m_commandBuffer->end();
3270}
3271
3272TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3273 // Image copy tests on multiplane images with aspect errors
3274
3275 // Enable KHR multiplane req'd extensions
3276 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3277 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3278 if (mp_extensions) {
3279 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3280 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003281 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003282 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003283 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3284 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3285 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3286 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003287 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003288 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3289 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3290 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3291 } else {
3292 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3293 return;
3294 }
3295 ASSERT_NO_FATAL_FAILURE(InitState());
3296
3297 // Select multi-plane formats and verify support
3298 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3299 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3300
3301 VkImageCreateInfo ci = {};
3302 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3303 ci.pNext = NULL;
3304 ci.flags = 0;
3305 ci.imageType = VK_IMAGE_TYPE_2D;
3306 ci.format = mp2_format;
3307 ci.extent = {256, 256, 1};
3308 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3309 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3310 ci.mipLevels = 1;
3311 ci.arrayLayers = 1;
3312 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3313 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3314 ci.queueFamilyIndexCount = 0;
3315 ci.pQueueFamilyIndices = NULL;
3316 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3317
3318 // Verify formats
3319 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3320 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3321 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3322 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3323 ci.format = mp3_format;
3324 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3325 if (!supported) {
3326 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3327 kSkipPrefix);
3328 return; // Assume there's low ROI on searching for different mp formats
3329 }
3330
3331 // Create images
3332 VkImageObj mp3_image(m_device);
3333 mp3_image.init(&ci);
3334 ASSERT_TRUE(mp3_image.initialized());
3335
3336 ci.format = mp2_format;
3337 VkImageObj mp2_image(m_device);
3338 mp2_image.init(&ci);
3339 ASSERT_TRUE(mp2_image.initialized());
3340
3341 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3342 VkImageObj sp_image(m_device);
3343 sp_image.init(&ci);
3344 ASSERT_TRUE(sp_image.initialized());
3345
3346 m_commandBuffer->begin();
3347
3348 VkImageCopy copy_region;
3349 copy_region.extent = {128, 128, 1};
3350 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3351 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3352 copy_region.srcSubresource.mipLevel = 0;
3353 copy_region.dstSubresource.mipLevel = 0;
3354 copy_region.srcSubresource.baseArrayLayer = 0;
3355 copy_region.dstSubresource.baseArrayLayer = 0;
3356 copy_region.srcSubresource.layerCount = 1;
3357 copy_region.dstSubresource.layerCount = 1;
3358 copy_region.srcOffset = {0, 0, 0};
3359 copy_region.dstOffset = {0, 0, 0};
3360
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003361 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003362 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3363 &copy_region);
3364 m_errorMonitor->VerifyFound();
3365
unknown088160a2019-05-23 17:43:13 -06003366 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3367 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003368 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003369 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3370 &copy_region);
3371 m_errorMonitor->VerifyFound();
3372
3373 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3374 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003375 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003376 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3377 &copy_region);
3378 m_errorMonitor->VerifyFound();
3379
3380 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003381 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003382 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3383 &copy_region);
3384 m_errorMonitor->VerifyFound();
3385
3386 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003387 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003388 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003389 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3390 &copy_region);
3391 m_errorMonitor->VerifyFound();
3392
3393 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3394 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003395 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003396 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003397 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3398 &copy_region);
3399 m_errorMonitor->VerifyFound();
3400
3401 m_commandBuffer->end();
3402}
3403
3404TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3405 // Image copy with source region specified greater than src image size
3406 ASSERT_NO_FATAL_FAILURE(Init());
3407
3408 // Create images with full mip chain
3409 VkImageCreateInfo ci;
3410 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3411 ci.pNext = NULL;
3412 ci.flags = 0;
3413 ci.imageType = VK_IMAGE_TYPE_3D;
3414 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3415 ci.extent = {32, 32, 8};
3416 ci.mipLevels = 6;
3417 ci.arrayLayers = 1;
3418 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3419 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3420 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3421 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3422 ci.queueFamilyIndexCount = 0;
3423 ci.pQueueFamilyIndices = NULL;
3424 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3425
3426 VkImageObj src_image(m_device);
3427 src_image.init(&ci);
3428 ASSERT_TRUE(src_image.initialized());
3429
3430 // Dest image with one more mip level
3431 ci.extent = {64, 64, 16};
3432 ci.mipLevels = 7;
3433 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3434 VkImageObj dst_image(m_device);
3435 dst_image.init(&ci);
3436 ASSERT_TRUE(dst_image.initialized());
3437
3438 m_commandBuffer->begin();
3439
3440 VkImageCopy copy_region;
3441 copy_region.extent = {32, 32, 8};
3442 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3443 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3444 copy_region.srcSubresource.mipLevel = 0;
3445 copy_region.dstSubresource.mipLevel = 0;
3446 copy_region.srcSubresource.baseArrayLayer = 0;
3447 copy_region.dstSubresource.baseArrayLayer = 0;
3448 copy_region.srcSubresource.layerCount = 1;
3449 copy_region.dstSubresource.layerCount = 1;
3450 copy_region.srcOffset = {0, 0, 0};
3451 copy_region.dstOffset = {0, 0, 0};
3452
3453 m_errorMonitor->ExpectSuccess();
3454 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3455 &copy_region);
3456 m_errorMonitor->VerifyNotFound();
3457
3458 // Source exceeded in x-dim, VU 01202
3459 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003460 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003461 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3462 &copy_region);
3463 m_errorMonitor->VerifyFound();
3464
3465 // Source exceeded in y-dim, VU 01203
3466 copy_region.srcOffset.x = 0;
3467 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003468 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003469 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3470 &copy_region);
3471 m_errorMonitor->VerifyFound();
3472
3473 // Source exceeded in z-dim, VU 01204
3474 copy_region.extent = {4, 4, 4};
3475 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003476 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003477 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3478 &copy_region);
3479 m_errorMonitor->VerifyFound();
3480
3481 m_commandBuffer->end();
3482}
3483
3484TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3485 // Image copy with dest region specified greater than dest image size
3486 ASSERT_NO_FATAL_FAILURE(Init());
3487
3488 // Create images with full mip chain
3489 VkImageCreateInfo ci;
3490 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3491 ci.pNext = NULL;
3492 ci.flags = 0;
3493 ci.imageType = VK_IMAGE_TYPE_3D;
3494 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3495 ci.extent = {32, 32, 8};
3496 ci.mipLevels = 6;
3497 ci.arrayLayers = 1;
3498 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3499 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3500 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3501 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3502 ci.queueFamilyIndexCount = 0;
3503 ci.pQueueFamilyIndices = NULL;
3504 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3505
3506 VkImageObj dst_image(m_device);
3507 dst_image.init(&ci);
3508 ASSERT_TRUE(dst_image.initialized());
3509
3510 // Src image with one more mip level
3511 ci.extent = {64, 64, 16};
3512 ci.mipLevels = 7;
3513 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3514 VkImageObj src_image(m_device);
3515 src_image.init(&ci);
3516 ASSERT_TRUE(src_image.initialized());
3517
3518 m_commandBuffer->begin();
3519
3520 VkImageCopy copy_region;
3521 copy_region.extent = {32, 32, 8};
3522 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3523 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3524 copy_region.srcSubresource.mipLevel = 0;
3525 copy_region.dstSubresource.mipLevel = 0;
3526 copy_region.srcSubresource.baseArrayLayer = 0;
3527 copy_region.dstSubresource.baseArrayLayer = 0;
3528 copy_region.srcSubresource.layerCount = 1;
3529 copy_region.dstSubresource.layerCount = 1;
3530 copy_region.srcOffset = {0, 0, 0};
3531 copy_region.dstOffset = {0, 0, 0};
3532
3533 m_errorMonitor->ExpectSuccess();
3534 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3535 &copy_region);
3536 m_errorMonitor->VerifyNotFound();
3537
3538 // Dest exceeded in x-dim, VU 01205
3539 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003540 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003541 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3542 &copy_region);
3543 m_errorMonitor->VerifyFound();
3544
3545 // Dest exceeded in y-dim, VU 01206
3546 copy_region.dstOffset.x = 0;
3547 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003548 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003549 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3550 &copy_region);
3551 m_errorMonitor->VerifyFound();
3552
3553 // Dest exceeded in z-dim, VU 01207
3554 copy_region.extent = {4, 4, 4};
3555 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003556 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003557 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3558 &copy_region);
3559 m_errorMonitor->VerifyFound();
3560
3561 m_commandBuffer->end();
3562}
3563
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003564TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3565 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3566
3567 // Enable KHR multiplane req'd extensions
3568 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3569 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3570 if (mp_extensions == true) {
3571 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3572 }
3573 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003574 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003575 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3576 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3577 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3578 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003579 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003580 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3581 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3582 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3583 } else {
3584 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3585 return;
3586 }
3587 ASSERT_NO_FATAL_FAILURE(InitState());
3588
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003589 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3590 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003591 VkFormatProperties props = {0, 0, 0};
3592 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003593 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003594 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3595 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3596 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3597
3598 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003599 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003600 return;
3601 }
3602
3603 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3604 VkImageObj src_image(m_device);
3605 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003606 src_image.Init(128, 128, 1, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003607 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003608 dst_image.Init(128, 128, 1, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003609 ASSERT_TRUE(dst_image.initialized());
3610
3611 VkImageCopy copy_region = {};
3612 copy_region.extent = {64, 64, 1}; // Size of plane 1
3613 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3614 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3615 copy_region.srcSubresource.mipLevel = 0;
3616 copy_region.dstSubresource.mipLevel = 0;
3617 copy_region.srcSubresource.baseArrayLayer = 0;
3618 copy_region.dstSubresource.baseArrayLayer = 0;
3619 copy_region.srcSubresource.layerCount = 1;
3620 copy_region.dstSubresource.layerCount = 1;
3621 copy_region.srcOffset = {0, 0, 0};
3622 copy_region.dstOffset = {0, 0, 0};
3623 VkImageCopy original_region = copy_region;
3624
3625 m_commandBuffer->begin();
3626
3627 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3628 m_errorMonitor->ExpectSuccess();
3629 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3630 &copy_region);
3631 m_errorMonitor->VerifyNotFound();
3632
3633 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3634 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3635 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3636 m_errorMonitor->ExpectSuccess();
3637 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3638 &copy_region);
3639 m_errorMonitor->VerifyNotFound();
3640
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003641 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003642 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3643 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3644
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003645 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3646 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3647 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3648 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003649 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3650 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003651 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3652 &copy_region);
3653 m_errorMonitor->VerifyNotFound();
3654
3655 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3656 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3657 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3658 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003659 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3660 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003661 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3662 &copy_region);
3663 m_errorMonitor->VerifyNotFound();
3664
3665 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3666 copy_region.extent = {128, 64, 1};
3667 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3668 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3669 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003670 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3671 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003672 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3673 &copy_region);
3674 m_errorMonitor->VerifyNotFound();
3675
3676 // 128x64 copy from plane 0 -> Plane 1
3677 copy_region.extent = {128, 64, 1};
3678 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3679 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003681 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3682 &copy_region);
3683 m_errorMonitor->VerifyFound();
3684
3685 // 128x64 copy from plane 1 -> Plane 0
3686 copy_region.extent = {128, 64, 1};
3687 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3688 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003689 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003690 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3691 &copy_region);
3692 m_errorMonitor->VerifyFound();
3693
3694 // src exceeded in y-dim from offset
3695 copy_region = original_region;
3696 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003697 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003698 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3699 &copy_region);
3700 m_errorMonitor->VerifyFound();
3701
3702 // dst exceeded in y-dim from offset
3703 copy_region = original_region;
3704 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003706 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3707 &copy_region);
3708 m_errorMonitor->VerifyFound();
3709
3710 m_commandBuffer->end();
3711}
3712
unknown088160a2019-05-23 17:43:13 -06003713TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003714 if (!EnableDeviceProfileLayer()) {
3715 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3716 return;
3717 }
unknown088160a2019-05-23 17:43:13 -06003718
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003719 // Enable KHR multiplane req'd extensions
3720 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3721 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3722 if (mp_extensions == true) {
3723 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3724 }
3725 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003726 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003727 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3728 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3729 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3730 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003731 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003732 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3733 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3734 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3735 }
3736 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003737
sfricke-samsung51067b22020-04-30 21:41:17 -07003738 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3739 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003740
sfricke-samsung51067b22020-04-30 21:41:17 -07003741 // Load required functions
3742 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3743 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3744 return;
3745 }
3746
3747 // Set transfer for all potential used formats
3748 VkFormatProperties format_props;
3749 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3750 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3751 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3752
3753 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3754 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3755 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003756
3757 VkImageCreateInfo image_create_info = {};
3758 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3759 image_create_info.pNext = NULL;
3760 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003761 image_create_info.extent.width = 32;
3762 image_create_info.extent.height = 32;
3763 image_create_info.extent.depth = 1;
3764 image_create_info.mipLevels = 1;
3765 image_create_info.arrayLayers = 1;
3766 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003767 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3768 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003769 image_create_info.flags = 0;
3770
sfricke-samsung51067b22020-04-30 21:41:17 -07003771 image_create_info.format = VK_FORMAT_R8_UNORM;
3772 VkImageObj image_8b_unorm(m_device);
3773 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003774
sfricke-samsung51067b22020-04-30 21:41:17 -07003775 image_create_info.format = VK_FORMAT_R8_UINT;
3776 VkImageObj image_8b_uint(m_device);
3777 image_8b_uint.init(&image_create_info);
3778
3779 // First try to test two single plane mismatch
3780 {
3781 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3782 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3783 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3784
3785 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3786 VkImageObj image_32b_unorm(m_device);
3787 image_32b_unorm.init(&image_create_info);
3788
3789 m_commandBuffer->begin();
3790 VkImageCopy copyRegion;
3791 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3792 copyRegion.srcSubresource.mipLevel = 0;
3793 copyRegion.srcSubresource.baseArrayLayer = 0;
3794 copyRegion.srcSubresource.layerCount = 1;
3795 copyRegion.srcOffset.x = 0;
3796 copyRegion.srcOffset.y = 0;
3797 copyRegion.srcOffset.z = 0;
3798 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3799 copyRegion.dstSubresource.mipLevel = 0;
3800 copyRegion.dstSubresource.baseArrayLayer = 0;
3801 copyRegion.dstSubresource.layerCount = 1;
3802 copyRegion.dstOffset.x = 0;
3803 copyRegion.dstOffset.y = 0;
3804 copyRegion.dstOffset.z = 0;
3805 copyRegion.extent.width = 1;
3806 copyRegion.extent.height = 1;
3807 copyRegion.extent.depth = 1;
3808
3809 // Sanity check between two 8bit formats
3810 m_errorMonitor->ExpectSuccess();
3811 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3812 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3813 m_errorMonitor->VerifyNotFound();
3814
3815 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3817 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3818 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3819 m_errorMonitor->VerifyFound();
3820
3821 // Swap src and dst
3822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3823 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3824 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3825 m_errorMonitor->VerifyFound();
3826
3827 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003828 }
3829
sfricke-samsung51067b22020-04-30 21:41:17 -07003830 // DstImage is a mismatched plane of a multi-planar format
3831 if (mp_extensions == false) {
3832 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3833 } else {
3834 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3835 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3836 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003837
sfricke-samsung51067b22020-04-30 21:41:17 -07003838 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3839 VkImageObj image_8b_16b_420_unorm(m_device);
3840 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003841
sfricke-samsung51067b22020-04-30 21:41:17 -07003842 m_commandBuffer->begin();
3843 VkImageCopy copyRegion;
3844 copyRegion.srcSubresource.mipLevel = 0;
3845 copyRegion.srcSubresource.baseArrayLayer = 0;
3846 copyRegion.srcSubresource.layerCount = 1;
3847 copyRegion.srcOffset.x = 0;
3848 copyRegion.srcOffset.y = 0;
3849 copyRegion.srcOffset.z = 0;
3850 copyRegion.dstSubresource.mipLevel = 0;
3851 copyRegion.dstSubresource.baseArrayLayer = 0;
3852 copyRegion.dstSubresource.layerCount = 1;
3853 copyRegion.dstOffset.x = 0;
3854 copyRegion.dstOffset.y = 0;
3855 copyRegion.dstOffset.z = 0;
3856 copyRegion.extent.width = 1;
3857 copyRegion.extent.height = 1;
3858 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003859
sfricke-samsung51067b22020-04-30 21:41:17 -07003860 // First test single-plane -> multi-plan
3861 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3862 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003863
sfricke-samsung51067b22020-04-30 21:41:17 -07003864 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3865 m_errorMonitor->ExpectSuccess();
3866 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3867 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3868 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003869
locke-lunargdf00db02020-03-04 19:00:57 -07003870 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3871 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3872
sfricke-samsung51067b22020-04-30 21:41:17 -07003873 // Make sure no false postiives if Compatible format
3874 m_errorMonitor->ExpectSuccess();
3875 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3876 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3877 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003878
sfricke-samsung51067b22020-04-30 21:41:17 -07003879 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3880 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3882 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3883 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3884 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003885
sfricke-samsung51067b22020-04-30 21:41:17 -07003886 // Same tests but swap src and dst
3887 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3888 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003889
locke-lunargdf00db02020-03-04 19:00:57 -07003890 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3891 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3892 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3893 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3894
sfricke-samsung51067b22020-04-30 21:41:17 -07003895 m_errorMonitor->ExpectSuccess();
3896 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3897 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3898 m_errorMonitor->VerifyNotFound();
3899
locke-lunargdf00db02020-03-04 19:00:57 -07003900 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3901 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3902
sfricke-samsung51067b22020-04-30 21:41:17 -07003903 m_errorMonitor->ExpectSuccess();
3904 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3905 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3906 m_errorMonitor->VerifyNotFound();
3907
3908 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3910 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3911 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3912 m_errorMonitor->VerifyFound();
3913
3914 m_commandBuffer->end();
3915 }
unknown088160a2019-05-23 17:43:13 -06003916}
3917
3918TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3919 ASSERT_NO_FATAL_FAILURE(Init());
3920 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3921 if (!depth_format) {
3922 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3923 return;
3924 }
3925
3926 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003927 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003928 if (properties.optimalTilingFeatures == 0) {
3929 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3930 return;
3931 }
3932
3933 VkImageObj srcImage(m_device);
3934 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3935 ASSERT_TRUE(srcImage.initialized());
3936 VkImageObj dstImage(m_device);
3937 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3938 ASSERT_TRUE(dstImage.initialized());
3939
3940 // Create two images of different types and try to copy between them
3941
3942 m_commandBuffer->begin();
3943 VkImageCopy copyRegion;
3944 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3945 copyRegion.srcSubresource.mipLevel = 0;
3946 copyRegion.srcSubresource.baseArrayLayer = 0;
3947 copyRegion.srcSubresource.layerCount = 1;
3948 copyRegion.srcOffset.x = 0;
3949 copyRegion.srcOffset.y = 0;
3950 copyRegion.srcOffset.z = 0;
3951 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3952 copyRegion.dstSubresource.mipLevel = 0;
3953 copyRegion.dstSubresource.baseArrayLayer = 0;
3954 copyRegion.dstSubresource.layerCount = 1;
3955 copyRegion.dstOffset.x = 0;
3956 copyRegion.dstOffset.y = 0;
3957 copyRegion.dstOffset.z = 0;
3958 copyRegion.extent.width = 1;
3959 copyRegion.extent.height = 1;
3960 copyRegion.extent.depth = 1;
3961
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003962 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003963 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3964 &copyRegion);
3965 m_commandBuffer->end();
3966
3967 m_errorMonitor->VerifyFound();
3968}
3969
3970TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3971 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3972
3973 ASSERT_NO_FATAL_FAILURE(Init());
3974
3975 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003976 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3977 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3978 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003979
3980 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3981 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3982 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3983 return;
3984 }
3985
3986 VkImageCreateInfo ci;
3987 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3988 ci.pNext = NULL;
3989 ci.flags = 0;
3990 ci.imageType = VK_IMAGE_TYPE_2D;
3991 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3992 ci.extent = {128, 128, 1};
3993 ci.mipLevels = 1;
3994 ci.arrayLayers = 1;
3995 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3996 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3997 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3998 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3999 ci.queueFamilyIndexCount = 0;
4000 ci.pQueueFamilyIndices = NULL;
4001 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4002
4003 VkImageObj image1(m_device);
4004 image1.init(&ci);
4005 ASSERT_TRUE(image1.initialized());
4006
4007 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4008 VkImageObj image2(m_device);
4009 image2.init(&ci);
4010 ASSERT_TRUE(image2.initialized());
4011
4012 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4013 VkImageObj image4(m_device);
4014 image4.init(&ci);
4015 ASSERT_TRUE(image4.initialized());
4016
4017 m_commandBuffer->begin();
4018
4019 VkImageCopy copyRegion;
4020 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4021 copyRegion.srcSubresource.mipLevel = 0;
4022 copyRegion.srcSubresource.baseArrayLayer = 0;
4023 copyRegion.srcSubresource.layerCount = 1;
4024 copyRegion.srcOffset = {0, 0, 0};
4025 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4026 copyRegion.dstSubresource.mipLevel = 0;
4027 copyRegion.dstSubresource.baseArrayLayer = 0;
4028 copyRegion.dstSubresource.layerCount = 1;
4029 copyRegion.dstOffset = {0, 0, 0};
4030 copyRegion.extent = {128, 128, 1};
4031
4032 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07004033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004034 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4035 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004036 m_errorMonitor->VerifyFound();
4037
Mark Lobodzinski20310782020-02-28 14:25:17 -07004038 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004039 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4040 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004041 m_errorMonitor->VerifyFound();
4042
4043 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004045 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4046 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004047 m_errorMonitor->VerifyFound();
4048
Mark Lobodzinski20310782020-02-28 14:25:17 -07004049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004050 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4051 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004052 m_errorMonitor->VerifyFound();
4053
4054 m_commandBuffer->end();
4055}
4056
4057TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4058 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004059
4060 if (!EnableDeviceProfileLayer()) {
4061 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4062 return;
4063 }
4064
4065 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4066 if (mp_extensions) {
4067 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4068 }
4069
4070 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004071 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004072 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4073 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4074 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4075 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004076 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004077 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4078 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4079 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4080 }
4081 ASSERT_NO_FATAL_FAILURE(InitState());
4082
4083 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4084 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4085
4086 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4087 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4088 return;
4089 }
4090
unknown088160a2019-05-23 17:43:13 -06004091 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4092 if (!ds_format) {
4093 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4094 return;
4095 }
4096
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004097 // Add Transfer support for all used formats
4098 VkFormatProperties formatProps;
4099 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4100 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4101 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4102 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4103 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4104 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4105 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4106 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4107 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4108
unknown088160a2019-05-23 17:43:13 -06004109 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4110 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4111 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4112 VK_IMAGE_TILING_OPTIMAL, 0);
4113 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4114 VK_IMAGE_TILING_OPTIMAL, 0);
4115 ASSERT_TRUE(color_image.initialized());
4116 ASSERT_TRUE(depth_image.initialized());
4117 ASSERT_TRUE(ds_image.initialized());
4118
4119 VkImageCopy copyRegion;
4120 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4121 copyRegion.srcSubresource.mipLevel = 0;
4122 copyRegion.srcSubresource.baseArrayLayer = 0;
4123 copyRegion.srcSubresource.layerCount = 1;
4124 copyRegion.srcOffset = {0, 0, 0};
4125 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4126 copyRegion.dstSubresource.mipLevel = 0;
4127 copyRegion.dstSubresource.baseArrayLayer = 0;
4128 copyRegion.dstSubresource.layerCount = 1;
4129 copyRegion.dstOffset = {64, 0, 0};
4130 copyRegion.extent = {64, 128, 1};
4131
4132 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004134 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004135 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4136 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004137 m_errorMonitor->VerifyFound();
4138
4139 m_commandBuffer->begin();
4140
4141 // Src and dest aspect masks don't match
4142 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004143 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004145 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4146 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004147 m_errorMonitor->VerifyFound();
4148 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4149
4150 // Illegal combinations of aspect bits
4151 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4152 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004153 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004154 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004155 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004156 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004157 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4158 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004159 m_errorMonitor->VerifyFound();
4160 // same test for dstSubresource
4161 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4162 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004164 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004167 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4168 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004169 m_errorMonitor->VerifyFound();
4170
4171 // Metadata aspect is illegal
4172 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4173 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004174 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004175 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004177 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4178 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004179 m_errorMonitor->VerifyFound();
4180 // same test for dstSubresource
4181 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4182 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004183 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004184 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004186 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4187 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004188 m_errorMonitor->VerifyFound();
4189
sfricke-samsung6141db32020-10-26 03:31:38 -07004190 // Aspect Memory Plane mask is illegal
4191 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4192 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4193 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4194 // These aspect/format mismatches are redundant but unavoidable here
4195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4196 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4197 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4198 m_errorMonitor->VerifyFound();
4199
unknown088160a2019-05-23 17:43:13 -06004200 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4201 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004202 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004203
4204 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004205 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004206 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004207 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004208 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4209 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004210 m_errorMonitor->VerifyFound();
4211
4212 // Aspect mask doesn't match dest image format
4213 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4214 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004215 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004216 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004218 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4219 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004220 m_errorMonitor->VerifyFound();
4221
4222 m_commandBuffer->end();
4223}
4224
4225TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004227
4228 ASSERT_NO_FATAL_FAILURE(Init());
4229
4230 // Create two images of sample count 1 and try to Resolve between them
4231
4232 VkImageCreateInfo image_create_info = {};
4233 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4234 image_create_info.pNext = NULL;
4235 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4236 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4237 image_create_info.extent.width = 32;
4238 image_create_info.extent.height = 1;
4239 image_create_info.extent.depth = 1;
4240 image_create_info.mipLevels = 1;
4241 image_create_info.arrayLayers = 1;
4242 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4243 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4244 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4245 image_create_info.flags = 0;
4246
4247 VkImageObj srcImage(m_device);
4248 srcImage.init(&image_create_info);
4249 ASSERT_TRUE(srcImage.initialized());
4250
4251 VkImageObj dstImage(m_device);
4252 dstImage.init(&image_create_info);
4253 ASSERT_TRUE(dstImage.initialized());
4254
4255 m_commandBuffer->begin();
4256 VkImageResolve resolveRegion;
4257 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4258 resolveRegion.srcSubresource.mipLevel = 0;
4259 resolveRegion.srcSubresource.baseArrayLayer = 0;
4260 resolveRegion.srcSubresource.layerCount = 1;
4261 resolveRegion.srcOffset.x = 0;
4262 resolveRegion.srcOffset.y = 0;
4263 resolveRegion.srcOffset.z = 0;
4264 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4265 resolveRegion.dstSubresource.mipLevel = 0;
4266 resolveRegion.dstSubresource.baseArrayLayer = 0;
4267 resolveRegion.dstSubresource.layerCount = 1;
4268 resolveRegion.dstOffset.x = 0;
4269 resolveRegion.dstOffset.y = 0;
4270 resolveRegion.dstOffset.z = 0;
4271 resolveRegion.extent.width = 1;
4272 resolveRegion.extent.height = 1;
4273 resolveRegion.extent.depth = 1;
4274 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4275 &resolveRegion);
4276 m_commandBuffer->end();
4277
4278 m_errorMonitor->VerifyFound();
4279}
4280
4281TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004282 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004283
4284 ASSERT_NO_FATAL_FAILURE(Init());
4285
4286 // Create two images of sample count 4 and try to Resolve between them
4287
4288 VkImageCreateInfo image_create_info = {};
4289 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4290 image_create_info.pNext = NULL;
4291 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4292 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4293 image_create_info.extent.width = 32;
4294 image_create_info.extent.height = 1;
4295 image_create_info.extent.depth = 1;
4296 image_create_info.mipLevels = 1;
4297 image_create_info.arrayLayers = 1;
4298 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4299 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4300 // Note: Some implementations expect color attachment usage for any
4301 // multisample surface
4302 image_create_info.usage =
4303 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4304 image_create_info.flags = 0;
4305
4306 VkImageObj srcImage(m_device);
4307 srcImage.init(&image_create_info);
4308 ASSERT_TRUE(srcImage.initialized());
4309
4310 VkImageObj dstImage(m_device);
4311 dstImage.init(&image_create_info);
4312 ASSERT_TRUE(dstImage.initialized());
4313
4314 m_commandBuffer->begin();
4315 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4316 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4317 // VK_IMAGE_LAYOUT_GENERAL = 1,
4318 VkImageResolve resolveRegion;
4319 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4320 resolveRegion.srcSubresource.mipLevel = 0;
4321 resolveRegion.srcSubresource.baseArrayLayer = 0;
4322 resolveRegion.srcSubresource.layerCount = 1;
4323 resolveRegion.srcOffset.x = 0;
4324 resolveRegion.srcOffset.y = 0;
4325 resolveRegion.srcOffset.z = 0;
4326 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4327 resolveRegion.dstSubresource.mipLevel = 0;
4328 resolveRegion.dstSubresource.baseArrayLayer = 0;
4329 resolveRegion.dstSubresource.layerCount = 1;
4330 resolveRegion.dstOffset.x = 0;
4331 resolveRegion.dstOffset.y = 0;
4332 resolveRegion.dstOffset.z = 0;
4333 resolveRegion.extent.width = 1;
4334 resolveRegion.extent.height = 1;
4335 resolveRegion.extent.depth = 1;
4336 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4337 &resolveRegion);
4338 m_commandBuffer->end();
4339
4340 m_errorMonitor->VerifyFound();
4341}
4342
4343TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004344 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004345
4346 ASSERT_NO_FATAL_FAILURE(Init());
4347
4348 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004349 VkImageObj srcImage(m_device);
4350 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004351
4352 VkImageCreateInfo image_create_info = {};
4353 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4354 image_create_info.pNext = NULL;
4355 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4356 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4357 image_create_info.extent.width = 32;
4358 image_create_info.extent.height = 1;
4359 image_create_info.extent.depth = 1;
4360 image_create_info.mipLevels = 1;
4361 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004362 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004363 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4364 // Note: Some implementations expect color attachment usage for any
4365 // multisample surface
4366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4367 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004368 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004369
4370 // Set format to something other than source image
4371 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4372 // Note: Some implementations expect color attachment usage for any
4373 // multisample surface
4374 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4375 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004376 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004377
4378 m_commandBuffer->begin();
4379 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4380 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4381 // VK_IMAGE_LAYOUT_GENERAL = 1,
4382 VkImageResolve resolveRegion;
4383 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4384 resolveRegion.srcSubresource.mipLevel = 0;
4385 resolveRegion.srcSubresource.baseArrayLayer = 0;
4386 resolveRegion.srcSubresource.layerCount = 1;
4387 resolveRegion.srcOffset.x = 0;
4388 resolveRegion.srcOffset.y = 0;
4389 resolveRegion.srcOffset.z = 0;
4390 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4391 resolveRegion.dstSubresource.mipLevel = 0;
4392 resolveRegion.dstSubresource.baseArrayLayer = 0;
4393 resolveRegion.dstSubresource.layerCount = 1;
4394 resolveRegion.dstOffset.x = 0;
4395 resolveRegion.dstOffset.y = 0;
4396 resolveRegion.dstOffset.z = 0;
4397 resolveRegion.extent.width = 1;
4398 resolveRegion.extent.height = 1;
4399 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004400 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4401 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004402 m_commandBuffer->end();
4403
4404 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004405}
4406
4407TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004408 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004409
4410 ASSERT_NO_FATAL_FAILURE(Init());
4411
4412 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004413 VkImageObj srcImage(m_device);
4414 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004415
4416 VkImageCreateInfo image_create_info = {};
4417 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4418 image_create_info.pNext = NULL;
4419 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4420 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4421 image_create_info.extent.width = 32;
4422 image_create_info.extent.height = 1;
4423 image_create_info.extent.depth = 1;
4424 image_create_info.mipLevels = 1;
4425 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004426 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004427 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4428 // Note: Some implementations expect color attachment usage for any
4429 // multisample surface
4430 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4431 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004432 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004433
4434 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4435 // Note: Some implementations expect color attachment usage for any
4436 // multisample surface
4437 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4438 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004439 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004440
4441 m_commandBuffer->begin();
4442 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4443 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4444 // VK_IMAGE_LAYOUT_GENERAL = 1,
4445 VkImageResolve resolveRegion;
4446 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4447 resolveRegion.srcSubresource.mipLevel = 0;
4448 resolveRegion.srcSubresource.baseArrayLayer = 0;
4449 resolveRegion.srcSubresource.layerCount = 1;
4450 resolveRegion.srcOffset.x = 0;
4451 resolveRegion.srcOffset.y = 0;
4452 resolveRegion.srcOffset.z = 0;
4453 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4454 resolveRegion.dstSubresource.mipLevel = 0;
4455 resolveRegion.dstSubresource.baseArrayLayer = 0;
4456 resolveRegion.dstSubresource.layerCount = 1;
4457 resolveRegion.dstOffset.x = 0;
4458 resolveRegion.dstOffset.y = 0;
4459 resolveRegion.dstOffset.z = 0;
4460 resolveRegion.extent.width = 1;
4461 resolveRegion.extent.height = 1;
4462 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004463 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4464 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004465 m_commandBuffer->end();
4466
4467 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004468}
4469
4470TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4471 ASSERT_NO_FATAL_FAILURE(Init());
4472
4473 // Create two images of different types and try to copy between them
4474 VkImageObj srcImage(m_device);
4475 VkImageObj dstImage(m_device);
4476
4477 VkImageCreateInfo image_create_info = {};
4478 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4479 image_create_info.pNext = NULL;
4480 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4481 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4482 image_create_info.extent.width = 32;
4483 image_create_info.extent.height = 32;
4484 image_create_info.extent.depth = 1;
4485 image_create_info.mipLevels = 1;
4486 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004487 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4489 image_create_info.usage =
4490 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4491 // Note: Some implementations expect color attachment usage for any
4492 // multisample surface
4493 image_create_info.flags = 0;
4494 srcImage.init(&image_create_info);
4495 ASSERT_TRUE(srcImage.initialized());
4496
4497 // Note: Some implementations expect color attachment usage for any
4498 // multisample surface
4499 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4500 dstImage.init(&image_create_info);
4501 ASSERT_TRUE(dstImage.initialized());
4502
4503 m_commandBuffer->begin();
4504 // source image must have valid contents before resolve
4505 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4506 VkImageSubresourceRange subresource = {};
4507 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4508 subresource.layerCount = 1;
4509 subresource.levelCount = 1;
4510 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4511 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4512 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4513 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4514
4515 VkImageResolve resolveRegion;
4516 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4517 resolveRegion.srcSubresource.mipLevel = 0;
4518 resolveRegion.srcSubresource.baseArrayLayer = 0;
4519 resolveRegion.srcSubresource.layerCount = 1;
4520 resolveRegion.srcOffset.x = 0;
4521 resolveRegion.srcOffset.y = 0;
4522 resolveRegion.srcOffset.z = 0;
4523 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4524 resolveRegion.dstSubresource.mipLevel = 0;
4525 resolveRegion.dstSubresource.baseArrayLayer = 0;
4526 resolveRegion.dstSubresource.layerCount = 1;
4527 resolveRegion.dstOffset.x = 0;
4528 resolveRegion.dstOffset.y = 0;
4529 resolveRegion.dstOffset.z = 0;
4530 resolveRegion.extent.width = 1;
4531 resolveRegion.extent.height = 1;
4532 resolveRegion.extent.depth = 1;
4533 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004535 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4536 1, &resolveRegion);
4537 m_errorMonitor->VerifyFound();
4538 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004540 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4541 1, &resolveRegion);
4542 m_errorMonitor->VerifyFound();
4543 m_commandBuffer->end();
4544}
4545
4546TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004547 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4548
4549 bool copy_commands2 = false;
4550 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4551 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4552 copy_commands2 = true;
4553 }
4554 ASSERT_NO_FATAL_FAILURE(InitState());
4555
4556 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4557 if (copy_commands2) {
4558 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4559 }
unknown088160a2019-05-23 17:43:13 -06004560
4561 // Create two images of different types and try to copy between them
4562 VkImageObj srcImage(m_device);
4563 VkImageObj dstImage(m_device);
4564
4565 VkImageCreateInfo image_create_info = {};
4566 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4567 image_create_info.pNext = NULL;
4568 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4569 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4570 image_create_info.extent.width = 32;
4571 image_create_info.extent.height = 32;
4572 image_create_info.extent.depth = 1;
4573 image_create_info.mipLevels = 1;
4574 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004575 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004576 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4577 image_create_info.usage =
4578 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4579 // Note: Some implementations expect color attachment usage for any
4580 // multisample surface
4581 image_create_info.flags = 0;
4582 srcImage.init(&image_create_info);
4583 ASSERT_TRUE(srcImage.initialized());
4584
4585 // Note: Some implementations expect color attachment usage for any
4586 // multisample surface
4587 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4588 dstImage.init(&image_create_info);
4589 ASSERT_TRUE(dstImage.initialized());
4590
4591 m_commandBuffer->begin();
4592 // source image must have valid contents before resolve
4593 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4594 VkImageSubresourceRange subresource = {};
4595 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4596 subresource.layerCount = 1;
4597 subresource.levelCount = 1;
4598 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4599 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4600 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4601 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4602
4603 VkImageResolve resolveRegion;
4604 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4605 resolveRegion.srcSubresource.mipLevel = 0;
4606 resolveRegion.srcSubresource.baseArrayLayer = 0;
4607 resolveRegion.srcSubresource.layerCount = 1;
4608 resolveRegion.srcOffset.x = 0;
4609 resolveRegion.srcOffset.y = 0;
4610 resolveRegion.srcOffset.z = 0;
4611 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4612 resolveRegion.dstSubresource.mipLevel = 0;
4613 resolveRegion.dstSubresource.baseArrayLayer = 0;
4614 resolveRegion.dstSubresource.layerCount = 1;
4615 resolveRegion.dstOffset.x = 0;
4616 resolveRegion.dstOffset.y = 0;
4617 resolveRegion.dstOffset.z = 0;
4618 resolveRegion.extent.width = 1;
4619 resolveRegion.extent.height = 1;
4620 resolveRegion.extent.depth = 1;
4621 // invalid source mip level
4622 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004623 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004624 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4625 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4626 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004627
4628 // Equivalent test using KHR_copy_commands2
4629 if (copy_commands2 && vkCmdResolveImage2Function) {
4630 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4631 NULL,
4632 resolveRegion.srcSubresource,
4633 resolveRegion.srcOffset,
4634 resolveRegion.dstSubresource,
4635 resolveRegion.dstOffset,
4636 resolveRegion.extent};
4637 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4638 NULL,
4639 srcImage.image(),
4640 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4641 dstImage.image(),
4642 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4643 1,
4644 &resolveRegion2};
4645 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4646 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4647 m_errorMonitor->VerifyFound();
4648 }
4649
unknown088160a2019-05-23 17:43:13 -06004650 resolveRegion.srcSubresource.mipLevel = 0;
4651 // invalid dest mip level
4652 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004653 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004654 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4655 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4656 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004657
4658 // Equivalent test using KHR_copy_commands2
4659 if (copy_commands2 && vkCmdResolveImage2Function) {
4660 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4661 NULL,
4662 resolveRegion.srcSubresource,
4663 resolveRegion.srcOffset,
4664 resolveRegion.dstSubresource,
4665 resolveRegion.dstOffset,
4666 resolveRegion.extent};
4667 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4668 NULL,
4669 srcImage.image(),
4670 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4671 dstImage.image(),
4672 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4673 1,
4674 &resolveRegion2};
4675 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4676 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4677 m_errorMonitor->VerifyFound();
4678 }
4679
unknown088160a2019-05-23 17:43:13 -06004680 resolveRegion.dstSubresource.mipLevel = 0;
4681 // invalid source array layer range
4682 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004684 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4685 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4686 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004687
4688 // Equivalent test using KHR_copy_commands2
4689 if (copy_commands2 && vkCmdResolveImage2Function) {
4690 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4691 NULL,
4692 resolveRegion.srcSubresource,
4693 resolveRegion.srcOffset,
4694 resolveRegion.dstSubresource,
4695 resolveRegion.dstOffset,
4696 resolveRegion.extent};
4697 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4698 NULL,
4699 srcImage.image(),
4700 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4701 dstImage.image(),
4702 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4703 1,
4704 &resolveRegion2};
4705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4706 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4707 m_errorMonitor->VerifyFound();
4708 }
4709
unknown088160a2019-05-23 17:43:13 -06004710 resolveRegion.srcSubresource.baseArrayLayer = 0;
4711 // invalid dest array layer range
4712 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004713 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004714 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4715 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4716 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004717
4718 // Equivalent test using KHR_copy_commands2
4719 if (copy_commands2 && vkCmdResolveImage2Function) {
4720 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4721 NULL,
4722 resolveRegion.srcSubresource,
4723 resolveRegion.srcOffset,
4724 resolveRegion.dstSubresource,
4725 resolveRegion.dstOffset,
4726 resolveRegion.extent};
4727 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4728 NULL,
4729 srcImage.image(),
4730 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4731 dstImage.image(),
4732 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4733 1,
4734 &resolveRegion2};
4735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4736 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4737 m_errorMonitor->VerifyFound();
4738 }
4739
unknown088160a2019-05-23 17:43:13 -06004740 resolveRegion.dstSubresource.baseArrayLayer = 0;
4741
4742 m_commandBuffer->end();
4743}
4744
sfricke-samsungf78d0592020-06-11 21:34:44 -07004745TEST_F(VkLayerTest, ResolveImageImageType) {
4746 ASSERT_NO_FATAL_FAILURE(Init());
4747 // Create images of different types and try to resolve between them
4748 VkImageObj srcImage2D(m_device);
4749 VkImageObj dstImage1D(m_device);
4750 VkImageObj dstImage3D(m_device);
4751
4752 VkImageCreateInfo image_create_info = {};
4753 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4754 image_create_info.pNext = NULL;
4755 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4756 image_create_info.extent.width = 32;
4757 image_create_info.extent.height = 1;
4758 image_create_info.extent.depth = 1;
4759 image_create_info.mipLevels = 1;
4760 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004761 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004762 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4763 image_create_info.usage =
4764 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4765 // Note: Some implementations expect color attachment usage for any
4766 // multisample surface
4767 image_create_info.flags = 0;
4768
4769 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4770 srcImage2D.init(&image_create_info);
4771 ASSERT_TRUE(srcImage2D.initialized());
4772
4773 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4774 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4775 dstImage1D.init(&image_create_info);
4776 ASSERT_TRUE(dstImage1D.initialized());
4777
4778 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4779 image_create_info.extent.height = 16;
4780 image_create_info.extent.depth = 16;
4781 image_create_info.arrayLayers = 1;
4782 dstImage3D.init(&image_create_info);
4783 ASSERT_TRUE(dstImage3D.initialized());
4784
4785 m_commandBuffer->begin();
4786
4787 VkImageResolve resolveRegion;
4788 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4789 resolveRegion.srcSubresource.mipLevel = 0;
4790 resolveRegion.srcSubresource.baseArrayLayer = 0;
4791 resolveRegion.srcSubresource.layerCount = 1;
4792 resolveRegion.srcOffset.x = 0;
4793 resolveRegion.srcOffset.y = 0;
4794 resolveRegion.srcOffset.z = 0;
4795 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4796 resolveRegion.dstSubresource.mipLevel = 0;
4797 resolveRegion.dstSubresource.baseArrayLayer = 0;
4798 resolveRegion.dstSubresource.layerCount = 1;
4799 resolveRegion.dstOffset.x = 0;
4800 resolveRegion.dstOffset.y = 0;
4801 resolveRegion.dstOffset.z = 0;
4802 resolveRegion.extent.width = 1;
4803 resolveRegion.extent.height = 1;
4804 resolveRegion.extent.depth = 1;
4805
4806 // non-zero value baseArrayLayer
4807 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004809 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4810 &resolveRegion);
4811 m_errorMonitor->VerifyFound();
4812 resolveRegion.srcSubresource.baseArrayLayer = 0;
4813
4814 // Set height with 1D dstImage
4815 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004817 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4819 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004820 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4821 &resolveRegion);
4822 m_errorMonitor->VerifyFound();
4823 resolveRegion.extent.height = 1;
4824
4825 // Set depth with 1D dstImage and 2D srcImage
4826 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004827 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004829 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4830 &resolveRegion);
4831 m_errorMonitor->VerifyFound();
4832 resolveRegion.extent.depth = 1;
4833
4834 m_commandBuffer->end();
4835}
4836
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004837TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4838 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4839 ASSERT_NO_FATAL_FAILURE(Init());
4840
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004841 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004842 VkImageObj srcImage2D(m_device);
4843 VkImageObj dstImage2D(m_device);
4844
4845 VkImageCreateInfo image_create_info = {};
4846 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4847 image_create_info.pNext = NULL;
4848 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4849 image_create_info.extent.width = 32;
4850 image_create_info.extent.height = 32;
4851 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004852 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004853 image_create_info.arrayLayers = 1;
4854 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4855 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4856 image_create_info.usage =
4857 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4858 // Note: Some implementations expect color attachment usage for any
4859 // multisample surface
4860 image_create_info.flags = 0;
4861
4862 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4863 srcImage2D.init(&image_create_info);
4864 ASSERT_TRUE(srcImage2D.initialized());
4865
4866 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4867 dstImage2D.init(&image_create_info);
4868 ASSERT_TRUE(dstImage2D.initialized());
4869
4870 m_commandBuffer->begin();
4871
4872 VkImageResolve resolveRegion = {};
4873 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4874 resolveRegion.srcSubresource.mipLevel = 0;
4875 resolveRegion.srcSubresource.baseArrayLayer = 0;
4876 resolveRegion.srcSubresource.layerCount = 1;
4877 resolveRegion.srcOffset.x = 0;
4878 resolveRegion.srcOffset.y = 0;
4879 resolveRegion.srcOffset.z = 0;
4880 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4881 resolveRegion.dstSubresource.mipLevel = 0;
4882 resolveRegion.dstSubresource.baseArrayLayer = 0;
4883 resolveRegion.dstSubresource.layerCount = 1;
4884 resolveRegion.dstOffset.x = 0;
4885 resolveRegion.dstOffset.y = 0;
4886 resolveRegion.dstOffset.z = 0;
4887 resolveRegion.extent.width = 32;
4888 resolveRegion.extent.height = 32;
4889 resolveRegion.extent.depth = 1;
4890
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004891 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4892 &resolveRegion);
4893 m_errorMonitor->VerifyNotFound();
4894
4895 // srcImage exceeded in x-dim
4896 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004897 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004898 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4899 &resolveRegion);
4900 m_errorMonitor->VerifyFound();
4901 resolveRegion.srcOffset.x = 0;
4902
4903 // dstImage exceeded in x-dim
4904 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004905 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004906 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4907 &resolveRegion);
4908 m_errorMonitor->VerifyFound();
4909 resolveRegion.dstOffset.x = 0;
4910
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004911 // both image exceeded in y-dim
4912 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004914 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4915 &resolveRegion);
4916 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004917 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004918
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004919 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004921 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4922 &resolveRegion);
4923 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004924 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004925
4926 // srcImage exceeded in z-dim
4927 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4929 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004930 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4931 &resolveRegion);
4932 m_errorMonitor->VerifyFound();
4933 resolveRegion.srcOffset.z = 0;
4934
4935 // dstImage exceeded in z-dim
4936 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4938 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004939 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4940 &resolveRegion);
4941 m_errorMonitor->VerifyFound();
4942 resolveRegion.dstOffset.z = 0;
4943
4944 m_commandBuffer->end();
4945}
4946
unknown088160a2019-05-23 17:43:13 -06004947TEST_F(VkLayerTest, ClearImageErrors) {
4948 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4949
4950 ASSERT_NO_FATAL_FAILURE(Init());
4951 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4952
4953 m_commandBuffer->begin();
4954
4955 // Color image
4956 VkClearColorValue clear_color;
4957 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4958 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4959 const int32_t img_width = 32;
4960 const int32_t img_height = 32;
4961 VkImageCreateInfo image_create_info = {};
4962 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4963 image_create_info.pNext = NULL;
4964 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4965 image_create_info.format = color_format;
4966 image_create_info.extent.width = img_width;
4967 image_create_info.extent.height = img_height;
4968 image_create_info.extent.depth = 1;
4969 image_create_info.mipLevels = 1;
4970 image_create_info.arrayLayers = 1;
4971 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4972 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4973
4974 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4975 vk_testing::Image color_image_no_transfer;
4976 color_image_no_transfer.init(*m_device, image_create_info);
4977
4978 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4979 vk_testing::Image color_image;
4980 color_image.init(*m_device, image_create_info);
4981
4982 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4983
4984 // Depth/Stencil image
4985 VkClearDepthStencilValue clear_value = {0};
4986 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4987 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4988 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4989 ds_image_create_info.extent.width = 64;
4990 ds_image_create_info.extent.height = 64;
4991 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4992 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4993
4994 vk_testing::Image ds_image;
4995 ds_image.init(*m_device, ds_image_create_info);
4996
4997 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4998
sfricke-samsungcd924d92020-05-20 23:51:17 -07004999 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005000
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005001 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005002
5003 m_errorMonitor->VerifyFound();
5004
sfricke-samsungcd924d92020-05-20 23:51:17 -07005005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005006
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005007 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5008 &color_range);
unknown088160a2019-05-23 17:43:13 -06005009
5010 m_errorMonitor->VerifyFound();
5011
5012 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005013 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005015
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005016 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5017 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005018
5019 m_errorMonitor->VerifyFound();
5020}
5021
5022TEST_F(VkLayerTest, CommandQueueFlags) {
5023 TEST_DESCRIPTION(
5024 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5025
5026 ASSERT_NO_FATAL_FAILURE(Init());
5027
5028 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5029 if (queueFamilyIndex == UINT32_MAX) {
5030 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5031 return;
5032 } else {
5033 // Create command pool on a non-graphics queue
5034 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5035
5036 // Setup command buffer on pool
5037 VkCommandBufferObj command_buffer(m_device, &command_pool);
5038 command_buffer.begin();
5039
5040 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005041 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005042 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5043 command_buffer.SetViewport(0, 1, &viewport);
5044 m_errorMonitor->VerifyFound();
5045 }
5046}
5047
sfricke-samsung674ba102020-08-18 22:38:49 -07005048TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5049 TEST_DESCRIPTION(
5050 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5051 "buffer");
5052
5053 ASSERT_NO_FATAL_FAILURE(Init());
5054
5055 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5056 if (queueFamilyIndex == UINT32_MAX) {
5057 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5058 return;
5059 } else {
5060 // Create Depth image
5061 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5062 if (ds_format == VK_FORMAT_UNDEFINED) {
5063 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5064 return;
5065 }
5066
5067 VkImageObj ds_image(m_device);
5068 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5069 VK_IMAGE_TILING_OPTIMAL, 0);
5070 ASSERT_TRUE(ds_image.initialized());
5071
5072 // Allocate buffers
5073 VkBufferObj buffer;
5074 VkMemoryPropertyFlags reqs = 0;
5075 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5076
5077 VkBufferImageCopy region = {};
5078 region.bufferRowLength = 0;
5079 region.bufferImageHeight = 0;
5080 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5081 region.imageSubresource.layerCount = 1;
5082 region.imageOffset = {0, 0, 0};
5083 region.imageExtent = {64, 64, 1};
5084 region.bufferOffset = 0;
5085
5086 // Create command pool on a non-graphics queue
5087 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5088
5089 // Setup command buffer on pool
5090 VkCommandBufferObj command_buffer(m_device, &command_pool);
5091 command_buffer.begin();
5092
sfricke-samsungea4fd142020-10-17 23:51:59 -07005093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005094 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5095 1, &region);
5096 m_errorMonitor->VerifyFound();
5097 }
5098}
5099
sfricke-samsung5a019492021-01-25 10:32:08 -08005100TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5101 TEST_DESCRIPTION(
5102 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5103 "buffer");
5104
5105 ASSERT_NO_FATAL_FAILURE(Init());
5106
5107 // Should be left with a tranfser queue
5108 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5109 if (queueFamilyIndex == UINT32_MAX) {
5110 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5111 return;
5112 }
5113
5114 VkImageObj image(m_device);
5115 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5116 VK_IMAGE_TILING_OPTIMAL, 0);
5117 ASSERT_TRUE(image.initialized());
5118
5119 // Allocate buffers
5120 VkBufferObj buffer;
5121 VkMemoryPropertyFlags reqs = 0;
5122 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5123
5124 VkBufferImageCopy region = {};
5125 region.bufferRowLength = 0;
5126 region.bufferImageHeight = 0;
5127 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5128 region.imageSubresource.layerCount = 1;
5129 region.imageOffset = {0, 0, 0};
5130 region.imageExtent = {16, 16, 1};
5131 region.bufferOffset = 5;
5132
5133 // Create command pool on a non-graphics queue
5134 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5135
5136 // Setup command buffer on pool
5137 VkCommandBufferObj command_buffer(m_device, &command_pool);
5138 command_buffer.begin();
5139
5140 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5142 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5143 &region);
5144 m_errorMonitor->VerifyFound();
5145}
5146
sfricke-samsungcb467672020-11-25 00:09:28 -08005147TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5148 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5149
5150 ASSERT_NO_FATAL_FAILURE(Init());
5151
5152 if (m_device->queue_props.size() < 2) {
5153 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5154 return;
5155 }
5156
5157 // First two queue families
5158 uint32_t queue_index_A = 0;
5159 uint32_t queue_index_B = 1;
5160
5161 VkCommandPoolCreateInfo pool_create_info = {};
5162 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5163 pool_create_info.pNext = nullptr;
5164 pool_create_info.flags = 0;
5165
5166 VkCommandPool command_pool_A;
5167 pool_create_info.queueFamilyIndex = queue_index_A;
5168 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5169
5170 VkCommandPool command_pool_B;
5171 pool_create_info.queueFamilyIndex = queue_index_B;
5172 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5173
5174 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
5175 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5176 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5177 command_buffer_allocate_info.commandBufferCount = 1;
5178 command_buffer_allocate_info.commandPool = command_pool_A;
5179 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5180 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5181
5182 command_buffer_allocate_info.commandPool = command_pool_B;
5183 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5184 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5185
5186 VkCommandBufferBeginInfo begin_info = {};
5187 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5188
5189 // secondary
5190 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5191 vk::EndCommandBuffer(command_buffer[1]);
5192
5193 // Try using different pool's command buffer as secondary
5194 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5196 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5197 m_errorMonitor->VerifyFound();
5198 vk::EndCommandBuffer(command_buffer[0]);
5199
5200 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5201 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5202}
5203
unknown088160a2019-05-23 17:43:13 -06005204TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5205 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5206 ASSERT_NO_FATAL_FAILURE(Init());
5207 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5208 // never record secondary
5209
Mark Lobodzinski20310782020-02-28 14:25:17 -07005210 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005211 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005212 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005213 m_errorMonitor->VerifyFound();
5214 m_commandBuffer->end();
5215}
5216
5217TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5218 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5219
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005220 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005221 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5222
5223 VkImageCreateInfo image_create_info = {};
5224 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5225 image_create_info.pNext = NULL;
5226 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5227 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5228 image_create_info.extent.width = 32;
5229 image_create_info.extent.height = 1;
5230 image_create_info.extent.depth = 1;
5231 image_create_info.mipLevels = 1;
5232 image_create_info.arrayLayers = 1;
5233 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5234 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5235 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5236 image_create_info.flags = 0;
5237
5238 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5239 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5240
5241 VkImageObj image(m_device);
5242 image.init(&image_create_info);
5243 ASSERT_TRUE(image.initialized());
5244 VkImageMemoryBarrier image_barrier =
5245 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5246
5247 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5248 image_barrier.oldLayout = old_layout;
5249 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005250 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5251 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005252 };
5253
5254 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5255 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5256 secondary.begin();
5257 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5258 secondary.end();
5259
Mark Lobodzinski20310782020-02-28 14:25:17 -07005260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005261 m_commandBuffer->begin();
5262 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005263 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005264 m_errorMonitor->VerifyFound();
5265
unknown088160a2019-05-23 17:43:13 -06005266 m_commandBuffer->reset();
5267 secondary.reset();
5268
5269 // Validate that UNDEFINED doesn't false positive on us
5270 secondary.begin();
5271 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5272 secondary.end();
5273 m_commandBuffer->begin();
5274 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5275 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005276 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005277 m_errorMonitor->VerifyNotFound();
5278 m_commandBuffer->end();
5279}
5280
5281TEST_F(VkLayerTest, SetDynViewportParamTests) {
5282 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5283
5284 SetTargetApiVersion(VK_API_VERSION_1_1);
5285 VkPhysicalDeviceFeatures features{};
5286 ASSERT_NO_FATAL_FAILURE(Init(&features));
5287
5288 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5289 const VkViewport viewports[] = {vp, vp};
5290
5291 m_commandBuffer->begin();
5292
5293 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005294 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005295 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005296 m_errorMonitor->VerifyFound();
5297
Mark Lobodzinski20310782020-02-28 14:25:17 -07005298 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005299 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005300 m_errorMonitor->VerifyFound();
5301
Mark Lobodzinski20310782020-02-28 14:25:17 -07005302 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005303 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005304 m_errorMonitor->VerifyFound();
5305
Mark Lobodzinski20310782020-02-28 14:25:17 -07005306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5307 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005308 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005309 m_errorMonitor->VerifyFound();
5310
Mark Lobodzinski20310782020-02-28 14:25:17 -07005311 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005312 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005313 m_errorMonitor->VerifyFound();
5314
5315 // core viewport tests
5316 using std::vector;
5317 struct TestCase {
5318 VkViewport vp;
5319 std::string veid;
5320 };
5321
5322 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5323 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5324 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5325
5326 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5327 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5328 const auto one_before_min_bounds = NearestSmaller(min_bound);
5329 const auto one_past_max_bounds = NearestGreater(max_bound);
5330
5331 const auto below_zero = NearestSmaller(0.0f);
5332 const auto past_one = NearestGreater(1.0f);
5333
5334 vector<TestCase> test_cases = {
5335 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5336 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5337 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5338 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5339 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5340 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5341 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5342 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5343 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5344 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5345 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5346 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5347 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5348 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5349 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5350 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5351 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5352 };
5353
5354 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5355 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5356 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5357 } else {
5358 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5359 }
5360
5361 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005363 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005364 m_errorMonitor->VerifyFound();
5365 }
5366}
5367
5368TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5369 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5370
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005371 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005372
Mike Schuchardt7cc57842021-09-15 10:49:59 -07005373 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
5374 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005375 } else {
5376 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5377 return;
5378 }
5379 ASSERT_NO_FATAL_FAILURE(InitState());
5380
5381 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5382}
5383
5384TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5385 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5386
5387 ASSERT_NO_FATAL_FAILURE(Init());
5388
5389 if (!m_device->phy().features().multiViewport) {
5390 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5391 return;
5392 }
5393
unknown088160a2019-05-23 17:43:13 -06005394 m_commandBuffer->begin();
5395
Mark Lobodzinski20310782020-02-28 14:25:17 -07005396 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005397 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005398 m_errorMonitor->VerifyFound();
5399
Petr Kraus14e49492019-09-09 20:13:29 +02005400 const auto max_viewports = m_device->props.limits.maxViewports;
5401
Mark Lobodzinski20310782020-02-28 14:25:17 -07005402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005403 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005404 m_errorMonitor->VerifyFound();
5405
Petr Kraus14e49492019-09-09 20:13:29 +02005406 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5407 if (max_viewports >= too_big_max_viewports) {
5408 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5409 kSkipPrefix);
5410 } else {
5411 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5412 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5413
Mark Lobodzinski20310782020-02-28 14:25:17 -07005414 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005415 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005416 m_errorMonitor->VerifyFound();
5417
Mark Lobodzinski20310782020-02-28 14:25:17 -07005418 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005419 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005420 m_errorMonitor->VerifyFound();
5421
Mark Lobodzinski20310782020-02-28 14:25:17 -07005422 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005423 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005424 m_errorMonitor->VerifyFound();
5425
Mark Lobodzinski20310782020-02-28 14:25:17 -07005426 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005427 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005428 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005429 }
unknown088160a2019-05-23 17:43:13 -06005430}
5431
5432TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5433 TEST_DESCRIPTION(
5434 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5435
5436 ASSERT_NO_FATAL_FAILURE(Init());
5437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5438
5439 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5440 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5441
5442 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5443 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5444 nullptr, // pNext
5445 m_renderPass,
5446 0, // subpass
5447 m_framebuffer,
5448 };
5449 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5450 nullptr, // pNext
5451 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5452
5453 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5454 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5455 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5456 sec_cmdbuff_inside_rp.end();
5457
5458 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5459 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5460 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5461 sec_cmdbuff_outside_rp.end();
5462
5463 m_commandBuffer->begin();
5464
Mark Lobodzinski20310782020-02-28 14:25:17 -07005465 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005466 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005467 m_errorMonitor->VerifyFound();
5468
5469 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5470 nullptr, // pNext
5471 m_renderPass,
5472 m_framebuffer,
5473 {{0, 0}, {32, 32}},
5474 static_cast<uint32_t>(m_renderPassClearValues.size()),
5475 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005476 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005477
Mark Lobodzinski20310782020-02-28 14:25:17 -07005478 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005479 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005480 m_errorMonitor->VerifyFound();
5481}
5482
5483TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5484 TEST_DESCRIPTION(
5485 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5486 ASSERT_NO_FATAL_FAILURE(Init());
5487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5488
5489 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5490 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5491 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5492 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5493 command_buffer_allocate_info.commandBufferCount = 1;
5494
5495 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005496 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005497 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5498 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5499 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5500 command_buffer_inheritance_info.renderPass = m_renderPass;
5501 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5502
5503 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5504 command_buffer_begin_info.flags =
5505 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5506 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5507
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005508 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005509 VkClearAttachment color_attachment;
5510 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5511 color_attachment.clearValue.color.float32[0] = 0;
5512 color_attachment.clearValue.color.float32[1] = 0;
5513 color_attachment.clearValue.color.float32[2] = 0;
5514 color_attachment.clearValue.color.float32[3] = 0;
5515 color_attachment.colorAttachment = 0;
5516 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005517 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005518 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5519 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005520 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005521 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005522
Mark Lobodzinski20310782020-02-28 14:25:17 -07005523 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005524 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005525 m_errorMonitor->VerifyFound();
5526
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005527 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005528 m_commandBuffer->end();
5529}
5530
5531TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5532 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5533 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5534 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5535 } else {
5536 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5537 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5538 return;
5539 }
5540
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005541 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005542 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5543 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5544 } else {
5545 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5546 return;
5547 }
5548 ASSERT_NO_FATAL_FAILURE(InitState());
5549
5550 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5551 if (push_descriptor_prop.maxPushDescriptors < 1) {
5552 // Some implementations report an invalid maxPushDescriptors of 0
5553 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5554 return;
5555 }
5556
5557 // Create ordinary and push descriptor set layout
5558 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5559 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5560 ASSERT_TRUE(ds_layout.initialized());
5561 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5562 ASSERT_TRUE(push_ds_layout.initialized());
5563
5564 // Now use the descriptor set layouts to create a pipeline layout
5565 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5566 ASSERT_TRUE(pipeline_layout.initialized());
5567
5568 // Create a descriptor to push
5569 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5570 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5571 ASSERT_TRUE(buffer_obj.initialized());
5572
5573 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5574 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5575 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5576
5577 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5578 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5579
5580 // Find address of extension call and make the call
5581 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005582 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005583 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5584
5585 // Section 1: Queue family matching/capabilities.
5586 // Create command pool on a non-graphics queue
5587 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5588 const uint32_t transfer_only_qfi =
5589 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5590 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005591 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005592 } else {
5593 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5594
5595 VkCommandPoolObj command_pool(m_device, err_qfi);
5596 ASSERT_TRUE(command_pool.initialized());
5597 VkCommandBufferObj command_buffer(m_device, &command_pool);
5598 ASSERT_TRUE(command_buffer.initialized());
5599 command_buffer.begin();
5600
Mark Lobodzinski20310782020-02-28 14:25:17 -07005601 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5602 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005603 if (err_qfi == transfer_only_qfi) {
5604 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005606 }
5607 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5608 &descriptor_write);
5609 m_errorMonitor->VerifyFound();
5610 command_buffer.end();
5611
5612 // If we succeed in testing only one condition above, we need to test the other below.
5613 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5614 // Need to test the neither compute/gfx supported case separately.
5615 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5616 ASSERT_TRUE(tran_command_pool.initialized());
5617 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5618 ASSERT_TRUE(tran_command_buffer.initialized());
5619 tran_command_buffer.begin();
5620
5621 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005622 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5623 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005625 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5626 &descriptor_write);
5627 m_errorMonitor->VerifyFound();
5628 tran_command_buffer.end();
5629 }
5630 }
5631
5632 // Push to the non-push binding
5633 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005635 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5636 &descriptor_write);
5637 m_errorMonitor->VerifyFound();
5638
5639 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005641 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5642 &descriptor_write);
5643 m_errorMonitor->VerifyFound();
5644 m_commandBuffer->end();
5645
5646 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5647 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung85584a72021-09-30 21:43:38 -07005649 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005651 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5652 &descriptor_write);
5653 m_errorMonitor->VerifyFound();
5654}
5655
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005656TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5657 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5658 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5659 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5660 } else {
5661 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5662 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5663 return;
5664 }
5665
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005666 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005667 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5668 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5669 } else {
5670 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5671 return;
5672 }
5673 ASSERT_NO_FATAL_FAILURE(InitState());
5674
5675 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5676 if (push_descriptor_prop.maxPushDescriptors < 1) {
5677 // Some implementations report an invalid maxPushDescriptors of 0.
5678 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5679 return;
5680 }
5681
5682 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5683 if (min_alignment == 0) {
5684 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5685 return;
5686 }
5687
5688 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5689 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5690 ASSERT_TRUE(push_ds_layout.initialized());
5691
5692 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5693 ASSERT_TRUE(pipeline_layout.initialized());
5694
5695 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5696 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5697 ASSERT_TRUE(buffer_obj.initialized());
5698
5699 // Use an invalid alignment.
5700 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5701 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5702 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5703
5704 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5705 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5706 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5707
5708 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005710 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5711 &descriptor_write);
5712 m_errorMonitor->VerifyFound();
5713
5714 m_commandBuffer->end();
5715}
5716
unknown088160a2019-05-23 17:43:13 -06005717TEST_F(VkLayerTest, SetDynScissorParamTests) {
5718 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5719
5720 VkPhysicalDeviceFeatures features{};
5721 ASSERT_NO_FATAL_FAILURE(Init(&features));
5722
5723 const VkRect2D scissor = {{0, 0}, {16, 16}};
5724 const VkRect2D scissors[] = {scissor, scissor};
5725
5726 m_commandBuffer->begin();
5727
5728 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005730 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005731 m_errorMonitor->VerifyFound();
5732
Mark Lobodzinski20310782020-02-28 14:25:17 -07005733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005734 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005735 m_errorMonitor->VerifyFound();
5736
Mark Lobodzinski20310782020-02-28 14:25:17 -07005737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005738 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005739 m_errorMonitor->VerifyFound();
5740
Mark Lobodzinski20310782020-02-28 14:25:17 -07005741 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5742 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005743 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005744 m_errorMonitor->VerifyFound();
5745
Mark Lobodzinski20310782020-02-28 14:25:17 -07005746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005747 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005748 m_errorMonitor->VerifyFound();
5749
5750 struct TestCase {
5751 VkRect2D scissor;
5752 std::string vuid;
5753 };
5754
5755 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5756 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5757 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5758 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5759 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5760 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5761 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5762 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5763
5764 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005765 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005766 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005767 m_errorMonitor->VerifyFound();
5768 }
5769
5770 m_commandBuffer->end();
5771}
5772
5773TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5774 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5775
5776 ASSERT_NO_FATAL_FAILURE(Init());
5777
5778 if (!m_device->phy().features().multiViewport) {
5779 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5780 return;
5781 }
5782
unknown088160a2019-05-23 17:43:13 -06005783 m_commandBuffer->begin();
5784
Mark Lobodzinski20310782020-02-28 14:25:17 -07005785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005786 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005787 m_errorMonitor->VerifyFound();
5788
Petr Kraus14e49492019-09-09 20:13:29 +02005789 const auto max_scissors = m_device->props.limits.maxViewports;
5790
Mark Lobodzinski20310782020-02-28 14:25:17 -07005791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005792 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005793 m_errorMonitor->VerifyFound();
5794
Petr Kraus14e49492019-09-09 20:13:29 +02005795 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5796 if (max_scissors >= too_big_max_scissors) {
5797 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5798 kSkipPrefix);
5799 } else {
5800 const VkRect2D scissor = {{0, 0}, {16, 16}};
5801 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5802
Mark Lobodzinski20310782020-02-28 14:25:17 -07005803 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005804 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005805 m_errorMonitor->VerifyFound();
5806
Mark Lobodzinski20310782020-02-28 14:25:17 -07005807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005808 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005809 m_errorMonitor->VerifyFound();
5810
Mark Lobodzinski20310782020-02-28 14:25:17 -07005811 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005812 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005813 m_errorMonitor->VerifyFound();
5814
Mark Lobodzinski20310782020-02-28 14:25:17 -07005815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005816 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005817 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005818 }
unknown088160a2019-05-23 17:43:13 -06005819}
5820
Tony-LunarG667cc022021-06-25 10:11:17 -06005821TEST_F(VkLayerTest, MultiDrawTests) {
5822 TEST_DESCRIPTION("Test validation of multi_draw extension");
5823 SetTargetApiVersion(VK_API_VERSION_1_2);
5824 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5825 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5826 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5827 return;
5828 }
5829
5830 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
5831 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multi_draw_features);
5832 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
5833 if (!multi_draw_features.multiDraw) {
5834 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5835 return;
5836 }
5837 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5838 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5839 } else {
5840 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5841 return;
5842 }
5843 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5844 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
5845 vk::GetPhysicalDeviceProperties2(gpu(), &properties2);
5846
5847 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5849
5850 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5851 auto vkCmdDrawMultiIndexedEXT =
5852 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5853 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5854
5855 VkMultiDrawInfoEXT multi_draws[3] = {};
5856 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5857
5858 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5859 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5860
5861 CreatePipelineHelper pipe(*this);
5862 pipe.InitInfo();
5863 pipe.InitState();
5864 pipe.CreateGraphicsPipeline();
5865
5866 // Try existing VUID checks
5867 m_commandBuffer->begin();
5868 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5869
5870 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5871 &pipe.descriptor_set_->set_, 0, NULL);
5872 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5873 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5874 m_errorMonitor->VerifyFound();
5875 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5876 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5877 m_errorMonitor->VerifyFound();
5878
5879 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5880
5881 // New VUIDs added with multi_draw (also see GPU-AV)
5882 VkBufferObj buffer;
5883 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5884 multi_draw_indices[2].indexCount = 513;
5885 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5886 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5887 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5888 m_errorMonitor->VerifyFound();
5889 multi_draw_indices[2].indexCount = 1;
5890
5891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5892 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5893 m_errorMonitor->VerifyFound();
5894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5895 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5896 m_errorMonitor->VerifyFound();
5897
5898 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5899 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5900 m_errorMonitor->VerifyFound();
5901 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5902 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5903 m_errorMonitor->VerifyFound();
5904
5905 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5906 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5907 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5908 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5910 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5911 m_errorMonitor->VerifyFound();
5912 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5913 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5914 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5915 m_errorMonitor->VerifyFound();
5916 }
5917}
5918
5919TEST_F(VkLayerTest, MultiDrawFeatures) {
5920 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5921 SetTargetApiVersion(VK_API_VERSION_1_2);
5922 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5923 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5924 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5925 return;
5926 }
5927 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5928 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5929 } else {
5930 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5931 return;
5932 }
5933 ASSERT_NO_FATAL_FAILURE(InitState());
5934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5935
5936 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5937 auto vkCmdDrawMultiIndexedEXT =
5938 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5939 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5940
5941 VkMultiDrawInfoEXT multi_draws[3] = {};
5942 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5943
5944 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5945 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5946
5947 CreatePipelineHelper pipe(*this);
5948 pipe.InitInfo();
5949 pipe.InitState();
5950 pipe.CreateGraphicsPipeline();
5951
5952 m_commandBuffer->begin();
5953 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5954 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5955 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5956 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5957 m_errorMonitor->VerifyFound();
5958 VkBufferObj buffer;
5959 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5960 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5961 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5962 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5963 m_errorMonitor->VerifyFound();
5964}
5965
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005966TEST_F(VkLayerTest, IndirectDrawTests) {
5967 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005968
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005969 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5970 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5971 } else {
5972 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5973 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5974 return;
5975 }
5976 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5977
5978 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5979 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5980 return;
5981 }
5982
5983 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
5984 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
5985 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5986
5987 // Create a device and ensure multiDrawIndirect is disabled
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005988 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5989 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005990 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5991 features2.features.multiDrawIndirect = VK_FALSE;
5992
5993 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06005994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5995
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005996 CreatePipelineHelper pipe(*this);
5997 pipe.InitInfo();
5998 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5999 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6000 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6001 dyn_state_ci.dynamicStateCount = size(dyn_states);
6002 dyn_state_ci.pDynamicStates = dyn_states;
6003 pipe.dyn_state_ci_ = dyn_state_ci;
6004 pipe.InitState();
6005 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006006
6007 m_commandBuffer->begin();
6008 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6009
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006010 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6011 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6012 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006013
6014 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006015 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006016 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006017 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006018
6019 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6020 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
6021 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006022 VkBufferObj draw_buffer;
6023 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006024
6025 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07006026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006027 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006028 m_errorMonitor->VerifyFound();
6029
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006030 // VUID-vkCmdDrawIndirect-drawCount-02718
6031 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-02718");
6032 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
6033 m_errorMonitor->VerifyFound();
6034
6035 // VUID-vkCmdDrawIndexedIndirect-drawCount-02718
6036 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-02718");
6037 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
6038 m_errorMonitor->VerifyFound();
6039
unknown088160a2019-05-23 17:43:13 -06006040 m_commandBuffer->EndRenderPass();
6041 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006042}
6043
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006044TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
6045 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
6046
6047 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6048 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6049 } else {
6050 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6051 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6052 return;
6053 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006054 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006055
6056 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6057 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6058 } else {
6059 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07006060 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006061 }
6062
6063 ASSERT_NO_FATAL_FAILURE(InitState());
6064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6065
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006066 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6067 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006068 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6069
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006070 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
6071 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
6072
6073 m_commandBuffer->begin();
6074 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6075 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6076 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6077 buffer_create_info.size = 1024;
6078 VkBufferObj counter_buffer;
6079 counter_buffer.init(*m_device, buffer_create_info);
6080
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006081 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006082 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006083 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006084 m_errorMonitor->VerifyFound();
6085
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006086 // some mock ICD json files are missing a valid stride value
6087 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6088 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006090 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6091 m_errorMonitor->VerifyFound();
6092 }
6093
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006094 m_commandBuffer->EndRenderPass();
6095 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006096
6097 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6098 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6099 return;
6100 }
6101
6102 std::vector<const char *> device_extension_names;
6103 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6104 VkDeviceObj test_device(0, gpu(), device_extension_names);
6105 VkCommandPoolObj commandPool(&test_device, 0);
6106 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6107 VkBufferObj counter_buffer2;
6108 counter_buffer2.init(test_device, buffer_create_info);
6109 VkPipelineLayoutObj pipelineLayout(&test_device);
6110 VkRenderPass renderpass;
6111 VkRenderPassCreateInfo rp_info = {};
6112 VkSubpassDescription subpass = {};
6113 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
6114 rp_info.pSubpasses = &subpass;
6115 rp_info.subpassCount = 1;
6116 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6117 VkPipelineObj pipeline(&test_device);
6118 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6119 pipeline.AddShader(&vs);
6120 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6121 m_renderPassBeginInfo.renderPass = renderpass;
6122 VkFramebuffer fb;
6123 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6124 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6125 m_renderPassBeginInfo.framebuffer = fb;
6126 m_renderPassBeginInfo.renderPass = renderpass;
6127 commandBuffer.begin();
6128 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6129 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6130 VkRect2D scissor = {{0, 0}, {16, 16}};
6131 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6132 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6133 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6134 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006136 }
6137 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6138 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6139 m_errorMonitor->VerifyFound();
6140 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6141 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006142}
6143
unknown088160a2019-05-23 17:43:13 -06006144TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6145 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6146
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006147 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006148 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6149 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6150 } else {
6151 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6152 return;
6153 }
6154 ASSERT_NO_FATAL_FAILURE(InitState());
6155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6156
6157 VkMemoryRequirements memory_requirements;
6158 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
6159
6160 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006161 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006162
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006163 CreatePipelineHelper pipe(*this);
6164 pipe.InitInfo();
6165 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6166 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6167 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6168 dyn_state_ci.dynamicStateCount = size(dyn_states);
6169 dyn_state_ci.pDynamicStates = dyn_states;
6170 pipe.dyn_state_ci_ = dyn_state_ci;
6171 pipe.InitState();
6172 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006173
6174 m_commandBuffer->begin();
6175 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6176
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006177 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6178 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6179 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006180
6181 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006182 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006183 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006184 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006185
6186 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6187 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6188 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6189 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006190 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006191
6192 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6193 count_buffer_create_info.size = sizeof(uint32_t);
6194 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006195 VkBufferObj count_buffer;
6196 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006197
Mike Schuchardt65847d92019-12-20 13:50:47 -08006198 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006200 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6201 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006202 m_errorMonitor->VerifyFound();
6203
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006204 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006205 memory_allocate_info.allocationSize = memory_requirements.size;
6206 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6207 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006208 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6209 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006210
6211 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006212 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006213
Mike Schuchardt65847d92019-12-20 13:50:47 -08006214 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006215 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006216 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6217 m_errorMonitor->VerifyFound();
6218
Mike Schuchardt65847d92019-12-20 13:50:47 -08006219 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006220 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006221 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6222 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006223 m_errorMonitor->VerifyFound();
6224
Mike Schuchardt65847d92019-12-20 13:50:47 -08006225 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006227 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6228 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006229 m_errorMonitor->VerifyFound();
6230
Mike Schuchardt65847d92019-12-20 13:50:47 -08006231 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006232 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006233 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006234 m_errorMonitor->VerifyFound();
6235
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006236 // TODO: These covered VUIDs aren't tested. There is also no test coverage for the core Vulkan 1.0 vk::CmdDraw* equivalent of
unknown088160a2019-05-23 17:43:13 -06006237 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006238 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6239 // VUID-vkCmdDrawIndirectCount-subpass-02685
6240 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006241
6242 m_commandBuffer->EndRenderPass();
6243 m_commandBuffer->end();
6244
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006245 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6246 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006247
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006248 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006249}
6250
6251TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6252 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6253
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006254 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006255 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6256 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6257 } else {
6258 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6259 return;
6260 }
6261 ASSERT_NO_FATAL_FAILURE(InitState());
6262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6263
unknown088160a2019-05-23 17:43:13 -06006264 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006265 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006266
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006267 CreatePipelineHelper pipe(*this);
6268 pipe.InitInfo();
6269 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6270 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6271 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6272 dyn_state_ci.dynamicStateCount = size(dyn_states);
6273 dyn_state_ci.pDynamicStates = dyn_states;
6274 pipe.dyn_state_ci_ = dyn_state_ci;
6275 pipe.InitState();
6276 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006277
6278 m_commandBuffer->begin();
6279 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6280
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006281 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6282 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6283 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006284
6285 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006286 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006287 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006288 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006289
6290 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6291 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6292 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006293 VkBufferObj draw_buffer;
6294 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006295
6296 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6297 count_buffer_create_info.size = sizeof(uint32_t);
6298 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006299 VkBufferObj count_buffer;
6300 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006301
6302 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6303 index_buffer_create_info.size = sizeof(uint32_t);
6304 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006305 VkBufferObj index_buffer;
6306 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006307
Mike Schuchardt65847d92019-12-20 13:50:47 -08006308 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006310 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006311 sizeof(VkDrawIndexedIndirectCommand));
6312 m_errorMonitor->VerifyFound();
6313
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006314 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006315
6316 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006317 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006318
Mike Schuchardt65847d92019-12-20 13:50:47 -08006319 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006320 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006321 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006322 sizeof(VkDrawIndexedIndirectCommand));
6323 m_errorMonitor->VerifyFound();
6324
6325 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006326 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006327
Mike Schuchardt65847d92019-12-20 13:50:47 -08006328 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006329 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006330 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006331 sizeof(VkDrawIndexedIndirectCommand));
6332 m_errorMonitor->VerifyFound();
6333
Mike Schuchardt65847d92019-12-20 13:50:47 -08006334 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006335 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006336 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006337 sizeof(VkDrawIndexedIndirectCommand));
6338 m_errorMonitor->VerifyFound();
6339
Mike Schuchardt65847d92019-12-20 13:50:47 -08006340 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006341 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006342 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006343 sizeof(VkDrawIndexedIndirectCommand));
6344 m_errorMonitor->VerifyFound();
6345
Mike Schuchardt65847d92019-12-20 13:50:47 -08006346 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006347 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006348 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006349 m_errorMonitor->VerifyFound();
6350
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006351 // TODO: These covered VUIDs aren't tested. There is also no test coverage for the core Vulkan 1.0 vk::CmdDraw* equivalent of
unknown088160a2019-05-23 17:43:13 -06006352 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006353 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6354 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6355 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006356
6357 m_commandBuffer->EndRenderPass();
6358 m_commandBuffer->end();
6359
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006360 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6361 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006362}
6363
sfricke-samsung860d3b22020-05-04 21:08:29 -07006364TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6365 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6366
6367 SetTargetApiVersion(VK_API_VERSION_1_2);
6368 ASSERT_NO_FATAL_FAILURE(Init());
6369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6370 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6371 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6372 return;
6373 }
6374
6375 VkBufferObj indirect_buffer;
6376 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6377 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6378
6379 VkBufferObj indexed_indirect_buffer;
6380 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6381 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6382
6383 VkBufferObj count_buffer;
6384 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6385
6386 VkBufferObj index_buffer;
6387 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6388
6389 CreatePipelineHelper pipe(*this);
6390 pipe.InitInfo();
6391 pipe.InitState();
6392 pipe.CreateGraphicsPipeline();
6393
6394 // Make calls to valid commands but without the drawIndirectCount feature set
6395 m_commandBuffer->begin();
6396 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6397
6398 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6399
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006401 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6402 sizeof(VkDrawIndirectCommand));
6403 m_errorMonitor->VerifyFound();
6404
6405 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6406
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006407 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006408 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6409 sizeof(VkDrawIndexedIndirectCommand));
6410 m_errorMonitor->VerifyFound();
6411
6412 m_commandBuffer->EndRenderPass();
6413 m_commandBuffer->end();
6414}
6415
unknown088160a2019-05-23 17:43:13 -06006416TEST_F(VkLayerTest, ExclusiveScissorNV) {
6417 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6418
6419 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6420 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6421 } else {
6422 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6423 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6424 return;
6425 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006426 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006427 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6428 for (auto device_extension : required_device_extensions) {
6429 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6430 m_device_extension_names.push_back(device_extension);
6431 } else {
6432 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6433 return;
6434 }
6435 }
6436
6437 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006438 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006439 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6440
6441 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006442 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6443 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006444 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6445
6446 features2.features.multiViewport = VK_FALSE;
6447
6448 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6450
6451 if (m_device->phy().properties().limits.maxViewports) {
6452 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6453 return;
6454 }
6455
6456 // Based on PSOViewportStateTests
6457 {
6458 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6459 VkViewport viewports[] = {viewport, viewport};
6460 VkRect2D scissor = {{0, 0}, {64, 64}};
6461 VkRect2D scissors[100] = {scissor, scissor};
6462
6463 using std::vector;
6464 struct TestCase {
6465 uint32_t viewport_count;
6466 VkViewport *viewports;
6467 uint32_t scissor_count;
6468 VkRect2D *scissors;
6469 uint32_t exclusive_scissor_count;
6470 VkRect2D *exclusive_scissors;
6471
6472 vector<std::string> vuids;
6473 };
6474
6475 vector<TestCase> test_cases = {
6476 {1,
6477 viewports,
6478 1,
6479 scissors,
6480 2,
6481 scissors,
6482 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6483 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6484 {1,
6485 viewports,
6486 1,
6487 scissors,
6488 100,
6489 scissors,
6490 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6491 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6492 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006493 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006494 };
6495
6496 for (const auto &test_case : test_cases) {
6497 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6498 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6499
6500 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6501 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6502 helper.vp_state_ci_.pViewports = test_case.viewports;
6503 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6504 helper.vp_state_ci_.pScissors = test_case.scissors;
6505 helper.vp_state_ci_.pNext = &exc;
6506
6507 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6508 exc.pExclusiveScissors = test_case.exclusive_scissors;
6509 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006510 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006511 }
6512 }
6513
6514 // Based on SetDynScissorParamTests
6515 {
6516 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006517 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006518
6519 const VkRect2D scissor = {{0, 0}, {16, 16}};
6520 const VkRect2D scissors[] = {scissor, scissor};
6521
6522 m_commandBuffer->begin();
6523
Mark Lobodzinski20310782020-02-28 14:25:17 -07006524 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006525 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6526 m_errorMonitor->VerifyFound();
6527
Mark Lobodzinski20310782020-02-28 14:25:17 -07006528 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006529 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6530 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6531 m_errorMonitor->VerifyFound();
6532
Mark Lobodzinski20310782020-02-28 14:25:17 -07006533 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006534 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6535 m_errorMonitor->VerifyFound();
6536
Mark Lobodzinski20310782020-02-28 14:25:17 -07006537 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006538 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006540 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6541 m_errorMonitor->VerifyFound();
6542
Mark Lobodzinski20310782020-02-28 14:25:17 -07006543 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006545 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6546 m_errorMonitor->VerifyFound();
6547
Mark Lobodzinski20310782020-02-28 14:25:17 -07006548 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006549 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6550 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6551 m_errorMonitor->VerifyFound();
6552
6553 struct TestCase {
6554 VkRect2D scissor;
6555 std::string vuid;
6556 };
6557
6558 std::vector<TestCase> test_cases = {
6559 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6560 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6561 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6562 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6563 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6564 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6565 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6566 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6567
6568 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006569 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006570 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6571 m_errorMonitor->VerifyFound();
6572 }
6573
6574 m_commandBuffer->end();
6575 }
6576}
6577
6578TEST_F(VkLayerTest, MeshShaderNV) {
6579 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6580
6581 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6582 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6583 } else {
6584 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6585 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6586 return;
6587 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006588 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006589 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6590 for (auto device_extension : required_device_extensions) {
6591 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6592 m_device_extension_names.push_back(device_extension);
6593 } else {
6594 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6595 return;
6596 }
6597 }
6598
Tony-LunarG048f5012020-04-29 16:55:11 -06006599 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006600 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6601 return;
6602 }
6603
6604 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006605 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006606 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6607
6608 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006609 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6610 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006611 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6612 features2.features.multiDrawIndirect = VK_FALSE;
6613
6614 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6616
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006617 static const char vertShaderText[] = R"glsl(
6618 #version 450
6619 vec2 vertices[3];
6620 void main() {
6621 vertices[0] = vec2(-1.0, -1.0);
6622 vertices[1] = vec2( 1.0, -1.0);
6623 vertices[2] = vec2( 0.0, 1.0);
6624 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6625 gl_PointSize = 1.0f;
6626 }
6627 )glsl";
unknown088160a2019-05-23 17:43:13 -06006628
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006629 static const char meshShaderText[] = R"glsl(
6630 #version 450
6631 #extension GL_NV_mesh_shader : require
6632 layout(local_size_x = 1) in;
6633 layout(max_vertices = 3) out;
6634 layout(max_primitives = 1) out;
6635 layout(triangles) out;
6636 void main() {
6637 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6638 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6639 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6640 gl_PrimitiveIndicesNV[0] = 0;
6641 gl_PrimitiveIndicesNV[1] = 1;
6642 gl_PrimitiveIndicesNV[2] = 2;
6643 gl_PrimitiveCountNV = 1;
6644 }
6645 )glsl";
unknown088160a2019-05-23 17:43:13 -06006646
6647 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6648 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6649 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6650
6651 // Test pipeline creation
6652 {
6653 // can't mix mesh with vertex
6654 const auto break_vp = [&](CreatePipelineHelper &helper) {
6655 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6656 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006657 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006658 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6659
6660 // vertex or mesh must be present
6661 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006662 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006663 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6664
6665 // vertexinput and inputassembly must be valid when vertex stage is present
6666 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6667 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6668 helper.gp_ci_.pVertexInputState = nullptr;
6669 helper.gp_ci_.pInputAssemblyState = nullptr;
6670 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006671 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006672 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6673 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6674 }
6675
6676 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006677 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006678
6679 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6680 buffer_create_info.size = sizeof(uint32_t);
6681 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6682 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006683 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006684 ASSERT_VK_SUCCESS(result);
6685
6686 m_commandBuffer->begin();
6687
Mark Lobodzinski20310782020-02-28 14:25:17 -07006688 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6689 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006690 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6691 m_errorMonitor->VerifyFound();
6692
6693 m_commandBuffer->end();
6694
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006695 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006696}
6697
6698TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6699 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6700 ASSERT_NO_FATAL_FAILURE(Init());
6701 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6702
6703 VkEvent event;
6704 VkEventCreateInfo event_create_info{};
6705 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006706 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006707
6708 m_commandBuffer->begin();
6709
Shannon McPherson93970b12020-06-12 14:34:35 -06006710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006711 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006712 m_errorMonitor->VerifyFound();
6713
Shannon McPherson93970b12020-06-12 14:34:35 -06006714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006715 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006716 m_errorMonitor->VerifyFound();
6717
Shannon McPherson93970b12020-06-12 14:34:35 -06006718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006719 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006720 m_errorMonitor->VerifyFound();
6721
Shannon McPherson93970b12020-06-12 14:34:35 -06006722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006723 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006724 m_errorMonitor->VerifyFound();
6725
Shannon McPherson93970b12020-06-12 14:34:35 -06006726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006728 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6729 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006730 m_errorMonitor->VerifyFound();
6731
Shannon McPherson93970b12020-06-12 14:34:35 -06006732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006734 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6735 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006736 m_errorMonitor->VerifyFound();
6737
Shannon McPherson93970b12020-06-12 14:34:35 -06006738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006740 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6741 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006742 m_errorMonitor->VerifyFound();
6743
Shannon McPherson93970b12020-06-12 14:34:35 -06006744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006746 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6747 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006748 m_errorMonitor->VerifyFound();
6749
6750 m_commandBuffer->end();
6751
6752 VkSemaphoreCreateInfo semaphore_create_info = {};
6753 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6754 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006755 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006756
6757 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6758 VkSubmitInfo submit_info = {};
6759
6760 // Signal the semaphore so the next test can wait on it.
6761 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6762 submit_info.signalSemaphoreCount = 1;
6763 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006764 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006765 m_errorMonitor->VerifyNotFound();
6766
6767 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6768 submit_info.signalSemaphoreCount = 0;
6769 submit_info.pSignalSemaphores = nullptr;
6770 submit_info.waitSemaphoreCount = 1;
6771 submit_info.pWaitSemaphores = &semaphore;
6772 submit_info.pWaitDstStageMask = &stage_flags;
6773
sfricke-samsung1ac64842021-09-23 14:11:17 -07006774 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6775 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006776 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006777 m_errorMonitor->VerifyFound();
6778
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006779 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006780
6781 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6782 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6783 meshStage = vs.GetStageCreateInfo();
6784 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6785 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6786 taskStage = vs.GetStageCreateInfo();
6787 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6788
6789 // mesh and task shaders not supported
6790 const auto break_vp = [&](CreatePipelineHelper &helper) {
6791 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6792 };
6793 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006794 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006795 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6796 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6797 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6798
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006799 vk::DestroyEvent(m_device->device(), event, nullptr);
6800 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006801}
Chris Mayerc93536f2019-09-19 16:34:49 +02006802
6803TEST_F(VkLayerTest, ViewportWScalingNV) {
6804 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6805
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006806 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006807
6808 VkPhysicalDeviceFeatures device_features = {};
6809 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6810
6811 if (!device_features.multiViewport) {
6812 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6813 return;
6814 }
6815
6816 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6817 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6818 } else {
6819 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6820 return;
6821 }
6822
6823 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6825
6826 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006827 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006828
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006829 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006830 #version 450
6831 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6832 vec2( 1.0f, 1.0f),
6833 vec2(-1.0f, -1.0f),
6834 vec2( 1.0f, -1.0f) };
6835 out gl_PerVertex {
6836 vec4 gl_Position;
6837 };
6838
6839 void main() {
6840 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006841 }
6842 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006843
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006844 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006845 #version 450
6846 layout(location = 0) out vec4 outColor;
6847
6848 void main() {
6849 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006850 }
6851 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006852
6853 const std::vector<VkViewport> vp = {
6854 {0.0f, 0.0f, 64.0f, 64.0f}, {0.0f, 0.0f, 64.0f, 64.0f}, {0.0f, 0.0f, 64.0f, 64.0f}, {0.0f, 0.0f, 64.0f, 64.0f}};
6855 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6856 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6857
6858 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6859
6860 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6861 vpsi.viewportWScalingEnable = VK_TRUE;
6862 vpsi.viewportCount = vp_count;
6863 vpsi.pViewportWScalings = scale.data();
6864
6865 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6866 vpci.viewportCount = vp_count;
6867 vpci.pViewports = vp.data();
6868 vpci.scissorCount = vp_count;
6869 vpci.pScissors = sc.data();
6870 vpci.pNext = &vpsi;
6871
6872 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6873
6874 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006875 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006876
6877 // Create pipeline with w-scaling enabled but without a valid scaling array
6878 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006879 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006880 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6881
6882 vpsi.pViewportWScalings = scale.data();
6883
6884 // Create pipeline with w-scaling enabled but without matching viewport counts
6885 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006886 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006887 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6888
6889 const VkPipelineLayoutObj pl(m_device);
6890
6891 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6892 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6893
6894 VkPipelineObj pipe(m_device);
6895 pipe.AddDefaultColorAttachment();
6896 pipe.AddShader(&vs);
6897 pipe.AddShader(&fs);
6898 pipe.SetViewport(vp);
6899 pipe.SetScissor(sc);
6900 pipe.CreateVKPipeline(pl.handle(), renderPass());
6901
6902 VkPipelineObj pipeDynWScale(m_device);
6903 pipeDynWScale.AddDefaultColorAttachment();
6904 pipeDynWScale.AddShader(&vs);
6905 pipeDynWScale.AddShader(&fs);
6906 pipeDynWScale.SetViewport(vp);
6907 pipeDynWScale.SetScissor(sc);
6908 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6909 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6910
6911 m_commandBuffer->begin();
6912
6913 // Bind pipeline without dynamic w scaling enabled
6914 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006915 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006916 m_errorMonitor->VerifyNotFound();
6917
Chris Mayerc93536f2019-09-19 16:34:49 +02006918 // Bind pipeline that has dynamic w-scaling enabled
6919 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006920 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006921 m_errorMonitor->VerifyNotFound();
6922
6923 const auto max_vps = m_device->props.limits.maxViewports;
6924
Mark Lobodzinski20310782020-02-28 14:25:17 -07006925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006926 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6927 m_errorMonitor->VerifyFound();
6928
6929 m_errorMonitor->ExpectSuccess();
6930 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6931 m_errorMonitor->VerifyNotFound();
6932
6933 m_commandBuffer->end();
6934}
sfricke-samsung914e8002020-01-07 22:26:18 -08006935
6936TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6937 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6938
6939 // Enable Sampler YCbCr Conversion req'd extensions
6940 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6941 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6942 if (mp_extensions) {
6943 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6944 }
6945 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006946 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006947 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006948 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6949 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6950 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6951 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006952 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006953 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6954 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6955 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6956 } else {
6957 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6958 return;
6959 }
6960
6961 // Explictly not enable Ycbcr Conversion Features
6962 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6963 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6964 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6965 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6966
6967 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6968 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6969 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6970 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6971 return;
6972 }
6973
6974 // Create Ycbcr conversion
6975 VkSamplerYcbcrConversion conversions;
6976 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6977 NULL,
6978 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6979 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6980 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6981 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6982 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6983 VK_CHROMA_LOCATION_COSITED_EVEN,
6984 VK_CHROMA_LOCATION_COSITED_EVEN,
6985 VK_FILTER_NEAREST,
6986 false};
6987
Mark Lobodzinski20310782020-02-28 14:25:17 -07006988 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006989 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6990 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006991}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006992
6993TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6994 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6995
6996 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6997 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6998 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6999 return;
7000 }
7001 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7002
7003 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7004
7005 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7006 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7007 return;
7008 }
7009 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7010
7011 {
7012 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7013 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7014 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7015
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007016 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7017 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007018 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7019
7020 if (!tf_features.transformFeedback) {
7021 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7022 return;
7023 }
7024 }
7025
7026 ASSERT_NO_FATAL_FAILURE(InitState());
7027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7028
7029 {
7030 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
7031 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7032 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7033
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007034 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007035 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7036 info.size = 4;
7037 VkBufferObj buffer;
7038 buffer.init(*m_device, info);
7039 VkDeviceSize offsets[1]{};
7040
7041 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
7042 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
7043 m_errorMonitor->VerifyFound();
7044 }
7045
7046 {
7047 auto vkCmdBeginTransformFeedbackEXT =
7048 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7049 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7050
7051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
7052 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7053 m_errorMonitor->VerifyFound();
7054 }
7055
7056 {
7057 auto vkCmdEndTransformFeedbackEXT =
7058 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7059 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7060
7061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
7062 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7063 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7064 m_errorMonitor->VerifyFound();
7065 }
7066}
7067
7068TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
7069 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
7070
7071 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7072 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7073 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7074 return;
7075 }
7076 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7077
7078 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7079
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007080 if (IsPlatform(kGalaxyS10)) {
7081 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7082 return;
7083 }
7084
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007085 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7086 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7087 return;
7088 }
7089 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7090
7091 {
7092 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7093 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7094 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7095
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007096 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7097 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007098 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7099
7100 if (!tf_features.transformFeedback) {
7101 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7102 return;
7103 }
7104
7105 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7106 }
7107
7108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7109
7110 auto vkCmdBindTransformFeedbackBuffersEXT =
7111 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7112 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7113
7114 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007115 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7116 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007117 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7118
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007119 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007120 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7121 info.size = 8;
7122 VkBufferObj const buffer_obj(*m_device, info);
7123
7124 // Request a firstBinding that is too large.
7125 {
7126 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7127 VkDeviceSize const offsets[1]{};
7128
7129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7130 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7131 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7132 nullptr);
7133 m_errorMonitor->VerifyFound();
7134 }
7135
7136 // Request too many bindings.
7137 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7138 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7139 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7140
7141 std::vector<VkDeviceSize> offsets(bindingCount);
7142
7143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7144 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7145 nullptr);
7146 m_errorMonitor->VerifyFound();
7147 }
7148
7149 // Request a size that is larger than the maximum size.
7150 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7151 VkDeviceSize const offsets[1]{};
7152 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7153
7154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7155 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7156 m_errorMonitor->VerifyFound();
7157 }
7158 }
7159
7160 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007161 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007162 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7163 info.size = 8;
7164 VkBufferObj const buffer_obj(*m_device, info);
7165
7166 // Request an offset that is too large.
7167 {
7168 VkDeviceSize const offsets[1]{info.size + 4};
7169
7170 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7171 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7172 m_errorMonitor->VerifyFound();
7173 }
7174
7175 // Request an offset that is not a multiple of 4.
7176 {
7177 VkDeviceSize const offsets[1]{1};
7178
7179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7180 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7181 m_errorMonitor->VerifyFound();
7182 }
7183
7184 // Request a size that is larger than the buffer's size.
7185 {
7186 VkDeviceSize const offsets[1]{};
7187 VkDeviceSize const sizes[1]{info.size + 1};
7188
7189 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007190 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7191 m_errorMonitor->VerifyFound();
7192 }
7193
7194 // Request an offset and size whose sum is larger than the buffer's size.
7195 {
7196 VkDeviceSize const offsets[1]{4};
7197 VkDeviceSize const sizes[1]{info.size - 3};
7198
7199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7200 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7201 m_errorMonitor->VerifyFound();
7202 }
7203
7204 // Bind while transform feedback is active.
7205 {
7206 auto vkCmdBeginTransformFeedbackEXT =
7207 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7208 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7209 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7210
7211 VkDeviceSize const offsets[1]{};
7212
7213 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7214 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7215 m_errorMonitor->VerifyFound();
7216
7217 auto vkCmdEndTransformFeedbackEXT =
7218 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7219 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7220 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7221 }
7222 }
7223
7224 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7225 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007226 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007227 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7228 info.size = 4;
7229 VkBufferObj const buffer_obj(*m_device, info);
7230
7231 VkDeviceSize const offsets[1]{};
7232
7233 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7234 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7235 m_errorMonitor->VerifyFound();
7236 }
7237
7238 // Don't bind memory.
7239 {
7240 VkBuffer buffer{};
7241 {
7242 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7243 ASSERT_TRUE(vkCreateBuffer != nullptr);
7244
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007245 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007246 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7247 info.size = 4;
7248 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7249 }
7250
7251 VkDeviceSize const offsets[1]{};
7252
7253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7254 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7255 m_errorMonitor->VerifyFound();
7256 }
7257}
7258
7259TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7260 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7261
7262 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7263 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7264 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7265 return;
7266 }
7267 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7268
7269 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7270
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007271 if (IsPlatform(kGalaxyS10)) {
7272 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7273 return;
7274 }
7275
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007276 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7277 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7278 return;
7279 }
7280 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7281
7282 {
7283 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7284 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7285 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7286
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007287 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7288 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007289 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7290
7291 if (!tf_features.transformFeedback) {
7292 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7293 return;
7294 }
7295
7296 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7297 }
7298
7299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7300
7301 auto vkCmdBeginTransformFeedbackEXT =
7302 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7303 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7304
7305 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007306 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7307 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007308 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7309
7310 // Request a firstCounterBuffer that is too large.
7311 {
7312 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7313
7314 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7315 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7316 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7317 m_errorMonitor->VerifyFound();
7318 }
7319
7320 // Request too many buffers.
7321 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7322 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7323
7324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7325 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7326 m_errorMonitor->VerifyFound();
7327 }
7328 }
7329
7330 // Request an out-of-bounds location.
7331 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007332 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007333 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7334 info.size = 4;
7335 VkBufferObj const buffer_obj(*m_device, info);
7336
7337 VkDeviceSize const offsets[1]{1};
7338
7339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7340 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7341 m_errorMonitor->VerifyFound();
7342 }
7343
7344 // Request specific offsets without specifying buffers.
7345 {
7346 VkDeviceSize const offsets[1]{};
7347
7348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7349 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7350 m_errorMonitor->VerifyFound();
7351 }
7352
7353 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7354 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007355 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007356 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7357 info.size = 4;
7358 VkBufferObj const buffer_obj(*m_device, info);
7359
7360 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7361 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7362 m_errorMonitor->VerifyFound();
7363 }
7364
7365 // Begin while transform feedback is active.
7366 {
7367 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7368
7369 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7370 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7371 m_errorMonitor->VerifyFound();
7372
7373 auto vkCmdEndTransformFeedbackEXT =
7374 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7375 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7376
7377 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7378 }
7379}
7380
7381TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7382 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7383
7384 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7385 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7386 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7387 return;
7388 }
7389 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7390
7391 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7392
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007393 if (IsPlatform(kGalaxyS10)) {
7394 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7395 return;
7396 }
7397
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007398 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7399 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7400 return;
7401 }
7402 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7403
7404 {
7405 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7406 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7407 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7408
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007409 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7410 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007411 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7412
7413 if (!tf_features.transformFeedback) {
7414 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7415 return;
7416 }
7417
7418 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7419 }
7420
7421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7422
7423 auto vkCmdEndTransformFeedbackEXT =
7424 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7425 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7426
7427 {
7428 // Activate transform feedback.
7429 auto vkCmdBeginTransformFeedbackEXT =
7430 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7431 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7432 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7433
7434 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007435 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7436 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007437 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7438
7439 // Request a firstCounterBuffer that is too large.
7440 {
7441 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7442
7443 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7444 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7445 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7446 m_errorMonitor->VerifyFound();
7447 }
7448
7449 // Request too many buffers.
7450 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7451 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7452
7453 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7454 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7455 m_errorMonitor->VerifyFound();
7456 }
7457 }
7458
7459 // Request an out-of-bounds location.
7460 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007461 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007462 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7463 info.size = 4;
7464 VkBufferObj const buffer_obj(*m_device, info);
7465
7466 VkDeviceSize const offsets[1]{1};
7467
7468 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7469 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7470 m_errorMonitor->VerifyFound();
7471 }
7472
7473 // Request specific offsets without specifying buffers.
7474 {
7475 VkDeviceSize const offsets[1]{};
7476
7477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7478 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7479 m_errorMonitor->VerifyFound();
7480 }
7481
7482 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7483 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007484 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007485 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7486 info.size = 4;
7487 VkBufferObj const buffer_obj(*m_device, info);
7488
7489 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7490 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7491 m_errorMonitor->VerifyFound();
7492 }
7493 }
7494
7495 // End while transform feedback is inactive.
7496 {
7497 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7498
7499 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7500 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7501 m_errorMonitor->VerifyFound();
7502 }
7503}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007504
sfricke-samsung39ee2442020-07-22 21:21:15 -07007505TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7506 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007507
7508 // protect memory added in VK 1.1
7509 SetTargetApiVersion(VK_API_VERSION_1_1);
7510
7511 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7512 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7513 } else {
7514 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7515 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7516 return;
7517 }
7518 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7519
7520 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7521 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7522 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7523
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007524 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7525 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007526 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7527
7528 if (protected_memory_features.protectedMemory == VK_FALSE) {
7529 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7530 return;
7531 };
7532
7533 // Turns m_commandBuffer into a protected command buffer
7534 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7535
7536 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7537 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7538 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7539 return;
7540 }
7541
7542 VkBufferObj indirect_buffer;
7543 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7544 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7545
7546 VkBufferObj indexed_indirect_buffer;
7547 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7548 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7549
7550 VkBufferObj index_buffer;
7551 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7552
7553 CreatePipelineHelper pipe(*this);
7554 pipe.InitInfo();
7555 pipe.InitState();
7556 pipe.CreateGraphicsPipeline();
7557
sfricke-samsung39ee2442020-07-22 21:21:15 -07007558 VkQueryPool query_pool;
7559 VkQueryPoolCreateInfo query_pool_create_info{};
7560 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7561 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7562 query_pool_create_info.queryCount = 1;
7563 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7564
sfricke-samsung071af2d2020-07-02 10:37:22 -07007565 m_commandBuffer->begin();
7566 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7567
7568 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7569
7570 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7571 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7572 m_errorMonitor->VerifyFound();
7573
7574 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7575
7576 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7577 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7578 sizeof(VkDrawIndexedIndirectCommand));
7579 m_errorMonitor->VerifyFound();
7580
7581 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007582
7583 // Query should be outside renderpass
7584 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7585
7586 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7587 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7588 m_errorMonitor->VerifyFound();
7589
7590 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7591 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7592 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7593 m_errorMonitor->VerifyFound();
7594
sfricke-samsung071af2d2020-07-02 10:37:22 -07007595 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007596
7597 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007598}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007599
7600TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7601 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7602
7603 SetTargetApiVersion(VK_API_VERSION_1_1);
7604
7605 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7606 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7607 } else {
7608 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7609 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7610 return;
7611 }
7612 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7613
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007614 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7615 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7616 return;
7617 }
7618
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007619 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7620 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7621 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007622 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7623 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7624 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007625
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007626 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7627 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007628 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7629
7630 if (protected_memory_features.protectedMemory == VK_FALSE) {
7631 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7632 return;
7633 };
7634
sfricke-samsung21286f82021-11-16 08:21:46 -08007635 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7636 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7637 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7638 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7639
7640 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
7641 ASSERT_NO_FATAL_FAILURE(InitState());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007642
7643 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7644 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7645
7646 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7647 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7648 return;
7649 }
7650
7651 // Create actual protected and unprotected buffers
7652 VkBuffer buffer_protected = VK_NULL_HANDLE;
7653 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7654 VkBufferCreateInfo buffer_create_info = {};
7655 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7656 buffer_create_info.pNext = nullptr;
7657 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007658 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7659 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7660 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007661 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7662
7663 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7664 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7665 buffer_create_info.flags = 0;
7666 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7667
7668 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007669 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007670 VkImageObj image_protected(m_device);
7671 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007672 VkImageObj image_protected_descriptor(m_device);
7673 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007674 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007675 VkImageView image_views_descriptor[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007676 VkImageCreateInfo image_create_info = {};
7677 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7678 image_create_info.pNext = nullptr;
7679 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007680 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007681 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7682 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007683 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7684 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007685 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7686 image_create_info.arrayLayers = 1;
7687 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007688 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7689 image_protected.init_no_mem(*m_device, image_create_info);
7690 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7691
locke-lunarg0de02522020-10-27 22:55:17 -06007692 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7693 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007694
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007695 image_create_info.flags = 0;
7696 image_unprotected.init_no_mem(*m_device, image_create_info);
7697 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7698
locke-lunarg0de02522020-10-27 22:55:17 -06007699 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7700 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007701
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007702 // Create protected and unproteced memory
7703 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7704 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7705
7706 VkMemoryAllocateInfo alloc_info = {};
7707 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7708 alloc_info.pNext = nullptr;
7709 alloc_info.allocationSize = 0;
7710
7711 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7712 VkMemoryRequirements mem_reqs_protected;
7713 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7714 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7715 VkMemoryRequirements mem_reqs_unprotected;
7716 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7717 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7718
7719 // Get memory index for a protected and unprotected memory
7720 VkPhysicalDeviceMemoryProperties phys_mem_props;
7721 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7722 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7723 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7724 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7725 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7726 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7727 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7728 memory_type_unprotected = i;
7729 }
7730 // Check just protected bit is in type at all
7731 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7732 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7733 memory_type_protected = i;
7734 }
7735 }
7736 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7737 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7738 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7739 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7740 return;
7741 }
7742
7743 alloc_info.memoryTypeIndex = memory_type_protected;
7744 alloc_info.allocationSize = mem_reqs_protected.size;
7745 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7746
7747 alloc_info.allocationSize = mem_reqs_unprotected.size;
7748 alloc_info.memoryTypeIndex = memory_type_unprotected;
7749 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7750
7751 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7752 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7753 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7754 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007755 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7756 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7757
7758 // need memory bound at image view creation time
7759 image_views[0] = image_protected.targetView(image_format);
7760 image_views[1] = image_unprotected.targetView(image_format);
7761 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7762 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007763
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007764 // A renderpass and framebuffer that contains a protected and unprotected image view
7765 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007766 {0, image_format, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007767 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7768 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007769 {0, image_format, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7772 };
7773 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7774 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7775 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7776 VkSubpassDependency dependency = {0,
7777 0,
7778 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7779 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7780 VK_ACCESS_SHADER_WRITE_BIT,
7781 VK_ACCESS_SHADER_WRITE_BIT,
7782 VK_DEPENDENCY_BY_REGION_BIT};
7783 VkRenderPassCreateInfo render_pass_create_info = {
7784 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7785 VkRenderPass render_pass;
7786 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7787 VkFramebufferCreateInfo framebuffer_create_info = {
7788 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7789 VkFramebuffer framebuffer;
7790 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7791
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007792 // Various structs used for commands
7793 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7794 VkImageBlit blit_region = {};
7795 blit_region.srcSubresource = image_subresource;
7796 blit_region.dstSubresource = image_subresource;
7797 blit_region.srcOffsets[0] = {0, 0, 0};
7798 blit_region.srcOffsets[1] = {8, 8, 1};
7799 blit_region.dstOffsets[0] = {0, 8, 0};
7800 blit_region.dstOffsets[1] = {8, 8, 1};
7801 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7802 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7803 VkBufferCopy buffer_copy = {0, 0, 64};
7804 VkBufferImageCopy buffer_image_copy = {};
7805 buffer_image_copy.bufferRowLength = 0;
7806 buffer_image_copy.bufferImageHeight = 0;
7807 buffer_image_copy.imageSubresource = image_subresource;
7808 buffer_image_copy.imageOffset = {0, 0, 0};
7809 buffer_image_copy.imageExtent = {1, 1, 1};
7810 buffer_image_copy.bufferOffset = 0;
7811 VkImageCopy image_copy = {};
7812 image_copy.srcSubresource = image_subresource;
7813 image_copy.srcOffset = {0, 0, 0};
7814 image_copy.dstSubresource = image_subresource;
7815 image_copy.dstOffset = {0, 0, 0};
7816 image_copy.extent = {1, 1, 1};
7817 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007818 VkRect2D render_area = {{0, 0}, {8, 8}};
7819 VkRenderPassBeginInfo render_pass_begin = {
7820 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7821 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7822 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7823 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007824
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007825 const char fsSource[] = R"glsl(
7826 #version 450
7827 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7828 layout(set=0, binding=1, rgba8) uniform image2D si1;
7829 layout(location=0) out vec4 x;
7830 void main(){
7831 x = vec4(bar.y);
7832 imageStore(si1, ivec2(0), vec4(0));
7833 }
7834 )glsl";
locke-lunarg0de02522020-10-27 22:55:17 -06007835 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7836
7837 CreatePipelineHelper g_pipe(*this);
7838 g_pipe.InitInfo();
7839 g_pipe.gp_ci_.renderPass = render_pass;
7840 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7841 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7842 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7843 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7844 color_blend_attachments[0] = g_pipe.cb_attachments_;
7845 color_blend_attachments[1] = g_pipe.cb_attachments_;
7846 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7847 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7848 g_pipe.InitState();
7849 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7850
7851 VkSampler sampler;
7852 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7853 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7854 ASSERT_VK_SUCCESS(err);
7855
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007856 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007857 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007858 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7859 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7860 g_pipe.descriptor_set_->UpdateDescriptorSets();
7861
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007862 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007863 // will get undefined values, but not invalid if protectedNoFault is supported
7864 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7865 if (!protected_memory_properties.protectedNoFault) {
7866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7867 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7868 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7869 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007870
sfricke-samsung21286f82021-11-16 08:21:46 -08007871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7872 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7873 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7874 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007875
sfricke-samsung21286f82021-11-16 08:21:46 -08007876 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7877 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7878 &subresource_range);
7879 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007880
sfricke-samsung21286f82021-11-16 08:21:46 -08007881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7882 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7883 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007884
sfricke-samsung21286f82021-11-16 08:21:46 -08007885 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7886 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7887 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007888
sfricke-samsung21286f82021-11-16 08:21:46 -08007889 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7890 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7891 1, &buffer_image_copy);
7892 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007893
sfricke-samsung21286f82021-11-16 08:21:46 -08007894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7895 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7896 1, &buffer_image_copy);
7897 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007898
sfricke-samsung21286f82021-11-16 08:21:46 -08007899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7900 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7901 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7902 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007903
sfricke-samsung21286f82021-11-16 08:21:46 -08007904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7905 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7906 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7907 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007908
sfricke-samsung21286f82021-11-16 08:21:46 -08007909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7910 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7911 1, &buffer_image_copy);
7912 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007913
sfricke-samsung21286f82021-11-16 08:21:46 -08007914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7915 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7916 1, &buffer_image_copy);
7917 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007918
sfricke-samsung21286f82021-11-16 08:21:46 -08007919 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7920 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7921 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007922
sfricke-samsung21286f82021-11-16 08:21:46 -08007923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7924 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7925 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007926
sfricke-samsung21286f82021-11-16 08:21:46 -08007927 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007928
sfricke-samsung21286f82021-11-16 08:21:46 -08007929 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7930 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7931 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007932
sfricke-samsung21286f82021-11-16 08:21:46 -08007933 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7934 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7935 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7936 VkDeviceSize offset = 0;
7937 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7938 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007939
sfricke-samsung21286f82021-11-16 08:21:46 -08007940 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007945
sfricke-samsung21286f82021-11-16 08:21:46 -08007946 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7947 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007948
sfricke-samsung21286f82021-11-16 08:21:46 -08007949 vk::CmdEndRenderPass(m_commandBuffer->handle());
7950 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007951 m_commandBuffer->end();
7952
7953 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007954 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007955 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7956 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007957 g_pipe.descriptor_set_->UpdateDescriptorSets();
7958
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007959 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007960 if (!protected_memory_properties.protectedNoFault) {
7961 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7962 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7963 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7964 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007965
sfricke-samsung21286f82021-11-16 08:21:46 -08007966 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7967 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7968 1, &subresource_range);
7969 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007970
sfricke-samsung21286f82021-11-16 08:21:46 -08007971 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7972 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7973 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007974
sfricke-samsung21286f82021-11-16 08:21:46 -08007975 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7976 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7977 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
7978 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007979
sfricke-samsung21286f82021-11-16 08:21:46 -08007980 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7981 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7982 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7983 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007984
sfricke-samsung21286f82021-11-16 08:21:46 -08007985 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7986 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7987 buffer_unprotected, 1, &buffer_image_copy);
7988 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007989
sfricke-samsung21286f82021-11-16 08:21:46 -08007990 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7991 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7992 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007993
sfricke-samsung21286f82021-11-16 08:21:46 -08007994 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7995 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7996 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007997
sfricke-samsung21286f82021-11-16 08:21:46 -08007998 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007999
sfricke-samsung21286f82021-11-16 08:21:46 -08008000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
8001 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
8002 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008003
sfricke-samsung21286f82021-11-16 08:21:46 -08008004 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8005 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8006 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
8007 VkDeviceSize offset = 0;
8008 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
8009 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008010
sfricke-samsung21286f82021-11-16 08:21:46 -08008011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
8012 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
8013 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
8014 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06008015
sfricke-samsung21286f82021-11-16 08:21:46 -08008016 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
8017 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008018 protectedCommandBuffer.end();
8019
sfricke-samsung96cd9932020-08-23 20:57:11 -07008020 // Try submitting together to test only 1 error occurs for the corresponding command buffer
8021 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
8022
8023 VkProtectedSubmitInfo protected_submit_info = {};
8024 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
8025 protected_submit_info.pNext = nullptr;
8026
8027 VkSubmitInfo submit_info = {};
8028 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
8029 submit_info.pNext = &protected_submit_info;
8030 submit_info.commandBufferCount = 2;
8031 submit_info.pCommandBuffers = comman_buffers;
8032
8033 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08008034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06008035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07008036 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8037 m_errorMonitor->VerifyFound();
8038
8039 protected_submit_info.protectedSubmit = VK_FALSE;
8040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
8041 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8042 m_errorMonitor->VerifyFound();
8043
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008044 vk::DestroyBuffer(device(), buffer_protected, nullptr);
8045 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
8046 vk::FreeMemory(device(), memory_protected, nullptr);
8047 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008048 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
8049 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06008050}
locke-lunarg6b0de702020-08-07 17:42:13 -06008051
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008052TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06008053 TEST_DESCRIPTION(
8054 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
8055 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
8056
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07008057 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8058 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8059 } else {
8060 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8061 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8062 return;
8063 }
8064 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8065 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)) {
8066 m_device_extension_names.push_back(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
8067 } else {
8068 printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
8069 return;
8070 }
8071
8072 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8073 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8074 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
8075
8076 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
8077 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
8078 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8079 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8080
8081 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
8082 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
8083 return;
8084 }
locke-lunarg6b0de702020-08-07 17:42:13 -06008085
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008086 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06008087 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
8088 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
8089 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8090 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
8091
8092 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
8093 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8094 return;
8095 }
8096
8097 VkFormat buffer_view_format =
8098 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
8099 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8100 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8101 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8102 return;
8103 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008104 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8106
8107 VkPhysicalDeviceFeatures device_features = {};
8108 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8109 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8110 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8111 return;
8112 }
8113
8114 VkImageObj image(m_device);
8115 image.Init(image_ci);
8116 VkImageView image_view = image.targetView(image_format);
8117
8118 VkSampler sampler = VK_NULL_HANDLE;
8119 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8120 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8121
8122 VkBufferObj buffer;
8123 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8124
8125 VkBufferViewCreateInfo bvci = {};
8126 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8127 bvci.buffer = buffer.handle();
8128 bvci.format = buffer_view_format;
8129 bvci.range = VK_WHOLE_SIZE;
8130 VkBufferView buffer_view;
8131 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8132
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008133 char const *fsSource = R"glsl(
8134 #version 450
8135 layout(set=0, binding=3, r32f) uniform image2D si0;
8136 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8137 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8138 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8139 void main() {
8140 imageAtomicExchange(si0, ivec2(0), 1);
8141 imageAtomicExchange(si1[0], ivec2(0), 1);
8142 imageAtomicExchange(si1[1], ivec2(0), 1);
8143 imageAtomicExchange(stb2, 0, 1);
8144 imageAtomicExchange(stb3[0], 0, 1);
8145 imageAtomicExchange(stb3[1], 0, 1);
8146 }
8147 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008148
8149 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8150 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8151
8152 CreatePipelineHelper g_pipe(*this);
8153 g_pipe.InitInfo();
8154 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008155 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8156 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8157 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8158 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008159 g_pipe.InitState();
8160 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8161
locke-lunarg76e8dee2020-08-21 13:20:02 -06008162 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008163 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008164 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008165 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008166 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008167 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008168 g_pipe.descriptor_set_->UpdateDescriptorSets();
8169
8170 m_commandBuffer->begin();
8171 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8172 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8173 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8174 &g_pipe.descriptor_set_->set_, 0, nullptr);
8175
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008176 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8181 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8182 m_errorMonitor->VerifyFound();
8183
8184 m_commandBuffer->EndRenderPass();
8185 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008186 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8187 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008188}
locke-lunargae1bbab2020-09-10 11:55:56 -06008189
8190TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8191 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8192
8193 ASSERT_NO_FATAL_FAILURE(Init());
8194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8195
8196 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008197 char const *const vsSource = R"glsl(
8198 #version 450
8199 layout(push_constant, std430) uniform foo {
8200 bool b;
8201 float f2[3];
8202 vec3 v;
8203 vec4 v2[2];
8204 mat3 m;
8205 } constants;
8206 void func1( float f ){
8207 // use the whole v2[1]. byte: 48-63.
8208 vec2 v2 = constants.v2[1].yz;
8209 }
8210 void main(){
8211 // use only v2[0].z. byte: 40-43.
8212 func1( constants.v2[0].z);
8213 // index of m is variable. The all m is used. byte: 64-99.
8214 for(int i=1;i<2;++i) {
8215 vec3 v3 = constants.m[i];
8216 }
8217 }
8218 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008219
8220 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008221 char const *const fsSource = R"glsl(
8222 #version 450
8223 struct foo1{
8224 int i[4];
8225 }f;
8226 layout(push_constant, std430) uniform foo {
8227 float x[2][2][2];
8228 foo1 s;
8229 foo1 ss[3];
8230 } constants;
8231 void main(){
8232 // use s. byte: 32-47.
8233 f = constants.s;
8234 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8235 for(int i=1;i<2;++i) {
8236 int ii = constants.ss[i].i[3];
8237 }
8238 }
8239 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008240
8241 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8242 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8243
8244 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8245 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8246
8247 VkPipelineLayoutCreateInfo pipeline_layout_info{
8248 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8249
8250 VkPipelineLayout pipeline_layout;
8251 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8252
8253 CreatePipelineHelper g_pipe(*this);
8254 g_pipe.InitInfo();
8255 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8256 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8257 g_pipe.InitState();
8258 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8259
8260 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8261 VkPipelineLayout pipeline_layout_small;
8262 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8263
8264 CreatePipelineHelper g_pipe_small_range(*this);
8265 g_pipe_small_range.InitInfo();
8266 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8267 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8268 g_pipe_small_range.InitState();
8269
sfricke-samsung7699b912021-04-12 23:01:51 -07008270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008272 g_pipe_small_range.CreateGraphicsPipeline();
8273 m_errorMonitor->VerifyFound();
8274
8275 m_commandBuffer->begin();
8276 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8277
Piers Daniella7f93b62021-11-20 12:32:04 -07008278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008279 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8280 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8281 &g_pipe.descriptor_set_->set_, 0, nullptr);
8282 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8283 m_errorMonitor->VerifyFound();
8284
locke-lunargae1bbab2020-09-10 11:55:56 -06008285 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008286
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008287 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8288 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8289 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8290 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008291 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008292 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8293 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8294 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8295 // m_errorMonitor->VerifyFound();
8296
Piers Daniella7f93b62021-11-20 12:32:04 -07008297 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008298 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8299 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8300 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008301
8302 m_errorMonitor->ExpectSuccess();
8303 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8304 68, dummy_values);
8305 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8306 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008307}
8308
8309TEST_F(VkLayerTest, VerifyVertextBinding) {
8310 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8311
8312 ASSERT_NO_FATAL_FAILURE(Init());
8313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8314
8315 VkBufferObj vtx_buf;
8316 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8317 vtx_buf.init(*m_device, info);
8318
8319 CreatePipelineHelper pipe(*this);
8320 pipe.InitInfo();
8321 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8322 VkVertexInputBindingDescription vtx_binding_des[3] = {
8323 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8324
8325 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8326 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8327 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8328 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8329 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8330 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8331 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8332 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8333 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8334 pipe.InitState();
8335 pipe.CreateGraphicsPipeline();
8336
8337 m_commandBuffer->begin();
8338 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8339 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8340 VkDeviceSize offset = 0;
8341 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8342
8343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8348 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8349 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008350
8351 m_commandBuffer->EndRenderPass();
8352 m_commandBuffer->end();
8353}
locke-lunargd7a08e92020-10-21 00:24:00 -06008354
8355TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8356 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8357 ASSERT_NO_FATAL_FAILURE(Init());
8358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8359
8360 CreatePipelineHelper pipe(*this);
8361 pipe.InitInfo();
8362
8363 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8364
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008365 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008366 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8367 dyn_state_ci.pDynamicStates = dyn_states.data();
8368 pipe.dyn_state_ci_ = dyn_state_ci;
8369 pipe.InitState();
8370 pipe.CreateGraphicsPipeline();
8371
8372 m_commandBuffer->begin();
8373 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8374 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8375
8376 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8377 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8378 VkRect2D scissor = {{0, 0}, {16, 16}};
8379 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8380 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8381
8382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8383 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8384 m_errorMonitor->VerifyFound();
8385
8386 m_commandBuffer->EndRenderPass();
8387 m_commandBuffer->end();
8388}
locke-lunarg0de02522020-10-27 22:55:17 -06008389
8390TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8391 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8392 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8393 if (version < VK_API_VERSION_1_1) {
8394 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8395 return;
8396 }
8397 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8398
8399 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8400 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8401 } else {
8402 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8403 return;
8404 }
8405
8406 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8408
8409 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8410 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008411
8412 VkFormatProperties format_props;
8413 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8414 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8415 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8416 return;
8417 }
8418
locke-lunarg0de02522020-10-27 22:55:17 -06008419 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8420 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8421
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008422 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008423 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008424 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008425 image_format_info.type = image_ci.imageType;
8426 image_format_info.format = image_ci.format;
8427 image_format_info.tiling = image_ci.tiling;
8428 image_format_info.usage = image_ci.usage;
8429 image_format_info.flags = image_ci.flags;
8430
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008431 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8432 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008433
8434 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8435
8436 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8437 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8438 return;
8439 }
8440
8441 VkImageObj image(m_device);
8442 image.Init(image_ci);
8443 VkImageView imageView = image.targetView(format, imageViewType);
8444
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008445 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008446 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8447 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8448 VkSampler sampler;
8449 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8450
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008451 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008452 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8453 sampler_ci.pNext = &reduction_mode_ci;
8454 VkSampler sampler_rediction;
8455 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8456
8457 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8458
8459 CreatePipelineHelper g_pipe(*this);
8460 g_pipe.InitInfo();
8461 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8462 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8463 g_pipe.InitState();
8464 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8465
8466 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8467 g_pipe.descriptor_set_->UpdateDescriptorSets();
8468
8469 m_commandBuffer->begin();
8470 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8471 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8472 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8473 &g_pipe.descriptor_set_->set_, 0, nullptr);
8474
8475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8476 m_commandBuffer->Draw(1, 0, 0, 0);
8477 m_errorMonitor->VerifyFound();
8478
8479 m_commandBuffer->EndRenderPass();
8480 m_commandBuffer->end();
8481 m_commandBuffer->reset();
8482
8483 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8484 g_pipe.descriptor_set_->UpdateDescriptorSets();
8485
8486 m_commandBuffer->begin();
8487 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8488 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8489 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8490 &g_pipe.descriptor_set_->set_, 0, nullptr);
8491
8492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8493 m_commandBuffer->Draw(1, 0, 0, 0);
8494 m_errorMonitor->VerifyFound();
8495
8496 m_commandBuffer->EndRenderPass();
8497 m_commandBuffer->end();
8498}
8499
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008500TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008501 TEST_DESCRIPTION("Verify if sampler is filter cubic with the VK_IMG_filter cubic extension that it's a valid ImageViewType.");
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008502
Clemens Kern5a42ea62021-09-29 16:30:23 +02008503 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8504 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8505 if (!AreRequestedExtensionsEnabled()) {
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008506 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8507 return;
8508 }
8509
8510 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8512
8513 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8514 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008515 auto image_ci = vk_testing::Image::create_info();
8516 image_ci.imageType = VK_IMAGE_TYPE_3D;
8517 image_ci.format = format;
8518 image_ci.extent.width = 128;
8519 image_ci.extent.height = 128;
8520 image_ci.mipLevels = 1;
8521 image_ci.arrayLayers = 1;
8522 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8523 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8524 image_ci.usage = usage;
8525 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008526
8527 VkImageObj image(m_device);
8528 image.Init(image_ci);
8529 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8530 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8531
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008532 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008533 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8534 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8535 VkSampler sampler;
8536 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8537
Clemens Kern5a42ea62021-09-29 16:30:23 +02008538 static const char fs_src[] = R"glsl(
8539 #version 450
8540 layout(set=0, binding=0) uniform sampler3D s;
8541 layout(location=0) out vec4 x;
8542 void main(){
8543 x = texture(s, vec3(1));
8544 }
8545 )glsl";
8546 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008547
8548 CreatePipelineHelper g_pipe(*this);
8549 g_pipe.InitInfo();
8550 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8551 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8552 g_pipe.InitState();
8553 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8554
8555 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8556 g_pipe.descriptor_set_->UpdateDescriptorSets();
8557
8558 m_commandBuffer->begin();
8559 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8560 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8561 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8562 &g_pipe.descriptor_set_->set_, 0, nullptr);
8563
8564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8565 m_commandBuffer->Draw(1, 0, 0, 0);
8566 m_errorMonitor->VerifyFound();
8567
8568 m_commandBuffer->EndRenderPass();
8569 m_commandBuffer->end();
8570}
8571
locke-lunarg0de02522020-10-27 22:55:17 -06008572TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8573 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8574 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8575 if (version < VK_API_VERSION_1_1) {
8576 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8577 return;
8578 }
8579 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8580 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8581 } else {
8582 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8583 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8584 return;
8585 }
8586 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8587
8588 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8589 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8590 } else {
8591 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8592 return;
8593 }
8594
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008595 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008596 multiview_features.multiview = VK_TRUE;
8597 VkPhysicalDeviceFeatures2 pd_features2 = {};
8598 pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8599 pd_features2.pNext = &multiview_features;
8600
8601 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8603
8604 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8605 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8606 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008607 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8608 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008609 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8610 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8611 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8612 return;
8613 }
8614 CreatePipelineHelper pipe(*this);
8615 pipe.InitInfo();
8616 pipe.InitState();
8617 pipe.CreateGraphicsPipeline();
8618
8619 m_commandBuffer->begin();
8620 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8621 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8622
8623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8624 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8625 m_errorMonitor->VerifyFound();
8626
8627 m_commandBuffer->EndRenderPass();
8628 m_commandBuffer->end();
8629}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008630
8631TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8632 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8633
8634 // Enable KHR_fragment_shading_rate and all of its required extensions
8635 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8636 if (fsr_extensions) {
8637 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8638 }
8639 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8640
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008641 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8642 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008643 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8644 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8645 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8646 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008647 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8648 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008649 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8650 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8651 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8652 } else {
8653 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8654 return;
8655 }
8656
8657 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = {};
8658 fsr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
8659 fsr_features.pipelineFragmentShadingRate = true;
8660
8661 VkPhysicalDeviceFeatures2 device_features = {};
8662 device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8663 device_features.pNext = &fsr_features;
8664
8665 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8666
8667 // Find address of extension call and make the call
8668 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8669 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8670 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8671
8672 VkExtent2D fragmentSize = {1, 1};
8673 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8674 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8675
8676 m_commandBuffer->begin();
8677 fragmentSize.width = 0;
8678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8679 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8680 m_errorMonitor->VerifyFound();
8681 fragmentSize.width = 1;
8682
8683 fragmentSize.height = 0;
8684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8685 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8686 m_errorMonitor->VerifyFound();
8687 fragmentSize.height = 1;
8688
8689 fragmentSize.width = 3;
8690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8691 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8692 m_errorMonitor->VerifyFound();
8693 fragmentSize.width = 1;
8694
8695 fragmentSize.height = 3;
8696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8697 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8698 m_errorMonitor->VerifyFound();
8699 fragmentSize.height = 1;
8700
8701 fragmentSize.width = 8;
8702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8703 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8704 m_errorMonitor->VerifyFound();
8705 fragmentSize.width = 1;
8706
8707 fragmentSize.height = 8;
8708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8709 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8710 m_errorMonitor->VerifyFound();
8711 fragmentSize.height = 1;
8712 m_commandBuffer->end();
8713}
8714
8715TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8716 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8717
8718 // Enable KHR_fragment_shading_rate and all of its required extensions
8719 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8720 if (fsr_extensions) {
8721 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8722 }
8723 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8724
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008725 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8726 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008727 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8728 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8729 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8730 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008731 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8732 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008733 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8734 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8735 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8736 } else {
8737 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8738 return;
8739 }
8740
8741 ASSERT_NO_FATAL_FAILURE(InitState());
8742 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8743
8744 // Find address of extension call and make the call
8745 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8746 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8747 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8748
8749 VkExtent2D fragmentSize = {1, 1};
8750 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8751 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8752
8753 m_commandBuffer->begin();
8754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8755 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8756 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8757 m_errorMonitor->VerifyFound();
8758 m_commandBuffer->end();
8759}
8760
8761TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8762 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8763
8764 // Enable KHR_fragment_shading_rate and all of its required extensions
8765 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8766 if (fsr_extensions) {
8767 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8768 }
8769 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8770
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008771 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8772 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008773 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8774 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8775 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8776 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008777 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8778 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008779 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8780 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8781 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8782 } else {
8783 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8784 return;
8785 }
8786
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008787 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8788 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008789
8790 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8791 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8792 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8793
8794 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8796
8797 // Find address of extension call and make the call
8798 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8799 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8800 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8801
8802 VkExtent2D fragmentSize = {1, 1};
8803 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8804 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8805
8806 m_commandBuffer->begin();
8807
8808 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8810 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8811 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8812 m_errorMonitor->VerifyFound();
8813 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8814
8815 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8817 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8818 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8819 m_errorMonitor->VerifyFound();
8820 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8821
8822 m_commandBuffer->end();
8823}
8824
8825TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8826 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8827
8828 // Enable KHR_fragment_shading_rate and all of its required extensions
8829 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8830 if (fsr_extensions) {
8831 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8832 }
8833 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8834
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008835 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8836 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008837 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8838 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8839 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8840 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008841 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8842 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008843 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8844 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8845 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8846 } else {
8847 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8848 return;
8849 }
8850
8851 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8852 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8853 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008854 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8855 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008856 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8857
8858 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8859 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8860 return;
8861 }
8862
8863 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8864
8865 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8867
8868 // Find address of extension call and make the call
8869 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8870 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8871 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8872
8873 VkExtent2D fragmentSize = {1, 1};
8874 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8875 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8876
8877 m_commandBuffer->begin();
8878 fragmentSize.width = 2;
8879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8880 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8881 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8882 m_errorMonitor->VerifyFound();
8883 fragmentSize.width = 1;
8884
8885 fragmentSize.height = 2;
8886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8887 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8888 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8889 m_errorMonitor->VerifyFound();
8890 fragmentSize.height = 1;
8891}
8892
8893TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8894 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8895
8896 // Enable KHR_fragment_shading_rate and all of its required extensions
8897 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8898 if (fsr_extensions) {
8899 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8900 }
8901 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8902
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008903 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8904 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008905 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8906 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8907 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8908 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008909 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8910 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008911 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8912 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8913 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8914 } else {
8915 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8916 return;
8917 }
8918
8919 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8920 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8921 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8922 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008923 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8924 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008925 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8926
8927 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8928 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8929 return;
8930 }
8931
8932 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8933 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8934 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008935 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8936 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008937 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8938
8939 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8940 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8941 return;
8942 }
8943
8944 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8946
8947 // Find address of extension call and make the call
8948 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8949 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8950 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8951
8952 VkExtent2D fragmentSize = {1, 1};
8953 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8954 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8955
8956 m_commandBuffer->begin();
8957 if (fsr_features.primitiveFragmentShadingRate) {
8958 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8960 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8961 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8962 m_errorMonitor->VerifyFound();
8963 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8964 }
8965
8966 if (fsr_features.attachmentFragmentShadingRate) {
8967 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8969 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8970 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8971 m_errorMonitor->VerifyFound();
8972 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8973 }
8974 m_commandBuffer->end();
8975}
8976
8977TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8978 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8979
8980 // Enable KHR_fragment_shading_rate and all of its required extensions
8981 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8982 if (fsr_extensions) {
8983 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8984 }
8985 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8986
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008987 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8988 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008989 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8990 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8991 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8992 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008993 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8994 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008995 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8996 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8997 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8998 } else {
8999 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
9000 return;
9001 }
9002
9003 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
9004 if (eds_extension) {
9005 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
9006 } else {
9007 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
9008 return;
9009 }
9010
9011 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
9012 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
9013 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
9014 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009015 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
9016 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009017 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
9018
9019 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
9020 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
9021 return;
9022 }
9023
9024 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
9025 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
9026 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009027 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00009028 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009029 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
9030 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009031 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
9032
9033 if (!fsr_features.primitiveFragmentShadingRate) {
9034 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
9035 return;
9036 }
9037
9038 if (!features2.features.multiViewport) {
9039 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
9040 return;
9041 }
9042
9043 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9045
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07009046 char const *vsSource = R"glsl(
9047 #version 450
9048 #extension GL_EXT_fragment_shading_rate : enable
9049 void main() {
9050 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
9051 }
9052 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00009053
Tobias Hector04f2ab22020-12-01 10:59:33 +00009054 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9055
9056 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07009057 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
9058 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009059 pipe.AddShader(&fs);
9060 pipe.AddDefaultColorAttachment();
9061 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009062 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07009063 {
9064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9065 pipe.AddShader(&vs);
9066 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
9067 ASSERT_VK_SUCCESS(err);
9068 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00009069 m_commandBuffer->begin();
9070 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9071
9072 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
9073
9074 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
9075 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
9076 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
9077 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
9078
9079 // error produced here.
9080 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9081
9082 m_errorMonitor->VerifyFound();
9083
9084 m_commandBuffer->EndRenderPass();
9085 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009086}
ziga-lunargdada63d2021-07-13 22:10:11 +02009087
9088TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
9089 TEST_DESCRIPTION("Update buffer with invalid dataSize");
9090
9091 ASSERT_NO_FATAL_FAILURE(Init());
9092
9093 uint32_t update_data[4] = {0, 0, 0, 0};
9094 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9095 VkMemoryPropertyFlags reqs = 0;
9096 VkBufferObj buffer;
9097 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9098
9099 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
9100 m_commandBuffer->begin();
9101 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
9102 m_commandBuffer->end();
9103 m_errorMonitor->VerifyFound();
9104}
ziga-lunargc08456d2021-07-16 21:40:13 +02009105
9106TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
9107 TEST_DESCRIPTION("Update buffer with invalid dst offset");
9108
9109 ASSERT_NO_FATAL_FAILURE(Init());
9110
9111 uint32_t update_data[4] = {0, 0, 0, 0};
9112 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9113 VkMemoryPropertyFlags reqs = 0;
9114 VkBufferObj buffer;
9115 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9116
9117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
9118 m_commandBuffer->begin();
9119 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
9120 m_commandBuffer->end();
9121 m_errorMonitor->VerifyFound();
9122}
ziga-lunarg4e31a752021-07-22 14:35:03 +02009123
9124TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
9125 TEST_DESCRIPTION(
9126 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
9127
9128 ASSERT_NO_FATAL_FAILURE(Init());
9129
9130 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
9131 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
9132 if (INVALID_QUEUE == no_gfx_qfi) {
9133 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
9134 return;
9135 }
9136
9137 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
9138 ASSERT_TRUE(command_pool.initialized());
9139 VkCommandBufferObj command_buffer(m_device, &command_pool);
9140
9141 VkDescriptorPoolSize ds_type_count = {};
9142 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9143 ds_type_count.descriptorCount = 1;
9144
9145 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
9146 ds_pool_ci.maxSets = 1;
9147 ds_pool_ci.poolSizeCount = 1;
9148 ds_pool_ci.flags = 0;
9149 ds_pool_ci.pPoolSizes = &ds_type_count;
9150
9151 VkDescriptorPool ds_pool;
9152 vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, nullptr, &ds_pool);
9153
9154 VkDescriptorSetLayoutBinding dsl_binding = {};
9155 dsl_binding.binding = 0;
9156 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9157 dsl_binding.descriptorCount = 1;
9158 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9159 dsl_binding.pImmutableSamplers = nullptr;
9160
9161 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9162
9163 VkDescriptorSet descriptorSet;
9164 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9165 alloc_info.descriptorSetCount = 1;
9166 alloc_info.descriptorPool = ds_pool;
9167 alloc_info.pSetLayouts = &ds_layout.handle();
9168 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9169
9170 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9171 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9172
9173 command_buffer.begin();
9174 // Set invalid set
9175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9176 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9177 &descriptorSet, 0, nullptr);
9178 m_errorMonitor->VerifyFound();
9179 command_buffer.end();
9180}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009181
9182TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9183 TEST_DESCRIPTION(
9184 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9185 "occlusion query is active.");
9186 ASSERT_NO_FATAL_FAILURE(Init());
9187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9188
9189 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9190 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9191 qpci.queryCount = 1;
9192
9193 VkQueryPool query_pool;
9194 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9195
9196 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9197
9198 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9199 cbii.renderPass = m_renderPass;
9200 cbii.framebuffer = m_framebuffer;
9201 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9202
9203 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9204 cbbi.pInheritanceInfo = &cbii;
9205
9206 VkCommandBuffer secondary_handle = secondary.handle();
9207 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9208 vk::EndCommandBuffer(secondary_handle);
9209
9210 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9211 m_commandBuffer->begin();
9212 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9213 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9214 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9215 m_commandBuffer->end();
9216 m_errorMonitor->VerifyFound();
9217
9218 vk::DestroyQueryPool(device(), query_pool, nullptr);
9219}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009220
9221TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9222 TEST_DESCRIPTION("Test invalid null entries for clear color");
9223
9224 ASSERT_NO_FATAL_FAILURE(InitFramework());
9225 ASSERT_NO_FATAL_FAILURE(InitState());
9226
9227 VkImageObj image(m_device);
9228 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9229
9230 VkImageSubresourceRange isr = {};
9231 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9232 isr.baseArrayLayer = 0;
9233 isr.baseMipLevel = 0;
9234 isr.layerCount = 1;
9235 isr.levelCount = 1;
9236
9237 m_commandBuffer->begin();
9238 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9239 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9240 m_errorMonitor->VerifyFound();
9241 m_commandBuffer->end();
9242}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009243
9244TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9245 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9246
9247 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9248 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9249 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9250 return;
9251 }
9252 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9253 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9254 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9255 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9256 return;
9257 }
9258 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9259 ASSERT_NO_FATAL_FAILURE(InitState());
9260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9261
9262 VkAttachmentDescription attachmentDescription = {};
9263 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9264 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9265 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9266
9267 VkAttachmentReference colorAttachmentReference = {};
9268 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9269 colorAttachmentReference.attachment = 0;
9270
9271 VkSubpassDescription subpassDescription = {};
9272 subpassDescription.colorAttachmentCount = 1;
9273 subpassDescription.pColorAttachments = &colorAttachmentReference;
9274
9275 uint32_t viewMask = 0x1u;
9276 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9277 renderPassMultiviewCreateInfo.subpassCount = 1;
9278 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9279
9280 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9281 renderPassCreateInfo.attachmentCount = 1;
9282 renderPassCreateInfo.pAttachments = &attachmentDescription;
9283 renderPassCreateInfo.subpassCount = 1;
9284 renderPassCreateInfo.pSubpasses = &subpassDescription;
9285
9286 VkRenderPass renderPass;
9287 vk::CreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
9288
9289 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9290 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9291 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9292 image_create_info.extent.width = 32;
9293 image_create_info.extent.height = 32;
9294 image_create_info.extent.depth = 1;
9295 image_create_info.mipLevels = 1;
9296 image_create_info.arrayLayers = 4;
9297 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9298 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9299 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9300 image_create_info.flags = 0;
9301
9302 VkImageObj image(m_device);
9303 image.Init(image_create_info);
9304 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9305
9306 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9307 framebufferCreateInfo.width = 32;
9308 framebufferCreateInfo.height = 32;
9309 framebufferCreateInfo.layers = 1;
9310 framebufferCreateInfo.renderPass = renderPass;
9311 framebufferCreateInfo.attachmentCount = 1;
9312 framebufferCreateInfo.pAttachments = &imageView;
9313
9314 VkFramebuffer framebuffer = VK_NULL_HANDLE;
9315 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
9316
9317 // Start no RenderPass
9318 m_commandBuffer->begin();
9319
9320 VkClearAttachment color_attachment;
9321 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9322 color_attachment.clearValue.color.float32[0] = 0;
9323 color_attachment.clearValue.color.float32[1] = 0;
9324 color_attachment.clearValue.color.float32[2] = 0;
9325 color_attachment.clearValue.color.float32[3] = 0;
9326 color_attachment.colorAttachment = 0;
9327
9328 VkClearRect clear_rect = {};
9329 clear_rect.rect.extent.width = 32;
9330 clear_rect.rect.extent.height = 32;
9331
9332 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9333 render_pass_begin_info.renderPass = renderPass;
9334 render_pass_begin_info.framebuffer = framebuffer;
9335 render_pass_begin_info.renderArea.extent.width = 32;
9336 render_pass_begin_info.renderArea.extent.height = 32;
9337
9338 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9340 clear_rect.layerCount = 2;
9341 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9342 m_errorMonitor->VerifyFound();
9343
9344 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9345 clear_rect.baseArrayLayer = 1;
9346 clear_rect.layerCount = 1;
9347 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9348 m_errorMonitor->VerifyFound();
9349}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009350
9351TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9352 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9353
9354 ASSERT_NO_FATAL_FAILURE(InitFramework());
9355 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9356 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9357 } else {
9358 printf("%s %s not supported, skipping test\n", kSkipPrefix, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9359 return;
9360 }
9361 ASSERT_NO_FATAL_FAILURE(InitState());
9362
9363 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9364 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9365
9366 VkBufferObj buffer;
9367 VkMemoryPropertyFlags reqs = 0;
9368 buffer.init_as_storage(*m_device, 32, reqs);
9369
9370 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9371 conditional_rendering_begin.buffer = buffer.handle();
9372
9373 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9374
9375 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9376 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9377 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9378 vk::EndCommandBuffer(m_commandBuffer->handle());
9379 m_errorMonitor->VerifyFound();
9380}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009381
9382TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9383 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9384
9385 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9386 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9387 } else {
9388 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9389 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9390 return;
9391 }
9392 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9393
9394 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9395 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9396 } else {
9397 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
9398 return;
9399 }
9400
9401 ASSERT_NO_FATAL_FAILURE(InitState());
9402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9403
9404 CreatePipelineHelper pipe_one(*this);
9405 pipe_one.InitInfo();
9406 pipe_one.InitState();
9407 pipe_one.CreateGraphicsPipeline();
9408
9409 CreatePipelineHelper pipe_two(*this);
9410 pipe_two.InitInfo();
9411 pipe_two.InitState();
9412 pipe_two.CreateGraphicsPipeline();
9413
9414 auto vkCmdBeginTransformFeedbackEXT =
9415 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9416 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9417 auto vkCmdEndTransformFeedbackEXT =
9418 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9419 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9420
9421 m_commandBuffer->begin();
9422 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9423 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9424 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9425 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9426 m_errorMonitor->VerifyFound();
9427 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9428 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009429}
9430
9431TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9432 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9433
9434 ASSERT_NO_FATAL_FAILURE(Init());
9435
9436 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9437 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9438
9439 // Load required functions
9440 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9441 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9442 return;
9443 }
9444
9445 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9446
9447 // Set format features from being found
9448 VkFormatProperties formatProps;
9449 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9450 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9451 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9452 return;
9453 }
9454 // Gets pass pipeline creation but not the actual tiling used
9455 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9456 // will be caught at draw time that feature for optimal image is not set
9457 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9458 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9459 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9460
9461 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9462
9463 CreatePipelineHelper pipe(*this);
9464 pipe.InitInfo();
9465 pipe.InitState();
9466 pipe.cb_attachments_.blendEnable = VK_TRUE;
9467 pipe.CreateGraphicsPipeline();
9468
9469 m_commandBuffer->begin();
9470 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9471 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9472
9473 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9474 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9475 m_errorMonitor->VerifyFound();
9476
9477 m_commandBuffer->EndRenderPass();
9478 m_commandBuffer->end();
9479}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009480
9481TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9482 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9483
9484 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9485 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9486 printf("%s Did not find required device extension %s; test skipped.\n", kSkipPrefix, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
9487 return;
9488 }
9489 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9490 ASSERT_NO_FATAL_FAILURE(InitState());
9491
9492 VkAttachmentDescription attach[] = {
9493 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9494 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9495 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9496 };
9497 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9498 VkSubpassDescription subpasses[] = {
9499 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9500 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9501 };
9502
9503 VkSubpassDependency dep = {0,
9504 1,
9505 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9506 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9507 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9508 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9509 VK_DEPENDENCY_BY_REGION_BIT};
9510
9511 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9512 rpci.attachmentCount = 1;
9513 rpci.pAttachments = attach;
9514 rpci.subpassCount = 2;
9515 rpci.pSubpasses = subpasses;
9516 rpci.dependencyCount = 1;
9517 rpci.pDependencies = &dep;
9518
9519 vk_testing::RenderPass render_pass;
9520 render_pass.init(*m_device, rpci);
9521
9522 VkImageObj image(m_device);
9523 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9524 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9525
9526 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9527 fbci.renderPass = render_pass.handle();
9528 fbci.attachmentCount = 1;
9529 fbci.pAttachments = &imageView;
9530 fbci.width = 32;
9531 fbci.height = 32;
9532 fbci.layers = 1;
9533 VkFramebuffer framebuffer;
9534 vk::CreateFramebuffer(device(), &fbci, nullptr, &framebuffer);
9535
9536 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9537 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9538 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9539 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9540
9541 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9542 buffer_create_info.size = 32;
9543 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9544 VkBufferObj buffer;
9545 buffer.init(*m_device, buffer_create_info);
9546
9547 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9548 conditional_rendering_begin.buffer = buffer.handle();
9549
9550 VkClearValue clear_value;
9551 clear_value.color = m_clear_color;
9552
9553 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9554 rpbi.renderPass = render_pass.handle();
9555 rpbi.framebuffer = framebuffer;
9556 rpbi.renderArea = {{0, 0}, {32, 32}};
9557 rpbi.clearValueCount = 1;
9558 rpbi.pClearValues = &clear_value;
9559
9560 m_commandBuffer->begin();
9561
9562 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9563 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9564 m_errorMonitor->VerifyFound();
9565
9566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
9567 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9568 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9569 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9570 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9571 vk::CmdEndRenderPass(m_commandBuffer->handle());
9572 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9573 m_errorMonitor->VerifyFound();
9574
9575 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
9576 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9577 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9578 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9579 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9580 vk::CmdEndRenderPass(m_commandBuffer->handle());
9581 m_errorMonitor->VerifyFound();
9582
9583 m_commandBuffer->end();
9584}
ziga-lunarg58255142021-09-12 13:25:17 +02009585
9586TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9587 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9588
9589 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9590 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9591 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9592 return;
9593 }
9594 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9595
9596 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9597 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9598 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9599 return;
9600 }
9601 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9602 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9603 return;
9604 }
9605 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9606 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9607
9608 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9609 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
9610
9611 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
9612 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
9613 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
9614 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
9615
9616 if (!tf_features.transformFeedback) {
9617 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
9618 return;
9619 }
9620
9621 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9622 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9623
9624 VkAttachmentDescription attachmentDescription = {};
9625 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9626 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9627 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9628
9629 VkAttachmentReference colorAttachmentReference = {};
9630 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9631 colorAttachmentReference.attachment = 0;
9632
9633 VkSubpassDescription subpassDescription = {};
9634 subpassDescription.colorAttachmentCount = 1;
9635 subpassDescription.pColorAttachments = &colorAttachmentReference;
9636
9637 uint32_t viewMask = 0x1u;
9638 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9639 renderPassMultiviewCreateInfo.subpassCount = 1;
9640 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9641
9642 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9643 renderPassCreateInfo.attachmentCount = 1;
9644 renderPassCreateInfo.pAttachments = &attachmentDescription;
9645 renderPassCreateInfo.subpassCount = 1;
9646 renderPassCreateInfo.pSubpasses = &subpassDescription;
9647
9648 vk_testing::RenderPass render_pass;
9649 render_pass.init(*m_device, renderPassCreateInfo);
9650
9651 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9652 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9653 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9654 image_create_info.extent.width = 32;
9655 image_create_info.extent.height = 32;
9656 image_create_info.extent.depth = 1;
9657 image_create_info.mipLevels = 1;
9658 image_create_info.arrayLayers = 4;
9659 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9660 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9661 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9662 image_create_info.flags = 0;
9663
9664 VkImageObj image(m_device);
9665 image.Init(image_create_info);
9666 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9667
9668 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9669 framebufferCreateInfo.width = 32;
9670 framebufferCreateInfo.height = 32;
9671 framebufferCreateInfo.layers = 1;
9672 framebufferCreateInfo.renderPass = render_pass.handle();
9673 framebufferCreateInfo.attachmentCount = 1;
9674 framebufferCreateInfo.pAttachments = &imageView;
9675
9676 vk_testing::Framebuffer framebuffer;
9677 framebuffer.init(*m_device, framebufferCreateInfo);
9678
9679 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9680 render_pass_begin_info.renderPass = render_pass.handle();
9681 render_pass_begin_info.framebuffer = framebuffer.handle();
9682 render_pass_begin_info.renderArea.extent.width = 32;
9683 render_pass_begin_info.renderArea.extent.height = 32;
9684
9685 auto vkCmdBeginTransformFeedbackEXT =
9686 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9687 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9688
9689 m_commandBuffer->begin();
9690 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9691
9692 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9693 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9694 m_errorMonitor->VerifyFound();
9695
9696 m_commandBuffer->EndRenderPass();
9697 m_commandBuffer->end();
9698}
stusmithd2f36832021-11-26 11:44:11 +00009699
9700TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9701 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9702
9703 SetTargetApiVersion(VK_API_VERSION_1_1);
9704
9705 ASSERT_NO_FATAL_FAILURE(InitFramework());
9706
9707 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
9708 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
9709 return;
9710 }
9711
9712 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9713 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9714 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9715 if (!dynamic_rendering_features.dynamicRendering) {
9716 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9717 return;
9718 }
9719
9720 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9721
9722 VkRenderingAttachmentInfoKHR color_attachment = {};
9723 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
9724 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9725
9726 VkRenderingInfoKHR begin_rendering_info = {};
9727 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
9728 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9729 begin_rendering_info.colorAttachmentCount = 1;
9730 begin_rendering_info.pColorAttachments = &color_attachment;
9731
9732 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9733
9734 secondary.begin();
9735
9736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRenderingKHR-commandBuffer-06068");
9737 secondary.BeginRendering(begin_rendering_info);
9738 m_errorMonitor->VerifyFound();
9739
9740 secondary.end();
9741}
9742
9743TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9744 TEST_DESCRIPTION(
9745 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9746 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9747
9748 ASSERT_NO_FATAL_FAILURE(Init());
9749 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9750
9751 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9752
9753 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9754 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9755 nullptr, // pNext
9756 m_renderPass,
9757 0, // subpass
9758 m_framebuffer,
9759 };
9760
9761 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9762 nullptr, // pNext
9763 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9764 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9765 secondary.begin(&cmdbuff__bi);
9766 secondary.end();
9767
9768 m_commandBuffer->begin();
9769
9770 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9771 nullptr, // pNext
9772 m_renderPass,
9773 m_framebuffer,
9774 {{0, 0}, {32, 32}},
9775 static_cast<uint32_t>(m_renderPassClearValues.size()),
9776 m_renderPassClearValues.data()};
9777
9778 m_commandBuffer->BeginRenderPass(rp_bi);
9779
9780 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
9781 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9782 m_errorMonitor->VerifyFound();
9783
9784 m_commandBuffer->EndRenderPass();
9785 m_commandBuffer->end();
9786}
9787
9788TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9789 TEST_DESCRIPTION(
9790 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9791 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9792
9793 SetTargetApiVersion(VK_API_VERSION_1_1);
9794
9795 ASSERT_NO_FATAL_FAILURE(InitFramework());
9796
9797 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
9798 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
9799 return;
9800 }
9801
9802 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9803 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9804 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9805 if (!dynamic_rendering_features.dynamicRendering) {
9806 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9807 return;
9808 }
9809
9810 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9811
9812 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
9813
9814 VkRenderingAttachmentInfoKHR color_attachment = {};
9815 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
9816 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9817
9818 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
9819 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
9820 inheritance_rendering_info.colorAttachmentCount = 1;
9821 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
9822
9823 VkRenderingInfoKHR begin_rendering_info = {};
9824 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
9825 begin_rendering_info.colorAttachmentCount = 1;
9826 begin_rendering_info.pColorAttachments = &color_attachment;
9827
9828 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9829
9830 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9831 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9832 &inheritance_rendering_info, // pNext
9833 VK_NULL_HANDLE,
9834 0, // subpass
9835 VK_NULL_HANDLE,
9836 };
9837
9838 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9839 nullptr, // pNext
9840 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9841 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9842 secondary.begin(&cmdbuff__bi);
9843 secondary.end();
9844
9845 m_commandBuffer->begin();
9846
9847 m_commandBuffer->BeginRendering(begin_rendering_info);
9848
9849 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9850 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9851 m_errorMonitor->VerifyFound();
9852
9853 m_commandBuffer->EndRendering();
9854 m_commandBuffer->end();
9855}
9856
9857TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9858 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9859
9860 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9861 ASSERT_NO_FATAL_FAILURE(InitState());
9862
9863 // A renderpass with two subpasses, both writing the same attachment.
9864 VkAttachmentDescription attach[] = {
9865 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9866 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9867 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9868 };
9869 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9870 VkSubpassDescription subpasses[] = {
9871 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9872 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9873 };
9874
9875 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9876 VkRenderPass render_pass;
9877 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9878 ASSERT_VK_SUCCESS(err);
9879
9880 VkImageObj image(m_device);
9881 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9882 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9883
9884 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 1, &imageView, 32, 32, 1};
9885 VkFramebuffer framebuffer;
9886 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9887 ASSERT_VK_SUCCESS(err);
9888
9889 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9890
9891 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9892 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9893 nullptr, // pNext
9894 render_pass,
9895 1, // subpass
9896 framebuffer,
9897 };
9898
9899 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9900 nullptr, // pNext
9901 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9902 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9903 secondary.begin(&cmdbuff__bi);
9904 secondary.end();
9905
9906 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9907 nullptr, // pNext
9908 render_pass,
9909 framebuffer,
9910 {{0, 0}, {32, 32}},
9911 0,
9912 nullptr};
9913
9914 m_commandBuffer->begin();
9915 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9916
9917 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
9918 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9919 m_errorMonitor->VerifyFound();
9920
9921 m_commandBuffer->EndRenderPass();
9922 m_commandBuffer->end();
9923
9924 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9925 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9926}
9927
9928TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9929 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9930
9931 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9932 ASSERT_NO_FATAL_FAILURE(InitState());
9933
9934 // A renderpass with two subpasses, both writing the same attachment.
9935 VkAttachmentDescription attach[] = {
9936 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9937 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9938 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9939 };
9940 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9941 VkSubpassDescription subpasses[] = {
9942 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9943 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9944 };
9945
9946 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9947 VkRenderPass render_pass_1;
9948 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9949 ASSERT_VK_SUCCESS(err);
9950
9951 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9952 VkRenderPass render_pass_2;
9953 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9954 ASSERT_VK_SUCCESS(err);
9955
9956 VkImageObj image(m_device);
9957 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9958 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9959
9960 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9961 VkFramebuffer framebuffer;
9962 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9963 ASSERT_VK_SUCCESS(err);
9964
9965 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9966
9967 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9968 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9969 nullptr, // pNext
9970 render_pass_2,
9971 0, // subpass
9972 VK_NULL_HANDLE,
9973 };
9974
9975 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9976 nullptr, // pNext
9977 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9978 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9979 secondary.begin(&cmdbuff__bi);
9980 secondary.end();
9981
9982 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9983 nullptr, // pNext
9984 render_pass_1,
9985 framebuffer,
9986 {{0, 0}, {32, 32}},
9987 0,
9988 nullptr};
9989
9990 m_commandBuffer->begin();
9991 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9992
9993 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
9994 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9995 m_errorMonitor->VerifyFound();
9996
9997 m_commandBuffer->EndRenderPass();
9998 m_commandBuffer->end();
9999
10000 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
10001 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
10002 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
10003}
10004
10005TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
10006 TEST_DESCRIPTION(
10007 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
10008 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
10009
10010 SetTargetApiVersion(VK_API_VERSION_1_1);
10011
10012 ASSERT_NO_FATAL_FAILURE(InitFramework());
10013
10014 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
10015 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
10016 return;
10017 }
10018
10019 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10020 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10021 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10022 if (!dynamic_rendering_features.dynamicRendering) {
10023 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10024 return;
10025 }
10026
10027 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10028
10029 VkAttachmentDescription attach[] = {
10030 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
10031 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
10032 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
10033 };
10034 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
10035 VkSubpassDescription subpasses[] = {
10036 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
10037 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
10038 };
10039
10040 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
10041 VkRenderPass render_pass;
10042 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
10043 ASSERT_VK_SUCCESS(err);
10044
10045 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10046
10047 VkRenderingAttachmentInfoKHR color_attachment = {};
10048 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
10049 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10050
10051 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
10052 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
10053 inheritance_rendering_info.colorAttachmentCount = 1;
10054 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10055
10056 VkRenderingInfoKHR begin_rendering_info = {};
10057 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
10058 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10059 begin_rendering_info.colorAttachmentCount = 1;
10060 begin_rendering_info.pColorAttachments = &color_attachment;
10061
10062 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10063
10064 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10065 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10066 &inheritance_rendering_info, // pNext
10067 render_pass,
10068 0, // subpass
10069 VK_NULL_HANDLE,
10070 };
10071
10072 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10073 nullptr, // pNext
10074 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10075 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10076 secondary.begin(&cmdbuff__bi);
10077 secondary.end();
10078
10079 m_commandBuffer->begin();
10080
10081 m_commandBuffer->BeginRendering(begin_rendering_info);
10082
10083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
10084 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10085 m_errorMonitor->VerifyFound();
10086
10087 m_commandBuffer->EndRendering();
10088 m_commandBuffer->end();
10089
10090 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
10091}
10092
10093TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
10094 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
10095
10096 SetTargetApiVersion(VK_API_VERSION_1_1);
10097
10098 ASSERT_NO_FATAL_FAILURE(InitFramework());
10099
10100 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
10101 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
10102 return;
10103 }
10104
10105 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10106 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10107 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10108 if (!dynamic_rendering_features.dynamicRendering) {
10109 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10110 return;
10111 }
10112
10113 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10114
10115 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10116
10117 VkRenderingAttachmentInfoKHR color_attachment = {};
10118 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
10119 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10120
10121 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
10122 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
10123 inheritance_rendering_info.colorAttachmentCount = 1;
10124 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10125
10126 VkRenderingInfoKHR begin_rendering_info = {};
10127 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
10128 begin_rendering_info.flags =
10129 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
10130 begin_rendering_info.colorAttachmentCount = 1;
10131 begin_rendering_info.pColorAttachments = &color_attachment;
10132
10133 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10134
10135 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10136 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10137 &inheritance_rendering_info, // pNext
10138 VK_NULL_HANDLE,
10139 0, // subpass
10140 VK_NULL_HANDLE,
10141 };
10142
10143 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10144 nullptr, // pNext
10145 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10146 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10147 secondary.begin(&cmdbuff__bi);
10148 secondary.end();
10149
10150 m_commandBuffer->begin();
10151
10152 m_commandBuffer->BeginRendering(begin_rendering_info);
10153
10154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10155 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10156 m_errorMonitor->VerifyFound();
10157
10158 m_commandBuffer->EndRendering();
10159 m_commandBuffer->end();
10160}
10161
10162TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10163 TEST_DESCRIPTION(
10164 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
10165
10166 SetTargetApiVersion(VK_API_VERSION_1_1);
10167
10168 ASSERT_NO_FATAL_FAILURE(InitFramework());
10169
10170 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
10171 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
10172 return;
10173 }
10174
10175 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10176 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10177 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10178 if (!dynamic_rendering_features.dynamicRendering) {
10179 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10180 return;
10181 }
10182
10183 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10184
10185 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10186
10187 VkRenderingAttachmentInfoKHR color_attachment = {};
10188 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
10189 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10190
10191 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
10192 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
10193 inheritance_rendering_info.colorAttachmentCount = 0;
10194 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10195
10196 VkRenderingInfoKHR begin_rendering_info = {};
10197 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
10198 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10199 begin_rendering_info.colorAttachmentCount = 1;
10200 begin_rendering_info.pColorAttachments = &color_attachment;
10201
10202 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10203
10204 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10205 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10206 &inheritance_rendering_info, // pNext
10207 VK_NULL_HANDLE,
10208 0, // subpass
10209 VK_NULL_HANDLE,
10210 };
10211
10212 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10213 nullptr, // pNext
10214 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10215 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10216 secondary.begin(&cmdbuff__bi);
10217 secondary.end();
10218
10219 m_commandBuffer->begin();
10220
10221 m_commandBuffer->BeginRendering(begin_rendering_info);
10222
10223 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10224 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10225 m_errorMonitor->VerifyFound();
10226
10227 m_commandBuffer->EndRendering();
10228 m_commandBuffer->end();
10229}
10230
10231TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10232 TEST_DESCRIPTION(
10233 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10234
10235 SetTargetApiVersion(VK_API_VERSION_1_1);
10236
10237 ASSERT_NO_FATAL_FAILURE(InitFramework());
10238
10239 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
10240 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
10241 return;
10242 }
10243
10244 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10245 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10246 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10247 if (!dynamic_rendering_features.dynamicRendering) {
10248 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10249 return;
10250 }
10251
10252 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10253
10254 VkImageObj image(m_device);
10255 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10256 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10257
10258 VkRenderingAttachmentInfoKHR color_attachment = {};
10259 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
10260 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10261 color_attachment.imageView = imageView;
10262
10263 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10264
10265 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
10266 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
10267 inheritance_rendering_info.colorAttachmentCount = 1;
10268 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
10269
10270 VkRenderingInfoKHR begin_rendering_info = {};
10271 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
10272 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10273 begin_rendering_info.colorAttachmentCount = 1;
10274 begin_rendering_info.pColorAttachments = &color_attachment;
10275
10276 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10277
10278 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10279 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10280 &inheritance_rendering_info, // pNext
10281 VK_NULL_HANDLE,
10282 0, // subpass
10283 VK_NULL_HANDLE,
10284 };
10285
10286 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10287 nullptr, // pNext
10288 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10289 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10290 secondary.begin(&cmdbuff__bi);
10291 secondary.end();
10292
10293 m_commandBuffer->begin();
10294
10295 m_commandBuffer->BeginRendering(begin_rendering_info);
10296
10297 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10298 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10299 m_errorMonitor->VerifyFound();
10300
10301 m_commandBuffer->EndRendering();
10302 m_commandBuffer->end();
10303}
10304
10305TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10306 TEST_DESCRIPTION(
10307 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10308 "format");
10309
10310 SetTargetApiVersion(VK_API_VERSION_1_1);
10311
10312 ASSERT_NO_FATAL_FAILURE(InitFramework());
10313
10314 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
10315 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
10316 return;
10317 }
10318
10319 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10320 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10321 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10322 if (!dynamic_rendering_features.dynamicRendering) {
10323 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10324 return;
10325 }
10326
10327 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10328
10329 VkImageObj image(m_device);
10330 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10331 if (!depth_stencil_format) {
10332 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10333 return;
10334 }
10335 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10336 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10337
10338 VkRenderingAttachmentInfoKHR depth_stencil_attachment = {};
10339 depth_stencil_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
10340 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10341 depth_stencil_attachment.imageView = imageView;
10342
10343 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
10344 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
10345 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT;
10346 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_S8_UINT;
10347
10348 VkRenderingInfoKHR begin_rendering_info = {};
10349 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
10350 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10351 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10352 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10353
10354 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10355
10356 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10357 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10358 &inheritance_rendering_info, // pNext
10359 VK_NULL_HANDLE,
10360 0, // subpass
10361 VK_NULL_HANDLE,
10362 };
10363
10364 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10365 nullptr, // pNext
10366 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10367 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10368 secondary.begin(&cmdbuff__bi);
10369 secondary.end();
10370
10371 m_commandBuffer->begin();
10372
10373 m_commandBuffer->BeginRendering(begin_rendering_info);
10374
10375 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10376 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10377 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10378 m_errorMonitor->VerifyFound();
10379
10380 m_commandBuffer->EndRendering();
10381 m_commandBuffer->end();
10382}
10383
10384TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10385 TEST_DESCRIPTION(
10386 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10387
10388 SetTargetApiVersion(VK_API_VERSION_1_1);
10389
10390 ASSERT_NO_FATAL_FAILURE(InitFramework());
10391
10392 if (!AddRequiredDeviceExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
10393 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
10394 return;
10395 }
10396
10397 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10398 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10399 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10400 if (!dynamic_rendering_features.dynamicRendering) {
10401 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10402 return;
10403 }
10404
10405 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10406
10407 VkRenderingAttachmentInfoKHR color_attachment = {};
10408 color_attachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
10409 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10410
10411 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10412
10413 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info = {};
10414 inheritance_rendering_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR;
10415 inheritance_rendering_info.viewMask = 0;
10416 inheritance_rendering_info.colorAttachmentCount = 1;
10417 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10418
10419 VkRenderingInfoKHR begin_rendering_info = {};
10420 begin_rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
10421 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10422 begin_rendering_info.viewMask = 1;
10423 begin_rendering_info.colorAttachmentCount = 1;
10424 begin_rendering_info.pColorAttachments = &color_attachment;
10425
10426 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10427
10428 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10429 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10430 &inheritance_rendering_info, // pNext
10431 VK_NULL_HANDLE,
10432 0, // subpass
10433 VK_NULL_HANDLE,
10434 };
10435
10436 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10437 nullptr, // pNext
10438 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10439 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10440 secondary.begin(&cmdbuff__bi);
10441 secondary.end();
10442
10443 m_commandBuffer->begin();
10444
10445 m_commandBuffer->BeginRendering(begin_rendering_info);
10446
10447 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10448 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10449 m_errorMonitor->VerifyFound();
10450
10451 m_commandBuffer->EndRendering();
10452 m_commandBuffer->end();
10453}