blob: ff464e48ad3ed1eabbd0186fb5a874c755f1bc6c [file] [log] [blame]
unknown088160a2019-05-23 17:43:13 -06001/*
Aaron Hagand1a61212021-12-22 11:53:49 -05002 * Copyright (c) 2015-2022 The Khronos Group Inc.
3 * Copyright (c) 2015-2022 Valve Corporation
4 * Copyright (c) 2015-2022 LunarG, Inc.
5 * Copyright (c) 2015-2022 Google, Inc.
6 * Modifications Copyright (C) 2022 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
sfricke-samsung1c61f192021-12-31 01:53:03 -060041 VkCommandPoolCreateInfo pool_create_info = LvlInitStruct<VkCommandPoolCreateInfo>();
unknown088160a2019-05-23 17:43:13 -060042 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
43 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
44
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060045 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
unknown088160a2019-05-23 17:43:13 -060046
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060047 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
unknown088160a2019-05-23 17:43:13 -060048
49 VkCommandBuffer cb;
sfricke-samsung1c61f192021-12-31 01:53:03 -060050 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -060051 command_buffer_allocate_info.commandPool = command_pool_one;
52 command_buffer_allocate_info.commandBufferCount = 1;
53 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060054 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
unknown088160a2019-05-23 17:43:13 -060055
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060056 vk::FreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
unknown088160a2019-05-23 17:43:13 -060057
58 m_errorMonitor->VerifyFound();
59
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060060 vk::DestroyCommandPool(m_device->device(), command_pool_one, NULL);
61 vk::DestroyCommandPool(m_device->device(), command_pool_two, NULL);
unknown088160a2019-05-23 17:43:13 -060062}
63
64TEST_F(VkLayerTest, InvalidSecondaryCommandBufferBarrier) {
65 TEST_DESCRIPTION("Add an invalid image barrier in a secondary command buffer");
66 ASSERT_NO_FATAL_FAILURE(Init());
67
68 // A renderpass with a single subpass that declared a self-dependency
69 VkAttachmentDescription attach[] = {
70 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
71 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
72 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
73 };
74 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
75 VkSubpassDescription subpasses[] = {
76 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
77 };
78 VkSubpassDependency dep = {0,
79 0,
80 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
81 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
82 VK_ACCESS_SHADER_WRITE_BIT,
83 VK_ACCESS_SHADER_WRITE_BIT,
84 VK_DEPENDENCY_BY_REGION_BIT};
85 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 1, &dep};
86 VkRenderPass rp;
87
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060088 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
unknown088160a2019-05-23 17:43:13 -060089 ASSERT_VK_SUCCESS(err);
90
91 VkImageObj image(m_device);
92 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
93 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
94 // Second image that img_barrier will incorrectly use
95 VkImageObj image2(m_device);
96 image2.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
97
98 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
99 VkFramebuffer fb;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600100 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
unknown088160a2019-05-23 17:43:13 -0600101 ASSERT_VK_SUCCESS(err);
102
103 m_commandBuffer->begin();
104
105 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
106 nullptr,
107 rp,
108 fb,
109 {{
110 0,
111 0,
112 },
113 {32, 32}},
114 0,
115 nullptr};
116
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600117 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600118
119 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
120 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
121
122 VkCommandBufferInheritanceInfo cbii = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
123 nullptr,
124 rp,
125 0,
126 VK_NULL_HANDLE, // Set to NULL FB handle intentionally to flesh out any errors
127 VK_FALSE,
128 0,
129 0};
130 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
131 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
132 &cbii};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600133 vk::BeginCommandBuffer(secondary.handle(), &cbbi);
sfricke-samsung1c61f192021-12-31 01:53:03 -0600134 VkImageMemoryBarrier img_barrier = LvlInitStruct<VkImageMemoryBarrier>();
unknown088160a2019-05-23 17:43:13 -0600135 img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
136 img_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
137 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
138 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
139 img_barrier.image = image2.handle(); // Image mis-matches with FB image
140 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
141 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
142 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
143 img_barrier.subresourceRange.baseArrayLayer = 0;
144 img_barrier.subresourceRange.baseMipLevel = 0;
145 img_barrier.subresourceRange.layerCount = 1;
146 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600147 vk::CmdPipelineBarrier(secondary.handle(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
148 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
unknown088160a2019-05-23 17:43:13 -0600149 secondary.end();
150
Shannon McPherson93970b12020-06-12 14:34:35 -0600151 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600152 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600153 m_errorMonitor->VerifyFound();
154
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600155 vk::DestroyFramebuffer(m_device->device(), fb, nullptr);
156 vk::DestroyRenderPass(m_device->device(), rp, nullptr);
unknown088160a2019-05-23 17:43:13 -0600157}
158
159TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
160 TEST_DESCRIPTION(
161 "Run a simple draw calls to validate failure when Depth Bias dynamic state is required but not correctly bound.");
162
163 ASSERT_NO_FATAL_FAILURE(Init());
164 // Dynamic depth bias
Mark Lobodzinski20310782020-02-28 14:25:17 -0700165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bias state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600166 VKTriangleTest(BsoFailDepthBias);
167 m_errorMonitor->VerifyFound();
168}
169
170TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
171 TEST_DESCRIPTION(
172 "Run a simple draw calls to validate failure when Line Width dynamic state is required but not correctly bound.");
173
174 ASSERT_NO_FATAL_FAILURE(Init());
175 // Dynamic line width
Mark Lobodzinski20310782020-02-28 14:25:17 -0700176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line width state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600177 VKTriangleTest(BsoFailLineWidth);
178 m_errorMonitor->VerifyFound();
179}
180
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500181TEST_F(VkLayerTest, DynamicLineStippleNotBound) {
182 TEST_DESCRIPTION(
183 "Run a simple draw calls to validate failure when Line Stipple dynamic state is required but not correctly bound.");
184
sjfricked8e01c52022-07-06 14:09:04 +0900185 AddRequiredExtensions(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -0700186 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +0900187 if (!AreRequiredExtensionsEnabled()) {
188 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500189 }
190
191 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600192 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500193 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
194
Mark Lobodzinski07d0a612020-12-30 15:42:31 -0700195 auto line_rasterization_features = LvlInitStruct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
196 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&line_rasterization_features);
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500197 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
198
199 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
200 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
201 return;
202 }
203
204 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
205
Mark Lobodzinski20310782020-02-28 14:25:17 -0700206 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500207 VKTriangleTest(BsoFailLineStipple);
208 m_errorMonitor->VerifyFound();
209}
210
unknown088160a2019-05-23 17:43:13 -0600211TEST_F(VkLayerTest, DynamicViewportNotBound) {
212 TEST_DESCRIPTION(
213 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
214
215 ASSERT_NO_FATAL_FAILURE(Init());
216 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600218 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
219 VKTriangleTest(BsoFailViewport);
220 m_errorMonitor->VerifyFound();
221}
222
223TEST_F(VkLayerTest, DynamicScissorNotBound) {
224 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
225
226 ASSERT_NO_FATAL_FAILURE(Init());
227 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600229 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
230 VKTriangleTest(BsoFailScissor);
231 m_errorMonitor->VerifyFound();
232}
233
234TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
235 TEST_DESCRIPTION(
236 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
237
238 ASSERT_NO_FATAL_FAILURE(Init());
239 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600241 VKTriangleTest(BsoFailBlend);
242 m_errorMonitor->VerifyFound();
243}
244
245TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
246 TEST_DESCRIPTION(
247 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
248
249 ASSERT_NO_FATAL_FAILURE(Init());
250 if (!m_device->phy().features().depthBounds) {
251 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
252 return;
253 }
254 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700255 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600256 VKTriangleTest(BsoFailDepthBounds);
257 m_errorMonitor->VerifyFound();
258}
259
260TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
261 TEST_DESCRIPTION(
262 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
263
264 ASSERT_NO_FATAL_FAILURE(Init());
265 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700266 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600267 VKTriangleTest(BsoFailStencilReadMask);
268 m_errorMonitor->VerifyFound();
269}
270
271TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
272 TEST_DESCRIPTION(
273 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
274
275 ASSERT_NO_FATAL_FAILURE(Init());
276 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700277 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600278 VKTriangleTest(BsoFailStencilWriteMask);
279 m_errorMonitor->VerifyFound();
280}
281
282TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
283 TEST_DESCRIPTION(
284 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
285
286 ASSERT_NO_FATAL_FAILURE(Init());
287 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700288 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600289 VKTriangleTest(BsoFailStencilReference);
290 m_errorMonitor->VerifyFound();
291}
292
293TEST_F(VkLayerTest, IndexBufferNotBound) {
294 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
295
296 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700297 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600298 VKTriangleTest(BsoFailIndexBuffer);
299 m_errorMonitor->VerifyFound();
300}
301
302TEST_F(VkLayerTest, IndexBufferBadSize) {
303 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
304
305 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600307 VKTriangleTest(BsoFailIndexBufferBadSize);
308 m_errorMonitor->VerifyFound();
309}
310
311TEST_F(VkLayerTest, IndexBufferBadOffset) {
312 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
313
314 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600316 VKTriangleTest(BsoFailIndexBufferBadOffset);
317 m_errorMonitor->VerifyFound();
318}
319
320TEST_F(VkLayerTest, IndexBufferBadBindSize) {
321 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
322
323 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600325 VKTriangleTest(BsoFailIndexBufferBadMapSize);
326 m_errorMonitor->VerifyFound();
327}
328
329TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
330 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
331
332 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600334 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
335 m_errorMonitor->VerifyFound();
336}
337
338TEST_F(VkLayerTest, MissingClearAttachment) {
339 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700341 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600342
343 VKTriangleTest(BsoFailCmdClearAttachments);
344 m_errorMonitor->VerifyFound();
345}
346
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700347TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
348 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700349 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700350
351 ASSERT_NO_FATAL_FAILURE(Init());
352
353 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
354 secondary.begin();
355 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
356 secondary.end();
357
sfricke-samsung1c61f192021-12-31 01:53:03 -0600358 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700359 submit_info.waitSemaphoreCount = 0;
360 submit_info.pWaitSemaphores = NULL;
361 submit_info.pWaitDstStageMask = NULL;
362 submit_info.commandBufferCount = 1;
363 submit_info.pCommandBuffers = &secondary.handle();
364 submit_info.signalSemaphoreCount = 0;
365 submit_info.pSignalSemaphores = NULL;
366
367 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
368 m_errorMonitor->VerifyFound();
369}
370
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700371TEST_F(VkLayerTest, Sync2SecondaryCommandbufferAsPrimary) {
372 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit2KHR.");
373 SetTargetApiVersion(VK_API_VERSION_1_2);
374 ASSERT_NO_FATAL_FAILURE(InitFramework());
375 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
376 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
377 } else {
378 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
379 return;
380 }
381
382 if (!CheckSynchronization2SupportAndInitState(this)) {
383 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
384 return;
385 }
386 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
Tony-LunarG279601c2021-11-16 10:50:51 -0700387 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferSubmitInfo-commandBuffer-03890");
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700388
389 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
390 secondary.begin();
391 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
392 secondary.end();
393
394 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
395 cb_info.commandBuffer = secondary.handle();
396
397 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
398 submit_info.commandBufferInfoCount = 1;
399 submit_info.pCommandBufferInfos = &cb_info;
400
401 fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
402 m_errorMonitor->VerifyFound();
403}
404
unknown088160a2019-05-23 17:43:13 -0600405TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600407 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
408
409 ASSERT_NO_FATAL_FAILURE(Init());
410 ASSERT_NO_FATAL_FAILURE(InitViewport());
411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
412
413 // We luck out b/c by default the framework creates CB w/ the
414 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
415 m_commandBuffer->begin();
416 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
417 m_commandBuffer->end();
418
419 // Bypass framework since it does the waits automatically
420 VkResult err = VK_SUCCESS;
sfricke-samsung1c61f192021-12-31 01:53:03 -0600421 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -0600422 submit_info.waitSemaphoreCount = 0;
423 submit_info.pWaitSemaphores = NULL;
424 submit_info.pWaitDstStageMask = NULL;
425 submit_info.commandBufferCount = 1;
426 submit_info.pCommandBuffers = &m_commandBuffer->handle();
427 submit_info.signalSemaphoreCount = 0;
428 submit_info.pSignalSemaphores = NULL;
429
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600430 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600431 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600432 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600433
434 // Cause validation error by re-submitting cmd buffer that should only be
435 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600436 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
437 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600438
439 m_errorMonitor->VerifyFound();
440}
441
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700442TEST_F(VkLayerTest, Sync2CommandBufferTwoSubmits) {
443 SetTargetApiVersion(VK_API_VERSION_1_2);
444 ASSERT_NO_FATAL_FAILURE(InitFramework());
445 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
446 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
447 } else {
448 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
449 return;
450 }
451
452 if (!CheckSynchronization2SupportAndInitState(this)) {
453 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
454 return;
455 }
456 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
457
458 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
459 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
460 ASSERT_NO_FATAL_FAILURE(InitViewport());
461 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
462
463 // We luck out b/c by default the framework creates CB w/ the
464 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
465 m_commandBuffer->begin();
466 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
467 m_commandBuffer->end();
468
469 // Bypass framework since it does the waits automatically
470 VkResult err = VK_SUCCESS;
471 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
472 cb_info.commandBuffer = m_commandBuffer->handle();
473
474 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
475 submit_info.commandBufferInfoCount = 1;
476 submit_info.pCommandBufferInfos = &cb_info;
477
478 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
479 ASSERT_VK_SUCCESS(err);
480 vk::QueueWaitIdle(m_device->m_queue);
481
482 // Cause validation error by re-submitting cmd buffer that should only be
483 // submitted once
484 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
485 vk::QueueWaitIdle(m_device->m_queue);
486
487 m_errorMonitor->VerifyFound();
488}
489
unknown088160a2019-05-23 17:43:13 -0600490TEST_F(VkLayerTest, InvalidPushConstants) {
491 ASSERT_NO_FATAL_FAILURE(Init());
492 ASSERT_NO_FATAL_FAILURE(InitViewport());
493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
494
495 VkPipelineLayout pipeline_layout;
496 VkPushConstantRange pc_range = {};
sfricke-samsung1c61f192021-12-31 01:53:03 -0600497 VkPipelineLayoutCreateInfo pipeline_layout_ci = LvlInitStruct<VkPipelineLayoutCreateInfo>();
unknown088160a2019-05-23 17:43:13 -0600498 pipeline_layout_ci.pushConstantRangeCount = 1;
499 pipeline_layout_ci.pPushConstantRanges = &pc_range;
500
501 //
502 // Check for invalid push constant ranges in pipeline layouts.
503 //
504 struct PipelineLayoutTestCase {
505 VkPushConstantRange const range;
506 char const *msg;
507 };
508
509 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
510 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700511 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
512 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
513 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
514 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
515 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
516 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
517 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
518 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
519 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
520 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600521 }};
522
523 // Check for invalid offset and size
524 for (const auto &iter : range_tests) {
525 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700526 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600527 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600528 m_errorMonitor->VerifyFound();
529 }
530
531 // Check for invalid stage flag
532 pc_range.offset = 0;
533 pc_range.size = 16;
534 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600536 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600537 m_errorMonitor->VerifyFound();
538
539 // Check for duplicate stage flags in a list of push constant ranges.
540 // A shader can only have one push constant block and that block is mapped
541 // to the push constant range that has that shader's stage flag set.
542 // The shader's stage flag can only appear once in all the ranges, so the
543 // implementation can find the one and only range to map it to.
544 const uint32_t ranges_per_test = 5;
545 struct DuplicateStageFlagsTestCase {
546 VkPushConstantRange const ranges[ranges_per_test];
547 std::vector<char const *> const msg;
548 };
549 // Overlapping ranges are OK, but a stage flag can appear only once.
550 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
551 {
552 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
553 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
554 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
555 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
556 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
557 {
558 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
559 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
560 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
561 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
562 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
563 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
564 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
565 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
566 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
567 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
568 }},
569 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
570 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
571 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
572 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
573 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
574 {
575 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
576 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
577 }},
578 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
579 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
580 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
581 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
582 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
583 {
584 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
585 }},
586 },
587 };
588
589 for (const auto &iter : duplicate_stageFlags_tests) {
590 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
591 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700592 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600593 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600594 m_errorMonitor->VerifyFound();
595 }
596
597 //
598 // CmdPushConstants tests
599 //
600
601 // Setup a pipeline layout with ranges: [0,32) [16,80)
602 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
603 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
604 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
605
606 const uint8_t dummy_values[100] = {};
607
608 m_commandBuffer->begin();
609 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
610
611 // Check for invalid stage flag
612 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700613 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600614 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600615 m_errorMonitor->VerifyFound();
616
617 // Positive tests for the overlapping ranges
618 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600619 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
620 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600621 m_errorMonitor->VerifyNotFound();
622 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600623 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600624 m_errorMonitor->VerifyNotFound();
625 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600626 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
627 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600628 m_errorMonitor->VerifyNotFound();
629
630 // Wrong cmd stages for extant range
631 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700632 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600633 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600635 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
636 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600637 m_errorMonitor->VerifyFound();
638
639 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600641 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
642 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600643 m_errorMonitor->VerifyFound();
644
645 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600647 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
648 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600649 m_errorMonitor->VerifyFound();
650
651 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600653 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600654 m_errorMonitor->VerifyFound();
655
656 m_commandBuffer->EndRenderPass();
657 m_commandBuffer->end();
658}
659
660TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700661 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600662
663 ASSERT_NO_FATAL_FAILURE(Init());
664 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
665 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600666 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600667
668 m_errorMonitor->VerifyFound();
669}
670
unknown088160a2019-05-23 17:43:13 -0600671TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
672 ASSERT_NO_FATAL_FAILURE(Init());
673
Mark Lobodzinski20310782020-02-28 14:25:17 -0700674 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600675
676 // A pool we can reset in.
677 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
678 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
679
680 secondary.begin();
681 secondary.end();
682
683 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600684 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600685
686 // rerecording of secondary
687 secondary.reset(); // explicit reset here.
688 secondary.begin();
689 secondary.end();
690
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600691 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600692 m_errorMonitor->VerifyFound();
693}
694
695TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
696 ASSERT_NO_FATAL_FAILURE(Init());
697
Mark Lobodzinski20310782020-02-28 14:25:17 -0700698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600699
700 // A pool we can reset in.
701 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
702 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
703
704 secondary.begin();
705 secondary.end();
706
707 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600708 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600709
710 // rerecording of secondary
711 secondary.begin(); // implicit reset in begin
712 secondary.end();
713
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600714 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600715 m_errorMonitor->VerifyFound();
716}
717
718TEST_F(VkLayerTest, CascadedInvalidation) {
719 ASSERT_NO_FATAL_FAILURE(Init());
720
sfricke-samsung1c61f192021-12-31 01:53:03 -0600721 VkEventCreateInfo eci = LvlInitStruct<VkEventCreateInfo>();
722 eci.flags = 0;
unknown088160a2019-05-23 17:43:13 -0600723 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600724 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600725
726 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
727 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600728 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600729 secondary.end();
730
731 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600732 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600733 m_commandBuffer->end();
734
735 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600736 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600737
Mark Lobodzinski20310782020-02-28 14:25:17 -0700738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600739 m_commandBuffer->QueueCommandBuffer(false);
740 m_errorMonitor->VerifyFound();
741}
742
743TEST_F(VkLayerTest, CommandBufferResetErrors) {
744 // Cause error due to Begin while recording CB
745 // Then cause 2 errors for attempting to reset CB w/o having
746 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
747 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600749
750 ASSERT_NO_FATAL_FAILURE(Init());
751
752 // Calls AllocateCommandBuffers
753 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
754
755 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
sfricke-samsung1c61f192021-12-31 01:53:03 -0600756 VkCommandBufferInheritanceInfo cmd_buf_hinfo = LvlInitStruct<VkCommandBufferInheritanceInfo>();
757 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -0600758 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
759 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
760
761 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600762 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600763 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600764 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600765 m_errorMonitor->VerifyFound();
766
Mark Lobodzinski20310782020-02-28 14:25:17 -0700767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600768 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
769 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600770 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600771 m_errorMonitor->VerifyFound();
772
Mark Lobodzinski20310782020-02-28 14:25:17 -0700773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600774 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600775 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600776 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600777 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600778 m_errorMonitor->VerifyFound();
779}
780
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700781TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
782 ASSERT_NO_FATAL_FAILURE(Init());
783
784 // Calls AllocateCommandBuffers
785 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
786
sfricke-samsung1c61f192021-12-31 01:53:03 -0600787 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700788 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
789
790 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
791 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
792 m_errorMonitor->VerifyFound();
793}
794
unknown088160a2019-05-23 17:43:13 -0600795TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
796 // Call CmdClearAttachmentss outside of an active RenderPass
797
sfricke-samsung85584a72021-09-30 21:43:38 -0700798 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearAttachments: This call must be issued inside an active render pass");
unknown088160a2019-05-23 17:43:13 -0600799
800 ASSERT_NO_FATAL_FAILURE(Init());
801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
802
803 // Start no RenderPass
804 m_commandBuffer->begin();
805
806 VkClearAttachment color_attachment;
807 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
808 color_attachment.clearValue.color.float32[0] = 0;
809 color_attachment.clearValue.color.float32[1] = 0;
810 color_attachment.clearValue.color.float32[2] = 0;
811 color_attachment.clearValue.color.float32[3] = 0;
812 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600813 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600814 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600815
816 m_errorMonitor->VerifyFound();
817}
818
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600819TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
820 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
821
Mark Lobodzinski20310782020-02-28 14:25:17 -0700822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600823
824 ASSERT_NO_FATAL_FAILURE(Init());
825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
826
827 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600828 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600829
830 VkClearAttachment color_attachment;
831 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
832 color_attachment.clearValue.color.float32[0] = 0;
833 color_attachment.clearValue.color.float32[1] = 0;
834 color_attachment.clearValue.color.float32[2] = 0;
835 color_attachment.clearValue.color.float32[3] = 0;
836 color_attachment.colorAttachment = 0;
837 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600838 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600839
840 m_errorMonitor->VerifyFound();
841}
842
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700843TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
844 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
845
846 ASSERT_NO_FATAL_FAILURE(Init());
847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
848
849 m_commandBuffer->begin();
850 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
851
852 VkClearAttachment color_attachment;
853 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
854 color_attachment.clearValue.color.float32[0] = 0;
855 color_attachment.clearValue.color.float32[1] = 0;
856 color_attachment.clearValue.color.float32[2] = 0;
857 color_attachment.clearValue.color.float32[3] = 0;
858 color_attachment.colorAttachment = 0;
859 VkClearRect clear_rect = {};
860 clear_rect.rect.offset = {0, 0};
861 clear_rect.baseArrayLayer = 0;
862 clear_rect.layerCount = 1;
863
864 clear_rect.rect.extent = {0, 1};
865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
866 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
867 m_errorMonitor->VerifyFound();
868
869 clear_rect.rect.extent = {1, 0};
870 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
871 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
872 m_errorMonitor->VerifyFound();
873}
874
sfricke-samsung6141db32020-10-26 03:31:38 -0700875TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
876 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
877
878 ASSERT_NO_FATAL_FAILURE(Init());
879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
880
881 m_commandBuffer->begin();
882 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
883
884 VkClearAttachment attachment;
885 attachment.clearValue.color.float32[0] = 0;
886 attachment.clearValue.color.float32[1] = 0;
887 attachment.clearValue.color.float32[2] = 0;
888 attachment.clearValue.color.float32[3] = 0;
889 attachment.colorAttachment = 0;
890 VkClearRect clear_rect = {};
891 clear_rect.rect.offset = {0, 0};
892 clear_rect.rect.extent = {1, 1};
893 clear_rect.baseArrayLayer = 0;
894 clear_rect.layerCount = 1;
895
896 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
897 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
898 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
899 m_errorMonitor->VerifyFound();
900
901 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
902 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
903 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
904 m_errorMonitor->VerifyFound();
905
906 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
907 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
908 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
909 m_errorMonitor->VerifyFound();
910
911 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
912 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
913 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
914 m_errorMonitor->VerifyFound();
915}
916
sfricke-samsung91f4a542020-10-21 00:29:17 -0700917TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
918 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
919
920 ASSERT_NO_FATAL_FAILURE(Init());
921 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
922
923 m_commandBuffer->begin();
924 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
925
926 VkClearAttachment color_attachment;
927 color_attachment.clearValue.color.float32[0] = 0;
928 color_attachment.clearValue.color.float32[1] = 0;
929 color_attachment.clearValue.color.float32[2] = 0;
930 color_attachment.clearValue.color.float32[3] = 0;
931 color_attachment.colorAttachment = 0;
932 VkClearRect clear_rect = {};
933 clear_rect.rect.offset = {0, 0};
934 clear_rect.rect.extent = {1, 1};
935 clear_rect.baseArrayLayer = 0;
936 clear_rect.layerCount = 1;
937
938 color_attachment.aspectMask = 0;
939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
940 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
941 m_errorMonitor->VerifyFound();
942
943 color_attachment.aspectMask = 0xffffffff;
944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
945 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
946 m_errorMonitor->VerifyFound();
947}
948
sfricke-samsung87b09512020-10-26 03:35:42 -0700949TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
950 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
951
952 ASSERT_NO_FATAL_FAILURE(Init());
953 // Creates a color attachment
954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
955
956 m_commandBuffer->begin();
957 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
958
959 VkClearAttachment attachment;
960 attachment.clearValue.color.float32[0] = 0;
961 attachment.clearValue.color.float32[1] = 0;
962 attachment.clearValue.color.float32[2] = 0;
963 attachment.clearValue.color.float32[3] = 0;
964 attachment.colorAttachment = 0;
965 VkClearRect clear_rect = {};
966 clear_rect.rect.offset = {0, 0};
967 clear_rect.rect.extent = {1, 1};
968 clear_rect.baseArrayLayer = 0;
969 clear_rect.layerCount = 1;
970
971 m_errorMonitor->ExpectSuccess();
972 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
973 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
974 m_errorMonitor->VerifyNotFound();
975
976 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
977 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
978 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
979 m_errorMonitor->VerifyFound();
980
981 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
982 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
983 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
984 m_errorMonitor->VerifyFound();
985}
986
unknown088160a2019-05-23 17:43:13 -0600987TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
988 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
989
990 ASSERT_NO_FATAL_FAILURE(Init());
991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
992
993 // An empty primary command buffer
994 VkCommandBufferObj cb(m_device, m_commandPool);
995 cb.begin();
996 cb.end();
997
998 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600999 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001000 VkCommandBuffer handle = cb.handle();
1001
Mark Lobodzinski20310782020-02-28 14:25:17 -07001002 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001003 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001004 m_errorMonitor->VerifyFound();
1005
1006 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1007
1008 m_commandBuffer->EndRenderPass();
1009 m_commandBuffer->end();
1010}
1011
Petr Kraus8e53cf02020-01-03 05:30:04 +01001012TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1013 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1014
1015 ASSERT_NO_FATAL_FAILURE(Init());
1016
1017 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1018 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1019 secondary_cb.begin();
1020 secondary_cb.end();
1021
1022 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001024 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1025 m_errorMonitor->VerifyFound();
1026}
1027
unknown088160a2019-05-23 17:43:13 -06001028TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1029 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1030
1031 ASSERT_NO_FATAL_FAILURE(Init());
1032 ASSERT_NO_FATAL_FAILURE(InitViewport());
1033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1034
1035 const VkPipelineLayoutObj pipeline_layout(m_device);
1036
1037 struct VboEntry {
1038 uint16_t input0[2];
1039 uint32_t input1;
1040 float input2[4];
1041 };
1042
1043 const unsigned vbo_entry_count = 3;
1044 const VboEntry vbo_data[vbo_entry_count] = {};
1045
1046 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1047 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1048
1049 VkVertexInputBindingDescription input_binding;
1050 input_binding.binding = 0;
1051 input_binding.stride = sizeof(VboEntry);
1052 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1053
1054 VkVertexInputAttributeDescription input_attribs[3];
1055
1056 input_attribs[0].binding = 0;
1057 // Location switch between attrib[0] and attrib[1] is intentional
1058 input_attribs[0].location = 1;
1059 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1060 input_attribs[0].offset = offsetof(VboEntry, input1);
1061
1062 input_attribs[1].binding = 0;
1063 input_attribs[1].location = 0;
1064 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1065 input_attribs[1].offset = offsetof(VboEntry, input0);
1066
1067 input_attribs[2].binding = 0;
1068 input_attribs[2].location = 2;
1069 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1070 input_attribs[2].offset = offsetof(VboEntry, input2);
1071
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001072 char const *vsSource = R"glsl(
1073 #version 450
1074 layout(location = 0) in vec2 input0;
1075 layout(location = 1) in vec4 input1;
1076 layout(location = 2) in vec4 input2;
1077 void main(){
1078 gl_Position = input1 + input2;
1079 gl_Position.xy += input0;
1080 }
1081 )glsl";
unknown088160a2019-05-23 17:43:13 -06001082
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001083 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
1084 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001085
1086 VkPipelineObj pipe1(m_device);
1087 pipe1.AddDefaultColorAttachment();
1088 pipe1.AddShader(&vs);
1089 pipe1.AddShader(&fs);
1090 pipe1.AddVertexInputBindings(&input_binding, 1);
1091 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1092 pipe1.SetViewport(m_viewports);
1093 pipe1.SetScissor(m_scissors);
1094 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1095
1096 input_binding.stride = 6;
1097
1098 VkPipelineObj pipe2(m_device);
1099 pipe2.AddDefaultColorAttachment();
1100 pipe2.AddShader(&vs);
1101 pipe2.AddShader(&fs);
1102 pipe2.AddVertexInputBindings(&input_binding, 1);
1103 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1104 pipe2.SetViewport(m_viewports);
1105 pipe2.SetScissor(m_scissors);
1106 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1107
1108 m_commandBuffer->begin();
1109 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1110
1111 // Test with invalid buffer offset
1112 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001113 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1114 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001115 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
1116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 1
1117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001118 m_commandBuffer->Draw(1, 0, 0, 0);
1119 m_errorMonitor->VerifyFound();
1120
1121 // Test with invalid buffer stride
1122 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001123 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1124 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
unknown088160a2019-05-23 17:43:13 -06001126 // Attribute[1] is aligned properly even with a wrong stride
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001128 m_commandBuffer->Draw(1, 0, 0, 0);
1129 m_errorMonitor->VerifyFound();
1130
1131 m_commandBuffer->EndRenderPass();
1132 m_commandBuffer->end();
1133}
1134
1135TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1136 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001137 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001138
1139 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1140
1141 secondary.begin();
1142 secondary.end();
1143
1144 VkCommandBufferBeginInfo cbbi = {
1145 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1146 nullptr,
1147 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1148 nullptr,
1149 };
1150
1151 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001152 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001153 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001154 m_errorMonitor->VerifyFound();
1155 m_commandBuffer->end();
1156}
1157
1158TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1159 ASSERT_NO_FATAL_FAILURE(Init());
1160
John Zulauff1640d12019-08-13 15:39:58 -06001161 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001162
1163 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1164
sfricke-samsung1c61f192021-12-31 01:53:03 -06001165 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001166 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1167
1168 secondary.begin(&cbbi);
1169 secondary.end();
1170
1171 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001172 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001173 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001174 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001175 m_errorMonitor->VerifyFound();
1176 m_commandBuffer->end();
1177}
1178
1179TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1180 ASSERT_NO_FATAL_FAILURE(Init());
1181
1182 // variation on previous test executing the same CB twice in the same
1183 // CmdExecuteCommands call
1184
John Zulauff1640d12019-08-13 15:39:58 -06001185 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001186
1187 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1188
sfricke-samsung1c61f192021-12-31 01:53:03 -06001189 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001190 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1191
1192 secondary.begin(&cbbi);
1193 secondary.end();
1194
1195 m_commandBuffer->begin();
1196 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001198 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001199 m_errorMonitor->VerifyFound();
1200 m_commandBuffer->end();
1201}
1202
1203TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1204 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1205 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1206 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1207 ASSERT_NO_FATAL_FAILURE(Init());
1208
1209 VkCommandBuffer cmd_bufs[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06001210 VkCommandBufferAllocateInfo alloc_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06001211 alloc_info.commandBufferCount = 2;
1212 alloc_info.commandPool = m_commandPool->handle();
1213 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001214 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001215
sfricke-samsung1c61f192021-12-31 01:53:03 -06001216 VkCommandBufferBeginInfo cb_binfo = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -06001217 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1218 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001219 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001220 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001221 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1222 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001223 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1224
sfricke-samsung1c61f192021-12-31 01:53:03 -06001225 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06001226 submit_info.commandBufferCount = 2;
1227 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001229 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001230 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001231 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001232
1233 // Set one time use and now look for one time submit
1234 duplicates[0] = duplicates[1] = cmd_bufs[1];
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06001235 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001236 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1237 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1238 vk::EndCommandBuffer(cmd_bufs[1]);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06001239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-pCommandBuffers-00071");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001241 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001242 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001243 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001244}
1245
1246TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1247 TEST_DESCRIPTION(
1248 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1249
Mark Lobodzinski20310782020-02-28 14:25:17 -07001250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001251
1252 ASSERT_NO_FATAL_FAILURE(Init());
1253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1254
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001255 char const *fsSource = R"glsl(
1256 #version 450
1257 layout(set=0, binding=0) uniform sampler3D s;
1258 layout(location=0) out vec4 color;
1259 void main() {
1260 color = texture(s, vec3(0));
1261 }
1262 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001263 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1264 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001265
1266 VkPipelineObj pipe(m_device);
1267 pipe.AddShader(&vs);
1268 pipe.AddShader(&fs);
1269 pipe.AddDefaultColorAttachment();
1270
1271 VkTextureObj texture(m_device, nullptr);
1272 VkSamplerObj sampler(m_device);
1273
1274 VkDescriptorSetObj descriptorSet(m_device);
1275 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1276 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1277
1278 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1279 ASSERT_VK_SUCCESS(err);
1280
1281 m_commandBuffer->begin();
1282 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1283
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001284 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001285 m_commandBuffer->BindDescriptorSet(descriptorSet);
1286
1287 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001288 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001289 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001290 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001291
1292 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001293 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001294
1295 m_errorMonitor->VerifyFound();
1296
1297 m_commandBuffer->EndRenderPass();
1298 m_commandBuffer->end();
1299}
1300
1301TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1302 TEST_DESCRIPTION(
1303 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1304 "vice versa.");
1305
Mark Lobodzinski20310782020-02-28 14:25:17 -07001306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001307
1308 ASSERT_NO_FATAL_FAILURE(Init());
1309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1310
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001311 char const *fsSource = R"glsl(
1312 #version 450
1313 layout(set=0, binding=0) uniform sampler2DMS s;
1314 layout(location=0) out vec4 color;
1315 void main() {
1316 color = texelFetch(s, ivec2(0), 0);
1317 }
1318 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001319 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1320 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001321
1322 VkPipelineObj pipe(m_device);
1323 pipe.AddShader(&vs);
1324 pipe.AddShader(&fs);
1325 pipe.AddDefaultColorAttachment();
1326
1327 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1328 VkSamplerObj sampler(m_device);
1329
1330 VkDescriptorSetObj descriptorSet(m_device);
1331 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1333
1334 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1335 ASSERT_VK_SUCCESS(err);
1336
1337 m_commandBuffer->begin();
1338 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1339
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001340 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001341 m_commandBuffer->BindDescriptorSet(descriptorSet);
1342
1343 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001344 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001345 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001346 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001347
1348 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001349 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001350
1351 m_errorMonitor->VerifyFound();
1352
1353 m_commandBuffer->EndRenderPass();
1354 m_commandBuffer->end();
1355}
1356
1357TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1358 TEST_DESCRIPTION(
1359 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1360
Mark Lobodzinski20310782020-02-28 14:25:17 -07001361 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001362
1363 ASSERT_NO_FATAL_FAILURE(Init());
1364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1365
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001366 char const *fsSource = R"glsl(
1367 #version 450
1368 layout(set=0, binding=0) uniform isampler2D s;
1369 layout(location=0) out vec4 color;
1370 void main() {
1371 color = texelFetch(s, ivec2(0), 0);
1372 }
1373 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001374 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1375 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001376
1377 VkPipelineObj pipe(m_device);
1378 pipe.AddShader(&vs);
1379 pipe.AddShader(&fs);
1380 pipe.AddDefaultColorAttachment();
1381
1382 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1383 VkSamplerObj sampler(m_device);
1384
1385 VkDescriptorSetObj descriptorSet(m_device);
1386 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1387 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1388
1389 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1390 ASSERT_VK_SUCCESS(err);
1391
1392 m_commandBuffer->begin();
1393 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1394
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001395 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001396 m_commandBuffer->BindDescriptorSet(descriptorSet);
1397
1398 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001399 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001400 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001401 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001402
1403 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001404 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001405
1406 m_errorMonitor->VerifyFound();
1407
1408 m_commandBuffer->EndRenderPass();
1409 m_commandBuffer->end();
1410}
1411
unknown088160a2019-05-23 17:43:13 -06001412TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1413 TEST_DESCRIPTION(
1414 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001415 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1416 bool maintenance1 = false;
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001417 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
1418 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung30b094c2020-05-30 11:42:11 -07001419 maintenance1 = true;
1420 }
1421 ASSERT_NO_FATAL_FAILURE(InitState());
1422
1423 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1424 VkFormatProperties format_props;
1425 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1426 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1427 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1428 return;
1429 }
unknown088160a2019-05-23 17:43:13 -06001430
1431 // Create two images to copy between
1432 VkImageObj src_image_obj(m_device);
1433 VkImageObj dst_image_obj(m_device);
1434
sfricke-samsung1c61f192021-12-31 01:53:03 -06001435 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001436 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001437 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001438 image_create_info.extent.width = 32;
1439 image_create_info.extent.height = 32;
1440 image_create_info.extent.depth = 1;
1441 image_create_info.mipLevels = 1;
1442 image_create_info.arrayLayers = 4;
1443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1444 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1445 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1446 image_create_info.flags = 0;
1447
1448 src_image_obj.init(&image_create_info);
1449 ASSERT_TRUE(src_image_obj.initialized());
1450
1451 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1452 dst_image_obj.init(&image_create_info);
1453 ASSERT_TRUE(dst_image_obj.initialized());
1454
1455 m_commandBuffer->begin();
1456 VkImageCopy copyRegion;
1457 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1458 copyRegion.srcSubresource.mipLevel = 0;
1459 copyRegion.srcSubresource.baseArrayLayer = 0;
1460 copyRegion.srcSubresource.layerCount = 1;
1461 copyRegion.srcOffset.x = 0;
1462 copyRegion.srcOffset.y = 0;
1463 copyRegion.srcOffset.z = 0;
1464 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1465 copyRegion.dstSubresource.mipLevel = 0;
1466 copyRegion.dstSubresource.baseArrayLayer = 0;
1467 // Introduce failure by forcing the dst layerCount to differ from src
1468 copyRegion.dstSubresource.layerCount = 3;
1469 copyRegion.dstOffset.x = 0;
1470 copyRegion.dstOffset.y = 0;
1471 copyRegion.dstOffset.z = 0;
1472 copyRegion.extent.width = 1;
1473 copyRegion.extent.height = 1;
1474 copyRegion.extent.depth = 1;
1475
sfricke-samsung30b094c2020-05-30 11:42:11 -07001476 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001478 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1479 &copyRegion);
1480 m_errorMonitor->VerifyFound();
1481}
1482
1483TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1484 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1485
Jeff Leger465acf52020-10-12 18:07:16 -04001486 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1487
1488 bool copy_commands2 = false;
1489 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1490 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1491 copy_commands2 = true;
1492 }
1493 ASSERT_NO_FATAL_FAILURE(InitState());
1494
1495 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001496 if (copy_commands2) {
1497 vkCmdCopyBufferToImage2Function =
1498 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001499 }
unknown088160a2019-05-23 17:43:13 -06001500
1501 VkPhysicalDeviceFeatures device_features = {};
1502 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1503 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1504 if (device_features.textureCompressionBC) {
1505 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1506 } else if (device_features.textureCompressionETC2) {
1507 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1508 } else if (device_features.textureCompressionASTC_LDR) {
1509 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1510 } else {
1511 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1512 return;
1513 }
1514
sfricke-samsung1c61f192021-12-31 01:53:03 -06001515 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001516 ci.flags = 0;
1517 ci.imageType = VK_IMAGE_TYPE_2D;
1518 ci.format = compressed_format;
1519 ci.extent = {32, 32, 1};
1520 ci.mipLevels = 6;
1521 ci.arrayLayers = 1;
1522 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1523 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1524 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1525 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1526 ci.queueFamilyIndexCount = 0;
1527 ci.pQueueFamilyIndices = NULL;
1528 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1529
1530 VkImageObj image(m_device);
1531 image.init(&ci);
1532 ASSERT_TRUE(image.initialized());
1533
1534 VkImageObj odd_image(m_device);
1535 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1536 odd_image.init(&ci);
1537 ASSERT_TRUE(odd_image.initialized());
1538
1539 // Allocate buffers
1540 VkMemoryPropertyFlags reqs = 0;
1541 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1542 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1543 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1544 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1545 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1546
1547 VkBufferImageCopy region = {};
1548 region.bufferRowLength = 0;
1549 region.bufferImageHeight = 0;
1550 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1551 region.imageSubresource.layerCount = 1;
1552 region.imageOffset = {0, 0, 0};
1553 region.bufferOffset = 0;
1554
1555 // start recording
1556 m_commandBuffer->begin();
1557
locke-lunargdf00db02020-03-04 19:00:57 -07001558 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001559 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001560 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1561 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001562 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001563 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1564 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001565 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001566 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1567 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1568
unknown088160a2019-05-23 17:43:13 -06001569 // Mip level copies that work - 5 levels
1570 m_errorMonitor->ExpectSuccess();
1571
1572 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1573 region.imageExtent = {32, 32, 1};
1574 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001575 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001576
1577 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1578 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001579 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001580
1581 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1582 region.imageExtent = {8, 8, 1};
1583 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001584 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001585
1586 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1587 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001588 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001589
1590 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1591 region.imageExtent = {4, 4, 1};
1592 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001593 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001594
1595 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1596 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001597 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001598
1599 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1600 region.imageExtent = {2, 2, 1};
1601 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001602
1603 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1604 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001605 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001606
1607 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1608 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001609 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001610
1611 region.imageExtent = {1, 1, 1};
1612 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001613
1614 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1615 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001616 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001617
1618 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1619 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001620 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001621 m_errorMonitor->VerifyNotFound();
1622
1623 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001625 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001626 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001628 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001629 m_errorMonitor->VerifyFound();
1630
1631 // Copy width < compressed block size, but not the full mip width
1632 region.imageExtent = {1, 2, 1};
1633 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001634 // width not a multiple of compressed block width
1635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001637 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001638 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001639 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001640
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001641 m_errorMonitor->SetDesiredFailureMsg(
1642 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001643 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001644 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001645 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001646 m_errorMonitor->VerifyFound();
1647
1648 // Copy height < compressed block size but not the full mip height
1649 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001650 m_errorMonitor->SetDesiredFailureMsg(
1651 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001653 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001654 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001655 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001656
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001657 m_errorMonitor->SetDesiredFailureMsg(
1658 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001659 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001660 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001661 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001662 m_errorMonitor->VerifyFound();
1663
1664 // Offsets must be multiple of compressed block size
1665 region.imageOffset = {1, 1, 0};
1666 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001667 // imageOffset not a multiple of block size
1668 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001670 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001671 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001672 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001673
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001674 m_errorMonitor->SetDesiredFailureMsg(
1675 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001677 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
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->VerifyFound();
1680
Jeff Leger465acf52020-10-12 18:07:16 -04001681 // Equivalent test using KHR_copy_commands2
1682 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1683 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1684 NULL,
1685 region.bufferOffset,
1686 region.bufferRowLength,
1687 region.bufferImageHeight,
1688 region.imageSubresource,
1689 region.imageOffset,
1690 region.imageExtent};
1691 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1692 NULL,
1693 buffer_16.handle(),
1694 image.handle(),
1695 VK_IMAGE_LAYOUT_GENERAL,
1696 1,
1697 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001698 m_errorMonitor->SetDesiredFailureMsg(
Tony-LunarG953d55a2021-11-11 14:20:25 -07001699 kErrorBit, "VUID-VkCopyBufferToImageInfo2-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001700 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Tony-LunarG953d55a2021-11-11 14:20:25 -07001701 "VUID-VkCopyBufferToImageInfo2-imageOffset-01793"); // image transfer granularity
Jeff Leger465acf52020-10-12 18:07:16 -04001702 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1703 m_errorMonitor->VerifyFound();
1704 }
1705
unknown088160a2019-05-23 17:43:13 -06001706 // Offset + extent width = mip width - should succeed
1707 region.imageOffset = {4, 4, 0};
1708 region.imageExtent = {3, 4, 1};
1709 region.imageSubresource.mipLevel = 2;
1710 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001711
1712 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1713 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001714 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1715 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001716
1717 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1718 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001719 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1720 &region);
unknown088160a2019-05-23 17:43:13 -06001721 m_errorMonitor->VerifyNotFound();
1722
unknown088160a2019-05-23 17:43:13 -06001723 // Offset + extent width < mip width and not a multiple of block width - should fail
1724 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001725 m_errorMonitor->SetDesiredFailureMsg(
1726 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
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(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1730 &region);
unknown088160a2019-05-23 17:43:13 -06001731 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001732 m_errorMonitor->SetDesiredFailureMsg(
1733 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
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(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1737 &region);
unknown088160a2019-05-23 17:43:13 -06001738 m_errorMonitor->VerifyFound();
1739}
1740
1741TEST_F(VkLayerTest, ImageBufferCopyTests) {
1742 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001743
1744 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1745 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1746 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1747 if (mp_extensions) {
1748 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1749 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001750 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001751 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001752 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1753 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1754 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1755 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001756 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001757 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1758 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1759 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1760 }
1761 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001762
1763 // Bail if any dimension of transfer granularity is 0.
1764 auto index = m_device->graphics_queue_node_index_;
1765 auto queue_family_properties = m_device->phy().queue_properties();
1766 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1767 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1768 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1769 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1770 return;
1771 }
1772
sfricke-samsung6d97e562020-01-07 22:01:00 -08001773 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1774 // 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 -07001775 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1776 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001777 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001778 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1779 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1780 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1781 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1782 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001783 // compression
1784 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1785 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1786 // multi-planar
1787 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 -06001788
sfricke-samsung6d97e562020-01-07 22:01:00 -08001789 // Verify R8G8B8A8_UINT format is supported for transfer
1790 bool missing_rgba_support = false;
1791 VkFormatProperties props = {0, 0, 0};
1792 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1793 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1794 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1795 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1796
1797 if (!missing_rgba_support) {
1798 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1799 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1800 VK_IMAGE_TILING_OPTIMAL, 0);
1801 ASSERT_TRUE(image_64k.initialized());
1802
1803 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1804 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1805 VK_IMAGE_TILING_OPTIMAL, 0);
1806 ASSERT_TRUE(image_16k.initialized());
1807 }
unknown088160a2019-05-23 17:43:13 -06001808
1809 // Verify all needed Depth/Stencil formats are supported
1810 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001811 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001812 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1813 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1814 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001815 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001816 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1817 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1818 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001819 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001820 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1821 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1822 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001823 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001824 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1825 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1826 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1827
1828 if (!missing_ds_support) {
1829 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1830 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1831 ASSERT_TRUE(image_16k_depth.initialized());
1832
1833 ds_image_4D_1S.Init(
1834 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1835 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1836 VK_IMAGE_TILING_OPTIMAL, 0);
1837 ASSERT_TRUE(ds_image_4D_1S.initialized());
1838
1839 ds_image_3D_1S.Init(
1840 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1841 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1842 VK_IMAGE_TILING_OPTIMAL, 0);
1843 ASSERT_TRUE(ds_image_3D_1S.initialized());
1844
1845 ds_image_2D.Init(
1846 256, 256, 1, VK_FORMAT_D16_UNORM,
1847 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1848 VK_IMAGE_TILING_OPTIMAL, 0);
1849 ASSERT_TRUE(ds_image_2D.initialized());
1850
1851 ds_image_1S.Init(
1852 256, 256, 1, VK_FORMAT_S8_UINT,
1853 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1854 VK_IMAGE_TILING_OPTIMAL, 0);
1855 ASSERT_TRUE(ds_image_1S.initialized());
1856 }
1857
1858 // Allocate buffers
1859 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1860 VkMemoryPropertyFlags reqs = 0;
1861 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1862 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1863 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1864 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1865
1866 VkBufferImageCopy region = {};
1867 region.bufferRowLength = 0;
1868 region.bufferImageHeight = 0;
1869 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1870 region.imageSubresource.layerCount = 1;
1871 region.imageOffset = {0, 0, 0};
1872 region.imageExtent = {64, 64, 1};
1873 region.bufferOffset = 0;
1874
locke-lunargdf00db02020-03-04 19:00:57 -07001875 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001876 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001877 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1878 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001879 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001880 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1881 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001882 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001883 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1884 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1885
sfricke-samsung6d97e562020-01-07 22:01:00 -08001886 if (missing_rgba_support) {
1887 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001888
sfricke-samsung6d97e562020-01-07 22:01:00 -08001889 // start recording for future tests
1890 m_commandBuffer->begin();
1891 } else {
1892 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001893 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001894 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1895 &region);
unknown088160a2019-05-23 17:43:13 -06001896 m_errorMonitor->VerifyFound();
1897
Mark Lobodzinski20310782020-02-28 14:25:17 -07001898 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001899 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1900 &region);
1901 m_errorMonitor->VerifyFound();
1902
1903 // start recording
1904 m_commandBuffer->begin();
1905
1906 // successful copies
1907 m_errorMonitor->ExpectSuccess();
1908 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1909 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001910
1911 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1912 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001913 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1914 &region);
1915 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001916
1917 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1918 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001919 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1920 &region);
1921 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001922
1923 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1924 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001925 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1926 &region);
1927 region.imageOffset.x = 0;
1928 region.imageExtent.height = 64;
1929 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001930
1931 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1932 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001933 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1934 &region);
1935 m_errorMonitor->VerifyNotFound();
1936
1937 // image/buffer too small (extent too large) on copy to image
1938 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001940 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1941 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1942 &region);
1943 m_errorMonitor->VerifyFound();
1944
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001945 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001947 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001948 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1949 &region);
1950 m_errorMonitor->VerifyFound();
1951
1952 // image/buffer too small (offset) on copy to image
1953 region.imageExtent = {64, 64, 1};
1954 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001955 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001956 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1957 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1958 &region);
1959 m_errorMonitor->VerifyFound();
1960
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001961 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
1962 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001963 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001964 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001965 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1966 &region);
1967 m_errorMonitor->VerifyFound();
1968
1969 // image/buffer too small on copy to buffer
1970 region.imageExtent = {64, 64, 1};
1971 region.imageOffset = {0, 0, 0};
1972 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001973 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001974 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
1975 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1976 &region);
1977 m_errorMonitor->VerifyFound();
1978
1979 region.imageExtent = {64, 65, 1};
1980 region.bufferOffset = 0;
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001981 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001983 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001984 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1985 &region);
1986 m_errorMonitor->VerifyFound();
1987
1988 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07001989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001990 region.imageExtent = {64, 64, 1};
1991 region.bufferRowLength = 68;
1992 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1993 &region);
1994 m_errorMonitor->VerifyFound();
1995
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05001996 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06659");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001997 region.imageExtent.width = 0;
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05001998 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001999 &region);
2000 m_errorMonitor->VerifyFound();
2001
2002 // aspect bits
2003 region.imageExtent = {64, 64, 1};
2004 region.bufferRowLength = 0;
2005 region.bufferImageHeight = 0;
2006 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002008 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2009 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2010 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2011 buffer_16k.handle(), 1, &region);
2012 m_errorMonitor->VerifyFound();
2013
Mark Lobodzinski20310782020-02-28 14:25:17 -07002014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002015 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002016 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2017 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2018 buffer_16k.handle(), 1, &region);
2019 m_errorMonitor->VerifyFound();
2020 }
2021
Mark Lobodzinski20310782020-02-28 14:25:17 -07002022 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002023 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002024 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2025 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2026 &region);
2027 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002028 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002029
2030 // Out-of-range mip levels should fail
2031 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002032 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002033 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06221");
2034 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002035 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002036 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002037 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002038 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002039 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2040 &region);
2041 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002043 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2044 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002045 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002046 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002047 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002048 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002049 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2050 &region);
2051 m_errorMonitor->VerifyFound();
2052 region.imageSubresource.mipLevel = 0;
2053
2054 // Out-of-range array layers should fail
2055 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2056 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002057 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002058 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2059 &region);
2060 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002062 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2063 &region);
2064 m_errorMonitor->VerifyFound();
2065 region.imageSubresource.baseArrayLayer = 0;
2066
2067 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002069 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2070 buffer_16k.handle(), 1, &region);
2071 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002072 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002073 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2074 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002075 m_errorMonitor->VerifyFound();
2076 }
2077
unknown088160a2019-05-23 17:43:13 -06002078 // Test Depth/Stencil copies
2079 if (missing_ds_support) {
2080 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2081 } else {
2082 VkBufferImageCopy ds_region = {};
2083 ds_region.bufferOffset = 0;
2084 ds_region.bufferRowLength = 0;
2085 ds_region.bufferImageHeight = 0;
2086 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2087 ds_region.imageSubresource.mipLevel = 0;
2088 ds_region.imageSubresource.baseArrayLayer = 0;
2089 ds_region.imageSubresource.layerCount = 1;
2090 ds_region.imageOffset = {0, 0, 0};
2091 ds_region.imageExtent = {256, 256, 1};
2092
2093 // Depth copies that should succeed
2094 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002095 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2096 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002097 m_errorMonitor->VerifyNotFound();
2098
2099 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002100 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2101 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002102 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2103 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002104 m_errorMonitor->VerifyNotFound();
2105
2106 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002107 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2108 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002109 m_errorMonitor->VerifyNotFound();
2110
2111 // Depth copies that should fail
2112 ds_region.bufferOffset = 4;
2113 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002114 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002115 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002116 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2117 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002118 m_errorMonitor->VerifyFound();
2119
2120 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002121 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002122 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002123 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002124 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002125 m_errorMonitor->VerifyFound();
2126
2127 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002128 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002129 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002130 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2131 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002132 m_errorMonitor->VerifyFound();
2133
sfricke-samsung5a019492021-01-25 10:32:08 -08002134 ds_region.bufferOffset = 5;
2135 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2136 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2137 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2138 buffer_128k.handle(), 1, &ds_region);
2139 m_errorMonitor->VerifyFound();
2140 ds_region.imageExtent = {256, 256, 1};
2141
unknown088160a2019-05-23 17:43:13 -06002142 // Stencil copies that should succeed
2143 ds_region.bufferOffset = 0;
2144 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2145 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002146 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2147 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002148 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2149 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002150 m_errorMonitor->VerifyNotFound();
2151
2152 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002153 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2154 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002155 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2156 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002157 m_errorMonitor->VerifyNotFound();
2158
2159 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002160 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2161 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002162 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2163 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002164 m_errorMonitor->VerifyNotFound();
2165
2166 // Stencil copies that should fail
2167 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002168 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002169 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002170 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2171 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002172 m_errorMonitor->VerifyFound();
2173
2174 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002175 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002176 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2177 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002178 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2179 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002180 m_errorMonitor->VerifyFound();
2181
2182 ds_region.bufferRowLength = 0;
2183 ds_region.bufferOffset = 4;
2184 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002185 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002186 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002187 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2188 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002189 m_errorMonitor->VerifyFound();
2190 }
2191
2192 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002193 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002194 VkPhysicalDeviceFeatures device_features = {};
2195 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2196 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2197 device_features.textureCompressionASTC_LDR)) {
2198 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2199 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002200 // Verify transfer support for each compression format used blow
2201 bool missing_bc_support = false;
2202 bool missing_etc_support = false;
2203 bool missing_astc_support = false;
2204 bool missing_compression_support = false;
2205
2206 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2207 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2208 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2209 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2210
2211 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2212 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2213 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2214 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2215
2216 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2217 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2218 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2219 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2220
2221 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002222 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2223 0);
2224 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2225 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002226 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002227 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2228 VK_IMAGE_TILING_OPTIMAL, 0);
2229 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2230 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002231 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002232 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2233 VK_IMAGE_TILING_OPTIMAL, 0);
2234 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2235 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002236 } else {
2237 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002238 }
unknown088160a2019-05-23 17:43:13 -06002239
sfricke-samsung6d97e562020-01-07 22:01:00 -08002240 if (missing_compression_support) {
2241 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2242 } else {
2243 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002244 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002245 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002246 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2247 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002248 m_errorMonitor->ExpectSuccess();
2249 region.imageExtent = {128, 128, 1};
2250 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2251 buffer_16k.handle(), 1, &region);
2252 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002253
sfricke-samsung6d97e562020-01-07 22:01:00 -08002254 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002255 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002256 region.bufferOffset = 16;
2257 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2258 buffer_16k.handle(), 1, &region);
2259 m_errorMonitor->VerifyFound();
2260 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002261
sfricke-samsung6d97e562020-01-07 22:01:00 -08002262 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002263 m_errorMonitor->SetDesiredFailureMsg(
2264 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002265 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002266 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2267 region.imageExtent.width = 66;
2268 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2269 buffer_16k.handle(), 1, &region);
2270 m_errorMonitor->VerifyFound();
2271 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002272
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002273 m_errorMonitor->SetDesiredFailureMsg(
2274 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002275 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002276 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2277 region.imageExtent.height = 2;
2278 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2279 buffer_16k.handle(), 1, &region);
2280 m_errorMonitor->VerifyFound();
2281 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002282
sfricke-samsung6d97e562020-01-07 22:01:00 -08002283 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002284
sfricke-samsung6d97e562020-01-07 22:01:00 -08002285 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2286 m_errorMonitor->ExpectSuccess();
2287 region.imageExtent.width = 66;
2288 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002289 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2290 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002291 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2292 buffer_16k.handle(), 1, &region);
2293 region.imageExtent.width = 16;
2294 region.imageOffset.x = 0;
2295 region.imageExtent.height = 2;
2296 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002297 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2298 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002299 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2300 buffer_16k.handle(), 1, &region);
2301 m_errorMonitor->VerifyNotFound();
2302 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002303
sfricke-samsung6d97e562020-01-07 22:01:00 -08002304 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002306 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002307 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002309 region.imageExtent = {64, 64, 1};
2310 region.bufferOffset = 24;
2311 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2312 buffer_16k.handle(), 1, &region);
2313 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002314
sfricke-samsung6d97e562020-01-07 22:01:00 -08002315 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002317 region.bufferOffset = 0;
2318 region.bufferRowLength = 130;
2319 region.bufferImageHeight = 0;
2320 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2321 buffer_64k.handle(), 1, &region);
2322 m_errorMonitor->VerifyFound();
2323
2324 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002325 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002326 region.bufferRowLength = 0;
2327 region.bufferImageHeight = 130;
2328 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2329 buffer_64k.handle(), 1, &region);
2330 m_errorMonitor->VerifyFound();
2331 }
2332 }
2333
2334 // Test multi-planar formats, if supported
2335 if (!mp_extensions) {
2336 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2337 } else {
2338 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2339 // being required with samplerYcbcrConversion feature
2340 bool missing_mp_support = false;
2341 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2342 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2343 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2344 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2345
2346 if (missing_mp_support) {
2347 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2348 } else {
2349 VkBufferImageCopy mp_region = {};
2350 mp_region.bufferOffset = 0;
2351 mp_region.bufferRowLength = 0;
2352 mp_region.bufferImageHeight = 0;
2353 mp_region.imageSubresource.mipLevel = 0;
2354 mp_region.imageSubresource.baseArrayLayer = 0;
2355 mp_region.imageSubresource.layerCount = 1;
2356 mp_region.imageOffset = {0, 0, 0};
2357 mp_region.imageExtent = {128, 128, 1};
2358
2359 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2360 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2361 VK_IMAGE_TILING_OPTIMAL, 0);
2362 ASSERT_TRUE(image_multi_planar.initialized());
2363
2364 // Copies into a mutli-planar image aspect properly
2365 m_errorMonitor->ExpectSuccess();
2366 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002367 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2368 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002369 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2370 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2371 m_errorMonitor->VerifyNotFound();
2372
2373 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002374 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002375 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2376 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2377 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2378 m_errorMonitor->VerifyFound();
2379
2380 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002381 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002382 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2383 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2384 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2385 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002386
2387 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002388 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002389 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2390 mp_region.bufferOffset = 5;
2391 mp_region.imageExtent = {8, 8, 1};
2392 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2393 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2394 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002395 }
unknown088160a2019-05-23 17:43:13 -06002396 }
2397}
2398
2399TEST_F(VkLayerTest, MiscImageLayerTests) {
2400 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2401
2402 ASSERT_NO_FATAL_FAILURE(Init());
2403
2404 // TODO: Ideally we should check if a format is supported, before using it.
2405 VkImageObj image(m_device);
2406 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2407 ASSERT_TRUE(image.initialized());
2408 VkBufferObj buffer;
2409 VkMemoryPropertyFlags reqs = 0;
2410 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2411 VkBufferImageCopy region = {};
2412 region.bufferRowLength = 128;
2413 region.bufferImageHeight = 128;
2414 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2415 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2416 region.imageSubresource.layerCount = 1;
2417 region.imageExtent.height = 4;
2418 region.imageExtent.width = 4;
2419 region.imageExtent.depth = 1;
2420
2421 VkImageObj image2(m_device);
2422 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2423 ASSERT_TRUE(image2.initialized());
2424 VkBufferObj buffer2;
2425 VkMemoryPropertyFlags reqs2 = 0;
2426 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002427 m_commandBuffer->begin();
2428
2429 // Image must have offset.z of 0 and extent.depth of 1
2430 // Introduce failure by setting imageExtent.depth to 0
2431 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002432 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05002433 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002434 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2435 &region);
unknown088160a2019-05-23 17:43:13 -06002436 m_errorMonitor->VerifyFound();
2437
2438 region.imageExtent.depth = 1;
2439
2440 // Image must have offset.z of 0 and extent.depth of 1
2441 // Introduce failure by setting imageOffset.z to 4
2442 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2443 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002444 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002446 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-06217");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002447 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2448 &region);
unknown088160a2019-05-23 17:43:13 -06002449 m_errorMonitor->VerifyFound();
2450
2451 region.imageOffset.z = 0;
2452 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2453 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2454 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002455 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002456 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2457 &region);
unknown088160a2019-05-23 17:43:13 -06002458 m_errorMonitor->VerifyFound();
2459
unknown088160a2019-05-23 17:43:13 -06002460 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2461 region.bufferOffset = 0;
2462 region.imageExtent.height = 128;
2463 region.imageExtent.width = 128;
2464 // Introduce failure by setting bufferRowLength > 0 but less than width
2465 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002467 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2468 &region);
unknown088160a2019-05-23 17:43:13 -06002469 m_errorMonitor->VerifyFound();
2470
2471 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2472 region.bufferRowLength = 128;
2473 // Introduce failure by setting bufferRowHeight > 0 but less than height
2474 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002475 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002476 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2477 &region);
unknown088160a2019-05-23 17:43:13 -06002478 m_errorMonitor->VerifyFound();
2479
2480 region.bufferImageHeight = 128;
2481 VkImageObj intImage1(m_device);
2482 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2483 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2484 VkImageObj intImage2(m_device);
2485 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2486 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2487 VkImageBlit blitRegion = {};
2488 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2489 blitRegion.srcSubresource.baseArrayLayer = 0;
2490 blitRegion.srcSubresource.layerCount = 1;
2491 blitRegion.srcSubresource.mipLevel = 0;
2492 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2493 blitRegion.dstSubresource.baseArrayLayer = 0;
2494 blitRegion.dstSubresource.layerCount = 1;
2495 blitRegion.dstSubresource.mipLevel = 0;
2496 blitRegion.srcOffsets[0] = {128, 0, 0};
2497 blitRegion.srcOffsets[1] = {128, 128, 1};
2498 blitRegion.dstOffsets[0] = {0, 128, 0};
2499 blitRegion.dstOffsets[1] = {128, 128, 1};
2500
2501 // Look for NULL-blit warning
sfricke-samsung85584a72021-09-30 21:43:38 -07002502 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
2503 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002504 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2505 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002506 m_errorMonitor->VerifyFound();
2507}
2508
2509TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2510 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002511 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2512
2513 bool copy_commands2 = false;
2514 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2515 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2516 copy_commands2 = true;
2517 }
2518 ASSERT_NO_FATAL_FAILURE(InitState());
2519
2520 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2521 if (copy_commands2) {
2522 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2523 }
unknown088160a2019-05-23 17:43:13 -06002524
sfricke-samsung30b094c2020-05-30 11:42:11 -07002525 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2526 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
sjfricke50955f32022-06-05 10:12:52 +09002527 GTEST_SKIP() << "Tests for 1.0 only";
sfricke-samsung30b094c2020-05-30 11:42:11 -07002528 }
2529
sfricke-samsung1c61f192021-12-31 01:53:03 -06002530 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002531 ci.flags = 0;
2532 ci.imageType = VK_IMAGE_TYPE_1D;
2533 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2534 ci.extent = {32, 1, 1};
2535 ci.mipLevels = 1;
2536 ci.arrayLayers = 1;
2537 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2538 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2539 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2540 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2541 ci.queueFamilyIndexCount = 0;
2542 ci.pQueueFamilyIndices = NULL;
2543 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2544
2545 // Create 1D image
2546 VkImageObj image_1D(m_device);
2547 image_1D.init(&ci);
2548 ASSERT_TRUE(image_1D.initialized());
2549
2550 // 2D image
2551 ci.imageType = VK_IMAGE_TYPE_2D;
2552 ci.extent = {32, 32, 1};
2553 VkImageObj image_2D(m_device);
2554 image_2D.init(&ci);
2555 ASSERT_TRUE(image_2D.initialized());
2556
2557 // 3D image
2558 ci.imageType = VK_IMAGE_TYPE_3D;
2559 ci.extent = {32, 32, 8};
2560 VkImageObj image_3D(m_device);
2561 image_3D.init(&ci);
2562 ASSERT_TRUE(image_3D.initialized());
2563
2564 // 2D image array
2565 ci.imageType = VK_IMAGE_TYPE_2D;
2566 ci.extent = {32, 32, 1};
2567 ci.arrayLayers = 8;
2568 VkImageObj image_2D_array(m_device);
2569 image_2D_array.init(&ci);
2570 ASSERT_TRUE(image_2D_array.initialized());
2571
2572 m_commandBuffer->begin();
2573
2574 VkImageCopy copy_region;
2575 copy_region.extent = {32, 1, 1};
2576 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2577 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2578 copy_region.srcSubresource.mipLevel = 0;
2579 copy_region.dstSubresource.mipLevel = 0;
2580 copy_region.srcSubresource.baseArrayLayer = 0;
2581 copy_region.dstSubresource.baseArrayLayer = 0;
2582 copy_region.srcSubresource.layerCount = 1;
2583 copy_region.dstSubresource.layerCount = 1;
2584 copy_region.srcOffset = {0, 0, 0};
2585 copy_region.dstOffset = {0, 0, 0};
2586
2587 // Sanity check
2588 m_errorMonitor->ExpectSuccess();
2589 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2590 &copy_region);
2591 m_errorMonitor->VerifyNotFound();
2592
Jeff Leger465acf52020-10-12 18:07:16 -04002593 // Equivalent sanity check using KHR_copy_commands2
2594 if (copy_commands2 && vkCmdCopyImage2Function) {
2595 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2596 NULL,
2597 copy_region.srcSubresource,
2598 copy_region.srcOffset,
2599 copy_region.dstSubresource,
2600 copy_region.dstOffset,
2601 copy_region.extent};
2602 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2603 NULL,
2604 image_1D.image(),
2605 VK_IMAGE_LAYOUT_GENERAL,
2606 image_2D.image(),
2607 VK_IMAGE_LAYOUT_GENERAL,
2608 1,
2609 &region2};
2610 m_errorMonitor->ExpectSuccess();
2611 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2612 m_errorMonitor->VerifyNotFound();
2613 }
2614
unknown088160a2019-05-23 17:43:13 -06002615 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2616 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002617 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002619 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2620 &copy_region);
2621 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002622
2623 // Equivalent test using KHR_copy_commands2
2624 if (copy_commands2 && vkCmdCopyImage2Function) {
2625 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2626 NULL,
2627 copy_region.srcSubresource,
2628 copy_region.srcOffset,
2629 copy_region.dstSubresource,
2630 copy_region.dstOffset,
2631 copy_region.extent};
2632 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2633 NULL,
2634 image_1D.image(),
2635 VK_IMAGE_LAYOUT_GENERAL,
2636 image_2D.image(),
2637 VK_IMAGE_LAYOUT_GENERAL,
2638 1,
2639 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2641 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002642 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2643 m_errorMonitor->VerifyFound();
2644 }
2645
unknown088160a2019-05-23 17:43:13 -06002646 copy_region.srcOffset.y = 0;
2647 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002650 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2651 &copy_region);
2652 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002653
2654 // Equivalent test 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_2D.image(),
2666 VK_IMAGE_LAYOUT_GENERAL,
2667 image_1D.image(),
2668 VK_IMAGE_LAYOUT_GENERAL,
2669 1,
2670 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002671 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002673 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2674 m_errorMonitor->VerifyFound();
2675 }
2676
unknown088160a2019-05-23 17:43:13 -06002677 copy_region.dstOffset.y = 0;
2678
2679 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2680 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002683 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2684 &copy_region);
2685 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002686
2687 // Equivalent test using KHR_copy_commands2
2688 if (copy_commands2 && vkCmdCopyImage2Function) {
2689 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2690 NULL,
2691 copy_region.srcSubresource,
2692 copy_region.srcOffset,
2693 copy_region.dstSubresource,
2694 copy_region.dstOffset,
2695 copy_region.extent};
2696 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2697 NULL,
2698 image_1D.image(),
2699 VK_IMAGE_LAYOUT_GENERAL,
2700 image_2D.image(),
2701 VK_IMAGE_LAYOUT_GENERAL,
2702 1,
2703 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002706 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2707 m_errorMonitor->VerifyFound();
2708 }
2709
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002712 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2713 &copy_region);
2714 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002715
2716 // Equivalent test using KHR_copy_commands2
2717 if (copy_commands2 && vkCmdCopyImage2Function) {
2718 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2719 NULL,
2720 copy_region.srcSubresource,
2721 copy_region.srcOffset,
2722 copy_region.dstSubresource,
2723 copy_region.dstOffset,
2724 copy_region.extent};
2725 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2726 NULL,
2727 image_2D.image(),
2728 VK_IMAGE_LAYOUT_GENERAL,
2729 image_1D.image(),
2730 VK_IMAGE_LAYOUT_GENERAL,
2731 1,
2732 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002735 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2736 m_errorMonitor->VerifyFound();
2737 }
2738
unknown088160a2019-05-23 17:43:13 -06002739 copy_region.extent.height = 1;
2740
2741 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2742 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002745 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2746 &copy_region);
2747 m_errorMonitor->VerifyFound();
2748 copy_region.srcOffset.z = 0;
2749 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002750 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2751 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002752 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2753 &copy_region);
2754 m_errorMonitor->VerifyFound();
2755 copy_region.dstOffset.z = 0;
2756
2757 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2758 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002761 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002763 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002764 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002765 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002766 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2767 &copy_region);
2768 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002770 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002771 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002773 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002774 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002775 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002776 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2777 &copy_region);
2778 m_errorMonitor->VerifyFound();
2779 copy_region.extent.depth = 1;
2780
2781 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2782 copy_region.extent = {16, 16, 1};
2783 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002784 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002786 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002787 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2788 &copy_region);
2789 m_errorMonitor->VerifyFound();
2790 copy_region.srcOffset.z = 0;
2791 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002793 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002794 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002795 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2796 &copy_region);
2797 m_errorMonitor->VerifyFound();
2798 copy_region.dstOffset.z = 0;
2799
2800 // 3D texture accessing an array layer other than 0. VU 09c0011a
2801 copy_region.extent = {4, 4, 1};
2802 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002803 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002805 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2806 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2807 &copy_region);
2808 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002809 copy_region.srcSubresource.baseArrayLayer = 0;
2810
unknown088160a2019-05-23 17:43:13 -06002811 m_commandBuffer->end();
2812}
2813
2814TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2815 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002816 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07002817 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
2818 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06002819 } else {
2820 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2821 return;
2822 }
2823 ASSERT_NO_FATAL_FAILURE(InitState());
2824
2825 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2826 VkFormatProperties format_props;
2827 // TODO: Remove this check if or when devsim handles extensions.
2828 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2829 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002830 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002831 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2832 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2833 return;
2834 }
2835
sfricke-samsung1c61f192021-12-31 01:53:03 -06002836 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002837 ci.flags = 0;
2838 ci.imageType = VK_IMAGE_TYPE_1D;
2839 ci.format = image_format;
2840 ci.extent = {32, 1, 1};
2841 ci.mipLevels = 1;
2842 ci.arrayLayers = 1;
2843 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2844 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2845 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2846 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2847 ci.queueFamilyIndexCount = 0;
2848 ci.pQueueFamilyIndices = NULL;
2849 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2850
2851 // Create 1D image
2852 VkImageObj image_1D(m_device);
2853 image_1D.init(&ci);
2854 ASSERT_TRUE(image_1D.initialized());
2855
2856 // 2D image
2857 ci.imageType = VK_IMAGE_TYPE_2D;
2858 ci.extent = {32, 32, 1};
2859 VkImageObj image_2D(m_device);
2860 image_2D.init(&ci);
2861 ASSERT_TRUE(image_2D.initialized());
2862
2863 // 3D image
2864 ci.imageType = VK_IMAGE_TYPE_3D;
2865 ci.extent = {32, 32, 8};
2866 VkImageObj image_3D(m_device);
2867 image_3D.init(&ci);
2868 ASSERT_TRUE(image_3D.initialized());
2869
2870 // 2D image array
2871 ci.imageType = VK_IMAGE_TYPE_2D;
2872 ci.extent = {32, 32, 1};
2873 ci.arrayLayers = 8;
2874 VkImageObj image_2D_array(m_device);
2875 image_2D_array.init(&ci);
2876 ASSERT_TRUE(image_2D_array.initialized());
2877
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002878 // second 2D image array
2879 ci.imageType = VK_IMAGE_TYPE_2D;
2880 ci.extent = {32, 32, 1};
2881 ci.arrayLayers = 8;
2882 VkImageObj image_2D_array_2(m_device);
2883 image_2D_array_2.init(&ci);
2884 ASSERT_TRUE(image_2D_array_2.initialized());
2885
unknown088160a2019-05-23 17:43:13 -06002886 m_commandBuffer->begin();
2887
2888 VkImageCopy copy_region;
2889 copy_region.extent = {32, 1, 1};
2890 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2891 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2892 copy_region.srcSubresource.mipLevel = 0;
2893 copy_region.dstSubresource.mipLevel = 0;
2894 copy_region.srcSubresource.baseArrayLayer = 0;
2895 copy_region.dstSubresource.baseArrayLayer = 0;
2896 copy_region.srcSubresource.layerCount = 1;
2897 copy_region.dstSubresource.layerCount = 1;
2898 copy_region.srcOffset = {0, 0, 0};
2899 copy_region.dstOffset = {0, 0, 0};
2900
2901 // Copy from layer not present
2902 copy_region.srcSubresource.baseArrayLayer = 4;
2903 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002905 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2906 &copy_region);
2907 m_errorMonitor->VerifyFound();
2908 copy_region.srcSubresource.baseArrayLayer = 0;
2909 copy_region.srcSubresource.layerCount = 1;
2910
2911 // Copy to layer not present
2912 copy_region.dstSubresource.baseArrayLayer = 1;
2913 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002915 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2916 &copy_region);
2917 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002918 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002919 copy_region.dstSubresource.layerCount = 1;
2920
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002921 // both 2D and extent.depth not 1
2922 // Need two 2D array images to prevent other errors
2923 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002924 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002925 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2926 1, &copy_region);
2927 m_errorMonitor->VerifyFound();
2928 copy_region.extent = {32, 1, 1};
2929
2930 // 2D src / 3D dst and depth not equal to src layerCount
2931 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002933 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002934 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2935 &copy_region);
2936 m_errorMonitor->VerifyFound();
2937 copy_region.extent = {32, 1, 1};
2938
2939 // 3D src / 2D dst and depth not equal to dst layerCount
2940 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002943 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2944 &copy_region);
2945 m_errorMonitor->VerifyFound();
2946 copy_region.extent = {32, 1, 1};
2947
unknown088160a2019-05-23 17:43:13 -06002948 m_commandBuffer->end();
2949}
2950
2951TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2952 // Image copy tests on compressed images with block alignment errors
2953 SetTargetApiVersion(VK_API_VERSION_1_1);
2954 ASSERT_NO_FATAL_FAILURE(Init());
2955
2956 // Select a compressed format and verify support
2957 VkPhysicalDeviceFeatures device_features = {};
2958 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2959 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2960 if (device_features.textureCompressionBC) {
2961 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2962 } else if (device_features.textureCompressionETC2) {
2963 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2964 } else if (device_features.textureCompressionASTC_LDR) {
2965 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2966 }
2967
sfricke-samsung1c61f192021-12-31 01:53:03 -06002968 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002969 ci.flags = 0;
2970 ci.imageType = VK_IMAGE_TYPE_2D;
2971 ci.format = compressed_format;
2972 ci.extent = {64, 64, 1};
2973 ci.mipLevels = 1;
2974 ci.arrayLayers = 1;
2975 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2976 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2977 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2978 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2979 ci.queueFamilyIndexCount = 0;
2980 ci.pQueueFamilyIndices = NULL;
2981 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2982
2983 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002984 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2985 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002986 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2987 return;
2988 }
2989
2990 // Create images
2991 VkImageObj image_1(m_device);
2992 image_1.init(&ci);
2993 ASSERT_TRUE(image_1.initialized());
2994
2995 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
2996 VkImageObj image_2(m_device);
2997 image_2.init(&ci);
2998 ASSERT_TRUE(image_2.initialized());
2999
3000 m_commandBuffer->begin();
3001
3002 VkImageCopy copy_region;
3003 copy_region.extent = {48, 48, 1};
3004 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3005 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3006 copy_region.srcSubresource.mipLevel = 0;
3007 copy_region.dstSubresource.mipLevel = 0;
3008 copy_region.srcSubresource.baseArrayLayer = 0;
3009 copy_region.dstSubresource.baseArrayLayer = 0;
3010 copy_region.srcSubresource.layerCount = 1;
3011 copy_region.dstSubresource.layerCount = 1;
3012 copy_region.srcOffset = {0, 0, 0};
3013 copy_region.dstOffset = {0, 0, 0};
3014
3015 // Sanity check
3016 m_errorMonitor->ExpectSuccess();
3017 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3018 m_errorMonitor->VerifyNotFound();
3019
3020 std::string vuid;
3021 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3022 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3023
3024 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3025 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003026 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003027 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003028 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003030 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3031 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3032 m_errorMonitor->VerifyFound();
3033 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003036 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3037 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3038 m_errorMonitor->VerifyFound();
3039 copy_region.srcOffset = {0, 0, 0};
3040
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003041 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003042 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003045 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3046 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3047 m_errorMonitor->VerifyFound();
3048 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003051 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3052 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3053 m_errorMonitor->VerifyFound();
3054 copy_region.dstOffset = {0, 0, 0};
3055
3056 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003057 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003058 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003059 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3060 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003061 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3062 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3063 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003064 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003065 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003066 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3067 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003068 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3069 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3070 m_errorMonitor->VerifyFound();
3071
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003072 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003073 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003076 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3077 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3078 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003079 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003080 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3082 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003083 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3084 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3085 m_errorMonitor->VerifyFound();
3086
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003087 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3088 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003089 // There are currently no supported compressed formats with a block depth other than 1,
3090 // so impossible to create a 'not a multiple' condition for depth.
3091 m_commandBuffer->end();
3092}
3093
3094TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3095 // Image copy tests on single-plane _422 formats with block alignment errors
3096
3097 // Enable KHR multiplane req'd extensions
3098 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3099 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3100 if (mp_extensions) {
3101 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3102 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003103 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003104 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003105 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3106 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3107 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3108 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003109 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003110 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3111 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3112 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3113 } else {
3114 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3115 return;
3116 }
3117 ASSERT_NO_FATAL_FAILURE(InitState());
3118
3119 // Select a _422 format and verify support
sfricke-samsung1c61f192021-12-31 01:53:03 -06003120 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003121 ci.flags = 0;
3122 ci.imageType = VK_IMAGE_TYPE_2D;
3123 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3124 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3125 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3126 ci.mipLevels = 1;
3127 ci.arrayLayers = 1;
3128 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3129 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3130 ci.queueFamilyIndexCount = 0;
3131 ci.pQueueFamilyIndices = NULL;
3132 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3133
3134 // Verify formats
3135 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3136 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3137 if (!supported) {
3138 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3139 return; // Assume there's low ROI on searching for different mp formats
3140 }
3141
3142 // Create images
3143 ci.extent = {64, 64, 1};
3144 VkImageObj image_422(m_device);
3145 image_422.init(&ci);
3146 ASSERT_TRUE(image_422.initialized());
3147
3148 ci.extent = {64, 64, 1};
3149 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3150 VkImageObj image_ucmp(m_device);
3151 image_ucmp.init(&ci);
3152 ASSERT_TRUE(image_ucmp.initialized());
3153
3154 m_commandBuffer->begin();
3155
3156 VkImageCopy copy_region;
3157 copy_region.extent = {48, 48, 1};
3158 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3159 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3160 copy_region.srcSubresource.mipLevel = 0;
3161 copy_region.dstSubresource.mipLevel = 0;
3162 copy_region.srcSubresource.baseArrayLayer = 0;
3163 copy_region.dstSubresource.baseArrayLayer = 0;
3164 copy_region.srcSubresource.layerCount = 1;
3165 copy_region.dstSubresource.layerCount = 1;
3166 copy_region.srcOffset = {0, 0, 0};
3167 copy_region.dstOffset = {0, 0, 0};
3168
3169 // Src offsets must be multiples of compressed block sizes
3170 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003172 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003173 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3174 &copy_region);
3175 m_errorMonitor->VerifyFound();
3176 copy_region.srcOffset = {0, 0, 0};
3177
3178 // Dst offsets must be multiples of compressed block sizes
3179 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003180 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003181 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003182 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003183 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3184 &copy_region);
3185 m_errorMonitor->VerifyFound();
3186 copy_region.dstOffset = {0, 0, 0};
3187
3188 // Copy extent must be multiples of compressed block sizes if not full width/height
3189 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003191 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003192 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3193 &copy_region);
3194 m_errorMonitor->VerifyFound();
3195
unknown357e1782019-09-25 17:57:40 -06003196 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003197 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3198 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003199 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003200 copy_region.dstOffset = {0, 0, 0};
3201
3202 m_commandBuffer->end();
3203}
3204
3205TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3206 // Image copy tests on multiplane images with aspect errors
3207
3208 // Enable KHR multiplane req'd extensions
3209 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3210 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3211 if (mp_extensions) {
3212 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3213 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003214 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003215 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003216 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3217 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3218 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3219 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003220 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003221 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3222 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3223 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3224 } else {
3225 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3226 return;
3227 }
3228 ASSERT_NO_FATAL_FAILURE(InitState());
3229
3230 // Select multi-plane formats and verify support
3231 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3232 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3233
sfricke-samsung1c61f192021-12-31 01:53:03 -06003234 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003235 ci.flags = 0;
3236 ci.imageType = VK_IMAGE_TYPE_2D;
3237 ci.format = mp2_format;
3238 ci.extent = {256, 256, 1};
3239 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3240 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3241 ci.mipLevels = 1;
3242 ci.arrayLayers = 1;
3243 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3244 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3245 ci.queueFamilyIndexCount = 0;
3246 ci.pQueueFamilyIndices = NULL;
3247 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3248
3249 // Verify formats
3250 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3251 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3252 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3253 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3254 ci.format = mp3_format;
3255 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3256 if (!supported) {
3257 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3258 kSkipPrefix);
3259 return; // Assume there's low ROI on searching for different mp formats
3260 }
3261
3262 // Create images
3263 VkImageObj mp3_image(m_device);
3264 mp3_image.init(&ci);
3265 ASSERT_TRUE(mp3_image.initialized());
3266
3267 ci.format = mp2_format;
3268 VkImageObj mp2_image(m_device);
3269 mp2_image.init(&ci);
3270 ASSERT_TRUE(mp2_image.initialized());
3271
3272 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3273 VkImageObj sp_image(m_device);
3274 sp_image.init(&ci);
3275 ASSERT_TRUE(sp_image.initialized());
3276
3277 m_commandBuffer->begin();
3278
3279 VkImageCopy copy_region;
3280 copy_region.extent = {128, 128, 1};
3281 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3282 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3283 copy_region.srcSubresource.mipLevel = 0;
3284 copy_region.dstSubresource.mipLevel = 0;
3285 copy_region.srcSubresource.baseArrayLayer = 0;
3286 copy_region.dstSubresource.baseArrayLayer = 0;
3287 copy_region.srcSubresource.layerCount = 1;
3288 copy_region.dstSubresource.layerCount = 1;
3289 copy_region.srcOffset = {0, 0, 0};
3290 copy_region.dstOffset = {0, 0, 0};
3291
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003292 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003293 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3294 &copy_region);
3295 m_errorMonitor->VerifyFound();
3296
unknown088160a2019-05-23 17:43:13 -06003297 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3298 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003300 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3301 &copy_region);
3302 m_errorMonitor->VerifyFound();
3303
3304 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3305 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003307 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3308 &copy_region);
3309 m_errorMonitor->VerifyFound();
3310
3311 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003313 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3314 &copy_region);
3315 m_errorMonitor->VerifyFound();
3316
3317 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003320 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3321 &copy_region);
3322 m_errorMonitor->VerifyFound();
3323
3324 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3325 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003326 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003328 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3329 &copy_region);
3330 m_errorMonitor->VerifyFound();
3331
3332 m_commandBuffer->end();
3333}
3334
3335TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3336 // Image copy with source region specified greater than src image size
3337 ASSERT_NO_FATAL_FAILURE(Init());
3338
3339 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003340 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003341 ci.flags = 0;
3342 ci.imageType = VK_IMAGE_TYPE_3D;
3343 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3344 ci.extent = {32, 32, 8};
3345 ci.mipLevels = 6;
3346 ci.arrayLayers = 1;
3347 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3348 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3349 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3350 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3351 ci.queueFamilyIndexCount = 0;
3352 ci.pQueueFamilyIndices = NULL;
3353 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3354
3355 VkImageObj src_image(m_device);
3356 src_image.init(&ci);
3357 ASSERT_TRUE(src_image.initialized());
3358
3359 // Dest image with one more mip level
3360 ci.extent = {64, 64, 16};
3361 ci.mipLevels = 7;
3362 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3363 VkImageObj dst_image(m_device);
3364 dst_image.init(&ci);
3365 ASSERT_TRUE(dst_image.initialized());
3366
3367 m_commandBuffer->begin();
3368
3369 VkImageCopy copy_region;
3370 copy_region.extent = {32, 32, 8};
3371 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3372 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3373 copy_region.srcSubresource.mipLevel = 0;
3374 copy_region.dstSubresource.mipLevel = 0;
3375 copy_region.srcSubresource.baseArrayLayer = 0;
3376 copy_region.dstSubresource.baseArrayLayer = 0;
3377 copy_region.srcSubresource.layerCount = 1;
3378 copy_region.dstSubresource.layerCount = 1;
3379 copy_region.srcOffset = {0, 0, 0};
3380 copy_region.dstOffset = {0, 0, 0};
3381
3382 m_errorMonitor->ExpectSuccess();
3383 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3384 &copy_region);
3385 m_errorMonitor->VerifyNotFound();
3386
sfricke-samsung066e0c72022-03-15 23:35:23 -05003387 // Source exceeded in x-dim
unknown088160a2019-05-23 17:43:13 -06003388 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003390 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3391 &copy_region);
3392 m_errorMonitor->VerifyFound();
3393
sfricke-samsung066e0c72022-03-15 23:35:23 -05003394 // Dest exceeded in x-dim in negative direction (since offset is a signed in)
3395 copy_region.extent.width = 4;
3396 copy_region.srcOffset.x = -8;
3397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
3398 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3399 &copy_region);
3400 m_errorMonitor->VerifyFound();
3401 copy_region.extent.width = 32;
3402
3403 // Source exceeded in y-dim
unknown088160a2019-05-23 17:43:13 -06003404 copy_region.srcOffset.x = 0;
3405 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003407 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3408 &copy_region);
3409 m_errorMonitor->VerifyFound();
3410
sfricke-samsung066e0c72022-03-15 23:35:23 -05003411 // Source exceeded in z-dim
unknown088160a2019-05-23 17:43:13 -06003412 copy_region.extent = {4, 4, 4};
3413 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003414 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003415 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3416 &copy_region);
3417 m_errorMonitor->VerifyFound();
3418
3419 m_commandBuffer->end();
3420}
3421
3422TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3423 // Image copy with dest region specified greater than dest image size
3424 ASSERT_NO_FATAL_FAILURE(Init());
3425
3426 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003427 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003428 ci.flags = 0;
3429 ci.imageType = VK_IMAGE_TYPE_3D;
3430 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3431 ci.extent = {32, 32, 8};
3432 ci.mipLevels = 6;
3433 ci.arrayLayers = 1;
3434 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3435 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3436 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3437 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3438 ci.queueFamilyIndexCount = 0;
3439 ci.pQueueFamilyIndices = NULL;
3440 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3441
3442 VkImageObj dst_image(m_device);
3443 dst_image.init(&ci);
3444 ASSERT_TRUE(dst_image.initialized());
3445
3446 // Src image with one more mip level
3447 ci.extent = {64, 64, 16};
3448 ci.mipLevels = 7;
3449 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3450 VkImageObj src_image(m_device);
3451 src_image.init(&ci);
3452 ASSERT_TRUE(src_image.initialized());
3453
3454 m_commandBuffer->begin();
3455
3456 VkImageCopy copy_region;
3457 copy_region.extent = {32, 32, 8};
3458 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3459 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3460 copy_region.srcSubresource.mipLevel = 0;
3461 copy_region.dstSubresource.mipLevel = 0;
3462 copy_region.srcSubresource.baseArrayLayer = 0;
3463 copy_region.dstSubresource.baseArrayLayer = 0;
3464 copy_region.srcSubresource.layerCount = 1;
3465 copy_region.dstSubresource.layerCount = 1;
3466 copy_region.srcOffset = {0, 0, 0};
3467 copy_region.dstOffset = {0, 0, 0};
3468
3469 m_errorMonitor->ExpectSuccess();
3470 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3471 &copy_region);
3472 m_errorMonitor->VerifyNotFound();
3473
sfricke-samsung066e0c72022-03-15 23:35:23 -05003474 // Dest exceeded in x-dim
unknown088160a2019-05-23 17:43:13 -06003475 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003476 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
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
sfricke-samsung066e0c72022-03-15 23:35:23 -05003481 // Dest exceeded in x-dim in negative direction (since offset is a signed in)
3482 copy_region.extent.width = 4;
3483 copy_region.dstOffset.x = -8;
3484 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
3485 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3486 &copy_region);
3487 m_errorMonitor->VerifyFound();
3488 copy_region.extent.width = 32;
3489
unknown088160a2019-05-23 17:43:13 -06003490 copy_region.dstOffset.x = 0;
3491 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003492 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003493 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3494 &copy_region);
3495 m_errorMonitor->VerifyFound();
3496
sfricke-samsung066e0c72022-03-15 23:35:23 -05003497 // Dest exceeded in z-dim
unknown088160a2019-05-23 17:43:13 -06003498 copy_region.extent = {4, 4, 4};
3499 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003500 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003501 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3502 &copy_region);
3503 m_errorMonitor->VerifyFound();
3504
3505 m_commandBuffer->end();
3506}
3507
sfricke-samsungea1154b2022-03-31 22:29:34 -05003508TEST_F(VkLayerTest, CopyImageZeroSize) {
3509 TEST_DESCRIPTION("Image Copy with empty regions");
3510 ASSERT_NO_FATAL_FAILURE(Init());
3511
3512 // Create images with full mip chain
3513 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
3514 ci.flags = 0;
3515 ci.imageType = VK_IMAGE_TYPE_3D;
3516 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3517 ci.extent = {32, 32, 8};
3518 ci.mipLevels = 6;
3519 ci.arrayLayers = 1;
3520 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3521 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3522 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3523 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3524 ci.queueFamilyIndexCount = 0;
3525 ci.pQueueFamilyIndices = NULL;
3526 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3527
3528 VkImageObj src_image(m_device);
3529 src_image.init(&ci);
3530 ASSERT_TRUE(src_image.initialized());
3531
3532 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3533 VkImageObj dst_image(m_device);
3534 dst_image.init(&ci);
3535 ASSERT_TRUE(dst_image.initialized());
3536
3537 VkBufferObj buffer;
3538 VkMemoryPropertyFlags reqs = 0;
3539 buffer.init_as_src_and_dst(*m_device, 16384, reqs); // large enough for image
3540
3541 m_commandBuffer->begin();
3542
3543 VkImageCopy copy_region;
3544 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3545 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3546 copy_region.srcSubresource.mipLevel = 0;
3547 copy_region.dstSubresource.mipLevel = 0;
3548 copy_region.srcSubresource.baseArrayLayer = 0;
3549 copy_region.dstSubresource.baseArrayLayer = 0;
3550 copy_region.srcSubresource.layerCount = 1;
3551 copy_region.dstSubresource.layerCount = 1;
3552 copy_region.srcOffset = {0, 0, 0};
3553 copy_region.dstOffset = {0, 0, 0};
3554
3555 copy_region.extent = {4, 4, 0};
3556 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06670");
3557 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 copy_region.extent = {0, 0, 4};
3562 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06668"); // width
3563 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06669"); // height
3564 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3565 &copy_region);
3566 m_errorMonitor->VerifyFound();
3567
3568 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
3569 VkBufferImageCopy buffer_image_copy;
3570 buffer_image_copy.bufferRowLength = 0;
3571 buffer_image_copy.bufferImageHeight = 0;
3572 buffer_image_copy.imageSubresource = image_subresource;
3573 buffer_image_copy.imageOffset = {0, 0, 0};
3574 buffer_image_copy.bufferOffset = 0;
3575
3576 buffer_image_copy.imageExtent = {4, 0, 1};
3577 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06660");
3578 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer.handle(), 1,
3579 &buffer_image_copy);
3580 m_errorMonitor->VerifyFound();
3581
3582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06660");
3583 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3584 &buffer_image_copy);
3585 m_errorMonitor->VerifyFound();
3586
3587 // depth is now zero
3588 buffer_image_copy.imageExtent = {4, 1, 0};
3589 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
3590 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer.handle(), 1,
3591 &buffer_image_copy);
3592 m_errorMonitor->VerifyFound();
3593
3594 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
3595 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3596 &buffer_image_copy);
3597 m_errorMonitor->VerifyFound();
3598
3599 m_commandBuffer->end();
3600}
3601
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003602TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3603 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3604
3605 // Enable KHR multiplane req'd extensions
3606 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3607 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3608 if (mp_extensions == true) {
3609 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3610 }
3611 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003612 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003613 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3614 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3615 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3616 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003617 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003618 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3619 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3620 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3621 } else {
3622 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3623 return;
3624 }
3625 ASSERT_NO_FATAL_FAILURE(InitState());
3626
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003627 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3628 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003629 VkFormatProperties props = {0, 0, 0};
3630 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003631 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003632 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3633 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3634 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3635
3636 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003637 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003638 return;
3639 }
3640
3641 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3642 VkImageObj src_image(m_device);
3643 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003644 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 -08003645 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003646 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 -08003647 ASSERT_TRUE(dst_image.initialized());
3648
3649 VkImageCopy copy_region = {};
3650 copy_region.extent = {64, 64, 1}; // Size of plane 1
3651 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3652 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3653 copy_region.srcSubresource.mipLevel = 0;
3654 copy_region.dstSubresource.mipLevel = 0;
3655 copy_region.srcSubresource.baseArrayLayer = 0;
3656 copy_region.dstSubresource.baseArrayLayer = 0;
3657 copy_region.srcSubresource.layerCount = 1;
3658 copy_region.dstSubresource.layerCount = 1;
3659 copy_region.srcOffset = {0, 0, 0};
3660 copy_region.dstOffset = {0, 0, 0};
3661 VkImageCopy original_region = copy_region;
3662
3663 m_commandBuffer->begin();
3664
3665 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3666 m_errorMonitor->ExpectSuccess();
3667 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3668 &copy_region);
3669 m_errorMonitor->VerifyNotFound();
3670
3671 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3672 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3673 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3674 m_errorMonitor->ExpectSuccess();
3675 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3676 &copy_region);
3677 m_errorMonitor->VerifyNotFound();
3678
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003679 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003680 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3681 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3682
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003683 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3684 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3685 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3686 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003687 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3688 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003689 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3690 &copy_region);
3691 m_errorMonitor->VerifyNotFound();
3692
3693 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3694 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3695 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3696 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003697 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3698 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003699 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3700 &copy_region);
3701 m_errorMonitor->VerifyNotFound();
3702
3703 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3704 copy_region.extent = {128, 64, 1};
3705 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3706 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3707 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003708 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3709 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003710 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3711 &copy_region);
3712 m_errorMonitor->VerifyNotFound();
3713
3714 // 128x64 copy from plane 0 -> Plane 1
3715 copy_region.extent = {128, 64, 1};
3716 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3717 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003719 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3720 &copy_region);
3721 m_errorMonitor->VerifyFound();
3722
3723 // 128x64 copy from plane 1 -> Plane 0
3724 copy_region.extent = {128, 64, 1};
3725 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3726 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003728 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3729 &copy_region);
3730 m_errorMonitor->VerifyFound();
3731
3732 // src exceeded in y-dim from offset
3733 copy_region = original_region;
3734 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003736 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3737 &copy_region);
3738 m_errorMonitor->VerifyFound();
3739
3740 // dst exceeded in y-dim from offset
3741 copy_region = original_region;
3742 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003744 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3745 &copy_region);
3746 m_errorMonitor->VerifyFound();
3747
3748 m_commandBuffer->end();
3749}
3750
unknown088160a2019-05-23 17:43:13 -06003751TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003752 if (!EnableDeviceProfileLayer()) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003753 GTEST_SKIP() << "Failed to enable device profile layer.";
sfricke-samsung51067b22020-04-30 21:41:17 -07003754 }
unknown088160a2019-05-23 17:43:13 -06003755
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003756 // Enable KHR multiplane req'd extensions
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003757 AddRequiredExtensions(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3758 ASSERT_NO_FATAL_FAILURE(InitFramework());
3759 if (!AreRequiredExtensionsEnabled()) {
3760 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003761 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003762 auto mp_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR>();
3763 auto features2 = GetPhysicalDeviceFeatures2(mp_features);
3764
3765 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
unknown088160a2019-05-23 17:43:13 -06003766
sfricke-samsung51067b22020-04-30 21:41:17 -07003767 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3768 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003769
sfricke-samsung51067b22020-04-30 21:41:17 -07003770 // Load required functions
3771 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003772 GTEST_SKIP() << "Failed to device profile layer.";
sfricke-samsung51067b22020-04-30 21:41:17 -07003773 }
3774
3775 // Set transfer for all potential used formats
3776 VkFormatProperties format_props;
3777 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3778 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3779 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3780
3781 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3782 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3783 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003784
sfricke-samsung1c61f192021-12-31 01:53:03 -06003785 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003786 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003787 image_create_info.extent.width = 32;
3788 image_create_info.extent.height = 32;
3789 image_create_info.extent.depth = 1;
3790 image_create_info.mipLevels = 1;
3791 image_create_info.arrayLayers = 1;
3792 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003793 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3794 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003795 image_create_info.flags = 0;
3796
sfricke-samsung51067b22020-04-30 21:41:17 -07003797 image_create_info.format = VK_FORMAT_R8_UNORM;
3798 VkImageObj image_8b_unorm(m_device);
3799 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003800
sfricke-samsung51067b22020-04-30 21:41:17 -07003801 image_create_info.format = VK_FORMAT_R8_UINT;
3802 VkImageObj image_8b_uint(m_device);
3803 image_8b_uint.init(&image_create_info);
3804
3805 // First try to test two single plane mismatch
3806 {
3807 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3808 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3809 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3810
3811 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3812 VkImageObj image_32b_unorm(m_device);
3813 image_32b_unorm.init(&image_create_info);
3814
3815 m_commandBuffer->begin();
3816 VkImageCopy copyRegion;
3817 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3818 copyRegion.srcSubresource.mipLevel = 0;
3819 copyRegion.srcSubresource.baseArrayLayer = 0;
3820 copyRegion.srcSubresource.layerCount = 1;
3821 copyRegion.srcOffset.x = 0;
3822 copyRegion.srcOffset.y = 0;
3823 copyRegion.srcOffset.z = 0;
3824 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3825 copyRegion.dstSubresource.mipLevel = 0;
3826 copyRegion.dstSubresource.baseArrayLayer = 0;
3827 copyRegion.dstSubresource.layerCount = 1;
3828 copyRegion.dstOffset.x = 0;
3829 copyRegion.dstOffset.y = 0;
3830 copyRegion.dstOffset.z = 0;
3831 copyRegion.extent.width = 1;
3832 copyRegion.extent.height = 1;
3833 copyRegion.extent.depth = 1;
3834
3835 // Sanity check between two 8bit formats
sfricke-samsung51067b22020-04-30 21:41:17 -07003836 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3837 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
sfricke-samsung51067b22020-04-30 21:41:17 -07003838
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003839 const char *vuid = (IsExtensionsEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME))
3840 ? "VUID-vkCmdCopyImage-srcImage-01548"
3841 : "VUID-vkCmdCopyImage-srcImage-00135";
sfricke-samsung51067b22020-04-30 21:41:17 -07003842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3843 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3844 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3845 m_errorMonitor->VerifyFound();
3846
3847 // Swap src and dst
3848 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3849 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3850 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3851 m_errorMonitor->VerifyFound();
3852
3853 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003854 }
3855
sfricke-samsung51067b22020-04-30 21:41:17 -07003856 // DstImage is a mismatched plane of a multi-planar format
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003857 if (!mp_features.samplerYcbcrConversion) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003858 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3859 } else {
3860 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3861 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3862 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003863
sfricke-samsung51067b22020-04-30 21:41:17 -07003864 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3865 VkImageObj image_8b_16b_420_unorm(m_device);
3866 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003867
sfricke-samsung51067b22020-04-30 21:41:17 -07003868 m_commandBuffer->begin();
3869 VkImageCopy copyRegion;
3870 copyRegion.srcSubresource.mipLevel = 0;
3871 copyRegion.srcSubresource.baseArrayLayer = 0;
3872 copyRegion.srcSubresource.layerCount = 1;
3873 copyRegion.srcOffset.x = 0;
3874 copyRegion.srcOffset.y = 0;
3875 copyRegion.srcOffset.z = 0;
3876 copyRegion.dstSubresource.mipLevel = 0;
3877 copyRegion.dstSubresource.baseArrayLayer = 0;
3878 copyRegion.dstSubresource.layerCount = 1;
3879 copyRegion.dstOffset.x = 0;
3880 copyRegion.dstOffset.y = 0;
3881 copyRegion.dstOffset.z = 0;
3882 copyRegion.extent.width = 1;
3883 copyRegion.extent.height = 1;
3884 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003885
sfricke-samsung51067b22020-04-30 21:41:17 -07003886 // First test single-plane -> multi-plan
3887 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3888 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003889
sfricke-samsung51067b22020-04-30 21:41:17 -07003890 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
sfricke-samsung51067b22020-04-30 21:41:17 -07003891 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3892 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003893
locke-lunargdf00db02020-03-04 19:00:57 -07003894 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3895 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3896
sfricke-samsung51067b22020-04-30 21:41:17 -07003897 // Make sure no false postiives if Compatible format
sfricke-samsung51067b22020-04-30 21:41:17 -07003898 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3899 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003900
sfricke-samsung51067b22020-04-30 21:41:17 -07003901 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3902 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3903 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3904 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3905 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3906 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003907
sfricke-samsung51067b22020-04-30 21:41:17 -07003908 // Same tests but swap src and dst
3909 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3910 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003911
locke-lunargdf00db02020-03-04 19:00:57 -07003912 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3913 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3914 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3915 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3916
sfricke-samsung51067b22020-04-30 21:41:17 -07003917 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3918 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
sfricke-samsung51067b22020-04-30 21:41:17 -07003919
locke-lunargdf00db02020-03-04 19:00:57 -07003920 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3921 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3922
sfricke-samsung51067b22020-04-30 21:41:17 -07003923 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3924 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
sfricke-samsung51067b22020-04-30 21:41:17 -07003925
3926 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3927 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3928 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3929 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3930 m_errorMonitor->VerifyFound();
3931
3932 m_commandBuffer->end();
3933 }
unknown088160a2019-05-23 17:43:13 -06003934}
3935
3936TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3937 ASSERT_NO_FATAL_FAILURE(Init());
3938 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3939 if (!depth_format) {
3940 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3941 return;
3942 }
3943
3944 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003945 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003946 if (properties.optimalTilingFeatures == 0) {
3947 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3948 return;
3949 }
3950
3951 VkImageObj srcImage(m_device);
3952 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3953 ASSERT_TRUE(srcImage.initialized());
3954 VkImageObj dstImage(m_device);
3955 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3956 ASSERT_TRUE(dstImage.initialized());
3957
3958 // Create two images of different types and try to copy between them
3959
3960 m_commandBuffer->begin();
3961 VkImageCopy copyRegion;
3962 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3963 copyRegion.srcSubresource.mipLevel = 0;
3964 copyRegion.srcSubresource.baseArrayLayer = 0;
3965 copyRegion.srcSubresource.layerCount = 1;
3966 copyRegion.srcOffset.x = 0;
3967 copyRegion.srcOffset.y = 0;
3968 copyRegion.srcOffset.z = 0;
3969 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3970 copyRegion.dstSubresource.mipLevel = 0;
3971 copyRegion.dstSubresource.baseArrayLayer = 0;
3972 copyRegion.dstSubresource.layerCount = 1;
3973 copyRegion.dstOffset.x = 0;
3974 copyRegion.dstOffset.y = 0;
3975 copyRegion.dstOffset.z = 0;
3976 copyRegion.extent.width = 1;
3977 copyRegion.extent.height = 1;
3978 copyRegion.extent.depth = 1;
3979
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003980 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003981 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3982 &copyRegion);
3983 m_commandBuffer->end();
3984
3985 m_errorMonitor->VerifyFound();
3986}
3987
3988TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3989 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3990
3991 ASSERT_NO_FATAL_FAILURE(Init());
3992
3993 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003994 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3995 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3996 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003997
3998 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3999 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
4000 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
4001 return;
4002 }
4003
sfricke-samsung1c61f192021-12-31 01:53:03 -06004004 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004005 ci.flags = 0;
4006 ci.imageType = VK_IMAGE_TYPE_2D;
4007 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
4008 ci.extent = {128, 128, 1};
4009 ci.mipLevels = 1;
4010 ci.arrayLayers = 1;
4011 ci.samples = VK_SAMPLE_COUNT_1_BIT;
4012 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
4013 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4014 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4015 ci.queueFamilyIndexCount = 0;
4016 ci.pQueueFamilyIndices = NULL;
4017 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4018
4019 VkImageObj image1(m_device);
4020 image1.init(&ci);
4021 ASSERT_TRUE(image1.initialized());
4022
4023 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4024 VkImageObj image2(m_device);
4025 image2.init(&ci);
4026 ASSERT_TRUE(image2.initialized());
4027
4028 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4029 VkImageObj image4(m_device);
4030 image4.init(&ci);
4031 ASSERT_TRUE(image4.initialized());
4032
4033 m_commandBuffer->begin();
4034
4035 VkImageCopy copyRegion;
4036 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4037 copyRegion.srcSubresource.mipLevel = 0;
4038 copyRegion.srcSubresource.baseArrayLayer = 0;
4039 copyRegion.srcSubresource.layerCount = 1;
4040 copyRegion.srcOffset = {0, 0, 0};
4041 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4042 copyRegion.dstSubresource.mipLevel = 0;
4043 copyRegion.dstSubresource.baseArrayLayer = 0;
4044 copyRegion.dstSubresource.layerCount = 1;
4045 copyRegion.dstOffset = {0, 0, 0};
4046 copyRegion.extent = {128, 128, 1};
4047
4048 // Copy a single sample image to/from a multi-sample image
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(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4051 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004052 m_errorMonitor->VerifyFound();
4053
Mark Lobodzinski20310782020-02-28 14:25:17 -07004054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004055 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4056 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004057 m_errorMonitor->VerifyFound();
4058
4059 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004060 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004061 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4062 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004063 m_errorMonitor->VerifyFound();
4064
Mark Lobodzinski20310782020-02-28 14:25:17 -07004065 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004066 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4067 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004068 m_errorMonitor->VerifyFound();
4069
4070 m_commandBuffer->end();
4071}
4072
4073TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4074 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004075
4076 if (!EnableDeviceProfileLayer()) {
4077 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4078 return;
4079 }
4080
4081 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4082 if (mp_extensions) {
4083 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4084 }
4085
4086 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004087 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004088 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4089 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4090 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4091 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004092 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004093 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4094 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4095 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4096 }
4097 ASSERT_NO_FATAL_FAILURE(InitState());
4098
4099 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4100 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4101
4102 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4103 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4104 return;
4105 }
4106
unknown088160a2019-05-23 17:43:13 -06004107 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4108 if (!ds_format) {
4109 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4110 return;
4111 }
4112
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004113 // Add Transfer support for all used formats
4114 VkFormatProperties formatProps;
4115 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4116 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4117 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4118 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4119 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4120 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4121 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4122 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4123 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4124
unknown088160a2019-05-23 17:43:13 -06004125 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4126 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4127 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4128 VK_IMAGE_TILING_OPTIMAL, 0);
4129 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4130 VK_IMAGE_TILING_OPTIMAL, 0);
4131 ASSERT_TRUE(color_image.initialized());
4132 ASSERT_TRUE(depth_image.initialized());
4133 ASSERT_TRUE(ds_image.initialized());
4134
4135 VkImageCopy copyRegion;
4136 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4137 copyRegion.srcSubresource.mipLevel = 0;
4138 copyRegion.srcSubresource.baseArrayLayer = 0;
4139 copyRegion.srcSubresource.layerCount = 1;
4140 copyRegion.srcOffset = {0, 0, 0};
4141 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4142 copyRegion.dstSubresource.mipLevel = 0;
4143 copyRegion.dstSubresource.baseArrayLayer = 0;
4144 copyRegion.dstSubresource.layerCount = 1;
4145 copyRegion.dstOffset = {64, 0, 0};
4146 copyRegion.extent = {64, 128, 1};
4147
4148 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004149 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004150 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004151 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4152 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004153 m_errorMonitor->VerifyFound();
4154
4155 m_commandBuffer->begin();
4156
4157 // Src and dest aspect masks don't match
4158 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004159 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004160 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004161 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4162 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004163 m_errorMonitor->VerifyFound();
4164 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4165
4166 // Illegal combinations of aspect bits
4167 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4168 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004169 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004170 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004172 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004173 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4174 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004175 m_errorMonitor->VerifyFound();
4176 // same test for dstSubresource
4177 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4178 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004180 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004181 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004182 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004183 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4184 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004185 m_errorMonitor->VerifyFound();
4186
4187 // Metadata aspect is illegal
4188 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4189 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004191 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004192 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004193 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4194 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004195 m_errorMonitor->VerifyFound();
4196 // same test for dstSubresource
4197 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4198 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004200 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004202 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4203 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004204 m_errorMonitor->VerifyFound();
4205
sfricke-samsung6141db32020-10-26 03:31:38 -07004206 // Aspect Memory Plane mask is illegal
4207 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4208 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4210 // These aspect/format mismatches are redundant but unavoidable here
4211 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4212 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4213 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4214 m_errorMonitor->VerifyFound();
4215
unknown088160a2019-05-23 17:43:13 -06004216 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4217 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004218 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004219
4220 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004222 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004223 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004224 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4225 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004226 m_errorMonitor->VerifyFound();
4227
4228 // Aspect mask doesn't match dest image format
4229 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4230 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004231 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004232 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004233 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004234 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4235 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004236 m_errorMonitor->VerifyFound();
4237
aitor-lunarg54c295b2022-01-28 17:02:32 +01004238 // Check no performance warnings regarding layout are thrown when copying from and to the same image
4239 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4240 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4241 m_errorMonitor->ExpectSuccess(kPerformanceWarningBit);
4242 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4243 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4244 m_errorMonitor->VerifyNotFound();
4245
unknown088160a2019-05-23 17:43:13 -06004246 m_commandBuffer->end();
4247}
4248
4249TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004251
4252 ASSERT_NO_FATAL_FAILURE(Init());
4253
4254 // Create two images of sample count 1 and try to Resolve between them
4255
sfricke-samsung1c61f192021-12-31 01:53:03 -06004256 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004257 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4258 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4259 image_create_info.extent.width = 32;
4260 image_create_info.extent.height = 1;
4261 image_create_info.extent.depth = 1;
4262 image_create_info.mipLevels = 1;
4263 image_create_info.arrayLayers = 1;
4264 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4265 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4266 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4267 image_create_info.flags = 0;
4268
4269 VkImageObj srcImage(m_device);
4270 srcImage.init(&image_create_info);
4271 ASSERT_TRUE(srcImage.initialized());
4272
4273 VkImageObj dstImage(m_device);
4274 dstImage.init(&image_create_info);
4275 ASSERT_TRUE(dstImage.initialized());
4276
4277 m_commandBuffer->begin();
4278 VkImageResolve resolveRegion;
4279 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4280 resolveRegion.srcSubresource.mipLevel = 0;
4281 resolveRegion.srcSubresource.baseArrayLayer = 0;
4282 resolveRegion.srcSubresource.layerCount = 1;
4283 resolveRegion.srcOffset.x = 0;
4284 resolveRegion.srcOffset.y = 0;
4285 resolveRegion.srcOffset.z = 0;
4286 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4287 resolveRegion.dstSubresource.mipLevel = 0;
4288 resolveRegion.dstSubresource.baseArrayLayer = 0;
4289 resolveRegion.dstSubresource.layerCount = 1;
4290 resolveRegion.dstOffset.x = 0;
4291 resolveRegion.dstOffset.y = 0;
4292 resolveRegion.dstOffset.z = 0;
4293 resolveRegion.extent.width = 1;
4294 resolveRegion.extent.height = 1;
4295 resolveRegion.extent.depth = 1;
4296 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4297 &resolveRegion);
4298 m_commandBuffer->end();
4299
4300 m_errorMonitor->VerifyFound();
4301}
4302
4303TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004304 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004305
4306 ASSERT_NO_FATAL_FAILURE(Init());
4307
4308 // Create two images of sample count 4 and try to Resolve between them
4309
sfricke-samsung1c61f192021-12-31 01:53:03 -06004310 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004311 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4312 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4313 image_create_info.extent.width = 32;
4314 image_create_info.extent.height = 1;
4315 image_create_info.extent.depth = 1;
4316 image_create_info.mipLevels = 1;
4317 image_create_info.arrayLayers = 1;
4318 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4319 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4320 // Note: Some implementations expect color attachment usage for any
4321 // multisample surface
4322 image_create_info.usage =
4323 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4324 image_create_info.flags = 0;
4325
4326 VkImageObj srcImage(m_device);
4327 srcImage.init(&image_create_info);
4328 ASSERT_TRUE(srcImage.initialized());
4329
4330 VkImageObj dstImage(m_device);
4331 dstImage.init(&image_create_info);
4332 ASSERT_TRUE(dstImage.initialized());
4333
4334 m_commandBuffer->begin();
4335 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4336 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4337 // VK_IMAGE_LAYOUT_GENERAL = 1,
4338 VkImageResolve resolveRegion;
4339 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4340 resolveRegion.srcSubresource.mipLevel = 0;
4341 resolveRegion.srcSubresource.baseArrayLayer = 0;
4342 resolveRegion.srcSubresource.layerCount = 1;
4343 resolveRegion.srcOffset.x = 0;
4344 resolveRegion.srcOffset.y = 0;
4345 resolveRegion.srcOffset.z = 0;
4346 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4347 resolveRegion.dstSubresource.mipLevel = 0;
4348 resolveRegion.dstSubresource.baseArrayLayer = 0;
4349 resolveRegion.dstSubresource.layerCount = 1;
4350 resolveRegion.dstOffset.x = 0;
4351 resolveRegion.dstOffset.y = 0;
4352 resolveRegion.dstOffset.z = 0;
4353 resolveRegion.extent.width = 1;
4354 resolveRegion.extent.height = 1;
4355 resolveRegion.extent.depth = 1;
4356 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4357 &resolveRegion);
4358 m_commandBuffer->end();
4359
4360 m_errorMonitor->VerifyFound();
4361}
4362
4363TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004365
4366 ASSERT_NO_FATAL_FAILURE(Init());
4367
4368 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004369 VkImageObj srcImage(m_device);
4370 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004371
sfricke-samsung1c61f192021-12-31 01:53:03 -06004372 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004373 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4374 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4375 image_create_info.extent.width = 32;
4376 image_create_info.extent.height = 1;
4377 image_create_info.extent.depth = 1;
4378 image_create_info.mipLevels = 1;
4379 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004380 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004381 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4382 // Note: Some implementations expect color attachment usage for any
4383 // multisample surface
4384 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4385 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004386 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004387
4388 // Set format to something other than source image
4389 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4390 // Note: Some implementations expect color attachment usage for any
4391 // multisample surface
4392 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4393 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004394 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004395
4396 m_commandBuffer->begin();
4397 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4398 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4399 // VK_IMAGE_LAYOUT_GENERAL = 1,
4400 VkImageResolve resolveRegion;
4401 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4402 resolveRegion.srcSubresource.mipLevel = 0;
4403 resolveRegion.srcSubresource.baseArrayLayer = 0;
4404 resolveRegion.srcSubresource.layerCount = 1;
4405 resolveRegion.srcOffset.x = 0;
4406 resolveRegion.srcOffset.y = 0;
4407 resolveRegion.srcOffset.z = 0;
4408 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4409 resolveRegion.dstSubresource.mipLevel = 0;
4410 resolveRegion.dstSubresource.baseArrayLayer = 0;
4411 resolveRegion.dstSubresource.layerCount = 1;
4412 resolveRegion.dstOffset.x = 0;
4413 resolveRegion.dstOffset.y = 0;
4414 resolveRegion.dstOffset.z = 0;
4415 resolveRegion.extent.width = 1;
4416 resolveRegion.extent.height = 1;
4417 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004418 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4419 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004420 m_commandBuffer->end();
4421
4422 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004423}
4424
4425TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004426 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004427
4428 ASSERT_NO_FATAL_FAILURE(Init());
4429
4430 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004431 VkImageObj srcImage(m_device);
4432 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004433
sfricke-samsung1c61f192021-12-31 01:53:03 -06004434 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004435 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4436 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4437 image_create_info.extent.width = 32;
4438 image_create_info.extent.height = 1;
4439 image_create_info.extent.depth = 1;
4440 image_create_info.mipLevels = 1;
4441 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004442 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004443 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4444 // Note: Some implementations expect color attachment usage for any
4445 // multisample surface
4446 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4447 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004448 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004449
4450 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4451 // Note: Some implementations expect color attachment usage for any
4452 // multisample surface
4453 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4454 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004455 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004456
4457 m_commandBuffer->begin();
4458 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4459 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4460 // VK_IMAGE_LAYOUT_GENERAL = 1,
4461 VkImageResolve resolveRegion;
4462 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4463 resolveRegion.srcSubresource.mipLevel = 0;
4464 resolveRegion.srcSubresource.baseArrayLayer = 0;
4465 resolveRegion.srcSubresource.layerCount = 1;
4466 resolveRegion.srcOffset.x = 0;
4467 resolveRegion.srcOffset.y = 0;
4468 resolveRegion.srcOffset.z = 0;
4469 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4470 resolveRegion.dstSubresource.mipLevel = 0;
4471 resolveRegion.dstSubresource.baseArrayLayer = 0;
4472 resolveRegion.dstSubresource.layerCount = 1;
4473 resolveRegion.dstOffset.x = 0;
4474 resolveRegion.dstOffset.y = 0;
4475 resolveRegion.dstOffset.z = 0;
4476 resolveRegion.extent.width = 1;
4477 resolveRegion.extent.height = 1;
4478 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004479 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4480 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004481 m_commandBuffer->end();
4482
4483 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004484}
4485
4486TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4487 ASSERT_NO_FATAL_FAILURE(Init());
4488
4489 // Create two images of different types and try to copy between them
4490 VkImageObj srcImage(m_device);
4491 VkImageObj dstImage(m_device);
4492
sfricke-samsung1c61f192021-12-31 01:53:03 -06004493 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004494 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4495 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4496 image_create_info.extent.width = 32;
4497 image_create_info.extent.height = 32;
4498 image_create_info.extent.depth = 1;
4499 image_create_info.mipLevels = 1;
4500 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004501 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004502 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4503 image_create_info.usage =
4504 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4505 // Note: Some implementations expect color attachment usage for any
4506 // multisample surface
4507 image_create_info.flags = 0;
4508 srcImage.init(&image_create_info);
4509 ASSERT_TRUE(srcImage.initialized());
4510
4511 // Note: Some implementations expect color attachment usage for any
4512 // multisample surface
4513 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4514 dstImage.init(&image_create_info);
4515 ASSERT_TRUE(dstImage.initialized());
4516
4517 m_commandBuffer->begin();
4518 // source image must have valid contents before resolve
4519 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4520 VkImageSubresourceRange subresource = {};
4521 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4522 subresource.layerCount = 1;
4523 subresource.levelCount = 1;
4524 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4525 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4526 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4527 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4528
4529 VkImageResolve resolveRegion;
4530 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4531 resolveRegion.srcSubresource.mipLevel = 0;
4532 resolveRegion.srcSubresource.baseArrayLayer = 0;
4533 resolveRegion.srcSubresource.layerCount = 1;
4534 resolveRegion.srcOffset.x = 0;
4535 resolveRegion.srcOffset.y = 0;
4536 resolveRegion.srcOffset.z = 0;
4537 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4538 resolveRegion.dstSubresource.mipLevel = 0;
4539 resolveRegion.dstSubresource.baseArrayLayer = 0;
4540 resolveRegion.dstSubresource.layerCount = 1;
4541 resolveRegion.dstOffset.x = 0;
4542 resolveRegion.dstOffset.y = 0;
4543 resolveRegion.dstOffset.z = 0;
4544 resolveRegion.extent.width = 1;
4545 resolveRegion.extent.height = 1;
4546 resolveRegion.extent.depth = 1;
4547 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004548 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004549 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4550 1, &resolveRegion);
4551 m_errorMonitor->VerifyFound();
4552 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004553 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004554 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4555 1, &resolveRegion);
4556 m_errorMonitor->VerifyFound();
4557 m_commandBuffer->end();
4558}
4559
4560TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004561 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4562
4563 bool copy_commands2 = false;
4564 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4565 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4566 copy_commands2 = true;
4567 }
4568 ASSERT_NO_FATAL_FAILURE(InitState());
4569
4570 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4571 if (copy_commands2) {
4572 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4573 }
unknown088160a2019-05-23 17:43:13 -06004574
4575 // Create two images of different types and try to copy between them
4576 VkImageObj srcImage(m_device);
4577 VkImageObj dstImage(m_device);
4578
sfricke-samsung1c61f192021-12-31 01:53:03 -06004579 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004580 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4581 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4582 image_create_info.extent.width = 32;
4583 image_create_info.extent.height = 32;
4584 image_create_info.extent.depth = 1;
4585 image_create_info.mipLevels = 1;
4586 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004587 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004588 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4589 image_create_info.usage =
4590 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4591 // Note: Some implementations expect color attachment usage for any
4592 // multisample surface
4593 image_create_info.flags = 0;
4594 srcImage.init(&image_create_info);
4595 ASSERT_TRUE(srcImage.initialized());
4596
4597 // Note: Some implementations expect color attachment usage for any
4598 // multisample surface
4599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4600 dstImage.init(&image_create_info);
4601 ASSERT_TRUE(dstImage.initialized());
4602
4603 m_commandBuffer->begin();
4604 // source image must have valid contents before resolve
4605 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4606 VkImageSubresourceRange subresource = {};
4607 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4608 subresource.layerCount = 1;
4609 subresource.levelCount = 1;
4610 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4611 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4612 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4613 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4614
4615 VkImageResolve resolveRegion;
4616 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4617 resolveRegion.srcSubresource.mipLevel = 0;
4618 resolveRegion.srcSubresource.baseArrayLayer = 0;
4619 resolveRegion.srcSubresource.layerCount = 1;
4620 resolveRegion.srcOffset.x = 0;
4621 resolveRegion.srcOffset.y = 0;
4622 resolveRegion.srcOffset.z = 0;
4623 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4624 resolveRegion.dstSubresource.mipLevel = 0;
4625 resolveRegion.dstSubresource.baseArrayLayer = 0;
4626 resolveRegion.dstSubresource.layerCount = 1;
4627 resolveRegion.dstOffset.x = 0;
4628 resolveRegion.dstOffset.y = 0;
4629 resolveRegion.dstOffset.z = 0;
4630 resolveRegion.extent.width = 1;
4631 resolveRegion.extent.height = 1;
4632 resolveRegion.extent.depth = 1;
4633 // invalid source mip level
4634 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004636 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4637 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4638 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004639
4640 // Equivalent test using KHR_copy_commands2
4641 if (copy_commands2 && vkCmdResolveImage2Function) {
4642 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4643 NULL,
4644 resolveRegion.srcSubresource,
4645 resolveRegion.srcOffset,
4646 resolveRegion.dstSubresource,
4647 resolveRegion.dstOffset,
4648 resolveRegion.extent};
4649 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4650 NULL,
4651 srcImage.image(),
4652 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4653 dstImage.image(),
4654 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4655 1,
4656 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004657 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01709");
Jeff Leger465acf52020-10-12 18:07:16 -04004658 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4659 m_errorMonitor->VerifyFound();
4660 }
4661
unknown088160a2019-05-23 17:43:13 -06004662 resolveRegion.srcSubresource.mipLevel = 0;
4663 // invalid dest mip level
4664 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004665 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004666 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4667 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4668 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004669
4670 // Equivalent test using KHR_copy_commands2
4671 if (copy_commands2 && vkCmdResolveImage2Function) {
4672 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4673 NULL,
4674 resolveRegion.srcSubresource,
4675 resolveRegion.srcOffset,
4676 resolveRegion.dstSubresource,
4677 resolveRegion.dstOffset,
4678 resolveRegion.extent};
4679 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4680 NULL,
4681 srcImage.image(),
4682 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4683 dstImage.image(),
4684 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4685 1,
4686 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01710");
Jeff Leger465acf52020-10-12 18:07:16 -04004688 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4689 m_errorMonitor->VerifyFound();
4690 }
4691
unknown088160a2019-05-23 17:43:13 -06004692 resolveRegion.dstSubresource.mipLevel = 0;
4693 // invalid source array layer range
4694 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004696 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4697 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4698 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004699
4700 // Equivalent test using KHR_copy_commands2
4701 if (copy_commands2 && vkCmdResolveImage2Function) {
4702 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4703 NULL,
4704 resolveRegion.srcSubresource,
4705 resolveRegion.srcOffset,
4706 resolveRegion.dstSubresource,
4707 resolveRegion.dstOffset,
4708 resolveRegion.extent};
4709 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4710 NULL,
4711 srcImage.image(),
4712 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4713 dstImage.image(),
4714 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4715 1,
4716 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01711");
Jeff Leger465acf52020-10-12 18:07:16 -04004718 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4719 m_errorMonitor->VerifyFound();
4720 }
4721
unknown088160a2019-05-23 17:43:13 -06004722 resolveRegion.srcSubresource.baseArrayLayer = 0;
4723 // invalid dest array layer range
4724 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004725 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004726 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4727 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4728 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004729
4730 // Equivalent test using KHR_copy_commands2
4731 if (copy_commands2 && vkCmdResolveImage2Function) {
4732 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4733 NULL,
4734 resolveRegion.srcSubresource,
4735 resolveRegion.srcOffset,
4736 resolveRegion.dstSubresource,
4737 resolveRegion.dstOffset,
4738 resolveRegion.extent};
4739 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4740 NULL,
4741 srcImage.image(),
4742 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4743 dstImage.image(),
4744 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4745 1,
4746 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01712");
Jeff Leger465acf52020-10-12 18:07:16 -04004748 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4749 m_errorMonitor->VerifyFound();
4750 }
4751
unknown088160a2019-05-23 17:43:13 -06004752 resolveRegion.dstSubresource.baseArrayLayer = 0;
4753
4754 m_commandBuffer->end();
4755}
4756
sfricke-samsungf78d0592020-06-11 21:34:44 -07004757TEST_F(VkLayerTest, ResolveImageImageType) {
4758 ASSERT_NO_FATAL_FAILURE(Init());
4759 // Create images of different types and try to resolve between them
4760 VkImageObj srcImage2D(m_device);
4761 VkImageObj dstImage1D(m_device);
4762 VkImageObj dstImage3D(m_device);
4763
sfricke-samsung1c61f192021-12-31 01:53:03 -06004764 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungf78d0592020-06-11 21:34:44 -07004765 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4766 image_create_info.extent.width = 32;
4767 image_create_info.extent.height = 1;
4768 image_create_info.extent.depth = 1;
4769 image_create_info.mipLevels = 1;
4770 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004771 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004772 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4773 image_create_info.usage =
4774 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4775 // Note: Some implementations expect color attachment usage for any
4776 // multisample surface
4777 image_create_info.flags = 0;
4778
4779 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4780 srcImage2D.init(&image_create_info);
4781 ASSERT_TRUE(srcImage2D.initialized());
4782
4783 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4784 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4785 dstImage1D.init(&image_create_info);
4786 ASSERT_TRUE(dstImage1D.initialized());
4787
4788 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4789 image_create_info.extent.height = 16;
4790 image_create_info.extent.depth = 16;
4791 image_create_info.arrayLayers = 1;
4792 dstImage3D.init(&image_create_info);
4793 ASSERT_TRUE(dstImage3D.initialized());
4794
4795 m_commandBuffer->begin();
4796
4797 VkImageResolve resolveRegion;
4798 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4799 resolveRegion.srcSubresource.mipLevel = 0;
4800 resolveRegion.srcSubresource.baseArrayLayer = 0;
4801 resolveRegion.srcSubresource.layerCount = 1;
4802 resolveRegion.srcOffset.x = 0;
4803 resolveRegion.srcOffset.y = 0;
4804 resolveRegion.srcOffset.z = 0;
4805 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4806 resolveRegion.dstSubresource.mipLevel = 0;
4807 resolveRegion.dstSubresource.baseArrayLayer = 0;
4808 resolveRegion.dstSubresource.layerCount = 1;
4809 resolveRegion.dstOffset.x = 0;
4810 resolveRegion.dstOffset.y = 0;
4811 resolveRegion.dstOffset.z = 0;
4812 resolveRegion.extent.width = 1;
4813 resolveRegion.extent.height = 1;
4814 resolveRegion.extent.depth = 1;
4815
4816 // non-zero value baseArrayLayer
4817 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004819 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4820 &resolveRegion);
4821 m_errorMonitor->VerifyFound();
4822 resolveRegion.srcSubresource.baseArrayLayer = 0;
4823
4824 // Set height with 1D dstImage
4825 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004826 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004827 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004830 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4831 &resolveRegion);
4832 m_errorMonitor->VerifyFound();
4833 resolveRegion.extent.height = 1;
4834
4835 // Set depth with 1D dstImage and 2D srcImage
4836 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4838 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004839 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4840 &resolveRegion);
4841 m_errorMonitor->VerifyFound();
4842 resolveRegion.extent.depth = 1;
4843
4844 m_commandBuffer->end();
4845}
4846
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004847TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4848 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4849 ASSERT_NO_FATAL_FAILURE(Init());
4850
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004851 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004852 VkImageObj srcImage2D(m_device);
4853 VkImageObj dstImage2D(m_device);
4854
sfricke-samsung1c61f192021-12-31 01:53:03 -06004855 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004856 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4857 image_create_info.extent.width = 32;
4858 image_create_info.extent.height = 32;
4859 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004860 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004861 image_create_info.arrayLayers = 1;
4862 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4863 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4864 image_create_info.usage =
4865 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4866 // Note: Some implementations expect color attachment usage for any
4867 // multisample surface
4868 image_create_info.flags = 0;
4869
4870 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4871 srcImage2D.init(&image_create_info);
4872 ASSERT_TRUE(srcImage2D.initialized());
4873
4874 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4875 dstImage2D.init(&image_create_info);
4876 ASSERT_TRUE(dstImage2D.initialized());
4877
4878 m_commandBuffer->begin();
4879
4880 VkImageResolve resolveRegion = {};
4881 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4882 resolveRegion.srcSubresource.mipLevel = 0;
4883 resolveRegion.srcSubresource.baseArrayLayer = 0;
4884 resolveRegion.srcSubresource.layerCount = 1;
4885 resolveRegion.srcOffset.x = 0;
4886 resolveRegion.srcOffset.y = 0;
4887 resolveRegion.srcOffset.z = 0;
4888 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4889 resolveRegion.dstSubresource.mipLevel = 0;
4890 resolveRegion.dstSubresource.baseArrayLayer = 0;
4891 resolveRegion.dstSubresource.layerCount = 1;
4892 resolveRegion.dstOffset.x = 0;
4893 resolveRegion.dstOffset.y = 0;
4894 resolveRegion.dstOffset.z = 0;
4895 resolveRegion.extent.width = 32;
4896 resolveRegion.extent.height = 32;
4897 resolveRegion.extent.depth = 1;
4898
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004899 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4900 &resolveRegion);
4901 m_errorMonitor->VerifyNotFound();
4902
4903 // srcImage exceeded in x-dim
4904 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004905 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
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.srcOffset.x = 0;
4910
4911 // dstImage exceeded in x-dim
4912 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
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();
4917 resolveRegion.dstOffset.x = 0;
4918
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004919 // both image exceeded in y-dim
4920 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004921 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004922 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4923 &resolveRegion);
4924 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004925 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004926
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004927 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004929 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4930 &resolveRegion);
4931 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004932 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004933
4934 // srcImage exceeded in z-dim
4935 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004936 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004938 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4939 &resolveRegion);
4940 m_errorMonitor->VerifyFound();
4941 resolveRegion.srcOffset.z = 0;
4942
4943 // dstImage exceeded in z-dim
4944 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004945 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004947 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4948 &resolveRegion);
4949 m_errorMonitor->VerifyFound();
4950 resolveRegion.dstOffset.z = 0;
4951
4952 m_commandBuffer->end();
4953}
4954
unknown088160a2019-05-23 17:43:13 -06004955TEST_F(VkLayerTest, ClearImageErrors) {
4956 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4957
4958 ASSERT_NO_FATAL_FAILURE(Init());
4959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4960
4961 m_commandBuffer->begin();
4962
4963 // Color image
4964 VkClearColorValue clear_color;
4965 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4966 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4967 const int32_t img_width = 32;
4968 const int32_t img_height = 32;
sfricke-samsung1c61f192021-12-31 01:53:03 -06004969 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4971 image_create_info.format = color_format;
4972 image_create_info.extent.width = img_width;
4973 image_create_info.extent.height = img_height;
4974 image_create_info.extent.depth = 1;
4975 image_create_info.mipLevels = 1;
4976 image_create_info.arrayLayers = 1;
4977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4978 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4979
4980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4981 vk_testing::Image color_image_no_transfer;
4982 color_image_no_transfer.init(*m_device, image_create_info);
4983
4984 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4985 vk_testing::Image color_image;
4986 color_image.init(*m_device, image_create_info);
4987
4988 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4989
4990 // Depth/Stencil image
4991 VkClearDepthStencilValue clear_value = {0};
4992 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4993 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4994 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4995 ds_image_create_info.extent.width = 64;
4996 ds_image_create_info.extent.height = 64;
4997 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4998 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4999
5000 vk_testing::Image ds_image;
5001 ds_image.init(*m_device, ds_image_create_info);
5002
5003 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
5004
sfricke-samsungcd924d92020-05-20 23:51:17 -07005005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005006
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005007 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005008
5009 m_errorMonitor->VerifyFound();
5010
sfricke-samsungcd924d92020-05-20 23:51:17 -07005011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005012
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005013 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5014 &color_range);
unknown088160a2019-05-23 17:43:13 -06005015
5016 m_errorMonitor->VerifyFound();
5017
5018 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005020 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005021
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005022 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5023 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005024
5025 m_errorMonitor->VerifyFound();
5026}
5027
5028TEST_F(VkLayerTest, CommandQueueFlags) {
5029 TEST_DESCRIPTION(
5030 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5031
5032 ASSERT_NO_FATAL_FAILURE(Init());
5033
5034 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5035 if (queueFamilyIndex == UINT32_MAX) {
5036 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5037 return;
5038 } else {
5039 // Create command pool on a non-graphics queue
5040 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5041
5042 // Setup command buffer on pool
5043 VkCommandBufferObj command_buffer(m_device, &command_pool);
5044 command_buffer.begin();
5045
5046 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005048 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5049 command_buffer.SetViewport(0, 1, &viewport);
5050 m_errorMonitor->VerifyFound();
5051 }
5052}
5053
sfricke-samsung674ba102020-08-18 22:38:49 -07005054TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5055 TEST_DESCRIPTION(
5056 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5057 "buffer");
5058
5059 ASSERT_NO_FATAL_FAILURE(Init());
5060
5061 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5062 if (queueFamilyIndex == UINT32_MAX) {
5063 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5064 return;
5065 } else {
5066 // Create Depth image
5067 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5068 if (ds_format == VK_FORMAT_UNDEFINED) {
5069 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5070 return;
5071 }
5072
5073 VkImageObj ds_image(m_device);
5074 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5075 VK_IMAGE_TILING_OPTIMAL, 0);
5076 ASSERT_TRUE(ds_image.initialized());
5077
5078 // Allocate buffers
5079 VkBufferObj buffer;
5080 VkMemoryPropertyFlags reqs = 0;
5081 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5082
5083 VkBufferImageCopy region = {};
5084 region.bufferRowLength = 0;
5085 region.bufferImageHeight = 0;
5086 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5087 region.imageSubresource.layerCount = 1;
5088 region.imageOffset = {0, 0, 0};
5089 region.imageExtent = {64, 64, 1};
5090 region.bufferOffset = 0;
5091
5092 // Create command pool on a non-graphics queue
5093 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5094
5095 // Setup command buffer on pool
5096 VkCommandBufferObj command_buffer(m_device, &command_pool);
5097 command_buffer.begin();
5098
sfricke-samsungea4fd142020-10-17 23:51:59 -07005099 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005100 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5101 1, &region);
5102 m_errorMonitor->VerifyFound();
5103 }
5104}
5105
sfricke-samsung5a019492021-01-25 10:32:08 -08005106TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5107 TEST_DESCRIPTION(
5108 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5109 "buffer");
5110
5111 ASSERT_NO_FATAL_FAILURE(Init());
5112
5113 // Should be left with a tranfser queue
5114 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5115 if (queueFamilyIndex == UINT32_MAX) {
5116 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5117 return;
5118 }
5119
5120 VkImageObj image(m_device);
5121 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5122 VK_IMAGE_TILING_OPTIMAL, 0);
5123 ASSERT_TRUE(image.initialized());
5124
5125 // Allocate buffers
5126 VkBufferObj buffer;
5127 VkMemoryPropertyFlags reqs = 0;
5128 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5129
5130 VkBufferImageCopy region = {};
5131 region.bufferRowLength = 0;
5132 region.bufferImageHeight = 0;
5133 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5134 region.imageSubresource.layerCount = 1;
5135 region.imageOffset = {0, 0, 0};
5136 region.imageExtent = {16, 16, 1};
5137 region.bufferOffset = 5;
5138
5139 // Create command pool on a non-graphics queue
5140 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5141
5142 // Setup command buffer on pool
5143 VkCommandBufferObj command_buffer(m_device, &command_pool);
5144 command_buffer.begin();
5145
5146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5147 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5148 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5149 &region);
5150 m_errorMonitor->VerifyFound();
5151}
5152
sfricke-samsungcb467672020-11-25 00:09:28 -08005153TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5154 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5155
5156 ASSERT_NO_FATAL_FAILURE(Init());
5157
5158 if (m_device->queue_props.size() < 2) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005159 GTEST_SKIP() << "Need 2 different queues for testing skipping.";
sfricke-samsungcb467672020-11-25 00:09:28 -08005160 }
5161
5162 // First two queue families
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005163 uint32_t queue_index_a = 0;
5164 uint32_t queue_index_b = 1;
sfricke-samsungcb467672020-11-25 00:09:28 -08005165
sfricke-samsung1c61f192021-12-31 01:53:03 -06005166 VkCommandPoolCreateInfo pool_create_info = LvlInitStruct<VkCommandPoolCreateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005167 pool_create_info.flags = 0;
5168
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005169 pool_create_info.queueFamilyIndex = queue_index_a;
5170 vk_testing::CommandPool command_pool_a(*m_device, pool_create_info);
5171 ASSERT_TRUE(command_pool_a.initialized());
sfricke-samsungcb467672020-11-25 00:09:28 -08005172
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005173 pool_create_info.queueFamilyIndex = queue_index_b;
5174 vk_testing::CommandPool command_pool_b(*m_device, pool_create_info);
5175 ASSERT_TRUE(command_pool_b.initialized());
sfricke-samsungcb467672020-11-25 00:09:28 -08005176
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005177 auto command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005178 command_buffer_allocate_info.commandBufferCount = 1;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005179 command_buffer_allocate_info.commandPool = command_pool_a.handle();
sfricke-samsungcb467672020-11-25 00:09:28 -08005180 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005181 vk_testing::CommandBuffer command_buffer_primary(*m_device, command_buffer_allocate_info);
5182 ASSERT_TRUE(command_buffer_primary.initialized());
sfricke-samsungcb467672020-11-25 00:09:28 -08005183
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005184 command_buffer_allocate_info.commandPool = command_pool_b.handle();
sfricke-samsungcb467672020-11-25 00:09:28 -08005185 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005186 vk_testing::CommandBuffer command_buffer_secondary(*m_device, command_buffer_allocate_info);
sfricke-samsungcb467672020-11-25 00:09:28 -08005187
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005188 auto cmdbuff_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
5189 cmdbuff_ii.renderPass = m_renderPass;
5190 cmdbuff_ii.subpass = 0;
5191 cmdbuff_ii.framebuffer = m_framebuffer;
5192
5193 auto begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5194 begin_info.pInheritanceInfo = &cmdbuff_ii;
sfricke-samsungcb467672020-11-25 00:09:28 -08005195
5196 // secondary
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005197 command_buffer_secondary.begin(&begin_info);
5198 command_buffer_secondary.end();
sfricke-samsungcb467672020-11-25 00:09:28 -08005199
5200 // Try using different pool's command buffer as secondary
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005201 command_buffer_primary.begin(&begin_info);
sfricke-samsungcb467672020-11-25 00:09:28 -08005202 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005203 vk::CmdExecuteCommands(command_buffer_primary.handle(), 1, &command_buffer_secondary.handle());
sfricke-samsungcb467672020-11-25 00:09:28 -08005204 m_errorMonitor->VerifyFound();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005205 command_buffer_primary.end();
sfricke-samsungcb467672020-11-25 00:09:28 -08005206}
5207
unknown088160a2019-05-23 17:43:13 -06005208TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5209 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5210 ASSERT_NO_FATAL_FAILURE(Init());
5211 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5212 // never record secondary
5213
Mark Lobodzinski20310782020-02-28 14:25:17 -07005214 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005215 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005216 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005217 m_errorMonitor->VerifyFound();
5218 m_commandBuffer->end();
5219}
5220
5221TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5222 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5223
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005224 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005225 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5226
sfricke-samsung1c61f192021-12-31 01:53:03 -06005227 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005228 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5229 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5230 image_create_info.extent.width = 32;
5231 image_create_info.extent.height = 1;
5232 image_create_info.extent.depth = 1;
5233 image_create_info.mipLevels = 1;
5234 image_create_info.arrayLayers = 1;
5235 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5236 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5237 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5238 image_create_info.flags = 0;
5239
5240 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5241 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5242
5243 VkImageObj image(m_device);
5244 image.init(&image_create_info);
5245 ASSERT_TRUE(image.initialized());
5246 VkImageMemoryBarrier image_barrier =
5247 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5248
5249 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5250 image_barrier.oldLayout = old_layout;
5251 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005252 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5253 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005254 };
5255
5256 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5257 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5258 secondary.begin();
5259 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5260 secondary.end();
5261
Mark Lobodzinski20310782020-02-28 14:25:17 -07005262 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005263 m_commandBuffer->begin();
5264 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005265 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005266 m_errorMonitor->VerifyFound();
5267
unknown088160a2019-05-23 17:43:13 -06005268 m_commandBuffer->reset();
5269 secondary.reset();
5270
5271 // Validate that UNDEFINED doesn't false positive on us
5272 secondary.begin();
5273 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5274 secondary.end();
5275 m_commandBuffer->begin();
5276 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5277 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005278 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005279 m_errorMonitor->VerifyNotFound();
5280 m_commandBuffer->end();
5281}
5282
5283TEST_F(VkLayerTest, SetDynViewportParamTests) {
5284 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5285
5286 SetTargetApiVersion(VK_API_VERSION_1_1);
5287 VkPhysicalDeviceFeatures features{};
5288 ASSERT_NO_FATAL_FAILURE(Init(&features));
5289
5290 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5291 const VkViewport viewports[] = {vp, vp};
5292
5293 m_commandBuffer->begin();
5294
5295 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005296 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005297 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005298 m_errorMonitor->VerifyFound();
5299
Mark Lobodzinski20310782020-02-28 14:25:17 -07005300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005301 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005302 m_errorMonitor->VerifyFound();
5303
Mark Lobodzinski20310782020-02-28 14:25:17 -07005304 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005305 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005306 m_errorMonitor->VerifyFound();
5307
Mark Lobodzinski20310782020-02-28 14:25:17 -07005308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005310 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005311 m_errorMonitor->VerifyFound();
5312
Mark Lobodzinski20310782020-02-28 14:25:17 -07005313 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005314 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005315 m_errorMonitor->VerifyFound();
5316
5317 // core viewport tests
5318 using std::vector;
5319 struct TestCase {
5320 VkViewport vp;
5321 std::string veid;
5322 };
5323
5324 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5325 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5326 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5327
5328 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5329 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5330 const auto one_before_min_bounds = NearestSmaller(min_bound);
5331 const auto one_past_max_bounds = NearestGreater(max_bound);
5332
5333 const auto below_zero = NearestSmaller(0.0f);
5334 const auto past_one = NearestGreater(1.0f);
5335
5336 vector<TestCase> test_cases = {
5337 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5338 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5339 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5340 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5341 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5342 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5343 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5344 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5345 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5346 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5347 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5348 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5349 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5350 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5351 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5352 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5353 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5354 };
5355
5356 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5357 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5358 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5359 } else {
5360 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5361 }
5362
5363 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005365 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005366 m_errorMonitor->VerifyFound();
5367 }
5368}
5369
5370TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5371 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5372
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005373 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005374
Mike Schuchardt7cc57842021-09-15 10:49:59 -07005375 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
5376 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005377 } else {
5378 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5379 return;
5380 }
5381 ASSERT_NO_FATAL_FAILURE(InitState());
5382
5383 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5384}
5385
5386TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5387 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5388
5389 ASSERT_NO_FATAL_FAILURE(Init());
5390
5391 if (!m_device->phy().features().multiViewport) {
5392 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5393 return;
5394 }
5395
unknown088160a2019-05-23 17:43:13 -06005396 m_commandBuffer->begin();
5397
Mark Lobodzinski20310782020-02-28 14:25:17 -07005398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005399 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005400 m_errorMonitor->VerifyFound();
5401
Petr Kraus14e49492019-09-09 20:13:29 +02005402 const auto max_viewports = m_device->props.limits.maxViewports;
5403
Mark Lobodzinski20310782020-02-28 14:25:17 -07005404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005405 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005406 m_errorMonitor->VerifyFound();
5407
Petr Kraus14e49492019-09-09 20:13:29 +02005408 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5409 if (max_viewports >= too_big_max_viewports) {
5410 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5411 kSkipPrefix);
5412 } else {
5413 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5414 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5415
Mark Lobodzinski20310782020-02-28 14:25:17 -07005416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005417 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005418 m_errorMonitor->VerifyFound();
5419
Mark Lobodzinski20310782020-02-28 14:25:17 -07005420 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005421 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005422 m_errorMonitor->VerifyFound();
5423
Mark Lobodzinski20310782020-02-28 14:25:17 -07005424 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005425 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005426 m_errorMonitor->VerifyFound();
5427
Mark Lobodzinski20310782020-02-28 14:25:17 -07005428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005429 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005430 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005431 }
unknown088160a2019-05-23 17:43:13 -06005432}
5433
5434TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5435 TEST_DESCRIPTION(
5436 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5437
5438 ASSERT_NO_FATAL_FAILURE(Init());
5439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5440
5441 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5442 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5443
5444 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5445 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5446 nullptr, // pNext
5447 m_renderPass,
5448 0, // subpass
5449 m_framebuffer,
5450 };
5451 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5452 nullptr, // pNext
5453 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5454
5455 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5456 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5457 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5458 sec_cmdbuff_inside_rp.end();
5459
5460 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5461 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5462 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5463 sec_cmdbuff_outside_rp.end();
5464
5465 m_commandBuffer->begin();
5466
Mark Lobodzinski20310782020-02-28 14:25:17 -07005467 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005468 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005469 m_errorMonitor->VerifyFound();
5470
5471 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5472 nullptr, // pNext
5473 m_renderPass,
5474 m_framebuffer,
5475 {{0, 0}, {32, 32}},
5476 static_cast<uint32_t>(m_renderPassClearValues.size()),
5477 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005478 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005479
Mark Lobodzinski20310782020-02-28 14:25:17 -07005480 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005481 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005482 m_errorMonitor->VerifyFound();
5483}
5484
5485TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5486 TEST_DESCRIPTION(
5487 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5488 ASSERT_NO_FATAL_FAILURE(Init());
5489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5490
sfricke-samsung1c61f192021-12-31 01:53:03 -06005491 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06005492 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5493 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5494 command_buffer_allocate_info.commandBufferCount = 1;
5495
5496 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005497 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
sfricke-samsung1c61f192021-12-31 01:53:03 -06005498 VkCommandBufferBeginInfo command_buffer_begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5499 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06005500 command_buffer_inheritance_info.renderPass = m_renderPass;
5501 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5502
unknown088160a2019-05-23 17:43:13 -06005503 command_buffer_begin_info.flags =
5504 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5505 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5506
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005507 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005508 VkClearAttachment color_attachment;
5509 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5510 color_attachment.clearValue.color.float32[0] = 0;
5511 color_attachment.clearValue.color.float32[1] = 0;
5512 color_attachment.clearValue.color.float32[2] = 0;
5513 color_attachment.clearValue.color.float32[3] = 0;
5514 color_attachment.colorAttachment = 0;
5515 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005516 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005517 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5518 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005519 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005520 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005521
Mark Lobodzinski20310782020-02-28 14:25:17 -07005522 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005523 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005524 m_errorMonitor->VerifyFound();
5525
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005526 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005527 m_commandBuffer->end();
5528}
5529
5530TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5531 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
sjfricked8e01c52022-07-06 14:09:04 +09005532 AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005533
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005534 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09005535 if (!AreRequiredExtensionsEnabled()) {
5536 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
unknown088160a2019-05-23 17:43:13 -06005537 }
5538 ASSERT_NO_FATAL_FAILURE(InitState());
5539
5540 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5541 if (push_descriptor_prop.maxPushDescriptors < 1) {
5542 // Some implementations report an invalid maxPushDescriptors of 0
5543 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5544 return;
5545 }
5546
5547 // Create ordinary and push descriptor set layout
5548 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5549 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5550 ASSERT_TRUE(ds_layout.initialized());
5551 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5552 ASSERT_TRUE(push_ds_layout.initialized());
5553
5554 // Now use the descriptor set layouts to create a pipeline layout
5555 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5556 ASSERT_TRUE(pipeline_layout.initialized());
5557
5558 // Create a descriptor to push
5559 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5560 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5561 ASSERT_TRUE(buffer_obj.initialized());
5562
5563 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5564 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5565 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5566
5567 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5568 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5569
5570 // Find address of extension call and make the call
5571 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005572 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005573 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5574
5575 // Section 1: Queue family matching/capabilities.
5576 // Create command pool on a non-graphics queue
5577 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5578 const uint32_t transfer_only_qfi =
5579 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5580 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005581 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005582 } else {
5583 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5584
5585 VkCommandPoolObj command_pool(m_device, err_qfi);
5586 ASSERT_TRUE(command_pool.initialized());
5587 VkCommandBufferObj command_buffer(m_device, &command_pool);
5588 ASSERT_TRUE(command_buffer.initialized());
5589 command_buffer.begin();
5590
Mark Lobodzinski20310782020-02-28 14:25:17 -07005591 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5592 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005593 if (err_qfi == transfer_only_qfi) {
5594 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005595 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005596 }
5597 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5598 &descriptor_write);
5599 m_errorMonitor->VerifyFound();
5600 command_buffer.end();
5601
5602 // If we succeed in testing only one condition above, we need to test the other below.
5603 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5604 // Need to test the neither compute/gfx supported case separately.
5605 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5606 ASSERT_TRUE(tran_command_pool.initialized());
5607 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5608 ASSERT_TRUE(tran_command_buffer.initialized());
5609 tran_command_buffer.begin();
5610
5611 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5613 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5614 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005615 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5616 &descriptor_write);
5617 m_errorMonitor->VerifyFound();
5618 tran_command_buffer.end();
5619 }
5620 }
5621
5622 // Push to the non-push binding
5623 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005625 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5626 &descriptor_write);
5627 m_errorMonitor->VerifyFound();
5628
5629 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005631 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5632 &descriptor_write);
5633 m_errorMonitor->VerifyFound();
5634 m_commandBuffer->end();
5635
5636 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5637 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005638 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung85584a72021-09-30 21:43:38 -07005639 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005641 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5642 &descriptor_write);
5643 m_errorMonitor->VerifyFound();
5644}
5645
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005646TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5647 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
sjfricked8e01c52022-07-06 14:09:04 +09005648 AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005649
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005650 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09005651 if (!AreRequiredExtensionsEnabled()) {
5652 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005653 }
5654 ASSERT_NO_FATAL_FAILURE(InitState());
5655
5656 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5657 if (push_descriptor_prop.maxPushDescriptors < 1) {
5658 // Some implementations report an invalid maxPushDescriptors of 0.
5659 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5660 return;
5661 }
5662
5663 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5664 if (min_alignment == 0) {
5665 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5666 return;
5667 }
5668
5669 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5670 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5671 ASSERT_TRUE(push_ds_layout.initialized());
5672
5673 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5674 ASSERT_TRUE(pipeline_layout.initialized());
5675
5676 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5677 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5678 ASSERT_TRUE(buffer_obj.initialized());
5679
5680 // Use an invalid alignment.
5681 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5682 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5683 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5684
5685 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5686 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5687 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5688
5689 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005690 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005691 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5692 &descriptor_write);
5693 m_errorMonitor->VerifyFound();
5694
5695 m_commandBuffer->end();
5696}
5697
unknown088160a2019-05-23 17:43:13 -06005698TEST_F(VkLayerTest, SetDynScissorParamTests) {
5699 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5700
5701 VkPhysicalDeviceFeatures features{};
5702 ASSERT_NO_FATAL_FAILURE(Init(&features));
5703
5704 const VkRect2D scissor = {{0, 0}, {16, 16}};
5705 const VkRect2D scissors[] = {scissor, scissor};
5706
5707 m_commandBuffer->begin();
5708
5709 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005711 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005712 m_errorMonitor->VerifyFound();
5713
Mark Lobodzinski20310782020-02-28 14:25:17 -07005714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005715 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005716 m_errorMonitor->VerifyFound();
5717
Mark Lobodzinski20310782020-02-28 14:25:17 -07005718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005719 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005720 m_errorMonitor->VerifyFound();
5721
Mark Lobodzinski20310782020-02-28 14:25:17 -07005722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005724 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005725 m_errorMonitor->VerifyFound();
5726
Mark Lobodzinski20310782020-02-28 14:25:17 -07005727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005728 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005729 m_errorMonitor->VerifyFound();
5730
5731 struct TestCase {
5732 VkRect2D scissor;
5733 std::string vuid;
5734 };
5735
5736 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5737 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5738 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5739 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5740 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5741 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5742 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5743 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5744
5745 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005747 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005748 m_errorMonitor->VerifyFound();
5749 }
5750
5751 m_commandBuffer->end();
5752}
5753
5754TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5755 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5756
5757 ASSERT_NO_FATAL_FAILURE(Init());
5758
5759 if (!m_device->phy().features().multiViewport) {
5760 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5761 return;
5762 }
5763
unknown088160a2019-05-23 17:43:13 -06005764 m_commandBuffer->begin();
5765
Mark Lobodzinski20310782020-02-28 14:25:17 -07005766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005767 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005768 m_errorMonitor->VerifyFound();
5769
Petr Kraus14e49492019-09-09 20:13:29 +02005770 const auto max_scissors = m_device->props.limits.maxViewports;
5771
Mark Lobodzinski20310782020-02-28 14:25:17 -07005772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005773 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005774 m_errorMonitor->VerifyFound();
5775
Petr Kraus14e49492019-09-09 20:13:29 +02005776 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5777 if (max_scissors >= too_big_max_scissors) {
5778 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5779 kSkipPrefix);
5780 } else {
5781 const VkRect2D scissor = {{0, 0}, {16, 16}};
5782 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5783
Mark Lobodzinski20310782020-02-28 14:25:17 -07005784 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005785 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005786 m_errorMonitor->VerifyFound();
5787
Mark Lobodzinski20310782020-02-28 14:25:17 -07005788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005789 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005790 m_errorMonitor->VerifyFound();
5791
Mark Lobodzinski20310782020-02-28 14:25:17 -07005792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005793 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005794 m_errorMonitor->VerifyFound();
5795
Mark Lobodzinski20310782020-02-28 14:25:17 -07005796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005797 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005798 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005799 }
unknown088160a2019-05-23 17:43:13 -06005800}
5801
Tony-LunarG667cc022021-06-25 10:11:17 -06005802TEST_F(VkLayerTest, MultiDrawTests) {
5803 TEST_DESCRIPTION("Test validation of multi_draw extension");
5804 SetTargetApiVersion(VK_API_VERSION_1_2);
5805 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5806 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09005807 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
Tony-LunarG667cc022021-06-25 10:11:17 -06005808 }
5809
5810 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
5811 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multi_draw_features);
5812 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
5813 if (!multi_draw_features.multiDraw) {
5814 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5815 return;
5816 }
5817 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5818 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5819 } else {
5820 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5821 return;
5822 }
5823 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5824 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
5825 vk::GetPhysicalDeviceProperties2(gpu(), &properties2);
5826
5827 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5828 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5829
5830 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5831 auto vkCmdDrawMultiIndexedEXT =
5832 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5833 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5834
5835 VkMultiDrawInfoEXT multi_draws[3] = {};
5836 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5837
5838 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5839 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5840
5841 CreatePipelineHelper pipe(*this);
5842 pipe.InitInfo();
5843 pipe.InitState();
5844 pipe.CreateGraphicsPipeline();
5845
5846 // Try existing VUID checks
5847 m_commandBuffer->begin();
5848 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5849
5850 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5851 &pipe.descriptor_set_->set_, 0, NULL);
5852 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5853 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5854 m_errorMonitor->VerifyFound();
5855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5856 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5857 m_errorMonitor->VerifyFound();
5858
5859 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5860
5861 // New VUIDs added with multi_draw (also see GPU-AV)
5862 VkBufferObj buffer;
5863 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5864 multi_draw_indices[2].indexCount = 513;
5865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5866 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5867 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5868 m_errorMonitor->VerifyFound();
5869 multi_draw_indices[2].indexCount = 1;
5870
5871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5872 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5873 m_errorMonitor->VerifyFound();
5874 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5875 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5876 m_errorMonitor->VerifyFound();
5877
5878 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5879 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5880 m_errorMonitor->VerifyFound();
5881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5882 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5883 m_errorMonitor->VerifyFound();
5884
5885 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5886 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5887 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5888 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5889 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5890 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5891 m_errorMonitor->VerifyFound();
5892 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5893 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5894 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5895 m_errorMonitor->VerifyFound();
5896 }
5897}
5898
5899TEST_F(VkLayerTest, MultiDrawFeatures) {
5900 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5901 SetTargetApiVersion(VK_API_VERSION_1_2);
5902 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5903 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09005904 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
Tony-LunarG667cc022021-06-25 10:11:17 -06005905 }
5906 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5907 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5908 } else {
5909 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5910 return;
5911 }
5912 ASSERT_NO_FATAL_FAILURE(InitState());
5913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5914
sfricke-samsungca162082022-02-10 08:53:41 -08005915 auto multi_draw_props = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5916 auto pd_props2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_props);
5917 vk::GetPhysicalDeviceProperties2(gpu(), &pd_props2);
5918 if (multi_draw_props.maxMultiDrawCount == 0) {
5919 // If using MockICD and devsim the value might be zero'ed and cause false errors
5920 return;
5921 }
5922
Tony-LunarG667cc022021-06-25 10:11:17 -06005923 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5924 auto vkCmdDrawMultiIndexedEXT =
5925 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5926 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5927
5928 VkMultiDrawInfoEXT multi_draws[3] = {};
5929 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5930
5931 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5932 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5933
5934 CreatePipelineHelper pipe(*this);
5935 pipe.InitInfo();
5936 pipe.InitState();
5937 pipe.CreateGraphicsPipeline();
5938
5939 m_commandBuffer->begin();
5940 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5941 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5943 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5944 m_errorMonitor->VerifyFound();
5945 VkBufferObj buffer;
5946 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5947 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5949 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5950 m_errorMonitor->VerifyFound();
5951}
5952
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005953TEST_F(VkLayerTest, IndirectDrawTests) {
5954 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005955
sjfricked8e01c52022-07-06 14:09:04 +09005956 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005957 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5958
5959 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5960 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5961 return;
5962 }
sjfricked8e01c52022-07-06 14:09:04 +09005963 if (!AreRequiredExtensionsEnabled()) {
5964 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
5965 }
Aaron Hagand1a61212021-12-22 11:53:49 -05005966 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06005967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5968
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005969 CreatePipelineHelper pipe(*this);
5970 pipe.InitInfo();
5971 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06005972 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005973 dyn_state_ci.dynamicStateCount = size(dyn_states);
5974 dyn_state_ci.pDynamicStates = dyn_states;
5975 pipe.dyn_state_ci_ = dyn_state_ci;
5976 pipe.InitState();
5977 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005978
5979 m_commandBuffer->begin();
5980 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5981
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005982 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5983 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5984 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005985
5986 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005987 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005988 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005989 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005990
sfricke-samsung1c61f192021-12-31 01:53:03 -06005991 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005992 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5993 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005994 VkBufferObj draw_buffer;
5995 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005996
Aaron Hagand1a61212021-12-22 11:53:49 -05005997 VkBufferObj draw_buffer_correct;
5998 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5999 draw_buffer_correct.init(*m_device, buffer_create_info);
6000
unknown088160a2019-05-23 17:43:13 -06006001 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07006002 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006003 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006004 m_errorMonitor->VerifyFound();
6005
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006006 // VUID-vkCmdDrawIndirect-drawCount-02718
Aaron Hagand1a61212021-12-22 11:53:49 -05006007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-00488");
6008 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006009 m_errorMonitor->VerifyFound();
6010
Aaron Hagand1a61212021-12-22 11:53:49 -05006011 // VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701
6012 // VUID-vkCmdDrawIndexedIndirect-drawCount-00540
6013 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
6014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
6015 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006016 m_errorMonitor->VerifyFound();
6017
unknown088160a2019-05-23 17:43:13 -06006018 m_commandBuffer->EndRenderPass();
6019 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006020}
6021
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006022TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
6023 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
6024
sjfricked8e01c52022-07-06 14:09:04 +09006025 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6026
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006027 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006028
sjfricked8e01c52022-07-06 14:09:04 +09006029 if (!AreRequiredExtensionsEnabled()) {
6030 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006031 }
6032
6033 ASSERT_NO_FATAL_FAILURE(InitState());
6034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6035
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006036 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6037 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006038 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6039
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006040 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
6041 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
6042
6043 m_commandBuffer->begin();
6044 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
sfricke-samsung1c61f192021-12-31 01:53:03 -06006045 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006046 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6047 buffer_create_info.size = 1024;
6048 VkBufferObj counter_buffer;
6049 counter_buffer.init(*m_device, buffer_create_info);
6050
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006051 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006052 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006053 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006054 m_errorMonitor->VerifyFound();
6055
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006056 // some mock ICD json files are missing a valid stride value
6057 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6058 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006059 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006060 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6061 m_errorMonitor->VerifyFound();
6062 }
6063
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006064 m_commandBuffer->EndRenderPass();
6065 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006066
6067 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6068 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6069 return;
6070 }
6071
6072 std::vector<const char *> device_extension_names;
6073 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6074 VkDeviceObj test_device(0, gpu(), device_extension_names);
6075 VkCommandPoolObj commandPool(&test_device, 0);
6076 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6077 VkBufferObj counter_buffer2;
6078 counter_buffer2.init(test_device, buffer_create_info);
6079 VkPipelineLayoutObj pipelineLayout(&test_device);
6080 VkRenderPass renderpass;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006081 VkRenderPassCreateInfo rp_info = LvlInitStruct<VkRenderPassCreateInfo>();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006082 VkSubpassDescription subpass = {};
Tony-LunarG983bbc52020-11-06 11:04:59 -07006083 rp_info.pSubpasses = &subpass;
6084 rp_info.subpassCount = 1;
6085 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6086 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006087 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
sjfricke394227a2022-06-20 16:47:38 +09006088 vs.InitFromGLSLTry(false, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006089 pipeline.AddShader(&vs);
6090 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6091 m_renderPassBeginInfo.renderPass = renderpass;
6092 VkFramebuffer fb;
6093 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6094 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6095 m_renderPassBeginInfo.framebuffer = fb;
6096 m_renderPassBeginInfo.renderPass = renderpass;
6097 commandBuffer.begin();
6098 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6099 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6100 VkRect2D scissor = {{0, 0}, {16, 16}};
6101 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6102 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6103 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6104 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006105 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006106 }
6107 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6108 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6109 m_errorMonitor->VerifyFound();
6110 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6111 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006112}
6113
unknown088160a2019-05-23 17:43:13 -06006114TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6115 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6116
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006117 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6118 ASSERT_NO_FATAL_FAILURE(InitFramework());
6119 if (!AreRequiredExtensionsEnabled()) {
6120 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006121 }
6122 ASSERT_NO_FATAL_FAILURE(InitState());
6123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6124
unknown088160a2019-05-23 17:43:13 -06006125 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006126 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006127
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006128 CreatePipelineHelper pipe(*this);
6129 pipe.InitInfo();
6130 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006131 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006132 dyn_state_ci.dynamicStateCount = size(dyn_states);
6133 dyn_state_ci.pDynamicStates = dyn_states;
6134 pipe.dyn_state_ci_ = dyn_state_ci;
6135 pipe.InitState();
6136 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006137
6138 m_commandBuffer->begin();
6139 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6140
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006141 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6142 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6143 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006144
6145 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006146 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006147 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006148 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006149
sfricke-samsung1c61f192021-12-31 01:53:03 -06006150 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006151 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6152 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006153 vk_testing::Buffer draw_buffer;
6154 draw_buffer.init_no_mem(*m_device, buffer_create_info);
6155 ASSERT_TRUE(draw_buffer.initialized());
unknown088160a2019-05-23 17:43:13 -06006156
sjfrickeedd669c2022-06-02 17:37:19 +09006157 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006158 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006159 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006160 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006161 VkBufferObj count_buffer;
6162 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006163
Mark Lobodzinski20310782020-02-28 14:25:17 -07006164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006165 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006166 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006167 m_errorMonitor->VerifyFound();
6168
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006169 draw_buffer.bind_memory(*m_device, 0, 0);
unknown088160a2019-05-23 17:43:13 -06006170
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006171 vk_testing::Buffer count_buffer_unbound;
6172 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6173 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006174
sjfrickeedd669c2022-06-02 17:37:19 +09006175 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006176 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006177 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6178
Mark Lobodzinski20310782020-02-28 14:25:17 -07006179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006180 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
6181 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006182 m_errorMonitor->VerifyFound();
6183
sjfrickeedd669c2022-06-02 17:37:19 +09006184 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, " VUID-vkCmdDrawIndirectCount-countBuffer-02715");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006185 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006186 sizeof(VkDrawIndirectCommand));
6187 m_errorMonitor->VerifyFound();
6188
Mark Lobodzinski20310782020-02-28 14:25:17 -07006189 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006190 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006191 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006192 m_errorMonitor->VerifyFound();
6193
Mark Lobodzinski20310782020-02-28 14:25:17 -07006194 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006195 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006196 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006197 m_errorMonitor->VerifyFound();
6198
sjfrickeedd669c2022-06-02 17:37:19 +09006199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-04129");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006200 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006201 sizeof(VkDrawIndirectCommand));
6202 m_errorMonitor->VerifyFound();
6203
Mark Lobodzinski20310782020-02-28 14:25:17 -07006204 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006205 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006206 m_errorMonitor->VerifyFound();
6207
unknown088160a2019-05-23 17:43:13 -06006208 m_commandBuffer->EndRenderPass();
6209 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006210}
6211
6212TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6213 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6214
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006215 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006216 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006217 if (!AreRequiredExtensionsEnabled()) {
6218 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006219 }
6220 ASSERT_NO_FATAL_FAILURE(InitState());
6221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6222
unknown088160a2019-05-23 17:43:13 -06006223 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006224 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006225
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006226 CreatePipelineHelper pipe(*this);
6227 pipe.InitInfo();
6228 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006229 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006230 dyn_state_ci.dynamicStateCount = size(dyn_states);
6231 dyn_state_ci.pDynamicStates = dyn_states;
6232 pipe.dyn_state_ci_ = dyn_state_ci;
6233 pipe.InitState();
6234 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006235
6236 m_commandBuffer->begin();
6237 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6238
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006239 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6240 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6241 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006242
6243 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006244 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006245 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006246 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006247
sfricke-samsung1c61f192021-12-31 01:53:03 -06006248 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006249 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6250 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006251 VkBufferObj draw_buffer;
6252 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006253
sjfrickeedd669c2022-06-02 17:37:19 +09006254 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006255 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006256 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006257 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006258 VkBufferObj count_buffer;
6259 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006260
sfricke-samsung1c61f192021-12-31 01:53:03 -06006261 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006262 index_buffer_create_info.size = sizeof(uint32_t);
6263 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006264 VkBufferObj index_buffer;
6265 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006266
Mark Lobodzinski20310782020-02-28 14:25:17 -07006267 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006268 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006269 sizeof(VkDrawIndexedIndirectCommand));
6270 m_errorMonitor->VerifyFound();
6271
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006272 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006273
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006274 vk_testing::Buffer draw_buffer_unbound;
6275 draw_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6276 ASSERT_TRUE(draw_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006277
Mark Lobodzinski20310782020-02-28 14:25:17 -07006278 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006279 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006280 sizeof(VkDrawIndexedIndirectCommand));
6281 m_errorMonitor->VerifyFound();
6282
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006283 vk_testing::Buffer count_buffer_unbound;
6284 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6285 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006286
sjfrickeedd669c2022-06-02 17:37:19 +09006287 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006288 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006289 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6290
Mark Lobodzinski20310782020-02-28 14:25:17 -07006291 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006292 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006293 sizeof(VkDrawIndexedIndirectCommand));
6294 m_errorMonitor->VerifyFound();
6295
sjfrickeedd669c2022-06-02 17:37:19 +09006296 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715");
6297 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
6298 sizeof(VkDrawIndexedIndirectCommand));
6299 m_errorMonitor->VerifyFound();
6300
Mark Lobodzinski20310782020-02-28 14:25:17 -07006301 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006302 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006303 sizeof(VkDrawIndexedIndirectCommand));
6304 m_errorMonitor->VerifyFound();
6305
Mark Lobodzinski20310782020-02-28 14:25:17 -07006306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006307 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006308 sizeof(VkDrawIndexedIndirectCommand));
6309 m_errorMonitor->VerifyFound();
6310
sjfrickeedd669c2022-06-02 17:37:19 +09006311 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-04129");
6312 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size,
6313 1, sizeof(VkDrawIndexedIndirectCommand));
6314 m_errorMonitor->VerifyFound();
6315
Mark Lobodzinski20310782020-02-28 14:25:17 -07006316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006317 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006318 m_errorMonitor->VerifyFound();
6319
unknown088160a2019-05-23 17:43:13 -06006320 m_commandBuffer->EndRenderPass();
6321 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006322}
6323
sfricke-samsung860d3b22020-05-04 21:08:29 -07006324TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6325 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6326
6327 SetTargetApiVersion(VK_API_VERSION_1_2);
6328 ASSERT_NO_FATAL_FAILURE(Init());
6329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6330 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09006331 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
sfricke-samsung860d3b22020-05-04 21:08:29 -07006332 }
6333
6334 VkBufferObj indirect_buffer;
6335 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6336 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6337
6338 VkBufferObj indexed_indirect_buffer;
6339 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6340 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6341
6342 VkBufferObj count_buffer;
6343 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6344
6345 VkBufferObj index_buffer;
6346 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6347
6348 CreatePipelineHelper pipe(*this);
6349 pipe.InitInfo();
6350 pipe.InitState();
6351 pipe.CreateGraphicsPipeline();
6352
6353 // Make calls to valid commands but without the drawIndirectCount feature set
6354 m_commandBuffer->begin();
6355 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6356
6357 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6358
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006359 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006360 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6361 sizeof(VkDrawIndirectCommand));
6362 m_errorMonitor->VerifyFound();
6363
6364 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6365
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006366 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006367 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6368 sizeof(VkDrawIndexedIndirectCommand));
6369 m_errorMonitor->VerifyFound();
6370
6371 m_commandBuffer->EndRenderPass();
6372 m_commandBuffer->end();
6373}
6374
unknown088160a2019-05-23 17:43:13 -06006375TEST_F(VkLayerTest, ExclusiveScissorNV) {
6376 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6377
6378 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6379 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6380 } else {
6381 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6382 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6383 return;
6384 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006385 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006386 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6387 for (auto device_extension : required_device_extensions) {
6388 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6389 m_device_extension_names.push_back(device_extension);
6390 } else {
6391 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6392 return;
6393 }
6394 }
6395
6396 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006397 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006398 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6399
6400 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006401 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6402 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006403 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6404
6405 features2.features.multiViewport = VK_FALSE;
6406
6407 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6408 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6409
6410 if (m_device->phy().properties().limits.maxViewports) {
6411 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6412 return;
6413 }
6414
6415 // Based on PSOViewportStateTests
6416 {
6417 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6418 VkViewport viewports[] = {viewport, viewport};
6419 VkRect2D scissor = {{0, 0}, {64, 64}};
6420 VkRect2D scissors[100] = {scissor, scissor};
6421
6422 using std::vector;
6423 struct TestCase {
6424 uint32_t viewport_count;
6425 VkViewport *viewports;
6426 uint32_t scissor_count;
6427 VkRect2D *scissors;
6428 uint32_t exclusive_scissor_count;
6429 VkRect2D *exclusive_scissors;
6430
6431 vector<std::string> vuids;
6432 };
6433
6434 vector<TestCase> test_cases = {
6435 {1,
6436 viewports,
6437 1,
6438 scissors,
6439 2,
6440 scissors,
6441 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6442 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6443 {1,
6444 viewports,
6445 1,
6446 scissors,
6447 100,
6448 scissors,
6449 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6450 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6451 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006452 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006453 };
6454
6455 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006456 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6457 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006458
6459 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6460 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6461 helper.vp_state_ci_.pViewports = test_case.viewports;
6462 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6463 helper.vp_state_ci_.pScissors = test_case.scissors;
6464 helper.vp_state_ci_.pNext = &exc;
6465
6466 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6467 exc.pExclusiveScissors = test_case.exclusive_scissors;
6468 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006469 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006470 }
6471 }
6472
6473 // Based on SetDynScissorParamTests
6474 {
6475 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006476 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006477
6478 const VkRect2D scissor = {{0, 0}, {16, 16}};
6479 const VkRect2D scissors[] = {scissor, scissor};
6480
6481 m_commandBuffer->begin();
6482
Mark Lobodzinski20310782020-02-28 14:25:17 -07006483 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006484 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6485 m_errorMonitor->VerifyFound();
6486
Mark Lobodzinski20310782020-02-28 14:25:17 -07006487 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006488 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6489 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6490 m_errorMonitor->VerifyFound();
6491
Mark Lobodzinski20310782020-02-28 14:25:17 -07006492 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006493 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6494 m_errorMonitor->VerifyFound();
6495
Mark Lobodzinski20310782020-02-28 14:25:17 -07006496 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006497 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006498 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006499 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6500 m_errorMonitor->VerifyFound();
6501
Mark Lobodzinski20310782020-02-28 14:25:17 -07006502 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006504 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6505 m_errorMonitor->VerifyFound();
6506
Mark Lobodzinski20310782020-02-28 14:25:17 -07006507 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006508 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6509 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6510 m_errorMonitor->VerifyFound();
6511
6512 struct TestCase {
6513 VkRect2D scissor;
6514 std::string vuid;
6515 };
6516
6517 std::vector<TestCase> test_cases = {
6518 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6519 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6520 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6521 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6522 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6523 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6524 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6525 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6526
6527 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006528 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006529 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6530 m_errorMonitor->VerifyFound();
6531 }
6532
6533 m_commandBuffer->end();
6534 }
6535}
6536
6537TEST_F(VkLayerTest, MeshShaderNV) {
6538 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6539
sjfricked8e01c52022-07-06 14:09:04 +09006540 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6541 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006542 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09006543 if (!AreRequiredExtensionsEnabled()) {
6544 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
unknown088160a2019-05-23 17:43:13 -06006545 }
6546
Tony-LunarG048f5012020-04-29 16:55:11 -06006547 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006548 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6549 return;
6550 }
6551
6552 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006553 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006554 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6555
6556 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006557 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6558 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006559 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6560 features2.features.multiDrawIndirect = VK_FALSE;
6561
6562 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6564
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006565 static const char vertShaderText[] = R"glsl(
6566 #version 450
6567 vec2 vertices[3];
6568 void main() {
6569 vertices[0] = vec2(-1.0, -1.0);
6570 vertices[1] = vec2( 1.0, -1.0);
6571 vertices[2] = vec2( 0.0, 1.0);
6572 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6573 gl_PointSize = 1.0f;
6574 }
6575 )glsl";
unknown088160a2019-05-23 17:43:13 -06006576
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006577 static const char meshShaderText[] = R"glsl(
6578 #version 450
6579 #extension GL_NV_mesh_shader : require
6580 layout(local_size_x = 1) in;
6581 layout(max_vertices = 3) out;
6582 layout(max_primitives = 1) out;
6583 layout(triangles) out;
6584 void main() {
6585 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6586 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6587 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6588 gl_PrimitiveIndicesNV[0] = 0;
6589 gl_PrimitiveIndicesNV[1] = 1;
6590 gl_PrimitiveIndicesNV[2] = 2;
6591 gl_PrimitiveCountNV = 1;
6592 }
6593 )glsl";
unknown088160a2019-05-23 17:43:13 -06006594
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006595 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6596 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6597 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006598
6599 // Test pipeline creation
6600 {
6601 // can't mix mesh with vertex
6602 const auto break_vp = [&](CreatePipelineHelper &helper) {
6603 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6604 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006605 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006606 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6607
6608 // vertex or mesh must be present
6609 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006610 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006611 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6612
6613 // vertexinput and inputassembly must be valid when vertex stage is present
6614 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6615 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6616 helper.gp_ci_.pVertexInputState = nullptr;
6617 helper.gp_ci_.pInputAssemblyState = nullptr;
6618 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006619 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006620 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6621 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6622 }
6623
6624 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006625 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006626
sfricke-samsung1c61f192021-12-31 01:53:03 -06006627 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006628 buffer_create_info.size = sizeof(uint32_t);
6629 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6630 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006631 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006632 ASSERT_VK_SUCCESS(result);
6633
6634 m_commandBuffer->begin();
6635
Mark Lobodzinski20310782020-02-28 14:25:17 -07006636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6637 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006638 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6639 m_errorMonitor->VerifyFound();
6640
6641 m_commandBuffer->end();
6642
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006643 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006644}
6645
6646TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6647 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006648
sjfricked700bc02022-05-30 16:35:06 +09006649 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006650 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +09006651 if (!AreRequiredExtensionsEnabled()) {
6652 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006653 }
6654 auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
6655 vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR"));
6656 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6657
6658 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6659 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
6660 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6661 if (mesh_shader_features.meshShader != VK_TRUE) {
6662 printf("%s Mesh shader feature not supported\n", kSkipPrefix);
6663 return;
6664 }
6665
6666 mesh_shader_features.meshShader = VK_FALSE;
6667 mesh_shader_features.taskShader = VK_FALSE;
6668 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06006669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6670
6671 VkEvent event;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006672 VkEventCreateInfo event_create_info = LvlInitStruct<VkEventCreateInfo>();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006673 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006674
6675 m_commandBuffer->begin();
6676
Shannon McPherson93970b12020-06-12 14:34:35 -06006677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006678 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006679 m_errorMonitor->VerifyFound();
6680
Shannon McPherson93970b12020-06-12 14:34:35 -06006681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006682 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006683 m_errorMonitor->VerifyFound();
6684
Shannon McPherson93970b12020-06-12 14:34:35 -06006685 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006686 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006687 m_errorMonitor->VerifyFound();
6688
Shannon McPherson93970b12020-06-12 14:34:35 -06006689 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006690 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006691 m_errorMonitor->VerifyFound();
6692
Shannon McPherson93970b12020-06-12 14:34:35 -06006693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006695 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6696 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006697 m_errorMonitor->VerifyFound();
6698
Shannon McPherson93970b12020-06-12 14:34:35 -06006699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6700 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006701 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6702 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006703 m_errorMonitor->VerifyFound();
6704
Shannon McPherson93970b12020-06-12 14:34:35 -06006705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006707 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6708 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006709 m_errorMonitor->VerifyFound();
6710
Shannon McPherson93970b12020-06-12 14:34:35 -06006711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006713 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6714 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006715 m_errorMonitor->VerifyFound();
6716
6717 m_commandBuffer->end();
6718
sfricke-samsung1c61f192021-12-31 01:53:03 -06006719 VkSemaphoreCreateInfo semaphore_create_info = LvlInitStruct<VkSemaphoreCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006720 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006721 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006722
6723 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006724 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006725
6726 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006727 submit_info.signalSemaphoreCount = 1;
6728 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006729 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006730 m_errorMonitor->VerifyNotFound();
6731
unknown088160a2019-05-23 17:43:13 -06006732 submit_info.signalSemaphoreCount = 0;
6733 submit_info.pSignalSemaphores = nullptr;
6734 submit_info.waitSemaphoreCount = 1;
6735 submit_info.pWaitSemaphores = &semaphore;
6736 submit_info.pWaitDstStageMask = &stage_flags;
6737
sfricke-samsung1ac64842021-09-23 14:11:17 -07006738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006740 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006741 m_errorMonitor->VerifyFound();
6742
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006743 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006744
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006745 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006746
6747 static const char task_src[] = R"glsl(
6748 #version 450
6749
6750 #extension GL_NV_mesh_shader : require
6751
6752 layout(local_size_x = 32) in;
6753
6754 taskNV out Task {
6755 uint baseID;
6756 } OUT;
6757
6758 void main() {
6759 OUT.baseID = 1;
6760 }
6761 )glsl";
6762
6763 static const char mesh_src[] = R"glsl(
6764 #version 450
6765
6766 #extension GL_NV_mesh_shader : require
6767
6768 layout(local_size_x = 1) in;
6769 layout(max_vertices = 3) out;
6770 layout(max_primitives = 1) out;
6771 layout(triangles) out;
6772
6773 taskNV in Task {
6774 uint baseID;
6775 } IN;
6776
6777 void main() {
6778 }
6779 )glsl";
6780
6781 VkShaderObj task_shader(this, task_src, VK_SHADER_STAGE_TASK_BIT_NV);
6782 VkShaderObj mesh_shader(this, mesh_src, VK_SHADER_STAGE_MESH_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006783
6784 // mesh and task shaders not supported
6785 const auto break_vp = [&](CreatePipelineHelper &helper) {
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006786 helper.shader_stages_ = {task_shader.GetStageCreateInfo(), mesh_shader.GetStageCreateInfo()};
unknown088160a2019-05-23 17:43:13 -06006787 };
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006788 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
6789 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6790 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
unknown088160a2019-05-23 17:43:13 -06006791
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006792 vk::DestroyEvent(m_device->device(), event, nullptr);
6793 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006794}
Chris Mayerc93536f2019-09-19 16:34:49 +02006795
6796TEST_F(VkLayerTest, ViewportWScalingNV) {
6797 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6798
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006799 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006800
6801 VkPhysicalDeviceFeatures device_features = {};
6802 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6803
6804 if (!device_features.multiViewport) {
6805 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6806 return;
6807 }
6808
6809 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6810 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6811 } else {
6812 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6813 return;
6814 }
6815
6816 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6818
6819 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006820 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006821
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006822 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006823 #version 450
6824 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6825 vec2( 1.0f, 1.0f),
6826 vec2(-1.0f, -1.0f),
6827 vec2( 1.0f, -1.0f) };
6828 out gl_PerVertex {
6829 vec4 gl_Position;
6830 };
6831
6832 void main() {
6833 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006834 }
6835 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006836
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006837 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006838 #version 450
6839 layout(location = 0) out vec4 outColor;
6840
6841 void main() {
6842 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006843 }
6844 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006845
6846 const std::vector<VkViewport> vp = {
6847 {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}};
6848 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6849 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6850
6851 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6852
sfricke-samsung1c61f192021-12-31 01:53:03 -06006853 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006854 vpsi.viewportWScalingEnable = VK_TRUE;
6855 vpsi.viewportCount = vp_count;
6856 vpsi.pViewportWScalings = scale.data();
6857
sfricke-samsung1c61f192021-12-31 01:53:03 -06006858 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006859 vpci.viewportCount = vp_count;
6860 vpci.pViewports = vp.data();
6861 vpci.scissorCount = vp_count;
6862 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006863
6864 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6865
6866 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006867 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006868
6869 // Create pipeline with w-scaling enabled but without a valid scaling array
6870 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006871 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006872 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6873
6874 vpsi.pViewportWScalings = scale.data();
6875
6876 // Create pipeline with w-scaling enabled but without matching viewport counts
6877 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006878 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006879 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6880
6881 const VkPipelineLayoutObj pl(m_device);
6882
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006883 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6884 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006885
6886 VkPipelineObj pipe(m_device);
6887 pipe.AddDefaultColorAttachment();
6888 pipe.AddShader(&vs);
6889 pipe.AddShader(&fs);
6890 pipe.SetViewport(vp);
6891 pipe.SetScissor(sc);
6892 pipe.CreateVKPipeline(pl.handle(), renderPass());
6893
6894 VkPipelineObj pipeDynWScale(m_device);
6895 pipeDynWScale.AddDefaultColorAttachment();
6896 pipeDynWScale.AddShader(&vs);
6897 pipeDynWScale.AddShader(&fs);
6898 pipeDynWScale.SetViewport(vp);
6899 pipeDynWScale.SetScissor(sc);
6900 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6901 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6902
6903 m_commandBuffer->begin();
6904
6905 // Bind pipeline without dynamic w scaling enabled
6906 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006907 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006908 m_errorMonitor->VerifyNotFound();
6909
Chris Mayerc93536f2019-09-19 16:34:49 +02006910 // Bind pipeline that has dynamic w-scaling enabled
6911 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006912 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006913 m_errorMonitor->VerifyNotFound();
6914
6915 const auto max_vps = m_device->props.limits.maxViewports;
6916
Mark Lobodzinski20310782020-02-28 14:25:17 -07006917 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006918 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6919 m_errorMonitor->VerifyFound();
6920
6921 m_errorMonitor->ExpectSuccess();
6922 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6923 m_errorMonitor->VerifyNotFound();
6924
6925 m_commandBuffer->end();
6926}
sfricke-samsung914e8002020-01-07 22:26:18 -08006927
6928TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6929 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6930
6931 // Enable Sampler YCbCr Conversion req'd extensions
6932 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6933 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6934 if (mp_extensions) {
6935 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6936 }
6937 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006938 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006939 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006940 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6941 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6942 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6943 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006944 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006945 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6946 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6947 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6948 } else {
6949 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6950 return;
6951 }
6952
6953 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06006954 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08006955 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6956 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6957
6958 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6959 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6960 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6961 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6962 return;
6963 }
6964
6965 // Create Ycbcr conversion
6966 VkSamplerYcbcrConversion conversions;
6967 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6968 NULL,
6969 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6970 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6971 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6972 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6973 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6974 VK_CHROMA_LOCATION_COSITED_EVEN,
6975 VK_CHROMA_LOCATION_COSITED_EVEN,
6976 VK_FILTER_NEAREST,
6977 false};
6978
Mark Lobodzinski20310782020-02-28 14:25:17 -07006979 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006980 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6981 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006982}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006983
6984TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6985 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6986
sjfricked8e01c52022-07-06 14:09:04 +09006987 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006988
6989 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6990
sjfricked8e01c52022-07-06 14:09:04 +09006991 if (!AreRequiredExtensionsEnabled()) {
6992 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006993 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006994
6995 {
6996 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6997 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6998 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6999
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007000 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7001 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007002 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7003
7004 if (!tf_features.transformFeedback) {
7005 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7006 return;
7007 }
7008 }
7009
7010 ASSERT_NO_FATAL_FAILURE(InitState());
7011 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7012
7013 {
7014 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
7015 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7016 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7017
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007018 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007019 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7020 info.size = 4;
7021 VkBufferObj buffer;
7022 buffer.init(*m_device, info);
7023 VkDeviceSize offsets[1]{};
7024
7025 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
7026 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
7027 m_errorMonitor->VerifyFound();
7028 }
7029
7030 {
7031 auto vkCmdBeginTransformFeedbackEXT =
7032 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7033 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7034
7035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
7036 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7037 m_errorMonitor->VerifyFound();
7038 }
7039
7040 {
7041 auto vkCmdEndTransformFeedbackEXT =
7042 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7043 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7044
7045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
7046 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7047 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7048 m_errorMonitor->VerifyFound();
7049 }
7050}
7051
7052TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
7053 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
7054
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007055 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7056 ASSERT_NO_FATAL_FAILURE(InitFramework());
7057 if (!AreRequiredExtensionsEnabled()) {
7058 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007059 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007060
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007061 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007062 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007063 }
7064
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007065 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007066 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007067 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007068
7069 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007070 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007071 }
7072
7073 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7074 }
7075
7076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7077
7078 auto vkCmdBindTransformFeedbackBuffersEXT =
7079 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7080 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7081
7082 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007083 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007084 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007085
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007086 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007087 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7088 info.size = 8;
7089 VkBufferObj const buffer_obj(*m_device, info);
7090
7091 // Request a firstBinding that is too large.
7092 {
7093 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7094 VkDeviceSize const offsets[1]{};
7095
7096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7097 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7098 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7099 nullptr);
7100 m_errorMonitor->VerifyFound();
7101 }
7102
7103 // Request too many bindings.
7104 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7105 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7106 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7107
7108 std::vector<VkDeviceSize> offsets(bindingCount);
7109
7110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7111 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7112 nullptr);
7113 m_errorMonitor->VerifyFound();
7114 }
7115
7116 // Request a size that is larger than the maximum size.
7117 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7118 VkDeviceSize const offsets[1]{};
7119 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7120
7121 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7122 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7123 m_errorMonitor->VerifyFound();
7124 }
7125 }
7126
7127 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007128 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007129 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7130 info.size = 8;
7131 VkBufferObj const buffer_obj(*m_device, info);
7132
7133 // Request an offset that is too large.
7134 {
7135 VkDeviceSize const offsets[1]{info.size + 4};
7136
7137 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7138 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7139 m_errorMonitor->VerifyFound();
7140 }
7141
7142 // Request an offset that is not a multiple of 4.
7143 {
7144 VkDeviceSize const offsets[1]{1};
7145
7146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7147 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7148 m_errorMonitor->VerifyFound();
7149 }
7150
7151 // Request a size that is larger than the buffer's size.
7152 {
7153 VkDeviceSize const offsets[1]{};
7154 VkDeviceSize const sizes[1]{info.size + 1};
7155
7156 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007157 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7158 m_errorMonitor->VerifyFound();
7159 }
7160
7161 // Request an offset and size whose sum is larger than the buffer's size.
7162 {
7163 VkDeviceSize const offsets[1]{4};
7164 VkDeviceSize const sizes[1]{info.size - 3};
7165
7166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7167 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7168 m_errorMonitor->VerifyFound();
7169 }
7170
7171 // Bind while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007172 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007173 auto vkCmdBeginTransformFeedbackEXT =
7174 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7175 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7176 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7177
7178 VkDeviceSize const offsets[1]{};
7179
7180 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7181 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7182 m_errorMonitor->VerifyFound();
7183
7184 auto vkCmdEndTransformFeedbackEXT =
7185 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7186 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7187 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7188 }
7189 }
7190
7191 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7192 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007193 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007194 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7195 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007196 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007197 VkBufferObj const buffer_obj(*m_device, info);
7198
7199 VkDeviceSize const offsets[1]{};
7200
7201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7202 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7203 m_errorMonitor->VerifyFound();
7204 }
7205
7206 // Don't bind memory.
7207 {
7208 VkBuffer buffer{};
7209 {
7210 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7211 ASSERT_TRUE(vkCreateBuffer != nullptr);
7212
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007213 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007214 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7215 info.size = 4;
7216 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7217 }
7218
7219 VkDeviceSize const offsets[1]{};
7220
7221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7222 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7223 m_errorMonitor->VerifyFound();
7224 }
7225}
7226
7227TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7228 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7229
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007230 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7231 ASSERT_NO_FATAL_FAILURE(InitFramework());
7232 if (!AreRequiredExtensionsEnabled()) {
7233 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007234 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007235
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007236 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007237 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007238 }
7239
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007240 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007241 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007242 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007243
7244 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007245 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007246 }
7247
7248 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7249 }
7250
7251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7252
7253 auto vkCmdBeginTransformFeedbackEXT =
7254 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7255 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7256
7257 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007258 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007259 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007260
7261 // Request a firstCounterBuffer that is too large.
7262 {
7263 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7264
7265 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7266 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7267 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7268 m_errorMonitor->VerifyFound();
7269 }
7270
7271 // Request too many buffers.
7272 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7273 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7274
7275 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7276 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7277 m_errorMonitor->VerifyFound();
7278 }
7279 }
7280
7281 // Request an out-of-bounds location.
7282 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007283 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007284 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7285 info.size = 4;
7286 VkBufferObj const buffer_obj(*m_device, info);
7287
7288 VkDeviceSize const offsets[1]{1};
7289
7290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7291 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7292 m_errorMonitor->VerifyFound();
7293 }
7294
7295 // Request specific offsets without specifying buffers.
7296 {
7297 VkDeviceSize const offsets[1]{};
7298
7299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7300 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7301 m_errorMonitor->VerifyFound();
7302 }
7303
7304 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7305 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007306 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007307 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7308 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007309 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007310 VkBufferObj const buffer_obj(*m_device, info);
7311
7312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7313 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7314 m_errorMonitor->VerifyFound();
7315 }
7316
7317 // Begin while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007318 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007319 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7320
7321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7322 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7323 m_errorMonitor->VerifyFound();
7324
7325 auto vkCmdEndTransformFeedbackEXT =
7326 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7327 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7328
7329 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7330 }
7331}
7332
7333TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7334 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7335
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007336 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007337 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007338 if (!AreRequiredExtensionsEnabled()) {
7339 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
7340 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007341
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007342 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007343 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007344 }
7345
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007346 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007347 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007348 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007349
7350 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007351 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007352 }
7353
7354 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7355 }
7356
7357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7358
7359 auto vkCmdEndTransformFeedbackEXT =
7360 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7361 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7362
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007363 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007364 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007365 // Activate transform feedback.
7366 auto vkCmdBeginTransformFeedbackEXT =
7367 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7368 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7369 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007370
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007371 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007372 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7373 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007374
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007375 // Request a firstCounterBuffer that is too large.
7376 {
7377 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7378
7379 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7380 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7381 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7382 m_errorMonitor->VerifyFound();
7383 }
7384
7385 // Request too many buffers.
7386 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7387 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7388
7389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7390 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7391 m_errorMonitor->VerifyFound();
7392 }
7393 }
7394
7395 // Request an out-of-bounds location.
7396 {
7397 auto info = LvlInitStruct<VkBufferCreateInfo>();
7398 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7399 info.size = 4;
7400 VkBufferObj const buffer_obj(*m_device, info);
7401
7402 VkDeviceSize const offsets[1]{1};
7403
7404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7405 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007406 m_errorMonitor->VerifyFound();
7407 }
7408
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007409 // Request specific offsets without specifying buffers.
7410 {
7411 VkDeviceSize const offsets[1]{};
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007412
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7414 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7415 m_errorMonitor->VerifyFound();
7416 }
7417
7418 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7419 {
7420 auto info = LvlInitStruct<VkBufferCreateInfo>();
7421 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7422 info.size = 4;
7423 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
7424 VkBufferObj const buffer_obj(*m_device, info);
7425
7426 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7427 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007428 m_errorMonitor->VerifyFound();
7429 }
7430 }
7431
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007432 // End while transform feedback is inactive.
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007433 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007434 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007435
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007436 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7437 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007438 m_errorMonitor->VerifyFound();
7439 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007440 }
7441}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007442
sfricke-samsung39ee2442020-07-22 21:21:15 -07007443TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7444 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007445
7446 // protect memory added in VK 1.1
7447 SetTargetApiVersion(VK_API_VERSION_1_1);
7448
sjfricked8e01c52022-07-06 14:09:04 +09007449 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7450
sfricke-samsung071af2d2020-07-02 10:37:22 -07007451 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7452
sjfricked8e01c52022-07-06 14:09:04 +09007453 if (!AreRequiredExtensionsEnabled()) {
7454 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7455 }
7456
sfricke-samsung071af2d2020-07-02 10:37:22 -07007457 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7458 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7459 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7460
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007461 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7462 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007463 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7464
7465 if (protected_memory_features.protectedMemory == VK_FALSE) {
7466 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7467 return;
7468 };
7469
7470 // Turns m_commandBuffer into a protected command buffer
7471 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7472
7473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7474 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007475 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung071af2d2020-07-02 10:37:22 -07007476 }
7477
7478 VkBufferObj indirect_buffer;
7479 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7480 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7481
7482 VkBufferObj indexed_indirect_buffer;
7483 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7484 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7485
7486 VkBufferObj index_buffer;
7487 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7488
7489 CreatePipelineHelper pipe(*this);
7490 pipe.InitInfo();
7491 pipe.InitState();
7492 pipe.CreateGraphicsPipeline();
7493
sfricke-samsung39ee2442020-07-22 21:21:15 -07007494 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007495 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007496 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7497 query_pool_create_info.queryCount = 1;
7498 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7499
sfricke-samsung071af2d2020-07-02 10:37:22 -07007500 m_commandBuffer->begin();
7501 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7502
7503 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7504
7505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7506 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7507 m_errorMonitor->VerifyFound();
7508
7509 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7510
7511 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7512 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7513 sizeof(VkDrawIndexedIndirectCommand));
7514 m_errorMonitor->VerifyFound();
7515
7516 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007517
7518 // Query should be outside renderpass
7519 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7520
7521 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7522 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7523 m_errorMonitor->VerifyFound();
7524
7525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7526 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7527 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7528 m_errorMonitor->VerifyFound();
7529
sfricke-samsung071af2d2020-07-02 10:37:22 -07007530 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007531
7532 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007533}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007534
7535TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7536 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7537
7538 SetTargetApiVersion(VK_API_VERSION_1_1);
sjfricked8e01c52022-07-06 14:09:04 +09007539 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007540
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007541 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7542
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007543 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7544 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7545 return;
7546 }
sjfricked8e01c52022-07-06 14:09:04 +09007547 if (!AreRequiredExtensionsEnabled()) {
7548 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7549 }
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007550
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007551 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7552 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7553 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007554 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7555 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7556 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007557
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007558 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7559 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007560 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7561
7562 if (protected_memory_features.protectedMemory == VK_FALSE) {
7563 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7564 return;
7565 };
7566
sfricke-samsung21286f82021-11-16 08:21:46 -08007567 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7568 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7569 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7570 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7571
7572 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
7573 ASSERT_NO_FATAL_FAILURE(InitState());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007574
7575 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7576 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7577
7578 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007579 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007580 }
7581
7582 // Create actual protected and unprotected buffers
7583 VkBuffer buffer_protected = VK_NULL_HANDLE;
7584 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007585 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007586 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007587 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7588 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7589 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007590 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7591
7592 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7593 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7594 buffer_create_info.flags = 0;
7595 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7596
7597 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007598 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007599 VkImageObj image_protected(m_device);
7600 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007601 VkImageObj image_protected_descriptor(m_device);
7602 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007603 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007604 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007605 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007606 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007607 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007608 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7609 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007610 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7611 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007612 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7613 image_create_info.arrayLayers = 1;
7614 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007615 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7616 image_protected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007617 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007618
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007619 image_create_info.flags = 0;
7620 image_unprotected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007621 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007622
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007623 // Create protected and unproteced memory
7624 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7625 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7626
sfricke-samsung1c61f192021-12-31 01:53:03 -06007627 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007628 alloc_info.allocationSize = 0;
7629
7630 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7631 VkMemoryRequirements mem_reqs_protected;
7632 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7633 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7634 VkMemoryRequirements mem_reqs_unprotected;
7635 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7636 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7637
7638 // Get memory index for a protected and unprotected memory
7639 VkPhysicalDeviceMemoryProperties phys_mem_props;
7640 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7641 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7642 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7643 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7644 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7645 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7646 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7647 memory_type_unprotected = i;
7648 }
7649 // Check just protected bit is in type at all
7650 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7651 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7652 memory_type_protected = i;
7653 }
7654 }
7655 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7656 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7657 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7658 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7659 return;
7660 }
7661
7662 alloc_info.memoryTypeIndex = memory_type_protected;
7663 alloc_info.allocationSize = mem_reqs_protected.size;
7664 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7665
7666 alloc_info.allocationSize = mem_reqs_unprotected.size;
7667 alloc_info.memoryTypeIndex = memory_type_unprotected;
7668 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7669
7670 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7671 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7672 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7673 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007674 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7675 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7676
Aitor Camacho6ba32ff2022-06-16 19:11:12 +02007677 // Change layout once memory is bound
7678 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7679 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7680 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7681 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7682
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007683 // need memory bound at image view creation time
7684 image_views[0] = image_protected.targetView(image_format);
7685 image_views[1] = image_unprotected.targetView(image_format);
7686 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7687 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007688
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007689 // A renderpass and framebuffer that contains a protected and unprotected image view
7690 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007691 {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 -07007692 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7693 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007694 {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 -07007695 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7696 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7697 };
7698 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7699 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7700 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7701 VkSubpassDependency dependency = {0,
7702 0,
7703 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7704 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7705 VK_ACCESS_SHADER_WRITE_BIT,
7706 VK_ACCESS_SHADER_WRITE_BIT,
7707 VK_DEPENDENCY_BY_REGION_BIT};
7708 VkRenderPassCreateInfo render_pass_create_info = {
7709 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7710 VkRenderPass render_pass;
7711 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7712 VkFramebufferCreateInfo framebuffer_create_info = {
7713 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7714 VkFramebuffer framebuffer;
7715 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7716
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007717 // Various structs used for commands
7718 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7719 VkImageBlit blit_region = {};
7720 blit_region.srcSubresource = image_subresource;
7721 blit_region.dstSubresource = image_subresource;
7722 blit_region.srcOffsets[0] = {0, 0, 0};
7723 blit_region.srcOffsets[1] = {8, 8, 1};
7724 blit_region.dstOffsets[0] = {0, 8, 0};
7725 blit_region.dstOffsets[1] = {8, 8, 1};
7726 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7727 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7728 VkBufferCopy buffer_copy = {0, 0, 64};
7729 VkBufferImageCopy buffer_image_copy = {};
7730 buffer_image_copy.bufferRowLength = 0;
7731 buffer_image_copy.bufferImageHeight = 0;
7732 buffer_image_copy.imageSubresource = image_subresource;
7733 buffer_image_copy.imageOffset = {0, 0, 0};
7734 buffer_image_copy.imageExtent = {1, 1, 1};
7735 buffer_image_copy.bufferOffset = 0;
7736 VkImageCopy image_copy = {};
7737 image_copy.srcSubresource = image_subresource;
7738 image_copy.srcOffset = {0, 0, 0};
7739 image_copy.dstSubresource = image_subresource;
7740 image_copy.dstOffset = {0, 0, 0};
7741 image_copy.extent = {1, 1, 1};
7742 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007743 VkRect2D render_area = {{0, 0}, {8, 8}};
7744 VkRenderPassBeginInfo render_pass_begin = {
7745 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7746 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7747 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7748 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007749
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007750 const char fsSource[] = R"glsl(
7751 #version 450
7752 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7753 layout(set=0, binding=1, rgba8) uniform image2D si1;
7754 layout(location=0) out vec4 x;
7755 void main(){
7756 x = vec4(bar.y);
7757 imageStore(si1, ivec2(0), vec4(0));
7758 }
7759 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007760 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007761
aitor-lunargf15acd52022-03-09 22:13:25 +01007762 CreatePipelineHelper g_pipe(*this, 2u);
locke-lunarg0de02522020-10-27 22:55:17 -06007763 g_pipe.InitInfo();
7764 g_pipe.gp_ci_.renderPass = render_pass;
7765 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7766 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7767 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg0de02522020-10-27 22:55:17 -06007768 g_pipe.InitState();
7769 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7770
7771 VkSampler sampler;
7772 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7773 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7774 ASSERT_VK_SUCCESS(err);
7775
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007776 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007777 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007778 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7779 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7780 g_pipe.descriptor_set_->UpdateDescriptorSets();
7781
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007782 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007783 // will get undefined values, but not invalid if protectedNoFault is supported
7784 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7785 if (!protected_memory_properties.protectedNoFault) {
7786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7787 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7788 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7789 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007790
sfricke-samsung21286f82021-11-16 08:21:46 -08007791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7792 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7793 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7794 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007795
sfricke-samsung21286f82021-11-16 08:21:46 -08007796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7797 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7798 &subresource_range);
7799 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007800
sfricke-samsung21286f82021-11-16 08:21:46 -08007801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7802 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7803 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007804
sfricke-samsung21286f82021-11-16 08:21:46 -08007805 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7806 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7807 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007808
sfricke-samsung21286f82021-11-16 08:21:46 -08007809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7810 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7811 1, &buffer_image_copy);
7812 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007813
sfricke-samsung21286f82021-11-16 08:21:46 -08007814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7815 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7816 1, &buffer_image_copy);
7817 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007818
sfricke-samsung21286f82021-11-16 08:21:46 -08007819 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7820 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7821 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7822 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007823
sfricke-samsung21286f82021-11-16 08:21:46 -08007824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7825 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7826 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7827 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007828
sfricke-samsung21286f82021-11-16 08:21:46 -08007829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7830 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7831 1, &buffer_image_copy);
7832 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007833
sfricke-samsung21286f82021-11-16 08:21:46 -08007834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7835 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7836 1, &buffer_image_copy);
7837 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007838
sfricke-samsung21286f82021-11-16 08:21:46 -08007839 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7840 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7841 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007842
sfricke-samsung21286f82021-11-16 08:21:46 -08007843 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7844 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7845 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007846
sfricke-samsung21286f82021-11-16 08:21:46 -08007847 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007848
sfricke-samsung21286f82021-11-16 08:21:46 -08007849 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7850 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7851 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007852
sfricke-samsung21286f82021-11-16 08:21:46 -08007853 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7854 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7855 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7856 VkDeviceSize offset = 0;
7857 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7858 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007859
sfricke-samsung21286f82021-11-16 08:21:46 -08007860 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7861 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7862 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7864 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007865
sfricke-samsung21286f82021-11-16 08:21:46 -08007866 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7867 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007868
sfricke-samsung21286f82021-11-16 08:21:46 -08007869 vk::CmdEndRenderPass(m_commandBuffer->handle());
7870 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007871 m_commandBuffer->end();
7872
7873 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007874 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007875 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7876 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007877 g_pipe.descriptor_set_->UpdateDescriptorSets();
7878
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007879 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007880 if (!protected_memory_properties.protectedNoFault) {
7881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7882 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7883 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7884 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007885
sfricke-samsung21286f82021-11-16 08:21:46 -08007886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7887 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7888 1, &subresource_range);
7889 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007890
sfricke-samsung21286f82021-11-16 08:21:46 -08007891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7892 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7893 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007894
sfricke-samsung21286f82021-11-16 08:21:46 -08007895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7896 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7897 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
7898 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007899
sfricke-samsung21286f82021-11-16 08:21:46 -08007900 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7901 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7902 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7903 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007904
sfricke-samsung21286f82021-11-16 08:21:46 -08007905 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7906 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7907 buffer_unprotected, 1, &buffer_image_copy);
7908 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007909
sfricke-samsung21286f82021-11-16 08:21:46 -08007910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7911 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
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-vkCmdUpdateBuffer-commandBuffer-01814");
7915 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7916 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007917
sfricke-samsung21286f82021-11-16 08:21:46 -08007918 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007919
sfricke-samsung21286f82021-11-16 08:21:46 -08007920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7921 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7922 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007923
sfricke-samsung21286f82021-11-16 08:21:46 -08007924 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7925 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7926 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7927 VkDeviceSize offset = 0;
7928 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7929 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007930
sfricke-samsung21286f82021-11-16 08:21:46 -08007931 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7933 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7934 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007935
sfricke-samsung21286f82021-11-16 08:21:46 -08007936 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
7937 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007938 protectedCommandBuffer.end();
7939
sfricke-samsung96cd9932020-08-23 20:57:11 -07007940 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7941 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7942
sfricke-samsung1c61f192021-12-31 01:53:03 -06007943 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
7944 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07007945 submit_info.commandBufferCount = 2;
7946 submit_info.pCommandBuffers = comman_buffers;
7947
7948 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08007949 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007951 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7952 m_errorMonitor->VerifyFound();
7953
7954 protected_submit_info.protectedSubmit = VK_FALSE;
7955 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7956 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7957 m_errorMonitor->VerifyFound();
7958
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007959 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7960 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7961 vk::FreeMemory(device(), memory_protected, nullptr);
7962 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007963 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7964 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007965}
locke-lunarg6b0de702020-08-07 17:42:13 -06007966
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007967TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007968 TEST_DESCRIPTION(
7969 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7970 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7971
sjfricked8e01c52022-07-06 14:09:04 +09007972 AddRequiredExtensions(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007973
sjfricked8e01c52022-07-06 14:09:04 +09007974 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7975 if (!AreRequiredExtensionsEnabled()) {
7976 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7977 }
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007978 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7979 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7980 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7981
7982 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
7983 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
7984 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7985 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7986
7987 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
7988 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
7989 return;
7990 }
locke-lunarg6b0de702020-08-07 17:42:13 -06007991
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007992 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06007993 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7994 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7995 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7996 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7997
7998 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7999 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8000 return;
8001 }
8002
8003 VkFormat buffer_view_format =
8004 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
8005 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8006 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8007 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8008 return;
8009 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008010 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008011 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8012
8013 VkPhysicalDeviceFeatures device_features = {};
8014 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8015 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8016 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8017 return;
8018 }
8019
8020 VkImageObj image(m_device);
8021 image.Init(image_ci);
8022 VkImageView image_view = image.targetView(image_format);
8023
8024 VkSampler sampler = VK_NULL_HANDLE;
8025 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8026 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8027
8028 VkBufferObj buffer;
8029 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8030
sfricke-samsung1c61f192021-12-31 01:53:03 -06008031 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06008032 bvci.buffer = buffer.handle();
8033 bvci.format = buffer_view_format;
8034 bvci.range = VK_WHOLE_SIZE;
8035 VkBufferView buffer_view;
8036 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8037
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008038 char const *fsSource = R"glsl(
8039 #version 450
8040 layout(set=0, binding=3, r32f) uniform image2D si0;
8041 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8042 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8043 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8044 void main() {
8045 imageAtomicExchange(si0, ivec2(0), 1);
8046 imageAtomicExchange(si1[0], ivec2(0), 1);
8047 imageAtomicExchange(si1[1], ivec2(0), 1);
8048 imageAtomicExchange(stb2, 0, 1);
8049 imageAtomicExchange(stb3[0], 0, 1);
8050 imageAtomicExchange(stb3[1], 0, 1);
8051 }
8052 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008053
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008054 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
8055 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06008056
8057 CreatePipelineHelper g_pipe(*this);
8058 g_pipe.InitInfo();
8059 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008060 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8061 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8062 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8063 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008064 g_pipe.InitState();
8065 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8066
locke-lunarg76e8dee2020-08-21 13:20:02 -06008067 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008068 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008069 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008070 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008071 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008072 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008073 g_pipe.descriptor_set_->UpdateDescriptorSets();
8074
8075 m_commandBuffer->begin();
8076 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8077 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8078 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8079 &g_pipe.descriptor_set_->set_, 0, nullptr);
8080
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008081 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8086 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8087 m_errorMonitor->VerifyFound();
8088
8089 m_commandBuffer->EndRenderPass();
8090 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008091 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8092 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008093}
locke-lunargae1bbab2020-09-10 11:55:56 -06008094
8095TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8096 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8097
8098 ASSERT_NO_FATAL_FAILURE(Init());
8099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8100
8101 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008102 char const *const vsSource = R"glsl(
8103 #version 450
8104 layout(push_constant, std430) uniform foo {
8105 bool b;
8106 float f2[3];
8107 vec3 v;
8108 vec4 v2[2];
8109 mat3 m;
8110 } constants;
8111 void func1( float f ){
8112 // use the whole v2[1]. byte: 48-63.
8113 vec2 v2 = constants.v2[1].yz;
8114 }
8115 void main(){
8116 // use only v2[0].z. byte: 40-43.
8117 func1( constants.v2[0].z);
8118 // index of m is variable. The all m is used. byte: 64-99.
8119 for(int i=1;i<2;++i) {
8120 vec3 v3 = constants.m[i];
8121 }
8122 }
8123 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008124
8125 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008126 char const *const fsSource = R"glsl(
8127 #version 450
8128 struct foo1{
8129 int i[4];
8130 }f;
8131 layout(push_constant, std430) uniform foo {
8132 float x[2][2][2];
8133 foo1 s;
8134 foo1 ss[3];
8135 } constants;
8136 void main(){
8137 // use s. byte: 32-47.
8138 f = constants.s;
8139 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8140 for(int i=1;i<2;++i) {
8141 int ii = constants.ss[i].i[3];
8142 }
8143 }
8144 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008145
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008146 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8147 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008148
8149 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8150 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8151
Aitor Camacho2933a0a2022-06-13 20:46:34 +02008152 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
8153 pipeline_layout_info.pushConstantRangeCount = 1;
8154 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
locke-lunargae1bbab2020-09-10 11:55:56 -06008155
8156 VkPipelineLayout pipeline_layout;
8157 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8158
8159 CreatePipelineHelper g_pipe(*this);
8160 g_pipe.InitInfo();
8161 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8162 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8163 g_pipe.InitState();
8164 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8165
8166 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8167 VkPipelineLayout pipeline_layout_small;
8168 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8169
8170 CreatePipelineHelper g_pipe_small_range(*this);
8171 g_pipe_small_range.InitInfo();
8172 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8173 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8174 g_pipe_small_range.InitState();
8175
sfricke-samsung7699b912021-04-12 23:01:51 -07008176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008178 g_pipe_small_range.CreateGraphicsPipeline();
8179 m_errorMonitor->VerifyFound();
8180
8181 m_commandBuffer->begin();
8182 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8183
Piers Daniella7f93b62021-11-20 12:32:04 -07008184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008185 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8186 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8187 &g_pipe.descriptor_set_->set_, 0, nullptr);
8188 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8189 m_errorMonitor->VerifyFound();
8190
locke-lunargae1bbab2020-09-10 11:55:56 -06008191 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008192
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008193 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8194 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8195 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8196 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008197 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008198 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8199 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8200 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8201 // m_errorMonitor->VerifyFound();
8202
Piers Daniella7f93b62021-11-20 12:32:04 -07008203 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008204 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8205 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8206 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008207
8208 m_errorMonitor->ExpectSuccess();
8209 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8210 68, dummy_values);
8211 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8212 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008213}
8214
8215TEST_F(VkLayerTest, VerifyVertextBinding) {
8216 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8217
8218 ASSERT_NO_FATAL_FAILURE(Init());
8219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8220
8221 VkBufferObj vtx_buf;
8222 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8223 vtx_buf.init(*m_device, info);
8224
8225 CreatePipelineHelper pipe(*this);
8226 pipe.InitInfo();
8227 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8228 VkVertexInputBindingDescription vtx_binding_des[3] = {
8229 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8230
8231 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8232 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8233 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8234 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8235 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8236 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8237 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8238 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8239 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8240 pipe.InitState();
8241 pipe.CreateGraphicsPipeline();
8242
8243 m_commandBuffer->begin();
8244 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8245 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8246 VkDeviceSize offset = 0;
8247 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8248
8249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8254 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8255 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008256
8257 m_commandBuffer->EndRenderPass();
8258 m_commandBuffer->end();
8259}
locke-lunargd7a08e92020-10-21 00:24:00 -06008260
8261TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8262 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8263 ASSERT_NO_FATAL_FAILURE(Init());
8264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8265
8266 CreatePipelineHelper pipe(*this);
8267 pipe.InitInfo();
8268
8269 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8270
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008271 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008272 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8273 dyn_state_ci.pDynamicStates = dyn_states.data();
8274 pipe.dyn_state_ci_ = dyn_state_ci;
8275 pipe.InitState();
8276 pipe.CreateGraphicsPipeline();
8277
8278 m_commandBuffer->begin();
8279 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8280 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8281
8282 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8283 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8284 VkRect2D scissor = {{0, 0}, {16, 16}};
8285 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8286 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8287
8288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8289 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8290 m_errorMonitor->VerifyFound();
8291
8292 m_commandBuffer->EndRenderPass();
8293 m_commandBuffer->end();
8294}
locke-lunarg0de02522020-10-27 22:55:17 -06008295
8296TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8297 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008298 SetTargetApiVersion(VK_API_VERSION_1_1);
8299 AddRequiredExtensions(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8300 AddRequiredExtensions(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
8301 ASSERT_NO_FATAL_FAILURE(InitFramework());
8302 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8303 GTEST_SKIP() << "Test requires at least Vulkan 1.1";
locke-lunarg0de02522020-10-27 22:55:17 -06008304 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008305 if (!AreRequiredExtensionsEnabled()) {
8306 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
locke-lunarg0de02522020-10-27 22:55:17 -06008307 }
8308
8309 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8311
8312 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8313 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008314
8315 VkFormatProperties format_props;
8316 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8317 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008318 GTEST_SKIP() << "SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.";
sfricke-samsung715e3d12020-12-01 22:45:49 -08008319 }
8320
locke-lunarg0de02522020-10-27 22:55:17 -06008321 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8322 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8323
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008324 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008325 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008326 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008327 image_format_info.type = image_ci.imageType;
8328 image_format_info.format = image_ci.format;
8329 image_format_info.tiling = image_ci.tiling;
8330 image_format_info.usage = image_ci.usage;
8331 image_format_info.flags = image_ci.flags;
8332
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008333 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8334 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008335
8336 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8337
8338 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008339 GTEST_SKIP() << "Image and ImageView supports filter cubic ; skipped.";
locke-lunarg0de02522020-10-27 22:55:17 -06008340 }
8341
8342 VkImageObj image(m_device);
8343 image.Init(image_ci);
8344 VkImageView imageView = image.targetView(format, imageViewType);
8345
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008346 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008347 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8348 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008349 vk_testing::Sampler sampler(*m_device, sampler_ci);
8350 ASSERT_TRUE(sampler.initialized());
locke-lunarg0de02522020-10-27 22:55:17 -06008351
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008352 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008353 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8354 sampler_ci.pNext = &reduction_mode_ci;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008355 vk_testing::Sampler sampler_reduction(*m_device, sampler_ci);
locke-lunarg0de02522020-10-27 22:55:17 -06008356
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008357 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008358
8359 CreatePipelineHelper g_pipe(*this);
8360 g_pipe.InitInfo();
8361 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8362 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8363 g_pipe.InitState();
8364 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8365
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008366 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_reduction.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008367 g_pipe.descriptor_set_->UpdateDescriptorSets();
8368
8369 m_commandBuffer->begin();
8370 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8371 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8372 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8373 &g_pipe.descriptor_set_->set_, 0, nullptr);
8374
8375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8376 m_commandBuffer->Draw(1, 0, 0, 0);
8377 m_errorMonitor->VerifyFound();
8378
8379 m_commandBuffer->EndRenderPass();
8380 m_commandBuffer->end();
8381 m_commandBuffer->reset();
8382
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008383 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008384 g_pipe.descriptor_set_->UpdateDescriptorSets();
8385
8386 m_commandBuffer->begin();
8387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8388 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8389 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8390 &g_pipe.descriptor_set_->set_, 0, nullptr);
8391
8392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8393 m_commandBuffer->Draw(1, 0, 0, 0);
8394 m_errorMonitor->VerifyFound();
8395
8396 m_commandBuffer->EndRenderPass();
8397 m_commandBuffer->end();
8398}
8399
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008400TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008401 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 -07008402
Clemens Kern5a42ea62021-09-29 16:30:23 +02008403 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8404 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked700bc02022-05-30 16:35:06 +09008405 if (!AreRequiredExtensionsEnabled()) {
8406 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008407 }
8408
8409 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8411
8412 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8413 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008414 auto image_ci = vk_testing::Image::create_info();
8415 image_ci.imageType = VK_IMAGE_TYPE_3D;
8416 image_ci.format = format;
8417 image_ci.extent.width = 128;
8418 image_ci.extent.height = 128;
8419 image_ci.mipLevels = 1;
8420 image_ci.arrayLayers = 1;
8421 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8422 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8423 image_ci.usage = usage;
8424 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008425
8426 VkImageObj image(m_device);
8427 image.Init(image_ci);
8428 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8429 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8430
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008431 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008432 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8433 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8434 VkSampler sampler;
8435 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8436
Clemens Kern5a42ea62021-09-29 16:30:23 +02008437 static const char fs_src[] = R"glsl(
8438 #version 450
8439 layout(set=0, binding=0) uniform sampler3D s;
8440 layout(location=0) out vec4 x;
8441 void main(){
8442 x = texture(s, vec3(1));
8443 }
8444 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008445 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008446
8447 CreatePipelineHelper g_pipe(*this);
8448 g_pipe.InitInfo();
8449 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8450 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8451 g_pipe.InitState();
8452 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8453
8454 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8455 g_pipe.descriptor_set_->UpdateDescriptorSets();
8456
8457 m_commandBuffer->begin();
8458 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8459 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8460 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8461 &g_pipe.descriptor_set_->set_, 0, nullptr);
8462
8463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8464 m_commandBuffer->Draw(1, 0, 0, 0);
8465 m_errorMonitor->VerifyFound();
8466
8467 m_commandBuffer->EndRenderPass();
8468 m_commandBuffer->end();
8469}
8470
locke-lunarg0de02522020-10-27 22:55:17 -06008471TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8472 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
sjfricked8e01c52022-07-06 14:09:04 +09008473 SetTargetApiVersion(VK_API_VERSION_1_1);
8474 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
locke-lunarg0de02522020-10-27 22:55:17 -06008475 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8476
sjfricked8e01c52022-07-06 14:09:04 +09008477 if (!AreRequiredExtensionsEnabled()) {
8478 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
8479 }
8480 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8481 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
locke-lunarg0de02522020-10-27 22:55:17 -06008482 }
8483
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008484 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008485 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008486 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008487
8488 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8490
8491 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8492 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8493 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008494 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8495 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008496 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8497 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8498 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8499 return;
8500 }
8501 CreatePipelineHelper pipe(*this);
8502 pipe.InitInfo();
8503 pipe.InitState();
8504 pipe.CreateGraphicsPipeline();
8505
8506 m_commandBuffer->begin();
8507 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8508 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8509
8510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8511 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8512 m_errorMonitor->VerifyFound();
8513
8514 m_commandBuffer->EndRenderPass();
8515 m_commandBuffer->end();
8516}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008517
8518TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8519 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8520
8521 // Enable KHR_fragment_shading_rate and all of its required extensions
8522 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8523 if (fsr_extensions) {
8524 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8525 }
8526 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8527
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008528 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8529 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008530 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8531 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8532 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8533 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008534 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8535 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008536 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8537 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8538 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8539 } else {
8540 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8541 return;
8542 }
8543
sfricke-samsung1c61f192021-12-31 01:53:03 -06008544 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008545 fsr_features.pipelineFragmentShadingRate = true;
8546
sfricke-samsung1c61f192021-12-31 01:53:03 -06008547 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008548
8549 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8550
8551 // Find address of extension call and make the call
8552 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8553 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8554 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8555
8556 VkExtent2D fragmentSize = {1, 1};
8557 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8558 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8559
8560 m_commandBuffer->begin();
8561 fragmentSize.width = 0;
8562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8563 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8564 m_errorMonitor->VerifyFound();
8565 fragmentSize.width = 1;
8566
8567 fragmentSize.height = 0;
8568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8569 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8570 m_errorMonitor->VerifyFound();
8571 fragmentSize.height = 1;
8572
8573 fragmentSize.width = 3;
8574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8575 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8576 m_errorMonitor->VerifyFound();
8577 fragmentSize.width = 1;
8578
8579 fragmentSize.height = 3;
8580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8581 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8582 m_errorMonitor->VerifyFound();
8583 fragmentSize.height = 1;
8584
8585 fragmentSize.width = 8;
8586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8587 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8588 m_errorMonitor->VerifyFound();
8589 fragmentSize.width = 1;
8590
8591 fragmentSize.height = 8;
8592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8593 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8594 m_errorMonitor->VerifyFound();
8595 fragmentSize.height = 1;
8596 m_commandBuffer->end();
8597}
8598
8599TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8600 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8601
8602 // Enable KHR_fragment_shading_rate and all of its required extensions
8603 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8604 if (fsr_extensions) {
8605 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8606 }
8607 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8608
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008609 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8610 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008611 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8612 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8613 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8614 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008615 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8616 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008617 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8618 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8619 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8620 } else {
8621 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8622 return;
8623 }
8624
8625 ASSERT_NO_FATAL_FAILURE(InitState());
8626 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8627
8628 // Find address of extension call and make the call
8629 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8630 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8631 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8632
8633 VkExtent2D fragmentSize = {1, 1};
8634 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8635 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8636
8637 m_commandBuffer->begin();
8638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8639 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8640 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8641 m_errorMonitor->VerifyFound();
8642 m_commandBuffer->end();
8643}
8644
8645TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8646 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8647
8648 // Enable KHR_fragment_shading_rate and all of its required extensions
8649 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8650 if (fsr_extensions) {
8651 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8652 }
8653 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8654
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008655 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8656 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008657 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8658 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8659 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8660 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008661 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8662 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008663 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8664 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8665 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8666 } else {
8667 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8668 return;
8669 }
8670
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008671 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8672 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008673
8674 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8675 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8676 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8677
8678 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8680
8681 // Find address of extension call and make the call
8682 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8683 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8684 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8685
8686 VkExtent2D fragmentSize = {1, 1};
8687 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8688 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8689
8690 m_commandBuffer->begin();
8691
8692 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8694 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8695 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8696 m_errorMonitor->VerifyFound();
8697 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8698
8699 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8701 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8702 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8703 m_errorMonitor->VerifyFound();
8704 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8705
8706 m_commandBuffer->end();
8707}
8708
8709TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8710 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8711
8712 // Enable KHR_fragment_shading_rate and all of its required extensions
8713 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8714 if (fsr_extensions) {
8715 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8716 }
8717 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8718
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008719 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8720 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008721 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8722 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8723 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8724 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008725 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8726 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008727 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8728 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8729 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8730 } else {
8731 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8732 return;
8733 }
8734
8735 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8736 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8737 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008738 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8739 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008740 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8741
8742 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8743 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8744 return;
8745 }
8746
8747 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8748
8749 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8751
8752 // Find address of extension call and make the call
8753 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8754 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8755 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8756
8757 VkExtent2D fragmentSize = {1, 1};
8758 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8759 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8760
8761 m_commandBuffer->begin();
8762 fragmentSize.width = 2;
8763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8764 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8765 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8766 m_errorMonitor->VerifyFound();
8767 fragmentSize.width = 1;
8768
8769 fragmentSize.height = 2;
8770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8771 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8772 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8773 m_errorMonitor->VerifyFound();
8774 fragmentSize.height = 1;
8775}
8776
8777TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8778 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8779
8780 // Enable KHR_fragment_shading_rate and all of its required extensions
8781 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8782 if (fsr_extensions) {
8783 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8784 }
8785 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8786
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008787 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8788 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008789 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8790 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8791 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8792 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008793 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8794 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008795 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8796 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8797 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8798 } else {
8799 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8800 return;
8801 }
8802
8803 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8804 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8805 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8806 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008807 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8808 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008809 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8810
8811 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8812 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8813 return;
8814 }
8815
8816 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8817 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8818 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008819 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8820 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008821 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8822
8823 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8824 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8825 return;
8826 }
8827
8828 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8830
8831 // Find address of extension call and make the call
8832 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8833 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8834 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8835
8836 VkExtent2D fragmentSize = {1, 1};
8837 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8838 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8839
8840 m_commandBuffer->begin();
8841 if (fsr_features.primitiveFragmentShadingRate) {
8842 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8844 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8845 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8846 m_errorMonitor->VerifyFound();
8847 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8848 }
8849
8850 if (fsr_features.attachmentFragmentShadingRate) {
8851 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8853 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8854 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8855 m_errorMonitor->VerifyFound();
8856 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8857 }
8858 m_commandBuffer->end();
8859}
8860
8861TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8862 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8863
8864 // Enable KHR_fragment_shading_rate and all of its required extensions
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008865 AddRequiredExtensions(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8866 AddRequiredExtensions(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8867 ASSERT_NO_FATAL_FAILURE(InitFramework());
8868 if (!AreRequiredExtensionsEnabled()) {
8869 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008870 }
8871
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008872 auto fsr_properties = LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8873 GetPhysicalDeviceProperties2(fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008874
8875 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008876 GTEST_SKIP() << "Test requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008877 }
8878
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008879 auto eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
8880 auto fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8881 auto features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008882
8883 if (!fsr_features.primitiveFragmentShadingRate) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008884 GTEST_SKIP() << "Test requires primitiveFragmentShadingRate to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008885 }
8886
8887 if (!features2.features.multiViewport) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008888 GTEST_SKIP() << "%s requires multiViewport to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008889 }
8890
8891 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8893
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008894 char const *vsSource = R"glsl(
8895 #version 450
8896 #extension GL_EXT_fragment_shading_rate : enable
8897 void main() {
8898 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8899 }
8900 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008901
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008902 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008903
8904 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008905 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8906 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008907 pipe.AddShader(&fs);
8908 pipe.AddDefaultColorAttachment();
8909 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008910 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008911 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008912 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008913 pipe.AddShader(&vs);
8914 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8915 ASSERT_VK_SUCCESS(err);
8916 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008917 m_commandBuffer->begin();
8918 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8919
8920 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8921
8922 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8923 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8924 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8925 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8926
8927 // error produced here.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-primitiveFragmentShadingRateWithMultipleViewports-04552");
Tobias Hector04f2ab22020-12-01 10:59:33 +00008929 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008930 m_errorMonitor->VerifyFound();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008931}
ziga-lunargdada63d2021-07-13 22:10:11 +02008932
8933TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
8934 TEST_DESCRIPTION("Update buffer with invalid dataSize");
8935
8936 ASSERT_NO_FATAL_FAILURE(Init());
8937
8938 uint32_t update_data[4] = {0, 0, 0, 0};
8939 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8940 VkMemoryPropertyFlags reqs = 0;
8941 VkBufferObj buffer;
8942 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8943
8944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
8945 m_commandBuffer->begin();
8946 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
8947 m_commandBuffer->end();
8948 m_errorMonitor->VerifyFound();
8949}
ziga-lunargc08456d2021-07-16 21:40:13 +02008950
8951TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
8952 TEST_DESCRIPTION("Update buffer with invalid dst offset");
8953
8954 ASSERT_NO_FATAL_FAILURE(Init());
8955
8956 uint32_t update_data[4] = {0, 0, 0, 0};
8957 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8958 VkMemoryPropertyFlags reqs = 0;
8959 VkBufferObj buffer;
8960 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8961
8962 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
8963 m_commandBuffer->begin();
8964 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
8965 m_commandBuffer->end();
8966 m_errorMonitor->VerifyFound();
8967}
ziga-lunarg4e31a752021-07-22 14:35:03 +02008968
8969TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
8970 TEST_DESCRIPTION(
8971 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
8972
8973 ASSERT_NO_FATAL_FAILURE(Init());
8974
8975 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
8976 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
8977 if (INVALID_QUEUE == no_gfx_qfi) {
8978 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
8979 return;
8980 }
8981
8982 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
8983 ASSERT_TRUE(command_pool.initialized());
8984 VkCommandBufferObj command_buffer(m_device, &command_pool);
8985
8986 VkDescriptorPoolSize ds_type_count = {};
8987 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8988 ds_type_count.descriptorCount = 1;
8989
8990 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
8991 ds_pool_ci.maxSets = 1;
8992 ds_pool_ci.poolSizeCount = 1;
8993 ds_pool_ci.flags = 0;
8994 ds_pool_ci.pPoolSizes = &ds_type_count;
8995
8996 VkDescriptorPool ds_pool;
8997 vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, nullptr, &ds_pool);
8998
8999 VkDescriptorSetLayoutBinding dsl_binding = {};
9000 dsl_binding.binding = 0;
9001 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9002 dsl_binding.descriptorCount = 1;
9003 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9004 dsl_binding.pImmutableSamplers = nullptr;
9005
9006 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9007
9008 VkDescriptorSet descriptorSet;
9009 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9010 alloc_info.descriptorSetCount = 1;
9011 alloc_info.descriptorPool = ds_pool;
9012 alloc_info.pSetLayouts = &ds_layout.handle();
9013 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9014
9015 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9016 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9017
9018 command_buffer.begin();
9019 // Set invalid set
9020 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9021 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9022 &descriptorSet, 0, nullptr);
9023 m_errorMonitor->VerifyFound();
9024 command_buffer.end();
9025}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009026
9027TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9028 TEST_DESCRIPTION(
9029 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9030 "occlusion query is active.");
9031 ASSERT_NO_FATAL_FAILURE(Init());
9032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9033
9034 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9035 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9036 qpci.queryCount = 1;
9037
9038 VkQueryPool query_pool;
9039 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9040
9041 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9042
9043 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9044 cbii.renderPass = m_renderPass;
9045 cbii.framebuffer = m_framebuffer;
9046 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9047
9048 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9049 cbbi.pInheritanceInfo = &cbii;
9050
9051 VkCommandBuffer secondary_handle = secondary.handle();
9052 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9053 vk::EndCommandBuffer(secondary_handle);
9054
9055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9056 m_commandBuffer->begin();
9057 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9058 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9059 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9060 m_commandBuffer->end();
9061 m_errorMonitor->VerifyFound();
9062
9063 vk::DestroyQueryPool(device(), query_pool, nullptr);
9064}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009065
9066TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9067 TEST_DESCRIPTION("Test invalid null entries for clear color");
9068
9069 ASSERT_NO_FATAL_FAILURE(InitFramework());
9070 ASSERT_NO_FATAL_FAILURE(InitState());
9071
9072 VkImageObj image(m_device);
9073 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9074
9075 VkImageSubresourceRange isr = {};
9076 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9077 isr.baseArrayLayer = 0;
9078 isr.baseMipLevel = 0;
9079 isr.layerCount = 1;
9080 isr.levelCount = 1;
9081
9082 m_commandBuffer->begin();
9083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9084 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9085 m_errorMonitor->VerifyFound();
9086 m_commandBuffer->end();
9087}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009088
9089TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9090 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9091
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009092 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009093 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009094 if (!AreRequiredExtensionsEnabled()) {
9095 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009096 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009097
9098 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
9099 auto features2 = GetPhysicalDeviceFeatures2(multiview_features);
9100 if (!multiview_features.multiview) {
9101 GTEST_SKIP() << "VkPhysicalDeviceMultiviewFeatures::multiview not supported";
9102 }
9103 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9105
9106 VkAttachmentDescription attachmentDescription = {};
9107 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9108 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009109 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009110 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9111
9112 VkAttachmentReference colorAttachmentReference = {};
9113 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9114 colorAttachmentReference.attachment = 0;
9115
9116 VkSubpassDescription subpassDescription = {};
9117 subpassDescription.colorAttachmentCount = 1;
9118 subpassDescription.pColorAttachments = &colorAttachmentReference;
9119
9120 uint32_t viewMask = 0x1u;
9121 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9122 renderPassMultiviewCreateInfo.subpassCount = 1;
9123 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9124
9125 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9126 renderPassCreateInfo.attachmentCount = 1;
9127 renderPassCreateInfo.pAttachments = &attachmentDescription;
9128 renderPassCreateInfo.subpassCount = 1;
9129 renderPassCreateInfo.pSubpasses = &subpassDescription;
9130
9131 VkRenderPass renderPass;
9132 vk::CreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
9133
9134 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9135 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9136 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9137 image_create_info.extent.width = 32;
9138 image_create_info.extent.height = 32;
9139 image_create_info.extent.depth = 1;
9140 image_create_info.mipLevels = 1;
9141 image_create_info.arrayLayers = 4;
9142 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9143 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9144 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9145 image_create_info.flags = 0;
9146
9147 VkImageObj image(m_device);
9148 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009149 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9150 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009151
9152 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9153 framebufferCreateInfo.width = 32;
9154 framebufferCreateInfo.height = 32;
9155 framebufferCreateInfo.layers = 1;
9156 framebufferCreateInfo.renderPass = renderPass;
9157 framebufferCreateInfo.attachmentCount = 1;
9158 framebufferCreateInfo.pAttachments = &imageView;
9159
9160 VkFramebuffer framebuffer = VK_NULL_HANDLE;
9161 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
9162
9163 // Start no RenderPass
9164 m_commandBuffer->begin();
9165
9166 VkClearAttachment color_attachment;
9167 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9168 color_attachment.clearValue.color.float32[0] = 0;
9169 color_attachment.clearValue.color.float32[1] = 0;
9170 color_attachment.clearValue.color.float32[2] = 0;
9171 color_attachment.clearValue.color.float32[3] = 0;
9172 color_attachment.colorAttachment = 0;
9173
9174 VkClearRect clear_rect = {};
9175 clear_rect.rect.extent.width = 32;
9176 clear_rect.rect.extent.height = 32;
9177
9178 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9179 render_pass_begin_info.renderPass = renderPass;
9180 render_pass_begin_info.framebuffer = framebuffer;
9181 render_pass_begin_info.renderArea.extent.width = 32;
9182 render_pass_begin_info.renderArea.extent.height = 32;
9183
9184 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9186 clear_rect.layerCount = 2;
9187 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9188 m_errorMonitor->VerifyFound();
9189
9190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9191 clear_rect.baseArrayLayer = 1;
9192 clear_rect.layerCount = 1;
9193 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9194 m_errorMonitor->VerifyFound();
9195}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009196
9197TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9198 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9199
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009200 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009201 ASSERT_NO_FATAL_FAILURE(InitFramework());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009202 if (!AreRequiredExtensionsEnabled()) {
9203 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunargdaff74b2021-08-14 23:16:25 +02009204 }
9205 ASSERT_NO_FATAL_FAILURE(InitState());
9206
9207 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9208 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9209
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009210 auto buffer_ci =
9211 vk_testing::Buffer::create_info(32, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT);
9212 vk_testing::Buffer buffer(*m_device, buffer_ci);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009213
9214 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9215 conditional_rendering_begin.buffer = buffer.handle();
9216
9217 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9218
9219 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9220 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9222 vk::EndCommandBuffer(m_commandBuffer->handle());
9223 m_errorMonitor->VerifyFound();
9224}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009225
9226TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9227 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9228
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009229 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9230 ASSERT_NO_FATAL_FAILURE(InitFramework());
9231 if (!AreRequiredExtensionsEnabled()) {
9232 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009233 }
9234
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009235 auto xfb_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9236 auto features2 = GetPhysicalDeviceFeatures2(xfb_features);
9237 if (!xfb_features.transformFeedback) {
9238 GTEST_SKIP() << "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback not supported.";
9239 }
9240 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9242
9243 CreatePipelineHelper pipe_one(*this);
9244 pipe_one.InitInfo();
9245 pipe_one.InitState();
9246 pipe_one.CreateGraphicsPipeline();
9247
9248 CreatePipelineHelper pipe_two(*this);
9249 pipe_two.InitInfo();
9250 pipe_two.InitState();
9251 pipe_two.CreateGraphicsPipeline();
9252
9253 auto vkCmdBeginTransformFeedbackEXT =
9254 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9255 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9256 auto vkCmdEndTransformFeedbackEXT =
9257 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9258 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9259
9260 m_commandBuffer->begin();
9261 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9262 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9264 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9265 m_errorMonitor->VerifyFound();
9266 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9267 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009268}
9269
9270TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9271 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9272
9273 ASSERT_NO_FATAL_FAILURE(Init());
9274
9275 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9276 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9277
9278 // Load required functions
9279 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9280 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9281 return;
9282 }
9283
9284 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9285
9286 // Set format features from being found
9287 VkFormatProperties formatProps;
9288 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9289 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9290 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9291 return;
9292 }
9293 // Gets pass pipeline creation but not the actual tiling used
9294 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9295 // will be caught at draw time that feature for optimal image is not set
9296 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9297 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9298 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9299
9300 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9301
9302 CreatePipelineHelper pipe(*this);
9303 pipe.InitInfo();
9304 pipe.InitState();
aitor-lunargf15acd52022-03-09 22:13:25 +01009305 pipe.cb_attachments_[0].blendEnable = VK_TRUE;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009306 pipe.CreateGraphicsPipeline();
9307
9308 m_commandBuffer->begin();
9309 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9310 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9311
9312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9313 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9314 m_errorMonitor->VerifyFound();
9315
9316 m_commandBuffer->EndRenderPass();
9317 m_commandBuffer->end();
9318}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009319
9320TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9321 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9322
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009323 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009324 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009325 if (!AreRequiredExtensionsEnabled()) {
9326 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg88c0e392021-09-03 19:14:13 +02009327 }
ziga-lunarg88c0e392021-09-03 19:14:13 +02009328 ASSERT_NO_FATAL_FAILURE(InitState());
9329
9330 VkAttachmentDescription attach[] = {
9331 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9332 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9333 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9334 };
9335 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9336 VkSubpassDescription subpasses[] = {
9337 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9338 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9339 };
9340
9341 VkSubpassDependency dep = {0,
9342 1,
9343 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9344 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9345 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9346 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9347 VK_DEPENDENCY_BY_REGION_BIT};
9348
9349 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9350 rpci.attachmentCount = 1;
9351 rpci.pAttachments = attach;
9352 rpci.subpassCount = 2;
9353 rpci.pSubpasses = subpasses;
9354 rpci.dependencyCount = 1;
9355 rpci.pDependencies = &dep;
9356
9357 vk_testing::RenderPass render_pass;
9358 render_pass.init(*m_device, rpci);
9359
9360 VkImageObj image(m_device);
9361 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9362 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9363
9364 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9365 fbci.renderPass = render_pass.handle();
9366 fbci.attachmentCount = 1;
9367 fbci.pAttachments = &imageView;
9368 fbci.width = 32;
9369 fbci.height = 32;
9370 fbci.layers = 1;
9371 VkFramebuffer framebuffer;
9372 vk::CreateFramebuffer(device(), &fbci, nullptr, &framebuffer);
9373
9374 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9375 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9376 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9377 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9378
9379 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9380 buffer_create_info.size = 32;
9381 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9382 VkBufferObj buffer;
9383 buffer.init(*m_device, buffer_create_info);
9384
9385 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9386 conditional_rendering_begin.buffer = buffer.handle();
9387
9388 VkClearValue clear_value;
9389 clear_value.color = m_clear_color;
9390
9391 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9392 rpbi.renderPass = render_pass.handle();
9393 rpbi.framebuffer = framebuffer;
9394 rpbi.renderArea = {{0, 0}, {32, 32}};
9395 rpbi.clearValueCount = 1;
9396 rpbi.pClearValues = &clear_value;
9397
9398 m_commandBuffer->begin();
9399
9400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9401 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9402 m_errorMonitor->VerifyFound();
9403
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009404 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9405 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009407 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009408 m_errorMonitor->VerifyFound();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009409 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9410 vk::CmdEndRenderPass(m_commandBuffer->handle());
9411 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009412
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009413 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9414 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9415 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009417 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009418 m_errorMonitor->VerifyFound();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009419 vk::CmdEndRenderPass(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009420}
ziga-lunarg58255142021-09-12 13:25:17 +02009421
9422TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9423 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9424
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009425 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9426 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
ziga-lunarg58255142021-09-12 13:25:17 +02009427 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009428 if (!AreRequiredExtensionsEnabled()) {
9429 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009430 }
ziga-lunarg58255142021-09-12 13:25:17 +02009431
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009432 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
9433 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(&mv_features);
9434 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
ziga-lunarg58255142021-09-12 13:25:17 +02009435
9436 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009437 GTEST_SKIP() << "transformFeedback not supported; skipped.";
9438 }
9439 if (!mv_features.multiview) {
9440 GTEST_SKIP() << "multiview not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009441 }
9442
9443 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9445
9446 VkAttachmentDescription attachmentDescription = {};
9447 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9448 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009449 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunarg58255142021-09-12 13:25:17 +02009450 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9451
9452 VkAttachmentReference colorAttachmentReference = {};
9453 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9454 colorAttachmentReference.attachment = 0;
9455
9456 VkSubpassDescription subpassDescription = {};
9457 subpassDescription.colorAttachmentCount = 1;
9458 subpassDescription.pColorAttachments = &colorAttachmentReference;
9459
9460 uint32_t viewMask = 0x1u;
9461 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9462 renderPassMultiviewCreateInfo.subpassCount = 1;
9463 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9464
9465 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9466 renderPassCreateInfo.attachmentCount = 1;
9467 renderPassCreateInfo.pAttachments = &attachmentDescription;
9468 renderPassCreateInfo.subpassCount = 1;
9469 renderPassCreateInfo.pSubpasses = &subpassDescription;
9470
9471 vk_testing::RenderPass render_pass;
9472 render_pass.init(*m_device, renderPassCreateInfo);
9473
9474 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9475 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9476 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9477 image_create_info.extent.width = 32;
9478 image_create_info.extent.height = 32;
9479 image_create_info.extent.depth = 1;
9480 image_create_info.mipLevels = 1;
9481 image_create_info.arrayLayers = 4;
9482 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9483 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9484 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9485 image_create_info.flags = 0;
9486
9487 VkImageObj image(m_device);
9488 image.Init(image_create_info);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009489 auto image_view_ci = image.TargetViewCI(VK_FORMAT_R8G8B8A8_UNORM);
9490 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
9491 VkImageView imageView = image.targetView(image_view_ci);
ziga-lunarg58255142021-09-12 13:25:17 +02009492
9493 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9494 framebufferCreateInfo.width = 32;
9495 framebufferCreateInfo.height = 32;
9496 framebufferCreateInfo.layers = 1;
9497 framebufferCreateInfo.renderPass = render_pass.handle();
9498 framebufferCreateInfo.attachmentCount = 1;
9499 framebufferCreateInfo.pAttachments = &imageView;
9500
9501 vk_testing::Framebuffer framebuffer;
9502 framebuffer.init(*m_device, framebufferCreateInfo);
9503
9504 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9505 render_pass_begin_info.renderPass = render_pass.handle();
9506 render_pass_begin_info.framebuffer = framebuffer.handle();
9507 render_pass_begin_info.renderArea.extent.width = 32;
9508 render_pass_begin_info.renderArea.extent.height = 32;
9509
9510 auto vkCmdBeginTransformFeedbackEXT =
9511 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9512 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9513
9514 m_commandBuffer->begin();
9515 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9516
9517 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9518 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9519 m_errorMonitor->VerifyFound();
9520
9521 m_commandBuffer->EndRenderPass();
9522 m_commandBuffer->end();
9523}
stusmithd2f36832021-11-26 11:44:11 +00009524
9525TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9526 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9527
9528 SetTargetApiVersion(VK_API_VERSION_1_1);
9529
stusmithab8e2a22021-12-17 11:20:03 +00009530 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9531
stusmithd2f36832021-11-26 11:44:11 +00009532 ASSERT_NO_FATAL_FAILURE(InitFramework());
9533
sjfricked700bc02022-05-30 16:35:06 +09009534 if (!AreRequiredExtensionsEnabled()) {
9535 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009536 }
9537
9538 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009539 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009540 }
9541
9542 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9543 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9544 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9545 if (!dynamic_rendering_features.dynamicRendering) {
9546 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9547 return;
9548 }
9549
9550 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9551
sfricke-samsung1c61f192021-12-31 01:53:03 -06009552 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009553 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9554
sfricke-samsung1c61f192021-12-31 01:53:03 -06009555 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009556 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
ziga-lunargaa97cbb2022-03-18 19:06:35 +01009557 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009558 begin_rendering_info.colorAttachmentCount = 1;
9559 begin_rendering_info.pColorAttachments = &color_attachment;
9560
9561 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9562
9563 secondary.begin();
9564
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009566 secondary.BeginRendering(begin_rendering_info);
9567 m_errorMonitor->VerifyFound();
9568
9569 secondary.end();
9570}
9571
9572TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9573 TEST_DESCRIPTION(
9574 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9575 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9576
9577 ASSERT_NO_FATAL_FAILURE(Init());
9578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9579
9580 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9581
9582 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9583 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9584 nullptr, // pNext
9585 m_renderPass,
9586 0, // subpass
9587 m_framebuffer,
9588 };
9589
9590 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9591 nullptr, // pNext
9592 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9593 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9594 secondary.begin(&cmdbuff__bi);
9595 secondary.end();
9596
9597 m_commandBuffer->begin();
9598
9599 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9600 nullptr, // pNext
9601 m_renderPass,
9602 m_framebuffer,
9603 {{0, 0}, {32, 32}},
9604 static_cast<uint32_t>(m_renderPassClearValues.size()),
9605 m_renderPassClearValues.data()};
9606
9607 m_commandBuffer->BeginRenderPass(rp_bi);
9608
9609 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009610 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-00095");
stusmithd2f36832021-11-26 11:44:11 +00009611 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9612 m_errorMonitor->VerifyFound();
9613
9614 m_commandBuffer->EndRenderPass();
9615 m_commandBuffer->end();
9616}
9617
9618TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9619 TEST_DESCRIPTION(
9620 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9621 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9622
9623 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009624
stusmithab8e2a22021-12-17 11:20:03 +00009625 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9626
stusmithd2f36832021-11-26 11:44:11 +00009627 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009628
sjfricked700bc02022-05-30 16:35:06 +09009629 if (!AreRequiredExtensionsEnabled()) {
9630 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009631 }
stusmithab8e2a22021-12-17 11:20:03 +00009632
9633 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009634 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009635 }
9636
stusmithd2f36832021-11-26 11:44:11 +00009637 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9638 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9639 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9640 if (!dynamic_rendering_features.dynamicRendering) {
9641 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9642 return;
9643 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009644
stusmithd2f36832021-11-26 11:44:11 +00009645 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9646
9647 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009648
9649 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009650 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9651
sfricke-samsung1c61f192021-12-31 01:53:03 -06009652 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9653 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009654 inheritance_rendering_info.colorAttachmentCount = 1;
9655 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009656 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009657
sfricke-samsung1c61f192021-12-31 01:53:03 -06009658 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009659 begin_rendering_info.colorAttachmentCount = 1;
9660 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009661 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009662
9663 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9664
9665 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9666 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9667 &inheritance_rendering_info, // pNext
9668 VK_NULL_HANDLE,
9669 0, // subpass
9670 VK_NULL_HANDLE,
9671 };
9672
9673 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9674 nullptr, // pNext
9675 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9676 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9677 secondary.begin(&cmdbuff__bi);
9678 secondary.end();
9679
9680 m_commandBuffer->begin();
9681
9682 m_commandBuffer->BeginRendering(begin_rendering_info);
9683
9684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9685 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9686 m_errorMonitor->VerifyFound();
9687
9688 m_commandBuffer->EndRendering();
9689 m_commandBuffer->end();
9690}
9691
9692TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9693 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9694
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009695 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithd2f36832021-11-26 11:44:11 +00009696 ASSERT_NO_FATAL_FAILURE(InitState());
9697
9698 // A renderpass with two subpasses, both writing the same attachment.
9699 VkAttachmentDescription attach[] = {
9700 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9701 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9702 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9703 };
9704 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9705 VkSubpassDescription subpasses[] = {
9706 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9707 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9708 };
9709
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009710 VkSubpassDependency dependencies = {
9711 0, // srcSubpass
9712 1, // dstSubpass
9713 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // srcStageMask
9714 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // dstStageMask
9715 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
9716 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
9717 0, // dependencyFlags
9718 };
9719
9720 auto rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9721 rpci.attachmentCount = 1;
9722 rpci.pAttachments = attach;
9723 rpci.subpassCount = 2;
9724 rpci.pSubpasses = subpasses;
9725 rpci.dependencyCount = 1;
9726 rpci.pDependencies = &dependencies;
9727 vk_testing::RenderPass render_pass(*m_device, rpci);
9728 ASSERT_TRUE(render_pass.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009729
9730 VkImageObj image(m_device);
9731 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9732 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9733
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009734 VkFramebufferCreateInfo fbci = {
9735 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass.handle(), 1, &imageView, 32, 32, 1};
9736 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9737 ASSERT_TRUE(framebuffer.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009738
9739 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9740
9741 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9742 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9743 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009744 render_pass.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009745 1, // subpass
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009746 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009747 };
9748
9749 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9750 nullptr, // pNext
9751 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9752 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9753 secondary.begin(&cmdbuff__bi);
9754 secondary.end();
9755
9756 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9757 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009758 render_pass.handle(),
9759 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009760 {{0, 0}, {32, 32}},
9761 0,
9762 nullptr};
9763
9764 m_commandBuffer->begin();
9765 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9766
9767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00097");
stusmithd2f36832021-11-26 11:44:11 +00009769 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9770 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +00009771}
9772
9773TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9774 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9775
9776 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9777 ASSERT_NO_FATAL_FAILURE(InitState());
9778
9779 // A renderpass with two subpasses, both writing the same attachment.
9780 VkAttachmentDescription attach[] = {
9781 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9782 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9783 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9784 };
9785 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9786 VkSubpassDescription subpasses[] = {
9787 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9788 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9789 };
9790
9791 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9792 VkRenderPass render_pass_1;
9793 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9794 ASSERT_VK_SUCCESS(err);
9795
9796 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9797 VkRenderPass render_pass_2;
9798 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9799 ASSERT_VK_SUCCESS(err);
9800
9801 VkImageObj image(m_device);
9802 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9803 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9804
9805 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9806 VkFramebuffer framebuffer;
9807 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9808 ASSERT_VK_SUCCESS(err);
9809
9810 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9811
9812 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9813 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9814 nullptr, // pNext
9815 render_pass_2,
9816 0, // subpass
9817 VK_NULL_HANDLE,
9818 };
9819
9820 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9821 nullptr, // pNext
9822 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9823 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9824 secondary.begin(&cmdbuff__bi);
9825 secondary.end();
9826
9827 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9828 nullptr, // pNext
9829 render_pass_1,
9830 framebuffer,
9831 {{0, 0}, {32, 32}},
9832 0,
9833 nullptr};
9834
9835 m_commandBuffer->begin();
9836 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9837
9838 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009839 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
stusmithd2f36832021-11-26 11:44:11 +00009840 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9841 m_errorMonitor->VerifyFound();
9842
9843 m_commandBuffer->EndRenderPass();
9844 m_commandBuffer->end();
9845
9846 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9847 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
9848 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
9849}
9850
9851TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
9852 TEST_DESCRIPTION(
9853 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9854 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
9855
9856 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009857
stusmithab8e2a22021-12-17 11:20:03 +00009858 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9859
stusmithd2f36832021-11-26 11:44:11 +00009860 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009861
sjfricked700bc02022-05-30 16:35:06 +09009862 if (!AreRequiredExtensionsEnabled()) {
9863 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009864 }
stusmithab8e2a22021-12-17 11:20:03 +00009865
9866 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009867 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009868 }
9869
stusmithd2f36832021-11-26 11:44:11 +00009870 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9871 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9872 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9873 if (!dynamic_rendering_features.dynamicRendering) {
9874 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9875 return;
9876 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009877
stusmithd2f36832021-11-26 11:44:11 +00009878 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9879
9880 VkAttachmentDescription attach[] = {
9881 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9882 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9883 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9884 };
9885 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9886 VkSubpassDescription subpasses[] = {
9887 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9888 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9889 };
9890
9891 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9892 VkRenderPass render_pass;
9893 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9894 ASSERT_VK_SUCCESS(err);
9895
9896 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009897
9898 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009899 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9900
sfricke-samsung1c61f192021-12-31 01:53:03 -06009901 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9902 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009903 inheritance_rendering_info.colorAttachmentCount = 1;
9904 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009905 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009906
sfricke-samsung1c61f192021-12-31 01:53:03 -06009907 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009908 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9909 begin_rendering_info.colorAttachmentCount = 1;
9910 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009911 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009912
9913 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9914
9915 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9916 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9917 &inheritance_rendering_info, // pNext
9918 render_pass,
9919 0, // subpass
9920 VK_NULL_HANDLE,
9921 };
9922
9923 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9924 nullptr, // pNext
9925 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9926 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9927 secondary.begin(&cmdbuff__bi);
9928 secondary.end();
9929
9930 m_commandBuffer->begin();
9931
9932 m_commandBuffer->BeginRendering(begin_rendering_info);
9933
9934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
9935 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9936 m_errorMonitor->VerifyFound();
9937
9938 m_commandBuffer->EndRendering();
9939 m_commandBuffer->end();
9940
9941 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9942}
9943
9944TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
9945 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
9946
9947 SetTargetApiVersion(VK_API_VERSION_1_1);
9948
stusmithab8e2a22021-12-17 11:20:03 +00009949 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9950
stusmithd2f36832021-11-26 11:44:11 +00009951 ASSERT_NO_FATAL_FAILURE(InitFramework());
9952
sjfricked700bc02022-05-30 16:35:06 +09009953 if (!AreRequiredExtensionsEnabled()) {
9954 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009955 }
9956
9957 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009958 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009959 }
9960
9961 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9962 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9963 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9964 if (!dynamic_rendering_features.dynamicRendering) {
9965 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9966 return;
9967 }
9968
9969 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9970
9971 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
9972
sfricke-samsung1c61f192021-12-31 01:53:03 -06009973 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009974 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9975
sfricke-samsung1c61f192021-12-31 01:53:03 -06009976 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9977 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009978 inheritance_rendering_info.colorAttachmentCount = 1;
9979 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009980 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009981
sfricke-samsung1c61f192021-12-31 01:53:03 -06009982 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009983 begin_rendering_info.flags =
9984 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
9985 begin_rendering_info.colorAttachmentCount = 1;
9986 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009987 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009988
9989 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9990
9991 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9992 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9993 &inheritance_rendering_info, // pNext
9994 VK_NULL_HANDLE,
9995 0, // subpass
9996 VK_NULL_HANDLE,
9997 };
9998
9999 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10000 nullptr, // pNext
10001 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10002 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10003 secondary.begin(&cmdbuff__bi);
10004 secondary.end();
10005
10006 m_commandBuffer->begin();
10007
10008 m_commandBuffer->BeginRendering(begin_rendering_info);
10009
10010 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10011 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10012 m_errorMonitor->VerifyFound();
10013
10014 m_commandBuffer->EndRendering();
10015 m_commandBuffer->end();
10016}
10017
10018TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10019 TEST_DESCRIPTION(
10020 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
10021
10022 SetTargetApiVersion(VK_API_VERSION_1_1);
10023
stusmithab8e2a22021-12-17 11:20:03 +000010024 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10025
stusmithd2f36832021-11-26 11:44:11 +000010026 ASSERT_NO_FATAL_FAILURE(InitFramework());
10027
sjfricked700bc02022-05-30 16:35:06 +090010028 if (!AreRequiredExtensionsEnabled()) {
10029 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010030 }
10031
10032 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010033 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010034 }
10035
10036 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10037 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10038 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10039 if (!dynamic_rendering_features.dynamicRendering) {
10040 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10041 return;
10042 }
10043
10044 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10045
10046 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10047
sfricke-samsung1c61f192021-12-31 01:53:03 -060010048 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010049 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10050
sfricke-samsung1c61f192021-12-31 01:53:03 -060010051 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10052 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010053 inheritance_rendering_info.colorAttachmentCount = 0;
10054 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010055 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010056
sfricke-samsung1c61f192021-12-31 01:53:03 -060010057 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010058 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;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010061 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010062
10063 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10064
10065 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10066 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10067 &inheritance_rendering_info, // pNext
10068 VK_NULL_HANDLE,
10069 0, // subpass
10070 VK_NULL_HANDLE,
10071 };
10072
10073 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10074 nullptr, // pNext
10075 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10076 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10077 secondary.begin(&cmdbuff__bi);
10078 secondary.end();
10079
10080 m_commandBuffer->begin();
10081
10082 m_commandBuffer->BeginRendering(begin_rendering_info);
10083
10084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10085 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10086 m_errorMonitor->VerifyFound();
10087
10088 m_commandBuffer->EndRendering();
10089 m_commandBuffer->end();
10090}
10091
10092TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10093 TEST_DESCRIPTION(
10094 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10095
10096 SetTargetApiVersion(VK_API_VERSION_1_1);
10097
stusmithab8e2a22021-12-17 11:20:03 +000010098 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10099
stusmithd2f36832021-11-26 11:44:11 +000010100 ASSERT_NO_FATAL_FAILURE(InitFramework());
10101
sjfricked700bc02022-05-30 16:35:06 +090010102 if (!AreRequiredExtensionsEnabled()) {
10103 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010104 }
10105
10106 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010107 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010108 }
10109
10110 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10111 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10112 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10113 if (!dynamic_rendering_features.dynamicRendering) {
10114 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10115 return;
10116 }
10117
10118 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10119
10120 VkImageObj image(m_device);
10121 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10122 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10123
sfricke-samsung1c61f192021-12-31 01:53:03 -060010124 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010125 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10126 color_attachment.imageView = imageView;
10127
10128 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10129
sfricke-samsung1c61f192021-12-31 01:53:03 -060010130 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10131 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010132 inheritance_rendering_info.colorAttachmentCount = 1;
10133 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010134 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010135
sfricke-samsung1c61f192021-12-31 01:53:03 -060010136 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010137 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10138 begin_rendering_info.colorAttachmentCount = 1;
10139 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010140 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010141
10142 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10143
10144 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10145 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10146 &inheritance_rendering_info, // pNext
10147 VK_NULL_HANDLE,
10148 0, // subpass
10149 VK_NULL_HANDLE,
10150 };
10151
10152 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10153 nullptr, // pNext
10154 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10155 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10156 secondary.begin(&cmdbuff__bi);
10157 secondary.end();
10158
10159 m_commandBuffer->begin();
10160
10161 m_commandBuffer->BeginRendering(begin_rendering_info);
10162
10163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10164 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10165 m_errorMonitor->VerifyFound();
10166
10167 m_commandBuffer->EndRendering();
10168 m_commandBuffer->end();
10169}
10170
10171TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10172 TEST_DESCRIPTION(
10173 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10174 "format");
10175
10176 SetTargetApiVersion(VK_API_VERSION_1_1);
10177
stusmithab8e2a22021-12-17 11:20:03 +000010178 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10179
stusmithd2f36832021-11-26 11:44:11 +000010180 ASSERT_NO_FATAL_FAILURE(InitFramework());
10181
sjfricked700bc02022-05-30 16:35:06 +090010182 if (!AreRequiredExtensionsEnabled()) {
10183 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010184 }
10185
10186 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010187 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010188 }
10189
10190 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10191 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10192 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10193 if (!dynamic_rendering_features.dynamicRendering) {
10194 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10195 return;
10196 }
10197
10198 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10199
10200 VkImageObj image(m_device);
10201 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10202 if (!depth_stencil_format) {
10203 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10204 return;
10205 }
10206 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10207 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10208
sfricke-samsung1c61f192021-12-31 01:53:03 -060010209 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010210 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10211 depth_stencil_attachment.imageView = imageView;
10212
sfricke-samsung1c61f192021-12-31 01:53:03 -060010213 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10214 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010215 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
10216 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010217 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010218
sfricke-samsung1c61f192021-12-31 01:53:03 -060010219 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010220 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10221 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10222 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010223 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010224
10225 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10226
10227 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10228 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10229 &inheritance_rendering_info, // pNext
10230 VK_NULL_HANDLE,
10231 0, // subpass
10232 VK_NULL_HANDLE,
10233 };
10234
10235 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10236 nullptr, // pNext
10237 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10238 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10239 secondary.begin(&cmdbuff__bi);
10240 secondary.end();
10241
10242 m_commandBuffer->begin();
10243
10244 m_commandBuffer->BeginRendering(begin_rendering_info);
10245
10246 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10247 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10248 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10249 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010250}
10251
10252TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10253 TEST_DESCRIPTION(
10254 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10255
10256 SetTargetApiVersion(VK_API_VERSION_1_1);
10257
stusmithab8e2a22021-12-17 11:20:03 +000010258 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10259
stusmithd2f36832021-11-26 11:44:11 +000010260 ASSERT_NO_FATAL_FAILURE(InitFramework());
10261
sjfricked700bc02022-05-30 16:35:06 +090010262 if (!AreRequiredExtensionsEnabled()) {
10263 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010264 }
10265
10266 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010267 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010268 }
10269
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010270 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
10271 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(&mv_features);
10272 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +000010273 if (!dynamic_rendering_features.dynamicRendering) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010274 GTEST_SKIP() << "Test requires (unsupported) dynamicRendering , skipping.";
10275 }
10276 if (!mv_features.multiview) {
10277 GTEST_SKIP() << "multiview feature not supported.";
stusmithd2f36832021-11-26 11:44:11 +000010278 }
10279
10280 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10281
sfricke-samsung1c61f192021-12-31 01:53:03 -060010282 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010283 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10284
10285 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10286
sfricke-samsung1c61f192021-12-31 01:53:03 -060010287 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10288 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010289 inheritance_rendering_info.viewMask = 0;
10290 inheritance_rendering_info.colorAttachmentCount = 1;
10291 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010292 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010293
sfricke-samsung1c61f192021-12-31 01:53:03 -060010294 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010295 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10296 begin_rendering_info.viewMask = 1;
10297 begin_rendering_info.colorAttachmentCount = 1;
10298 begin_rendering_info.pColorAttachments = &color_attachment;
10299
10300 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10301
10302 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10303 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10304 &inheritance_rendering_info, // pNext
10305 VK_NULL_HANDLE,
10306 0, // subpass
10307 VK_NULL_HANDLE,
10308 };
10309
10310 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10311 nullptr, // pNext
10312 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10313 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10314 secondary.begin(&cmdbuff__bi);
10315 secondary.end();
10316
10317 m_commandBuffer->begin();
10318
10319 m_commandBuffer->BeginRendering(begin_rendering_info);
10320
10321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10322 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10323 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010324}
stusmithcba0c502021-12-21 17:16:28 +000010325
10326TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10327 TEST_DESCRIPTION(
10328 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10329
10330 SetTargetApiVersion(VK_API_VERSION_1_1);
10331
10332 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10333
10334 ASSERT_NO_FATAL_FAILURE(InitFramework());
10335
sjfricked700bc02022-05-30 16:35:06 +090010336 if (!AreRequiredExtensionsEnabled()) {
10337 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010338 }
10339
10340 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010341 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010342 }
10343
10344 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10345 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10346 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10347 if (!dynamic_rendering_features.dynamicRendering) {
10348 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10349 return;
10350 }
10351
10352 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10353
10354 VkImageObj image(m_device);
10355 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10356 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10357
sfricke-samsung1c61f192021-12-31 01:53:03 -060010358 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010359 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10360 color_attachment.imageView = imageView;
10361
10362 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10363
sfricke-samsung1c61f192021-12-31 01:53:03 -060010364 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10365 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010366 inheritance_rendering_info.colorAttachmentCount = 1;
10367 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10368 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10369
sfricke-samsung1c61f192021-12-31 01:53:03 -060010370 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010371 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10372 begin_rendering_info.colorAttachmentCount = 1;
10373 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010374 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010375
10376 // A pool we can reset in.
10377 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10378 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10379
10380 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10381 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10382 &inheritance_rendering_info, // pNext
10383 VK_NULL_HANDLE,
10384 0, // subpass
10385 VK_NULL_HANDLE,
10386 };
10387
10388 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10389 nullptr, // pNext
10390 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10391 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10392 secondary.begin(&cmdbuff__bi);
10393 secondary.end();
10394
10395 m_commandBuffer->begin();
10396
10397 // color samples mismatch
10398 m_commandBuffer->BeginRendering(begin_rendering_info);
10399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10400 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10401 m_errorMonitor->VerifyFound();
10402 m_commandBuffer->EndRendering();
10403
10404 VkImageObj depthStencilImage(m_device);
10405 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10406 if (!depth_stencil_format) {
10407 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10408 return;
10409 }
10410 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10411 0);
10412 VkImageView depthStencilImageView =
10413 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10414
sfricke-samsung1c61f192021-12-31 01:53:03 -060010415 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010416 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10417 depth_stencil_attachment.imageView = depthStencilImageView;
10418
10419 begin_rendering_info.colorAttachmentCount = 0;
10420 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10421 inheritance_rendering_info.colorAttachmentCount = 0;
10422 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10423
10424 secondary.begin(&cmdbuff__bi);
10425 secondary.end();
10426
10427 // depth samples mismatch
10428 m_commandBuffer->BeginRendering(begin_rendering_info);
10429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10430 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10431 m_errorMonitor->VerifyFound();
10432 m_commandBuffer->EndRendering();
10433
10434 begin_rendering_info.pDepthAttachment = nullptr;
10435 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10436 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10437 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10438
10439 secondary.begin(&cmdbuff__bi);
10440 secondary.end();
10441
10442 // stencil samples mismatch
10443 m_commandBuffer->BeginRendering(begin_rendering_info);
10444 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10445 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10446 m_errorMonitor->VerifyFound();
10447 m_commandBuffer->EndRendering();
10448
10449 m_commandBuffer->end();
10450}
10451
10452TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10453 TEST_DESCRIPTION(
10454 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10455 "attachment samples");
10456
10457 SetTargetApiVersion(VK_API_VERSION_1_1);
10458
10459 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10460
10461 ASSERT_NO_FATAL_FAILURE(InitFramework());
10462
sjfricked700bc02022-05-30 16:35:06 +090010463 if (!AreRequiredExtensionsEnabled()) {
10464 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010465 }
10466
10467 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010468 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010469 }
10470
10471 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10472 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10473 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10474 if (!dynamic_rendering_features.dynamicRendering) {
10475 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10476 return;
10477 }
10478
10479 bool amd_samples = false;
10480 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10481 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10482 amd_samples = true;
10483 }
10484
10485 bool nv_samples = false;
10486 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10487 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10488 nv_samples = true;
10489 }
10490
10491 if (!amd_samples && !nv_samples) {
10492 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10493 kSkipPrefix);
10494 return;
10495 }
10496
10497 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10498
10499 VkImageObj image(m_device);
10500 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10501 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10502
sfricke-samsung1c61f192021-12-31 01:53:03 -060010503 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010504 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10505 color_attachment.imageView = imageView;
10506
10507 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10508
10509 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10510 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10511 samples_info.colorAttachmentCount = 1;
10512 samples_info.pColorAttachmentSamples = &counts;
10513
10514 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010515 inheritance_rendering_info.colorAttachmentCount = 1;
10516 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10517 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10518
sfricke-samsung1c61f192021-12-31 01:53:03 -060010519 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010520 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10521 begin_rendering_info.colorAttachmentCount = 1;
10522 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010523 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010524
10525 // A pool we can reset in.
10526 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10527 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10528
10529 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10530 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10531 &inheritance_rendering_info, // pNext
10532 VK_NULL_HANDLE,
10533 0, // subpass
10534 VK_NULL_HANDLE,
10535 };
10536
10537 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10538 nullptr, // pNext
10539 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10540 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10541 secondary.begin(&cmdbuff__bi);
10542 secondary.end();
10543
10544 m_commandBuffer->begin();
10545
10546 // color samples mismatch
10547 m_commandBuffer->BeginRendering(begin_rendering_info);
10548 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10549 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10550 m_errorMonitor->VerifyFound();
10551 m_commandBuffer->EndRendering();
10552
10553 VkImageObj depthStencilImage(m_device);
10554 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10555 if (!depth_stencil_format) {
10556 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10557 return;
10558 }
10559 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10560 0);
10561 VkImageView depthStencilImageView =
10562 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10563
sfricke-samsung1c61f192021-12-31 01:53:03 -060010564 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010565 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10566 depth_stencil_attachment.imageView = depthStencilImageView;
10567
10568 samples_info.colorAttachmentCount = 0;
10569 samples_info.pColorAttachmentSamples = nullptr;
10570 begin_rendering_info.colorAttachmentCount = 0;
10571 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10572 inheritance_rendering_info.colorAttachmentCount = 0;
10573 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10574 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10575
10576 secondary.begin(&cmdbuff__bi);
10577 secondary.end();
10578
10579 // depth samples mismatch
10580 m_commandBuffer->BeginRendering(begin_rendering_info);
10581 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10582 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10583 m_errorMonitor->VerifyFound();
10584 m_commandBuffer->EndRendering();
10585
10586 begin_rendering_info.pDepthAttachment = nullptr;
10587 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10588 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10589 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10590
10591 secondary.begin(&cmdbuff__bi);
10592 secondary.end();
10593
10594 // stencil samples mismatch
10595 m_commandBuffer->BeginRendering(begin_rendering_info);
10596 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10597 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10598 m_errorMonitor->VerifyFound();
10599 m_commandBuffer->EndRendering();
10600
10601 m_commandBuffer->end();
10602}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010603
10604TEST_F(VkLayerTest, CopyCommands2V13) {
10605 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10606
10607 SetTargetApiVersion(VK_API_VERSION_1_3);
10608 ASSERT_NO_FATAL_FAILURE(Init());
10609 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010610 GTEST_SKIP() << "At least Vulkan version 1.3 is required";
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010611 }
10612 VkImageObj image(m_device);
10613 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
ziga-lunarg0ce51882022-05-18 14:36:48 +020010614 VkImageObj image2(m_device);
10615 image2.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10616 VK_IMAGE_TILING_OPTIMAL, 0);
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010617 ASSERT_TRUE(image.initialized());
10618 VkBufferObj dst_buffer;
10619 VkMemoryPropertyFlags reqs = 0;
10620 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10621 VkBufferObj src_buffer;
10622 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10623 auto copy_region = LvlInitStruct<VkImageCopy2>();
10624 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10625 copy_region.srcSubresource.layerCount = 1;
10626 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10627 copy_region.dstSubresource.layerCount = 1;
10628 copy_region.dstOffset = {4, 4, 0};
10629 copy_region.extent.width = 1;
10630 copy_region.extent.height = 1;
10631 copy_region.extent.depth = 1;
10632 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10633 copy_image_info.srcImage = image.handle();
10634 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10635 copy_image_info.dstImage = image.handle();
10636 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10637 copy_image_info.regionCount = 1;
10638 copy_image_info.pRegions = &copy_region;
10639 m_commandBuffer->begin();
10640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10641 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10642 m_errorMonitor->VerifyFound();
10643 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
ziga-lunarg852187f2022-03-16 21:21:33 +010010644 copy_buffer.dstOffset = 4;
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010645 copy_buffer.size = 4;
10646 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10647 copy_buffer_info.srcBuffer = dst_buffer.handle();
10648 copy_buffer_info.dstBuffer = dst_buffer.handle();
10649 copy_buffer_info.regionCount = 1;
10650 copy_buffer_info.pRegions = &copy_buffer;
10651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10652 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10653 m_errorMonitor->VerifyFound();
10654 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10655 bic_region.bufferRowLength = 128;
10656 bic_region.bufferImageHeight = 128;
10657 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10658 bic_region.imageSubresource.layerCount = 1;
10659 bic_region.imageExtent.height = 4;
10660 bic_region.imageExtent.width = 4;
10661 bic_region.imageExtent.depth = 1;
10662 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10663 buffer_image_info.srcBuffer = src_buffer.handle();
10664 buffer_image_info.dstImage = image.handle();
10665 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10666 buffer_image_info.regionCount = 1;
10667 buffer_image_info.pRegions = &bic_region;
10668 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10669 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10670 m_errorMonitor->VerifyFound();
10671 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10672 image_buffer_info.dstBuffer = src_buffer.handle();
10673 image_buffer_info.srcImage = image.handle();
10674 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10675 image_buffer_info.regionCount = 1;
10676 image_buffer_info.pRegions = &bic_region;
10677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10678 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10679 m_errorMonitor->VerifyFound();
10680 auto blit_region = LvlInitStruct<VkImageBlit2>();
10681 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10682 blit_region.srcSubresource.baseArrayLayer = 0;
10683 blit_region.srcSubresource.layerCount = 1;
10684 blit_region.srcSubresource.mipLevel = 0;
10685 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10686 blit_region.dstSubresource.baseArrayLayer = 0;
10687 blit_region.dstSubresource.layerCount = 1;
10688 blit_region.dstSubresource.mipLevel = 0;
10689 blit_region.srcOffsets[0] = {0, 0, 0};
aitor-lunarg3ad811f2022-03-31 22:00:39 +020010690 blit_region.srcOffsets[1] = {31, 31, 1};
10691 blit_region.dstOffsets[0] = {32, 32, 0};
10692 blit_region.dstOffsets[1] = {64, 64, 1};
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010693 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10694 blit_image_info.srcImage = image.handle();
10695 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10696 blit_image_info.dstImage = image.handle();
10697 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10698 blit_image_info.regionCount = 1;
10699 blit_image_info.pRegions = &blit_region;
10700 blit_image_info.filter = VK_FILTER_NEAREST;
10701 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10702 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10703 m_errorMonitor->VerifyFound();
10704 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10705 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10706 resolve_region.srcSubresource.mipLevel = 0;
10707 resolve_region.srcSubresource.baseArrayLayer = 0;
10708 resolve_region.srcSubresource.layerCount = 1;
10709 resolve_region.srcOffset.x = 0;
10710 resolve_region.srcOffset.y = 0;
10711 resolve_region.srcOffset.z = 0;
10712 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10713 resolve_region.dstSubresource.mipLevel = 0;
10714 resolve_region.dstSubresource.baseArrayLayer = 0;
10715 resolve_region.dstSubresource.layerCount = 1;
10716 resolve_region.dstOffset.x = 0;
10717 resolve_region.dstOffset.y = 0;
10718 resolve_region.dstOffset.z = 0;
10719 resolve_region.extent.width = 1;
10720 resolve_region.extent.height = 1;
10721 resolve_region.extent.depth = 1;
10722 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10723 resolve_image_info.srcImage = image.handle();
10724 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
ziga-lunarg0ce51882022-05-18 14:36:48 +020010725 resolve_image_info.dstImage = image2.handle();
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010726 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10727 resolve_image_info.regionCount = 1;
10728 resolve_image_info.pRegions = &resolve_region;
10729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10730 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10731 m_errorMonitor->VerifyFound();
10732}
aitor-lunarga131fca2022-02-17 22:55:55 +010010733
10734TEST_F(VkLayerTest, ValidateMultiviewUnboundResourcesAfterBeginRenderPassAndNextSubpass) {
10735 TEST_DESCRIPTION(
10736 "Validate all required resources are bound if multiview is enabled after vkCmdBeginRenderPass and vkCmdNextSubpass");
10737
Aitor Camacho768bbc92022-06-10 16:57:44 +020010738 m_errorMonitor->ExpectSuccess();
10739
10740 constexpr unsigned multiview_count = 2u;
10741 constexpr unsigned extra_subpass_count = multiview_count - 1u;
10742
sjfricked700bc02022-05-30 16:35:06 +090010743 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
aitor-lunarga131fca2022-02-17 22:55:55 +010010744 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +090010745 if (!AreRequiredExtensionsEnabled()) {
10746 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
aitor-lunarga131fca2022-02-17 22:55:55 +010010747 }
10748
10749 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
Aitor Camacho768bbc92022-06-10 16:57:44 +020010750 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multiview_features);
10751 auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
10752 vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR"));
10753 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
10754 if (multiview_features.multiview == VK_FALSE) {
10755 GTEST_SKIP() << "Device does not support multiview.";
10756 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010757
Aitor Camacho768bbc92022-06-10 16:57:44 +020010758 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
aitor-lunarga131fca2022-02-17 22:55:55 +010010759
10760 VkAttachmentDescription attachmentDescription = {};
10761 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
10762 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010763 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
aitor-lunarga131fca2022-02-17 22:55:55 +010010764 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
10765
10766 VkAttachmentReference colorAttachmentReference = {};
10767 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
10768 colorAttachmentReference.attachment = 0;
10769
Aitor Camacho768bbc92022-06-10 16:57:44 +020010770 m_renderPass_subpasses.resize(multiview_count);
10771 for (unsigned i = 0; i < multiview_count; ++i) {
10772 m_renderPass_subpasses[i].colorAttachmentCount = 1;
10773 m_renderPass_subpasses[i].pColorAttachments = &colorAttachmentReference;
10774 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010775
Aitor Camacho768bbc92022-06-10 16:57:44 +020010776 uint32_t viewMasks[multiview_count] = {};
10777 for (unsigned i = 0; i < multiview_count; ++i) {
10778 viewMasks[i] = 1u << i;
10779 }
10780 auto renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
10781 renderPassMultiviewCreateInfo.subpassCount = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010782 renderPassMultiviewCreateInfo.pViewMasks = viewMasks;
10783
10784 m_renderPass_info = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
10785 m_renderPass_info.attachmentCount = 1;
10786 m_renderPass_info.pAttachments = &attachmentDescription;
10787 m_renderPass_info.subpassCount = m_renderPass_subpasses.size();
10788 m_renderPass_info.pSubpasses = m_renderPass_subpasses.data();
10789
Aitor Camacho768bbc92022-06-10 16:57:44 +020010790 m_renderPass_dependencies.resize(extra_subpass_count);
10791 for (unsigned i = 0; i < m_renderPass_dependencies.size(); ++i) {
10792 auto &subpass_dep = m_renderPass_dependencies[i];
10793 subpass_dep.srcSubpass = i;
10794 subpass_dep.dstSubpass = i + 1;
10795
10796 subpass_dep.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10797 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10798 subpass_dep.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10799 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10800
10801 subpass_dep.srcAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10802 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10803 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10804 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10805 subpass_dep.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10806 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10807 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10808 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10809
10810 subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
10811 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010812
10813 m_renderPass_info.dependencyCount = static_cast<uint32_t>(m_renderPass_dependencies.size());
10814 m_renderPass_info.pDependencies = m_renderPass_dependencies.data();
10815
10816 vk::CreateRenderPass(m_device->handle(), &m_renderPass_info, nullptr, &m_renderPass);
10817
Aitor Camacho768bbc92022-06-10 16:57:44 +020010818 auto image_create_info = LvlInitStruct<VkImageCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010819 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10820 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
10821 image_create_info.extent.width = static_cast<uint32_t>(m_width);
10822 image_create_info.extent.height = static_cast<uint32_t>(m_height);
10823 image_create_info.extent.depth = 1;
10824 image_create_info.mipLevels = 1;
Aitor Camacho768bbc92022-06-10 16:57:44 +020010825 image_create_info.arrayLayers = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010826 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10827 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10828 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10829 image_create_info.flags = 0;
10830
10831 VkImageObj image(m_device);
10832 image.Init(image_create_info);
Aitor Camacho768bbc92022-06-10 16:57:44 +020010833 image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
aitor-lunarga131fca2022-02-17 22:55:55 +010010834 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
10835 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
10836
Aitor Camacho768bbc92022-06-10 16:57:44 +020010837 auto framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010838 framebufferCreateInfo.width = static_cast<uint32_t>(m_width);
10839 framebufferCreateInfo.height = static_cast<uint32_t>(m_height);
10840 framebufferCreateInfo.layers = 1;
10841 framebufferCreateInfo.renderPass = m_renderPass;
10842 framebufferCreateInfo.attachmentCount = 1;
10843 framebufferCreateInfo.pAttachments = &imageView;
10844
10845 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &m_framebuffer);
10846
10847 VkClearValue clear{};
10848 clear.color = m_clear_color;
10849 m_renderPassClearValues.emplace_back(clear);
10850 m_renderPassBeginInfo.renderPass = m_renderPass;
10851 m_renderPassBeginInfo.framebuffer = m_framebuffer;
10852 m_renderPassBeginInfo.renderArea.extent.width = static_cast<uint32_t>(m_width);
10853 m_renderPassBeginInfo.renderArea.extent.height = static_cast<uint32_t>(m_height);
10854 m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size();
10855 m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data();
10856
Aitor Camacho768bbc92022-06-10 16:57:44 +020010857 // Pipeline not bound test
10858 {
10859 // No need to create individual pipelines for each subpass since we are checking no bound pipeline
10860 CreatePipelineHelper pipe(*this);
10861 pipe.InitInfo();
10862 pipe.InitState();
10863 pipe.CreateGraphicsPipeline();
aitor-lunarga131fca2022-02-17 22:55:55 +010010864
Aitor Camacho768bbc92022-06-10 16:57:44 +020010865 m_commandBuffer->begin();
10866 // This bind should not be valid after we begin the renderpass
10867 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10868 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10869 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010870
Aitor Camacho768bbc92022-06-10 16:57:44 +020010871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10872 m_commandBuffer->Draw(1, 0, 0, 0);
10873 m_errorMonitor->VerifyFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010874
Aitor Camacho768bbc92022-06-10 16:57:44 +020010875 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10876 m_errorMonitor->ExpectSuccess();
aitor-lunarga131fca2022-02-17 22:55:55 +010010877
Aitor Camacho768bbc92022-06-10 16:57:44 +020010878 // This bind should not be valid for next subpass
10879 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10880 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10881 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010882
Aitor Camacho768bbc92022-06-10 16:57:44 +020010883 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10884 m_commandBuffer->Draw(1, 0, 0, 0);
10885 m_errorMonitor->VerifyFound();
10886 }
10887
10888 m_errorMonitor->ExpectSuccess();
10889 m_commandBuffer->EndRenderPass();
10890 m_commandBuffer->end();
10891 }
10892
10893 m_commandBuffer->reset();
10894
Aitor Camacho131d2192022-06-13 19:15:11 +020010895 // Dynamic state (checking with line width)
10896 {
10897 // Pipeline for subpass 0
10898 CreatePipelineHelper pipe(*this);
10899 pipe.InitInfo();
10900
10901 VkDynamicState dyn_states = VK_DYNAMIC_STATE_LINE_WIDTH;
10902 pipe.ia_ci_.topology = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
10903 pipe.dyn_state_ci_ = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
10904 pipe.dyn_state_ci_.dynamicStateCount = 1;
10905 pipe.dyn_state_ci_.pDynamicStates = &dyn_states;
10906 pipe.InitState();
10907 pipe.CreateGraphicsPipeline();
10908
10909 // Pipelines for all other subpasses
10910 vk_testing::Pipeline pipelines[extra_subpass_count];
10911 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10912 auto pipe_info = pipe.gp_ci_;
10913 pipe_info.subpass = i + 1;
10914 pipelines[i].init(*m_device, pipe_info);
10915 }
10916
10917 m_commandBuffer->begin();
10918 // This line width set should not be valid for next subpass
10919 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10920 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10921 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10922 m_errorMonitor->VerifyNotFound();
10923
10924 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10925 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
10926 m_errorMonitor->VerifyFound();
10927
10928 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10929 m_errorMonitor->ExpectSuccess();
10930
10931 // This line width set should not be valid for next subpass
10932 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10933 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10934 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
10935 m_errorMonitor->VerifyNotFound();
10936
10937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10938 m_commandBuffer->Draw(1, 0, 0, 0);
10939 m_errorMonitor->VerifyFound();
10940 }
10941
10942 m_errorMonitor->ExpectSuccess();
10943 m_commandBuffer->EndRenderPass();
10944 m_commandBuffer->end();
10945 }
10946
10947 m_commandBuffer->reset();
10948
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010949 // Push constants
10950 {
10951 char const *const vsSource = R"glsl(
10952 #version 450
10953 layout(push_constant, std430) uniform foo {
10954 mat3 m;
10955 } constants;
10956 void main(){
10957 vec3 v3 = constants.m[0];
10958 }
10959 )glsl";
10960
10961 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
10962 VkShaderObj const fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
10963
10964 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT, 0, 16};
10965 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
10966 pipeline_layout_info.pushConstantRangeCount = 1;
10967 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
10968
10969 vk_testing::PipelineLayout layout;
10970 layout.init(*m_device, pipeline_layout_info, std::vector<const vk_testing::DescriptorSetLayout *>{});
10971
10972 CreatePipelineHelper pipe(*this);
10973 pipe.InitInfo();
10974 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
10975 pipe.pipeline_layout_ci_ = pipeline_layout_info;
10976 pipe.InitState();
10977 pipe.CreateGraphicsPipeline();
10978
10979 // Pipelines for all other subpasses
10980 vk_testing::Pipeline pipelines[extra_subpass_count];
10981 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10982 auto pipe_info = pipe.gp_ci_;
10983 pipe_info.subpass = i + 1;
10984 pipelines[i].init(*m_device, pipe_info);
10985 }
10986 // Set up complete
10987
10988 const float dummy_values[16] = {};
10989 m_commandBuffer->begin();
10990 // This push constants should not be counted when render pass begins
10991 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
10992 push_constant_range.size, dummy_values);
10993 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10994 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10995 m_errorMonitor->VerifyNotFound();
10996
10997 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
10998 m_commandBuffer->Draw(1, 0, 0, 0);
10999 m_errorMonitor->VerifyFound();
11000
11001 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11002 m_errorMonitor->ExpectSuccess();
11003
11004 // This push constants should not be counted when we change subpass
11005 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
11006 push_constant_range.size, dummy_values);
11007 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11008 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11009 m_errorMonitor->VerifyNotFound();
11010
11011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
11012 m_commandBuffer->Draw(1, 0, 0, 0);
11013 m_errorMonitor->VerifyFound();
11014 }
11015
11016 m_errorMonitor->ExpectSuccess();
11017 m_commandBuffer->EndRenderPass();
11018 m_commandBuffer->end();
11019 }
11020
11021 m_commandBuffer->reset();
11022
Aitor Camacho097a2322022-06-14 14:08:23 +020011023 // Descriptor sets
11024 {
11025 OneOffDescriptorSet descriptor_set{m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}};
11026
11027 auto bci = LvlInitStruct<VkBufferCreateInfo>();
11028 bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
11029 bci.size = 8;
11030 VkBufferObj buffer;
11031 buffer.init(*m_device, bci);
11032 VkDescriptorBufferInfo buffer_info;
11033 buffer_info.buffer = buffer.handle();
11034 buffer_info.offset = 0;
11035 buffer_info.range = VK_WHOLE_SIZE;
11036 auto descriptor_write = LvlInitStruct<VkWriteDescriptorSet>();
11037 descriptor_write.dstSet = descriptor_set.set_;
11038 descriptor_write.dstBinding = 0;
11039 descriptor_write.descriptorCount = 1;
11040 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11041 descriptor_write.pBufferInfo = &buffer_info;
11042 vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11043
11044 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
11045 pipeline_layout_info.setLayoutCount = 1;
11046 pipeline_layout_info.pSetLayouts = &descriptor_set.layout_.handle();
11047
11048 vk_testing::PipelineLayout layout;
11049 layout.init(*m_device, pipeline_layout_info, std::vector<vk_testing::DescriptorSetLayout const *>{});
11050
11051 VkShaderObj const vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
11052 VkShaderObj const fs(this, bindStateFragUniformShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11053
11054 CreatePipelineHelper pipe(*this);
11055 pipe.InitInfo();
11056 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11057 pipe.pipeline_layout_ci_ = pipeline_layout_info;
11058 pipe.InitState();
11059 pipe.CreateGraphicsPipeline();
11060
11061 // Pipelines for all other subpasses
11062 vk_testing::Pipeline pipelines[extra_subpass_count];
11063 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11064 auto pipe_info = pipe.gp_ci_;
11065 pipe_info.subpass = i + 1;
11066 pipelines[i].init(*m_device, pipe_info);
11067 }
11068 // Set up complete
11069
11070 m_commandBuffer->begin();
11071 // This descriptor bind should not be counted when render pass begins
11072 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
11073 &descriptor_set.set_, 0, nullptr);
11074 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11075 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11076 m_errorMonitor->VerifyNotFound();
11077
11078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
11079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
11080 m_commandBuffer->Draw(1, 0, 0, 0);
11081 m_errorMonitor->VerifyFound();
11082
11083 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11084 m_errorMonitor->ExpectSuccess();
11085
11086 // This descriptor bind should not be counted when next subpass begins
11087 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0,
11088 1, &descriptor_set.set_, 0, nullptr);
11089 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11090 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11091 m_errorMonitor->VerifyNotFound();
11092
11093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
11094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
11095 m_commandBuffer->Draw(1, 0, 0, 0);
11096 m_errorMonitor->VerifyFound();
11097 }
11098
11099 m_errorMonitor->ExpectSuccess();
11100 m_commandBuffer->EndRenderPass();
11101 m_commandBuffer->end();
11102 }
11103
11104 m_commandBuffer->reset();
11105
Aitor Camachob379c4b2022-06-14 14:43:40 +020011106 // Vertex buffer
11107 {
11108 float const vertex_data[] = {1.0f, 0.0f};
11109 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11110 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11111
11112 VkVertexInputBindingDescription input_binding{};
11113 input_binding.binding = 0;
11114 input_binding.stride = sizeof(vertex_data);
11115 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11116
11117 VkVertexInputAttributeDescription input_attribs{};
11118 input_attribs.binding = 0;
11119 input_attribs.location = 0;
11120 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11121 input_attribs.offset = 0;
11122
11123 char const *const vsSource = R"glsl(
11124 #version 450
11125 layout(location = 0) in vec2 input0;
11126 void main(){
11127 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11128 }
11129 )glsl";
11130
11131 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11132 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11133
11134 CreatePipelineHelper pipe(*this);
11135 pipe.InitInfo();
11136 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11137 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11138 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11139 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11140 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11141 pipe.InitState();
11142 pipe.CreateGraphicsPipeline();
11143
11144 // Pipelines for all other subpasses
11145 vk_testing::Pipeline pipelines[extra_subpass_count];
11146 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11147 auto pipe_info = pipe.gp_ci_;
11148 pipe_info.subpass = i + 1;
11149 pipelines[i].init(*m_device, pipe_info);
11150 }
11151 // Set up complete
11152 VkDeviceSize offset = 0;
11153
11154 m_commandBuffer->begin();
11155 // This vertex buffer bind should not be counted when render pass begins
11156 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11157 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11158 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11159 m_errorMonitor->VerifyNotFound();
11160
11161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11163 m_commandBuffer->Draw(1, 0, 0, 0);
11164 m_errorMonitor->VerifyFound();
11165
11166 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11167 m_errorMonitor->ExpectSuccess();
11168
11169 // This vertex buffer bind should not be counted when next subpass begins
11170 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11171 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11172 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11173 m_errorMonitor->VerifyNotFound();
11174
11175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11177 m_commandBuffer->Draw(1, 0, 0, 0);
11178 m_errorMonitor->VerifyFound();
11179 }
11180
11181 m_errorMonitor->ExpectSuccess();
11182 m_commandBuffer->EndRenderPass();
11183 m_commandBuffer->end();
11184 }
11185
11186 m_commandBuffer->reset();
11187
Aitor Camachoea9030a2022-06-14 15:07:25 +020011188 // Index buffer
11189 {
11190 float const vertex_data[] = {1.0f, 0.0f};
11191 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11192 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11193
11194 uint32_t const index_data[] = {0};
11195 VkConstantBufferObj ibo(m_device, static_cast<int>(sizeof(index_data)), reinterpret_cast<const void *>(index_data),
11196 VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
11197
11198 VkVertexInputBindingDescription input_binding{};
11199 input_binding.binding = 0;
11200 input_binding.stride = sizeof(vertex_data);
11201 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11202
11203 VkVertexInputAttributeDescription input_attribs{};
11204 input_attribs.binding = 0;
11205 input_attribs.location = 0;
11206 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11207 input_attribs.offset = 0;
11208
11209 char const *const vsSource = R"glsl(
11210 #version 450
11211 layout(location = 0) in vec2 input0;
11212 void main(){
11213 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11214 }
11215 )glsl";
11216
11217 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11218 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11219
11220 CreatePipelineHelper pipe(*this);
11221 pipe.InitInfo();
11222 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11223 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11224 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11225 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11226 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11227 pipe.InitState();
11228 pipe.CreateGraphicsPipeline();
11229
11230 // Pipelines for all other subpasses
11231 vk_testing::Pipeline pipelines[extra_subpass_count];
11232 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11233 auto pipe_info = pipe.gp_ci_;
11234 pipe_info.subpass = i + 1;
11235 pipelines[i].init(*m_device, pipe_info);
11236 }
11237 // Set up complete
11238
11239 VkDeviceSize offset = 0;
11240 m_commandBuffer->begin();
11241 // This index buffer bind should not be counted when render pass begins
11242 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11243 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11244 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11245 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11246 m_errorMonitor->VerifyNotFound();
11247
11248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11249 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11250 m_errorMonitor->VerifyFound();
11251
11252 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11253 m_errorMonitor->ExpectSuccess();
11254
11255 // This index buffer bind should not be counted when next subpass begins
11256 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11257 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11258 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11259 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11260 m_errorMonitor->VerifyNotFound();
11261
11262 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11263 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11264 m_errorMonitor->VerifyFound();
11265 }
11266
11267 m_errorMonitor->ExpectSuccess();
11268 m_commandBuffer->EndRenderPass();
11269 m_commandBuffer->end();
11270 }
11271
Aitor Camacho768bbc92022-06-10 16:57:44 +020011272 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010011273}
ziga-lunarg813fa012022-04-09 14:09:57 +020011274
11275TEST_F(VkLayerTest, TestCommandBufferInheritanceWithInvalidDepthFormat) {
11276 TEST_DESCRIPTION(
11277 "Test VkCommandBufferInheritanceRenderingInfoKHR with depthAttachmentFormat that does not include depth aspect");
11278
11279 SetTargetApiVersion(VK_API_VERSION_1_1);
11280
11281 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
11282
11283 ASSERT_NO_FATAL_FAILURE(InitFramework());
11284
sjfricked700bc02022-05-30 16:35:06 +090011285 if (!AreRequiredExtensionsEnabled()) {
11286 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunarg813fa012022-04-09 14:09:57 +020011287 }
11288
11289 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090011290 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
ziga-lunarg813fa012022-04-09 14:09:57 +020011291 }
11292
11293 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
11294 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
11295 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
11296 if (!dynamic_rendering_features.dynamicRendering) {
11297 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
11298 return;
11299 }
11300
11301 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
11302
11303 auto stencil_format = FindSupportedStencilOnlyFormat(gpu());
11304 if (!stencil_format) {
11305 printf("%s Couldn't stencil image format.\n", kSkipPrefix);
11306 return;
11307 }
11308
11309 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
11310 inheritance_rendering_info.depthAttachmentFormat = stencil_format;
11311
11312 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11313
11314 auto cmdbuf_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>(&inheritance_rendering_info);
11315 auto cmdbuf_bi = LvlInitStruct<VkCommandBufferBeginInfo>();
11316 cmdbuf_bi.pInheritanceInfo = &cmdbuf_ii;
11317
11318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferInheritanceRenderingInfo-depthAttachmentFormat-06540");
11319
11320 vk::BeginCommandBuffer(secondary.handle(), &cmdbuf_bi);
11321
11322 m_errorMonitor->VerifyFound();
11323}
ziga-lunarg0ce51882022-05-18 14:36:48 +020011324
11325TEST_F(VkLayerTest, ResolveInvalidUsage) {
11326 TEST_DESCRIPTION("Resolve image with missing usage flags.");
11327
11328 if (!EnableDeviceProfileLayer()) {
11329 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
11330 return;
11331 }
11332
11333 ASSERT_NO_FATAL_FAILURE(Init());
11334
11335 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
11336 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
11337
11338 // Load required functions
11339 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
11340 printf("%s Failed to device profile layer.\n", kSkipPrefix);
11341 return;
11342 }
11343
11344 VkFormat src_format = VK_FORMAT_R8_UNORM;
11345 VkFormat dst_format = VK_FORMAT_R8_SNORM;
11346
11347 VkFormatProperties formatProps;
11348 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, &formatProps);
11349 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
11350 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, formatProps);
11351 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, &formatProps);
11352 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
11353 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, formatProps);
11354
11355 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
11356 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11357 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11358 image_create_info.extent.width = 32;
11359 image_create_info.extent.height = 1;
11360 image_create_info.extent.depth = 1;
11361 image_create_info.mipLevels = 1;
11362 image_create_info.arrayLayers = 1;
11363 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
11364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11365 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11366 image_create_info.flags = 0;
11367
11368 VkImageObj srcImage(m_device);
11369 srcImage.init(&image_create_info);
11370 ASSERT_TRUE(srcImage.initialized());
11371
11372 image_create_info.format = dst_format;
11373 VkImageObj srcImage2(m_device);
11374 srcImage2.init(&image_create_info);
11375 ASSERT_TRUE(srcImage2.initialized());
11376
11377 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11378 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11379 VkImageObj invalidSrcImage(m_device);
11380 invalidSrcImage.init(&image_create_info);
11381 ASSERT_TRUE(invalidSrcImage.initialized());
11382
11383 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11384 image_create_info.format = src_format;
11385 VkImageObj invalidSrcImage2(m_device);
11386 invalidSrcImage2.init(&image_create_info);
11387 ASSERT_TRUE(invalidSrcImage2.initialized());
11388
11389 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11390 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11391 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11392 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11393 VkImageObj dstImage(m_device);
11394 dstImage.init(&image_create_info);
11395 ASSERT_TRUE(dstImage.initialized());
11396
11397 image_create_info.format = src_format;
11398 VkImageObj dstImage2(m_device);
11399 dstImage2.init(&image_create_info);
11400 ASSERT_TRUE(dstImage2.initialized());
11401
11402 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11403 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11404 VkImageObj invalidDstImage(m_device);
11405 invalidDstImage.init(&image_create_info);
11406 ASSERT_TRUE(invalidDstImage.initialized());
11407
11408 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11409 image_create_info.format = dst_format;
11410 VkImageObj invalidDstImage2(m_device);
11411 invalidDstImage2.init(&image_create_info);
11412 ASSERT_TRUE(invalidDstImage2.initialized());
11413
11414 m_commandBuffer->begin();
11415 VkImageResolve resolveRegion;
11416 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11417 resolveRegion.srcSubresource.mipLevel = 0;
11418 resolveRegion.srcSubresource.baseArrayLayer = 0;
11419 resolveRegion.srcSubresource.layerCount = 1;
11420 resolveRegion.srcOffset.x = 0;
11421 resolveRegion.srcOffset.y = 0;
11422 resolveRegion.srcOffset.z = 0;
11423 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11424 resolveRegion.dstSubresource.mipLevel = 0;
11425 resolveRegion.dstSubresource.baseArrayLayer = 0;
11426 resolveRegion.dstSubresource.layerCount = 1;
11427 resolveRegion.dstOffset.x = 0;
11428 resolveRegion.dstOffset.y = 0;
11429 resolveRegion.dstOffset.z = 0;
11430 resolveRegion.extent.width = 1;
11431 resolveRegion.extent.height = 1;
11432 resolveRegion.extent.depth = 1;
11433
11434 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06762");
11435 m_commandBuffer->ResolveImage(invalidSrcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11436 &resolveRegion);
11437 m_errorMonitor->VerifyFound();
11438
11439 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06764");
11440 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11441 &resolveRegion);
11442 m_errorMonitor->VerifyFound();
11443
11444 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06763");
11445 m_commandBuffer->ResolveImage(invalidSrcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11446 1, &resolveRegion);
11447 m_errorMonitor->VerifyFound();
11448
11449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06765");
11450 m_commandBuffer->ResolveImage(srcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11451 1, &resolveRegion);
11452 m_errorMonitor->VerifyFound();
11453
11454 m_commandBuffer->end();
11455}