blob: 21a25f8c7a066919d59222ce09d75fae2146c55f [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()) {
sjfricke11b24692022-06-21 20:49:53 +09005960 GTEST_SKIP() << "Test not supported by MockICD";
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005961 }
sjfricked8e01c52022-07-06 14:09:04 +09005962 if (!AreRequiredExtensionsEnabled()) {
5963 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
5964 }
Aaron Hagand1a61212021-12-22 11:53:49 -05005965 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06005966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5967
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005968 CreatePipelineHelper pipe(*this);
5969 pipe.InitInfo();
5970 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06005971 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005972 dyn_state_ci.dynamicStateCount = size(dyn_states);
5973 dyn_state_ci.pDynamicStates = dyn_states;
5974 pipe.dyn_state_ci_ = dyn_state_ci;
5975 pipe.InitState();
5976 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005977
5978 m_commandBuffer->begin();
5979 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5980
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005981 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5982 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5983 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005984
5985 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005986 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005987 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005988 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005989
sfricke-samsung1c61f192021-12-31 01:53:03 -06005990 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005991 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5992 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005993 VkBufferObj draw_buffer;
5994 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005995
Aaron Hagand1a61212021-12-22 11:53:49 -05005996 VkBufferObj draw_buffer_correct;
5997 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5998 draw_buffer_correct.init(*m_device, buffer_create_info);
5999
unknown088160a2019-05-23 17:43:13 -06006000 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07006001 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006002 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006003 m_errorMonitor->VerifyFound();
6004
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006005 // VUID-vkCmdDrawIndirect-drawCount-02718
Aaron Hagand1a61212021-12-22 11:53:49 -05006006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-00488");
6007 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006008 m_errorMonitor->VerifyFound();
6009
Aaron Hagand1a61212021-12-22 11:53:49 -05006010 // VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701
6011 // VUID-vkCmdDrawIndexedIndirect-drawCount-00540
6012 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
6013 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
6014 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006015 m_errorMonitor->VerifyFound();
6016
unknown088160a2019-05-23 17:43:13 -06006017 m_commandBuffer->EndRenderPass();
6018 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006019}
6020
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006021TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
6022 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
6023
sjfricked8e01c52022-07-06 14:09:04 +09006024 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6025
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006026 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006027
sjfricked8e01c52022-07-06 14:09:04 +09006028 if (!AreRequiredExtensionsEnabled()) {
6029 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006030 }
6031
6032 ASSERT_NO_FATAL_FAILURE(InitState());
6033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6034
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006035 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6036 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006037 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6038
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006039 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
6040 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
6041
6042 m_commandBuffer->begin();
6043 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
sfricke-samsung1c61f192021-12-31 01:53:03 -06006044 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006045 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6046 buffer_create_info.size = 1024;
6047 VkBufferObj counter_buffer;
6048 counter_buffer.init(*m_device, buffer_create_info);
6049
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006050 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006052 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006053 m_errorMonitor->VerifyFound();
6054
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006055 // some mock ICD json files are missing a valid stride value
6056 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6057 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006058 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006059 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6060 m_errorMonitor->VerifyFound();
6061 }
6062
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006063 m_commandBuffer->EndRenderPass();
6064 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006065
6066 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6067 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6068 return;
6069 }
6070
6071 std::vector<const char *> device_extension_names;
6072 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6073 VkDeviceObj test_device(0, gpu(), device_extension_names);
6074 VkCommandPoolObj commandPool(&test_device, 0);
6075 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6076 VkBufferObj counter_buffer2;
6077 counter_buffer2.init(test_device, buffer_create_info);
6078 VkPipelineLayoutObj pipelineLayout(&test_device);
6079 VkRenderPass renderpass;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006080 VkRenderPassCreateInfo rp_info = LvlInitStruct<VkRenderPassCreateInfo>();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006081 VkSubpassDescription subpass = {};
Tony-LunarG983bbc52020-11-06 11:04:59 -07006082 rp_info.pSubpasses = &subpass;
6083 rp_info.subpassCount = 1;
6084 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6085 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006086 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
sjfricke394227a2022-06-20 16:47:38 +09006087 vs.InitFromGLSLTry(false, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006088 pipeline.AddShader(&vs);
6089 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6090 m_renderPassBeginInfo.renderPass = renderpass;
6091 VkFramebuffer fb;
6092 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6093 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6094 m_renderPassBeginInfo.framebuffer = fb;
6095 m_renderPassBeginInfo.renderPass = renderpass;
6096 commandBuffer.begin();
6097 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6098 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6099 VkRect2D scissor = {{0, 0}, {16, 16}};
6100 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6101 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6102 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6103 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006104 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006105 }
6106 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6107 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6108 m_errorMonitor->VerifyFound();
6109 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6110 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006111}
6112
unknown088160a2019-05-23 17:43:13 -06006113TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6114 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6115
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006116 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6117 ASSERT_NO_FATAL_FAILURE(InitFramework());
6118 if (!AreRequiredExtensionsEnabled()) {
6119 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006120 }
6121 ASSERT_NO_FATAL_FAILURE(InitState());
6122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6123
unknown088160a2019-05-23 17:43:13 -06006124 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006125 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006126
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006127 CreatePipelineHelper pipe(*this);
6128 pipe.InitInfo();
6129 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006130 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006131 dyn_state_ci.dynamicStateCount = size(dyn_states);
6132 dyn_state_ci.pDynamicStates = dyn_states;
6133 pipe.dyn_state_ci_ = dyn_state_ci;
6134 pipe.InitState();
6135 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006136
6137 m_commandBuffer->begin();
6138 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6139
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006140 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6141 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6142 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006143
6144 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006145 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006146 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006147 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006148
sfricke-samsung1c61f192021-12-31 01:53:03 -06006149 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006150 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6151 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006152 vk_testing::Buffer draw_buffer;
6153 draw_buffer.init_no_mem(*m_device, buffer_create_info);
6154 ASSERT_TRUE(draw_buffer.initialized());
unknown088160a2019-05-23 17:43:13 -06006155
sjfrickeedd669c2022-06-02 17:37:19 +09006156 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006157 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006158 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006159 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006160 VkBufferObj count_buffer;
6161 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006162
Mark Lobodzinski20310782020-02-28 14:25:17 -07006163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006164 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006165 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006166 m_errorMonitor->VerifyFound();
6167
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006168 draw_buffer.bind_memory(*m_device, 0, 0);
unknown088160a2019-05-23 17:43:13 -06006169
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006170 vk_testing::Buffer count_buffer_unbound;
6171 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6172 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006173
sjfrickeedd669c2022-06-02 17:37:19 +09006174 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006175 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006176 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6177
Mark Lobodzinski20310782020-02-28 14:25:17 -07006178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006179 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
6180 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006181 m_errorMonitor->VerifyFound();
6182
sjfrickeedd669c2022-06-02 17:37:19 +09006183 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, " VUID-vkCmdDrawIndirectCount-countBuffer-02715");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006184 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006185 sizeof(VkDrawIndirectCommand));
6186 m_errorMonitor->VerifyFound();
6187
Mark Lobodzinski20310782020-02-28 14:25:17 -07006188 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006189 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006190 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006191 m_errorMonitor->VerifyFound();
6192
Mark Lobodzinski20310782020-02-28 14:25:17 -07006193 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006194 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006195 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006196 m_errorMonitor->VerifyFound();
6197
sjfrickeedd669c2022-06-02 17:37:19 +09006198 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-04129");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006199 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006200 sizeof(VkDrawIndirectCommand));
6201 m_errorMonitor->VerifyFound();
6202
Mark Lobodzinski20310782020-02-28 14:25:17 -07006203 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006204 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006205 m_errorMonitor->VerifyFound();
6206
unknown088160a2019-05-23 17:43:13 -06006207 m_commandBuffer->EndRenderPass();
6208 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006209}
6210
6211TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6212 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6213
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006214 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006215 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006216 if (!AreRequiredExtensionsEnabled()) {
6217 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006218 }
6219 ASSERT_NO_FATAL_FAILURE(InitState());
6220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6221
unknown088160a2019-05-23 17:43:13 -06006222 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006223 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006224
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006225 CreatePipelineHelper pipe(*this);
6226 pipe.InitInfo();
6227 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006228 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006229 dyn_state_ci.dynamicStateCount = size(dyn_states);
6230 dyn_state_ci.pDynamicStates = dyn_states;
6231 pipe.dyn_state_ci_ = dyn_state_ci;
6232 pipe.InitState();
6233 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006234
6235 m_commandBuffer->begin();
6236 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6237
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006238 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6239 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6240 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006241
6242 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006243 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006244 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006245 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006246
sfricke-samsung1c61f192021-12-31 01:53:03 -06006247 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006248 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6249 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006250 VkBufferObj draw_buffer;
6251 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006252
sjfrickeedd669c2022-06-02 17:37:19 +09006253 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006254 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006255 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006256 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006257 VkBufferObj count_buffer;
6258 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006259
sfricke-samsung1c61f192021-12-31 01:53:03 -06006260 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006261 index_buffer_create_info.size = sizeof(uint32_t);
6262 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006263 VkBufferObj index_buffer;
6264 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006265
Mark Lobodzinski20310782020-02-28 14:25:17 -07006266 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006267 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006268 sizeof(VkDrawIndexedIndirectCommand));
6269 m_errorMonitor->VerifyFound();
6270
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006271 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006272
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006273 vk_testing::Buffer draw_buffer_unbound;
6274 draw_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6275 ASSERT_TRUE(draw_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006276
Mark Lobodzinski20310782020-02-28 14:25:17 -07006277 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006278 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006279 sizeof(VkDrawIndexedIndirectCommand));
6280 m_errorMonitor->VerifyFound();
6281
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006282 vk_testing::Buffer count_buffer_unbound;
6283 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6284 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006285
sjfrickeedd669c2022-06-02 17:37:19 +09006286 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006287 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006288 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6289
Mark Lobodzinski20310782020-02-28 14:25:17 -07006290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006291 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006292 sizeof(VkDrawIndexedIndirectCommand));
6293 m_errorMonitor->VerifyFound();
6294
sjfrickeedd669c2022-06-02 17:37:19 +09006295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715");
6296 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
6297 sizeof(VkDrawIndexedIndirectCommand));
6298 m_errorMonitor->VerifyFound();
6299
Mark Lobodzinski20310782020-02-28 14:25:17 -07006300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006301 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006302 sizeof(VkDrawIndexedIndirectCommand));
6303 m_errorMonitor->VerifyFound();
6304
Mark Lobodzinski20310782020-02-28 14:25:17 -07006305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006306 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006307 sizeof(VkDrawIndexedIndirectCommand));
6308 m_errorMonitor->VerifyFound();
6309
sjfrickeedd669c2022-06-02 17:37:19 +09006310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-04129");
6311 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size,
6312 1, sizeof(VkDrawIndexedIndirectCommand));
6313 m_errorMonitor->VerifyFound();
6314
Mark Lobodzinski20310782020-02-28 14:25:17 -07006315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006316 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006317 m_errorMonitor->VerifyFound();
6318
unknown088160a2019-05-23 17:43:13 -06006319 m_commandBuffer->EndRenderPass();
6320 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006321}
6322
sfricke-samsung860d3b22020-05-04 21:08:29 -07006323TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6324 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6325
6326 SetTargetApiVersion(VK_API_VERSION_1_2);
6327 ASSERT_NO_FATAL_FAILURE(Init());
6328 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6329 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09006330 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
sfricke-samsung860d3b22020-05-04 21:08:29 -07006331 }
6332
6333 VkBufferObj indirect_buffer;
6334 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6335 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6336
6337 VkBufferObj indexed_indirect_buffer;
6338 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6339 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6340
6341 VkBufferObj count_buffer;
6342 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6343
6344 VkBufferObj index_buffer;
6345 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6346
6347 CreatePipelineHelper pipe(*this);
6348 pipe.InitInfo();
6349 pipe.InitState();
6350 pipe.CreateGraphicsPipeline();
6351
6352 // Make calls to valid commands but without the drawIndirectCount feature set
6353 m_commandBuffer->begin();
6354 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6355
6356 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6357
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006358 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006359 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6360 sizeof(VkDrawIndirectCommand));
6361 m_errorMonitor->VerifyFound();
6362
6363 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6364
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006365 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006366 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6367 sizeof(VkDrawIndexedIndirectCommand));
6368 m_errorMonitor->VerifyFound();
6369
6370 m_commandBuffer->EndRenderPass();
6371 m_commandBuffer->end();
6372}
6373
unknown088160a2019-05-23 17:43:13 -06006374TEST_F(VkLayerTest, ExclusiveScissorNV) {
6375 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6376
6377 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6378 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6379 } else {
6380 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6381 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6382 return;
6383 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006384 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006385 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6386 for (auto device_extension : required_device_extensions) {
6387 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6388 m_device_extension_names.push_back(device_extension);
6389 } else {
6390 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6391 return;
6392 }
6393 }
6394
6395 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006396 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006397 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6398
6399 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006400 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6401 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006402 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6403
6404 features2.features.multiViewport = VK_FALSE;
6405
6406 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6408
6409 if (m_device->phy().properties().limits.maxViewports) {
6410 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6411 return;
6412 }
6413
6414 // Based on PSOViewportStateTests
6415 {
6416 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6417 VkViewport viewports[] = {viewport, viewport};
6418 VkRect2D scissor = {{0, 0}, {64, 64}};
6419 VkRect2D scissors[100] = {scissor, scissor};
6420
6421 using std::vector;
6422 struct TestCase {
6423 uint32_t viewport_count;
6424 VkViewport *viewports;
6425 uint32_t scissor_count;
6426 VkRect2D *scissors;
6427 uint32_t exclusive_scissor_count;
6428 VkRect2D *exclusive_scissors;
6429
6430 vector<std::string> vuids;
6431 };
6432
6433 vector<TestCase> test_cases = {
6434 {1,
6435 viewports,
6436 1,
6437 scissors,
6438 2,
6439 scissors,
6440 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6441 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6442 {1,
6443 viewports,
6444 1,
6445 scissors,
6446 100,
6447 scissors,
6448 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6449 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6450 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006451 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006452 };
6453
6454 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006455 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6456 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006457
6458 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6459 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6460 helper.vp_state_ci_.pViewports = test_case.viewports;
6461 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6462 helper.vp_state_ci_.pScissors = test_case.scissors;
6463 helper.vp_state_ci_.pNext = &exc;
6464
6465 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6466 exc.pExclusiveScissors = test_case.exclusive_scissors;
6467 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006468 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006469 }
6470 }
6471
6472 // Based on SetDynScissorParamTests
6473 {
6474 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006475 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006476
6477 const VkRect2D scissor = {{0, 0}, {16, 16}};
6478 const VkRect2D scissors[] = {scissor, scissor};
6479
6480 m_commandBuffer->begin();
6481
Mark Lobodzinski20310782020-02-28 14:25:17 -07006482 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006483 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6484 m_errorMonitor->VerifyFound();
6485
Mark Lobodzinski20310782020-02-28 14:25:17 -07006486 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006487 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6488 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6489 m_errorMonitor->VerifyFound();
6490
Mark Lobodzinski20310782020-02-28 14:25:17 -07006491 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006492 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6493 m_errorMonitor->VerifyFound();
6494
Mark Lobodzinski20310782020-02-28 14:25:17 -07006495 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006496 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006497 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006498 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6499 m_errorMonitor->VerifyFound();
6500
Mark Lobodzinski20310782020-02-28 14:25:17 -07006501 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6502 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006503 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6504 m_errorMonitor->VerifyFound();
6505
Mark Lobodzinski20310782020-02-28 14:25:17 -07006506 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006507 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6508 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6509 m_errorMonitor->VerifyFound();
6510
6511 struct TestCase {
6512 VkRect2D scissor;
6513 std::string vuid;
6514 };
6515
6516 std::vector<TestCase> test_cases = {
6517 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6518 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6519 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6520 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6521 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6522 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6523 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6524 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6525
6526 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006527 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006528 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6529 m_errorMonitor->VerifyFound();
6530 }
6531
6532 m_commandBuffer->end();
6533 }
6534}
6535
6536TEST_F(VkLayerTest, MeshShaderNV) {
6537 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6538
sjfricked8e01c52022-07-06 14:09:04 +09006539 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6540 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006541 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09006542 if (!AreRequiredExtensionsEnabled()) {
6543 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
unknown088160a2019-05-23 17:43:13 -06006544 }
6545
Tony-LunarG048f5012020-04-29 16:55:11 -06006546 if (IsPlatform(kMockICD) || DeviceSimulation()) {
sjfricke11b24692022-06-21 20:49:53 +09006547 GTEST_SKIP() << "Test not supported by MockICD";
unknown088160a2019-05-23 17:43:13 -06006548 }
6549
6550 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006551 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006552 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6553
6554 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006555 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6556 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006557 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6558 features2.features.multiDrawIndirect = VK_FALSE;
6559
6560 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6561 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6562
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006563 static const char vertShaderText[] = R"glsl(
6564 #version 450
6565 vec2 vertices[3];
6566 void main() {
6567 vertices[0] = vec2(-1.0, -1.0);
6568 vertices[1] = vec2( 1.0, -1.0);
6569 vertices[2] = vec2( 0.0, 1.0);
6570 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6571 gl_PointSize = 1.0f;
6572 }
6573 )glsl";
unknown088160a2019-05-23 17:43:13 -06006574
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006575 static const char meshShaderText[] = R"glsl(
6576 #version 450
6577 #extension GL_NV_mesh_shader : require
6578 layout(local_size_x = 1) in;
6579 layout(max_vertices = 3) out;
6580 layout(max_primitives = 1) out;
6581 layout(triangles) out;
6582 void main() {
6583 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6584 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6585 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6586 gl_PrimitiveIndicesNV[0] = 0;
6587 gl_PrimitiveIndicesNV[1] = 1;
6588 gl_PrimitiveIndicesNV[2] = 2;
6589 gl_PrimitiveCountNV = 1;
6590 }
6591 )glsl";
unknown088160a2019-05-23 17:43:13 -06006592
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006593 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6594 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6595 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006596
6597 // Test pipeline creation
6598 {
6599 // can't mix mesh with vertex
6600 const auto break_vp = [&](CreatePipelineHelper &helper) {
6601 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6602 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006603 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006604 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6605
6606 // vertex or mesh must be present
6607 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006608 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006609 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6610
6611 // vertexinput and inputassembly must be valid when vertex stage is present
6612 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6613 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6614 helper.gp_ci_.pVertexInputState = nullptr;
6615 helper.gp_ci_.pInputAssemblyState = nullptr;
6616 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006617 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006618 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6619 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6620 }
6621
6622 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006623 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006624
sfricke-samsung1c61f192021-12-31 01:53:03 -06006625 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006626 buffer_create_info.size = sizeof(uint32_t);
6627 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6628 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006629 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006630 ASSERT_VK_SUCCESS(result);
6631
6632 m_commandBuffer->begin();
6633
Mark Lobodzinski20310782020-02-28 14:25:17 -07006634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006636 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6637 m_errorMonitor->VerifyFound();
6638
6639 m_commandBuffer->end();
6640
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006641 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006642}
6643
6644TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6645 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006646
sjfricked700bc02022-05-30 16:35:06 +09006647 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006648 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +09006649 if (!AreRequiredExtensionsEnabled()) {
6650 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006651 }
6652 auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
6653 vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR"));
6654 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6655
6656 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6657 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
6658 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6659 if (mesh_shader_features.meshShader != VK_TRUE) {
6660 printf("%s Mesh shader feature not supported\n", kSkipPrefix);
6661 return;
6662 }
6663
6664 mesh_shader_features.meshShader = VK_FALSE;
6665 mesh_shader_features.taskShader = VK_FALSE;
6666 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06006667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6668
6669 VkEvent event;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006670 VkEventCreateInfo event_create_info = LvlInitStruct<VkEventCreateInfo>();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006671 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006672
6673 m_commandBuffer->begin();
6674
Shannon McPherson93970b12020-06-12 14:34:35 -06006675 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006676 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006677 m_errorMonitor->VerifyFound();
6678
Shannon McPherson93970b12020-06-12 14:34:35 -06006679 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006680 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006681 m_errorMonitor->VerifyFound();
6682
Shannon McPherson93970b12020-06-12 14:34:35 -06006683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006684 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006685 m_errorMonitor->VerifyFound();
6686
Shannon McPherson93970b12020-06-12 14:34:35 -06006687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006688 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006689 m_errorMonitor->VerifyFound();
6690
Shannon McPherson93970b12020-06-12 14:34:35 -06006691 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6692 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006693 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6694 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006695 m_errorMonitor->VerifyFound();
6696
Shannon McPherson93970b12020-06-12 14:34:35 -06006697 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006699 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6700 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006701 m_errorMonitor->VerifyFound();
6702
Shannon McPherson93970b12020-06-12 14:34:35 -06006703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006705 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6706 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006707 m_errorMonitor->VerifyFound();
6708
Shannon McPherson93970b12020-06-12 14:34:35 -06006709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006711 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6712 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006713 m_errorMonitor->VerifyFound();
6714
6715 m_commandBuffer->end();
6716
sfricke-samsung1c61f192021-12-31 01:53:03 -06006717 VkSemaphoreCreateInfo semaphore_create_info = LvlInitStruct<VkSemaphoreCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006718 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006719 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006720
6721 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006722 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006723
6724 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006725 submit_info.signalSemaphoreCount = 1;
6726 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006727 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006728 m_errorMonitor->VerifyNotFound();
6729
unknown088160a2019-05-23 17:43:13 -06006730 submit_info.signalSemaphoreCount = 0;
6731 submit_info.pSignalSemaphores = nullptr;
6732 submit_info.waitSemaphoreCount = 1;
6733 submit_info.pWaitSemaphores = &semaphore;
6734 submit_info.pWaitDstStageMask = &stage_flags;
6735
sfricke-samsung1ac64842021-09-23 14:11:17 -07006736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006738 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006739 m_errorMonitor->VerifyFound();
6740
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006741 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006742
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006743 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006744
6745 static const char task_src[] = R"glsl(
6746 #version 450
6747
6748 #extension GL_NV_mesh_shader : require
6749
6750 layout(local_size_x = 32) in;
6751
6752 taskNV out Task {
6753 uint baseID;
6754 } OUT;
6755
6756 void main() {
6757 OUT.baseID = 1;
6758 }
6759 )glsl";
6760
6761 static const char mesh_src[] = R"glsl(
6762 #version 450
6763
6764 #extension GL_NV_mesh_shader : require
6765
6766 layout(local_size_x = 1) in;
6767 layout(max_vertices = 3) out;
6768 layout(max_primitives = 1) out;
6769 layout(triangles) out;
6770
6771 taskNV in Task {
6772 uint baseID;
6773 } IN;
6774
6775 void main() {
6776 }
6777 )glsl";
6778
6779 VkShaderObj task_shader(this, task_src, VK_SHADER_STAGE_TASK_BIT_NV);
6780 VkShaderObj mesh_shader(this, mesh_src, VK_SHADER_STAGE_MESH_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006781
6782 // mesh and task shaders not supported
6783 const auto break_vp = [&](CreatePipelineHelper &helper) {
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006784 helper.shader_stages_ = {task_shader.GetStageCreateInfo(), mesh_shader.GetStageCreateInfo()};
unknown088160a2019-05-23 17:43:13 -06006785 };
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006786 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
6787 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6788 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
unknown088160a2019-05-23 17:43:13 -06006789
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006790 vk::DestroyEvent(m_device->device(), event, nullptr);
6791 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006792}
Chris Mayerc93536f2019-09-19 16:34:49 +02006793
6794TEST_F(VkLayerTest, ViewportWScalingNV) {
6795 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6796
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006797 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006798
6799 VkPhysicalDeviceFeatures device_features = {};
6800 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6801
6802 if (!device_features.multiViewport) {
6803 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6804 return;
6805 }
6806
6807 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6808 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6809 } else {
6810 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6811 return;
6812 }
6813
6814 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6815 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6816
6817 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006818 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006819
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006820 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006821 #version 450
6822 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6823 vec2( 1.0f, 1.0f),
6824 vec2(-1.0f, -1.0f),
6825 vec2( 1.0f, -1.0f) };
6826 out gl_PerVertex {
6827 vec4 gl_Position;
6828 };
6829
6830 void main() {
6831 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006832 }
6833 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006834
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006835 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006836 #version 450
6837 layout(location = 0) out vec4 outColor;
6838
6839 void main() {
6840 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006841 }
6842 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006843
6844 const std::vector<VkViewport> vp = {
6845 {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}};
6846 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6847 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6848
6849 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6850
sfricke-samsung1c61f192021-12-31 01:53:03 -06006851 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006852 vpsi.viewportWScalingEnable = VK_TRUE;
6853 vpsi.viewportCount = vp_count;
6854 vpsi.pViewportWScalings = scale.data();
6855
sfricke-samsung1c61f192021-12-31 01:53:03 -06006856 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006857 vpci.viewportCount = vp_count;
6858 vpci.pViewports = vp.data();
6859 vpci.scissorCount = vp_count;
6860 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006861
6862 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6863
6864 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006865 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006866
6867 // Create pipeline with w-scaling enabled but without a valid scaling array
6868 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006869 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006870 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6871
6872 vpsi.pViewportWScalings = scale.data();
6873
6874 // Create pipeline with w-scaling enabled but without matching viewport counts
6875 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006876 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006877 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6878
6879 const VkPipelineLayoutObj pl(m_device);
6880
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006881 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6882 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006883
6884 VkPipelineObj pipe(m_device);
6885 pipe.AddDefaultColorAttachment();
6886 pipe.AddShader(&vs);
6887 pipe.AddShader(&fs);
6888 pipe.SetViewport(vp);
6889 pipe.SetScissor(sc);
6890 pipe.CreateVKPipeline(pl.handle(), renderPass());
6891
6892 VkPipelineObj pipeDynWScale(m_device);
6893 pipeDynWScale.AddDefaultColorAttachment();
6894 pipeDynWScale.AddShader(&vs);
6895 pipeDynWScale.AddShader(&fs);
6896 pipeDynWScale.SetViewport(vp);
6897 pipeDynWScale.SetScissor(sc);
6898 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6899 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6900
6901 m_commandBuffer->begin();
6902
6903 // Bind pipeline without dynamic w scaling enabled
6904 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006905 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006906 m_errorMonitor->VerifyNotFound();
6907
Chris Mayerc93536f2019-09-19 16:34:49 +02006908 // Bind pipeline that has dynamic w-scaling enabled
6909 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006910 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006911 m_errorMonitor->VerifyNotFound();
6912
6913 const auto max_vps = m_device->props.limits.maxViewports;
6914
Mark Lobodzinski20310782020-02-28 14:25:17 -07006915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006916 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6917 m_errorMonitor->VerifyFound();
6918
6919 m_errorMonitor->ExpectSuccess();
6920 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6921 m_errorMonitor->VerifyNotFound();
6922
6923 m_commandBuffer->end();
6924}
sfricke-samsung914e8002020-01-07 22:26:18 -08006925
6926TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6927 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6928
6929 // Enable Sampler YCbCr Conversion req'd extensions
6930 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6931 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6932 if (mp_extensions) {
6933 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6934 }
6935 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006936 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006937 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006938 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6939 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6940 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6941 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006942 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006943 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6944 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6945 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6946 } else {
6947 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6948 return;
6949 }
6950
6951 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06006952 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08006953 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6954 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6955
6956 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6957 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6958 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6959 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6960 return;
6961 }
6962
6963 // Create Ycbcr conversion
6964 VkSamplerYcbcrConversion conversions;
6965 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6966 NULL,
6967 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6968 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6969 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6970 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6971 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6972 VK_CHROMA_LOCATION_COSITED_EVEN,
6973 VK_CHROMA_LOCATION_COSITED_EVEN,
6974 VK_FILTER_NEAREST,
6975 false};
6976
Mark Lobodzinski20310782020-02-28 14:25:17 -07006977 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006978 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6979 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006980}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006981
6982TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6983 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6984
sjfricked8e01c52022-07-06 14:09:04 +09006985 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006986
6987 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6988
sjfricked8e01c52022-07-06 14:09:04 +09006989 if (!AreRequiredExtensionsEnabled()) {
6990 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006991 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006992
6993 {
6994 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6995 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6996 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6997
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006998 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6999 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007000 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7001
7002 if (!tf_features.transformFeedback) {
7003 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7004 return;
7005 }
7006 }
7007
7008 ASSERT_NO_FATAL_FAILURE(InitState());
7009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7010
7011 {
7012 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
7013 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7014 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7015
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007016 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007017 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7018 info.size = 4;
7019 VkBufferObj buffer;
7020 buffer.init(*m_device, info);
7021 VkDeviceSize offsets[1]{};
7022
7023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
7024 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
7025 m_errorMonitor->VerifyFound();
7026 }
7027
7028 {
7029 auto vkCmdBeginTransformFeedbackEXT =
7030 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7031 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7032
7033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
7034 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7035 m_errorMonitor->VerifyFound();
7036 }
7037
7038 {
7039 auto vkCmdEndTransformFeedbackEXT =
7040 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7041 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7042
7043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
7044 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7045 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7046 m_errorMonitor->VerifyFound();
7047 }
7048}
7049
7050TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
7051 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
7052
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007053 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7054 ASSERT_NO_FATAL_FAILURE(InitFramework());
7055 if (!AreRequiredExtensionsEnabled()) {
7056 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007057 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007058
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007059 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007060 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007061 }
7062
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007063 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007064 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007065 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007066
7067 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007068 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007069 }
7070
7071 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7072 }
7073
7074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7075
7076 auto vkCmdBindTransformFeedbackBuffersEXT =
7077 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7078 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7079
7080 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007081 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007082 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007083
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007084 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007085 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7086 info.size = 8;
7087 VkBufferObj const buffer_obj(*m_device, info);
7088
7089 // Request a firstBinding that is too large.
7090 {
7091 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7092 VkDeviceSize const offsets[1]{};
7093
7094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7095 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7096 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7097 nullptr);
7098 m_errorMonitor->VerifyFound();
7099 }
7100
7101 // Request too many bindings.
7102 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7103 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7104 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7105
7106 std::vector<VkDeviceSize> offsets(bindingCount);
7107
7108 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7109 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7110 nullptr);
7111 m_errorMonitor->VerifyFound();
7112 }
7113
7114 // Request a size that is larger than the maximum size.
7115 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7116 VkDeviceSize const offsets[1]{};
7117 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7118
7119 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7120 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7121 m_errorMonitor->VerifyFound();
7122 }
7123 }
7124
7125 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007126 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007127 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7128 info.size = 8;
7129 VkBufferObj const buffer_obj(*m_device, info);
7130
7131 // Request an offset that is too large.
7132 {
7133 VkDeviceSize const offsets[1]{info.size + 4};
7134
7135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7136 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7137 m_errorMonitor->VerifyFound();
7138 }
7139
7140 // Request an offset that is not a multiple of 4.
7141 {
7142 VkDeviceSize const offsets[1]{1};
7143
7144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7145 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7146 m_errorMonitor->VerifyFound();
7147 }
7148
7149 // Request a size that is larger than the buffer's size.
7150 {
7151 VkDeviceSize const offsets[1]{};
7152 VkDeviceSize const sizes[1]{info.size + 1};
7153
7154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007155 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7156 m_errorMonitor->VerifyFound();
7157 }
7158
7159 // Request an offset and size whose sum is larger than the buffer's size.
7160 {
7161 VkDeviceSize const offsets[1]{4};
7162 VkDeviceSize const sizes[1]{info.size - 3};
7163
7164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7165 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7166 m_errorMonitor->VerifyFound();
7167 }
7168
7169 // Bind while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007170 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007171 auto vkCmdBeginTransformFeedbackEXT =
7172 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7173 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7174 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7175
7176 VkDeviceSize const offsets[1]{};
7177
7178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7179 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7180 m_errorMonitor->VerifyFound();
7181
7182 auto vkCmdEndTransformFeedbackEXT =
7183 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7184 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7185 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7186 }
7187 }
7188
7189 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7190 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007191 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007192 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7193 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007194 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007195 VkBufferObj const buffer_obj(*m_device, info);
7196
7197 VkDeviceSize const offsets[1]{};
7198
7199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7200 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7201 m_errorMonitor->VerifyFound();
7202 }
7203
7204 // Don't bind memory.
7205 {
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007206 vk_testing::Buffer buffer;
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007207 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007208 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007209 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7210 info.size = 4;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007211 buffer.init_no_mem(*m_device, info);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007212 }
7213
7214 VkDeviceSize const offsets[1]{};
7215
7216 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007217 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007218 m_errorMonitor->VerifyFound();
7219 }
7220}
7221
7222TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7223 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7224
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007225 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7226 ASSERT_NO_FATAL_FAILURE(InitFramework());
7227 if (!AreRequiredExtensionsEnabled()) {
7228 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007229 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007230
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007231 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007232 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007233 }
7234
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007235 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007236 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007237 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007238
7239 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007240 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007241 }
7242
7243 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7244 }
7245
7246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7247
7248 auto vkCmdBeginTransformFeedbackEXT =
7249 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7250 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7251
7252 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007253 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007254 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007255
7256 // Request a firstCounterBuffer that is too large.
7257 {
7258 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7259
7260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7261 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7262 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7263 m_errorMonitor->VerifyFound();
7264 }
7265
7266 // Request too many buffers.
7267 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7268 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7269
7270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7271 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7272 m_errorMonitor->VerifyFound();
7273 }
7274 }
7275
7276 // Request an out-of-bounds location.
7277 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007278 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007279 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7280 info.size = 4;
7281 VkBufferObj const buffer_obj(*m_device, info);
7282
7283 VkDeviceSize const offsets[1]{1};
7284
7285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7286 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7287 m_errorMonitor->VerifyFound();
7288 }
7289
7290 // Request specific offsets without specifying buffers.
7291 {
7292 VkDeviceSize const offsets[1]{};
7293
7294 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7295 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7296 m_errorMonitor->VerifyFound();
7297 }
7298
7299 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7300 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007301 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007302 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7303 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007304 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007305 VkBufferObj const buffer_obj(*m_device, info);
7306
7307 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7308 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7309 m_errorMonitor->VerifyFound();
7310 }
7311
7312 // Begin while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007313 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007314 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7315
7316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7317 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7318 m_errorMonitor->VerifyFound();
7319
7320 auto vkCmdEndTransformFeedbackEXT =
7321 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7322 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7323
7324 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7325 }
7326}
7327
7328TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7329 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7330
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007331 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007332 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007333 if (!AreRequiredExtensionsEnabled()) {
7334 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
7335 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007336
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007337 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007338 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007339 }
7340
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007341 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007342 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007343 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007344
7345 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007346 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007347 }
7348
7349 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7350 }
7351
7352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7353
7354 auto vkCmdEndTransformFeedbackEXT =
7355 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7356 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7357
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007358 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007359 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007360 // Activate transform feedback.
7361 auto vkCmdBeginTransformFeedbackEXT =
7362 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7363 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7364 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007365
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007366 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007367 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7368 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007369
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007370 // Request a firstCounterBuffer that is too large.
7371 {
7372 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7373
7374 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7375 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7376 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7377 m_errorMonitor->VerifyFound();
7378 }
7379
7380 // Request too many buffers.
7381 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7382 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7383
7384 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7385 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7386 m_errorMonitor->VerifyFound();
7387 }
7388 }
7389
7390 // Request an out-of-bounds location.
7391 {
7392 auto info = LvlInitStruct<VkBufferCreateInfo>();
7393 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7394 info.size = 4;
7395 VkBufferObj const buffer_obj(*m_device, info);
7396
7397 VkDeviceSize const offsets[1]{1};
7398
7399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7400 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007401 m_errorMonitor->VerifyFound();
7402 }
7403
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007404 // Request specific offsets without specifying buffers.
7405 {
7406 VkDeviceSize const offsets[1]{};
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007407
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007408 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7409 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7410 m_errorMonitor->VerifyFound();
7411 }
7412
7413 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7414 {
7415 auto info = LvlInitStruct<VkBufferCreateInfo>();
7416 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7417 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007418 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007419 VkBufferObj const buffer_obj(*m_device, info);
7420
7421 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7422 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007423 m_errorMonitor->VerifyFound();
7424 }
7425 }
7426
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007427 // End while transform feedback is inactive.
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007428 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007429 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007430
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007431 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7432 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007433 m_errorMonitor->VerifyFound();
7434 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007435 }
7436}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007437
sfricke-samsung39ee2442020-07-22 21:21:15 -07007438TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7439 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007440
7441 // protect memory added in VK 1.1
7442 SetTargetApiVersion(VK_API_VERSION_1_1);
7443
sjfricked8e01c52022-07-06 14:09:04 +09007444 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7445
sfricke-samsung071af2d2020-07-02 10:37:22 -07007446 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7447
sjfricked8e01c52022-07-06 14:09:04 +09007448 if (!AreRequiredExtensionsEnabled()) {
7449 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7450 }
7451
sfricke-samsung071af2d2020-07-02 10:37:22 -07007452 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7453 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7454 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7455
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007456 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7457 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007458 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7459
7460 if (protected_memory_features.protectedMemory == VK_FALSE) {
7461 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7462 return;
7463 };
7464
7465 // Turns m_commandBuffer into a protected command buffer
7466 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7467
7468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7469 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007470 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung071af2d2020-07-02 10:37:22 -07007471 }
7472
7473 VkBufferObj indirect_buffer;
7474 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7475 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7476
7477 VkBufferObj indexed_indirect_buffer;
7478 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7479 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7480
7481 VkBufferObj index_buffer;
7482 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7483
7484 CreatePipelineHelper pipe(*this);
7485 pipe.InitInfo();
7486 pipe.InitState();
7487 pipe.CreateGraphicsPipeline();
7488
sfricke-samsung39ee2442020-07-22 21:21:15 -07007489 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007490 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007491 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7492 query_pool_create_info.queryCount = 1;
7493 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7494
sfricke-samsung071af2d2020-07-02 10:37:22 -07007495 m_commandBuffer->begin();
7496 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7497
7498 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7499
7500 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7501 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7502 m_errorMonitor->VerifyFound();
7503
7504 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7505
7506 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7507 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7508 sizeof(VkDrawIndexedIndirectCommand));
7509 m_errorMonitor->VerifyFound();
7510
7511 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007512
7513 // Query should be outside renderpass
7514 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7515
7516 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7517 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7518 m_errorMonitor->VerifyFound();
7519
7520 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7521 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7522 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7523 m_errorMonitor->VerifyFound();
7524
sfricke-samsung071af2d2020-07-02 10:37:22 -07007525 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007526
7527 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007528}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007529
7530TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7531 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7532
7533 SetTargetApiVersion(VK_API_VERSION_1_1);
sjfricked8e01c52022-07-06 14:09:04 +09007534 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007535
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007536 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7537
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007538 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7539 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7540 return;
7541 }
sjfricked8e01c52022-07-06 14:09:04 +09007542 if (!AreRequiredExtensionsEnabled()) {
7543 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7544 }
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007545
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007546 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7547 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7548 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007549 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7550 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7551 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007552
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007553 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7554 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007555 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7556
7557 if (protected_memory_features.protectedMemory == VK_FALSE) {
7558 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7559 return;
7560 };
7561
sfricke-samsung21286f82021-11-16 08:21:46 -08007562 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7563 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7564 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7565 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7566
7567 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
sjfricke8ab00c12022-07-08 17:33:48 +09007568 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007569
7570 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7571 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7572
7573 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007574 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007575 }
7576
7577 // Create actual protected and unprotected buffers
7578 VkBuffer buffer_protected = VK_NULL_HANDLE;
7579 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007580 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007581 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007582 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7583 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7584 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007585 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7586
7587 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7588 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7589 buffer_create_info.flags = 0;
7590 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7591
7592 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007593 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007594 VkImageObj image_protected(m_device);
7595 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007596 VkImageObj image_protected_descriptor(m_device);
7597 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007598 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007599 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007600 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007601 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007602 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007603 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7604 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007605 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7606 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007607 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7608 image_create_info.arrayLayers = 1;
7609 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007610 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7611 image_protected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007612 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007613
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007614 image_create_info.flags = 0;
7615 image_unprotected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007616 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007617
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007618 // Create protected and unproteced memory
7619 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7620 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7621
sfricke-samsung1c61f192021-12-31 01:53:03 -06007622 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007623 alloc_info.allocationSize = 0;
7624
7625 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7626 VkMemoryRequirements mem_reqs_protected;
7627 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7628 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7629 VkMemoryRequirements mem_reqs_unprotected;
7630 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7631 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7632
7633 // Get memory index for a protected and unprotected memory
7634 VkPhysicalDeviceMemoryProperties phys_mem_props;
7635 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7636 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7637 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7638 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7639 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7640 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7641 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7642 memory_type_unprotected = i;
7643 }
7644 // Check just protected bit is in type at all
7645 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7646 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7647 memory_type_protected = i;
7648 }
7649 }
7650 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7651 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7652 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7653 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7654 return;
7655 }
7656
7657 alloc_info.memoryTypeIndex = memory_type_protected;
7658 alloc_info.allocationSize = mem_reqs_protected.size;
7659 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7660
7661 alloc_info.allocationSize = mem_reqs_unprotected.size;
7662 alloc_info.memoryTypeIndex = memory_type_unprotected;
7663 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7664
7665 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7666 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7667 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7668 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007669 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7670 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7671
Aitor Camacho6ba32ff2022-06-16 19:11:12 +02007672 // Change layout once memory is bound
7673 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7674 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7675 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7676 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7677
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007678 // need memory bound at image view creation time
7679 image_views[0] = image_protected.targetView(image_format);
7680 image_views[1] = image_unprotected.targetView(image_format);
7681 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7682 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007683
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007684 // A renderpass and framebuffer that contains a protected and unprotected image view
7685 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007686 {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 -07007687 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7688 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007689 {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 -07007690 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7691 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7692 };
7693 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7694 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7695 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7696 VkSubpassDependency dependency = {0,
7697 0,
7698 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7699 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7700 VK_ACCESS_SHADER_WRITE_BIT,
7701 VK_ACCESS_SHADER_WRITE_BIT,
7702 VK_DEPENDENCY_BY_REGION_BIT};
7703 VkRenderPassCreateInfo render_pass_create_info = {
7704 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7705 VkRenderPass render_pass;
7706 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7707 VkFramebufferCreateInfo framebuffer_create_info = {
7708 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7709 VkFramebuffer framebuffer;
7710 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7711
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007712 // Various structs used for commands
7713 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7714 VkImageBlit blit_region = {};
7715 blit_region.srcSubresource = image_subresource;
7716 blit_region.dstSubresource = image_subresource;
7717 blit_region.srcOffsets[0] = {0, 0, 0};
7718 blit_region.srcOffsets[1] = {8, 8, 1};
7719 blit_region.dstOffsets[0] = {0, 8, 0};
7720 blit_region.dstOffsets[1] = {8, 8, 1};
7721 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7722 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7723 VkBufferCopy buffer_copy = {0, 0, 64};
7724 VkBufferImageCopy buffer_image_copy = {};
7725 buffer_image_copy.bufferRowLength = 0;
7726 buffer_image_copy.bufferImageHeight = 0;
7727 buffer_image_copy.imageSubresource = image_subresource;
7728 buffer_image_copy.imageOffset = {0, 0, 0};
7729 buffer_image_copy.imageExtent = {1, 1, 1};
7730 buffer_image_copy.bufferOffset = 0;
7731 VkImageCopy image_copy = {};
7732 image_copy.srcSubresource = image_subresource;
7733 image_copy.srcOffset = {0, 0, 0};
7734 image_copy.dstSubresource = image_subresource;
7735 image_copy.dstOffset = {0, 0, 0};
7736 image_copy.extent = {1, 1, 1};
7737 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007738 VkRect2D render_area = {{0, 0}, {8, 8}};
7739 VkRenderPassBeginInfo render_pass_begin = {
7740 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7741 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7742 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7743 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007744
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007745 const char fsSource[] = R"glsl(
7746 #version 450
7747 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7748 layout(set=0, binding=1, rgba8) uniform image2D si1;
7749 layout(location=0) out vec4 x;
7750 void main(){
7751 x = vec4(bar.y);
7752 imageStore(si1, ivec2(0), vec4(0));
7753 }
7754 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007755 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007756
aitor-lunargf15acd52022-03-09 22:13:25 +01007757 CreatePipelineHelper g_pipe(*this, 2u);
locke-lunarg0de02522020-10-27 22:55:17 -06007758 g_pipe.InitInfo();
7759 g_pipe.gp_ci_.renderPass = render_pass;
7760 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7761 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7762 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg0de02522020-10-27 22:55:17 -06007763 g_pipe.InitState();
7764 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7765
7766 VkSampler sampler;
7767 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7768 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7769 ASSERT_VK_SUCCESS(err);
7770
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007771 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007772 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007773 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7775 g_pipe.descriptor_set_->UpdateDescriptorSets();
7776
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007777 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007778 // will get undefined values, but not invalid if protectedNoFault is supported
7779 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7780 if (!protected_memory_properties.protectedNoFault) {
7781 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7782 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7783 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7784 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007785
sfricke-samsung21286f82021-11-16 08:21:46 -08007786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7787 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.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-vkCmdClearColorImage-commandBuffer-01805");
7792 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7793 &subresource_range);
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-vkCmdCopyBuffer-commandBuffer-01822");
7797 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7798 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007799
sfricke-samsung21286f82021-11-16 08:21:46 -08007800 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7801 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7802 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007803
sfricke-samsung21286f82021-11-16 08:21:46 -08007804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7805 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7806 1, &buffer_image_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-01829");
7810 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.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-vkCmdCopyImage-commandBuffer-01825");
7815 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7816 VK_IMAGE_LAYOUT_GENERAL, 1, &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-01826");
7820 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.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-vkCmdCopyImageToBuffer-commandBuffer-01831");
7825 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7826 1, &buffer_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-01832");
7830 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
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-vkCmdFillBuffer-commandBuffer-01811");
7835 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7836 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007837
sfricke-samsung21286f82021-11-16 08:21:46 -08007838 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7839 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7840 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007841
sfricke-samsung21286f82021-11-16 08:21:46 -08007842 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007843
sfricke-samsung21286f82021-11-16 08:21:46 -08007844 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7845 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7846 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007847
sfricke-samsung21286f82021-11-16 08:21:46 -08007848 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7849 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7850 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7851 VkDeviceSize offset = 0;
7852 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7853 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007854
sfricke-samsung21286f82021-11-16 08:21:46 -08007855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7857 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7859 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007860
sfricke-samsung21286f82021-11-16 08:21:46 -08007861 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7862 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007863
sfricke-samsung21286f82021-11-16 08:21:46 -08007864 vk::CmdEndRenderPass(m_commandBuffer->handle());
7865 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007866 m_commandBuffer->end();
7867
7868 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007869 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007870 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7871 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007872 g_pipe.descriptor_set_->UpdateDescriptorSets();
7873
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007874 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007875 if (!protected_memory_properties.protectedNoFault) {
7876 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7877 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7878 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7879 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007880
sfricke-samsung21286f82021-11-16 08:21:46 -08007881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7882 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7883 1, &subresource_range);
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-vkCmdCopyBuffer-commandBuffer-01824");
7887 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7888 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007889
sfricke-samsung21286f82021-11-16 08:21:46 -08007890 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7891 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7892 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_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-vkCmdCopyImage-commandBuffer-01827");
7896 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7897 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &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-vkCmdCopyImageToBuffer-commandBuffer-01833");
7901 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7902 buffer_unprotected, 1, &buffer_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-vkCmdFillBuffer-commandBuffer-01812");
7906 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7907 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007908
sfricke-samsung21286f82021-11-16 08:21:46 -08007909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7910 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7911 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007912
sfricke-samsung21286f82021-11-16 08:21:46 -08007913 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007914
sfricke-samsung21286f82021-11-16 08:21:46 -08007915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7916 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7917 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007918
sfricke-samsung21286f82021-11-16 08:21:46 -08007919 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7920 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7921 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7922 VkDeviceSize offset = 0;
7923 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7924 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007925
sfricke-samsung21286f82021-11-16 08:21:46 -08007926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7927 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7928 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7929 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007930
sfricke-samsung21286f82021-11-16 08:21:46 -08007931 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
7932 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007933 protectedCommandBuffer.end();
7934
sfricke-samsung96cd9932020-08-23 20:57:11 -07007935 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7936 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7937
sfricke-samsung1c61f192021-12-31 01:53:03 -06007938 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
7939 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07007940 submit_info.commandBufferCount = 2;
7941 submit_info.pCommandBuffers = comman_buffers;
7942
7943 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08007944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007945 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007946 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7947 m_errorMonitor->VerifyFound();
7948
7949 protected_submit_info.protectedSubmit = VK_FALSE;
7950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7951 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7952 m_errorMonitor->VerifyFound();
7953
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007954 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7955 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7956 vk::FreeMemory(device(), memory_protected, nullptr);
7957 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007958 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7959 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007960}
locke-lunarg6b0de702020-08-07 17:42:13 -06007961
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007962TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007963 TEST_DESCRIPTION(
7964 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7965 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7966
sjfricked8e01c52022-07-06 14:09:04 +09007967 AddRequiredExtensions(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007968
sjfricked8e01c52022-07-06 14:09:04 +09007969 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7970 if (!AreRequiredExtensionsEnabled()) {
7971 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7972 }
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007973 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7974 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7975 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7976
7977 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
7978 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
7979 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7980 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7981
7982 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
7983 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
7984 return;
7985 }
locke-lunarg6b0de702020-08-07 17:42:13 -06007986
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007987 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06007988 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7989 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7990 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7991 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7992
7993 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7994 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7995 return;
7996 }
7997
7998 VkFormat buffer_view_format =
7999 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
8000 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8001 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8002 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8003 return;
8004 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008005 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008006 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8007
8008 VkPhysicalDeviceFeatures device_features = {};
8009 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8010 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8011 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8012 return;
8013 }
8014
8015 VkImageObj image(m_device);
8016 image.Init(image_ci);
8017 VkImageView image_view = image.targetView(image_format);
8018
8019 VkSampler sampler = VK_NULL_HANDLE;
8020 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8021 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8022
8023 VkBufferObj buffer;
8024 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8025
sfricke-samsung1c61f192021-12-31 01:53:03 -06008026 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06008027 bvci.buffer = buffer.handle();
8028 bvci.format = buffer_view_format;
8029 bvci.range = VK_WHOLE_SIZE;
8030 VkBufferView buffer_view;
8031 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8032
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008033 char const *fsSource = R"glsl(
8034 #version 450
8035 layout(set=0, binding=3, r32f) uniform image2D si0;
8036 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8037 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8038 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8039 void main() {
8040 imageAtomicExchange(si0, ivec2(0), 1);
8041 imageAtomicExchange(si1[0], ivec2(0), 1);
8042 imageAtomicExchange(si1[1], ivec2(0), 1);
8043 imageAtomicExchange(stb2, 0, 1);
8044 imageAtomicExchange(stb3[0], 0, 1);
8045 imageAtomicExchange(stb3[1], 0, 1);
8046 }
8047 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008048
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008049 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
8050 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06008051
8052 CreatePipelineHelper g_pipe(*this);
8053 g_pipe.InitInfo();
8054 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008055 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8056 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8057 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8058 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008059 g_pipe.InitState();
8060 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8061
locke-lunarg76e8dee2020-08-21 13:20:02 -06008062 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008063 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008064 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008065 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008066 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008067 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008068 g_pipe.descriptor_set_->UpdateDescriptorSets();
8069
8070 m_commandBuffer->begin();
8071 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8072 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8073 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8074 &g_pipe.descriptor_set_->set_, 0, nullptr);
8075
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008076 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8081 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8082 m_errorMonitor->VerifyFound();
8083
8084 m_commandBuffer->EndRenderPass();
8085 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008086 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8087 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008088}
locke-lunargae1bbab2020-09-10 11:55:56 -06008089
8090TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8091 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8092
8093 ASSERT_NO_FATAL_FAILURE(Init());
8094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8095
8096 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008097 char const *const vsSource = R"glsl(
8098 #version 450
8099 layout(push_constant, std430) uniform foo {
8100 bool b;
8101 float f2[3];
8102 vec3 v;
8103 vec4 v2[2];
8104 mat3 m;
8105 } constants;
8106 void func1( float f ){
8107 // use the whole v2[1]. byte: 48-63.
8108 vec2 v2 = constants.v2[1].yz;
8109 }
8110 void main(){
8111 // use only v2[0].z. byte: 40-43.
8112 func1( constants.v2[0].z);
8113 // index of m is variable. The all m is used. byte: 64-99.
8114 for(int i=1;i<2;++i) {
8115 vec3 v3 = constants.m[i];
8116 }
8117 }
8118 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008119
8120 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008121 char const *const fsSource = R"glsl(
8122 #version 450
8123 struct foo1{
8124 int i[4];
8125 }f;
8126 layout(push_constant, std430) uniform foo {
8127 float x[2][2][2];
8128 foo1 s;
8129 foo1 ss[3];
8130 } constants;
8131 void main(){
8132 // use s. byte: 32-47.
8133 f = constants.s;
8134 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8135 for(int i=1;i<2;++i) {
8136 int ii = constants.ss[i].i[3];
8137 }
8138 }
8139 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008140
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008141 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8142 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008143
8144 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8145 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8146
Aitor Camacho2933a0a2022-06-13 20:46:34 +02008147 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
8148 pipeline_layout_info.pushConstantRangeCount = 1;
8149 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
locke-lunargae1bbab2020-09-10 11:55:56 -06008150
8151 VkPipelineLayout pipeline_layout;
8152 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8153
8154 CreatePipelineHelper g_pipe(*this);
8155 g_pipe.InitInfo();
8156 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8157 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8158 g_pipe.InitState();
8159 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8160
8161 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8162 VkPipelineLayout pipeline_layout_small;
8163 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8164
8165 CreatePipelineHelper g_pipe_small_range(*this);
8166 g_pipe_small_range.InitInfo();
8167 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8168 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8169 g_pipe_small_range.InitState();
8170
sfricke-samsung7699b912021-04-12 23:01:51 -07008171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008173 g_pipe_small_range.CreateGraphicsPipeline();
8174 m_errorMonitor->VerifyFound();
8175
8176 m_commandBuffer->begin();
8177 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8178
Piers Daniella7f93b62021-11-20 12:32:04 -07008179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008180 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8181 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8182 &g_pipe.descriptor_set_->set_, 0, nullptr);
8183 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8184 m_errorMonitor->VerifyFound();
8185
locke-lunargae1bbab2020-09-10 11:55:56 -06008186 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008187
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008188 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8189 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8190 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8191 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008192 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008193 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8194 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8195 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8196 // m_errorMonitor->VerifyFound();
8197
Piers Daniella7f93b62021-11-20 12:32:04 -07008198 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008199 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8200 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8201 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008202
8203 m_errorMonitor->ExpectSuccess();
8204 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8205 68, dummy_values);
8206 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8207 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008208}
8209
8210TEST_F(VkLayerTest, VerifyVertextBinding) {
8211 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8212
8213 ASSERT_NO_FATAL_FAILURE(Init());
8214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8215
8216 VkBufferObj vtx_buf;
8217 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8218 vtx_buf.init(*m_device, info);
8219
8220 CreatePipelineHelper pipe(*this);
8221 pipe.InitInfo();
8222 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8223 VkVertexInputBindingDescription vtx_binding_des[3] = {
8224 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8225
8226 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8227 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8228 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8229 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8230 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8231 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8232 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8233 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8234 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8235 pipe.InitState();
8236 pipe.CreateGraphicsPipeline();
8237
8238 m_commandBuffer->begin();
8239 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8240 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8241 VkDeviceSize offset = 0;
8242 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8243
8244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8249 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8250 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008251
8252 m_commandBuffer->EndRenderPass();
8253 m_commandBuffer->end();
8254}
locke-lunargd7a08e92020-10-21 00:24:00 -06008255
8256TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8257 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8258 ASSERT_NO_FATAL_FAILURE(Init());
8259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8260
8261 CreatePipelineHelper pipe(*this);
8262 pipe.InitInfo();
8263
8264 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8265
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008266 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008267 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8268 dyn_state_ci.pDynamicStates = dyn_states.data();
8269 pipe.dyn_state_ci_ = dyn_state_ci;
8270 pipe.InitState();
8271 pipe.CreateGraphicsPipeline();
8272
8273 m_commandBuffer->begin();
8274 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8275 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8276
8277 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8278 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8279 VkRect2D scissor = {{0, 0}, {16, 16}};
8280 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8281 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8282
8283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8284 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8285 m_errorMonitor->VerifyFound();
8286
8287 m_commandBuffer->EndRenderPass();
8288 m_commandBuffer->end();
8289}
locke-lunarg0de02522020-10-27 22:55:17 -06008290
8291TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8292 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008293 SetTargetApiVersion(VK_API_VERSION_1_1);
8294 AddRequiredExtensions(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8295 AddRequiredExtensions(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
8296 ASSERT_NO_FATAL_FAILURE(InitFramework());
8297 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8298 GTEST_SKIP() << "Test requires at least Vulkan 1.1";
locke-lunarg0de02522020-10-27 22:55:17 -06008299 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008300 if (!AreRequiredExtensionsEnabled()) {
8301 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
locke-lunarg0de02522020-10-27 22:55:17 -06008302 }
8303
8304 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8306
8307 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8308 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008309
8310 VkFormatProperties format_props;
8311 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8312 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008313 GTEST_SKIP() << "SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.";
sfricke-samsung715e3d12020-12-01 22:45:49 -08008314 }
8315
locke-lunarg0de02522020-10-27 22:55:17 -06008316 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8317 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8318
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008319 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008320 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008321 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008322 image_format_info.type = image_ci.imageType;
8323 image_format_info.format = image_ci.format;
8324 image_format_info.tiling = image_ci.tiling;
8325 image_format_info.usage = image_ci.usage;
8326 image_format_info.flags = image_ci.flags;
8327
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008328 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8329 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008330
8331 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8332
8333 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008334 GTEST_SKIP() << "Image and ImageView supports filter cubic ; skipped.";
locke-lunarg0de02522020-10-27 22:55:17 -06008335 }
8336
8337 VkImageObj image(m_device);
8338 image.Init(image_ci);
8339 VkImageView imageView = image.targetView(format, imageViewType);
8340
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008341 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008342 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8343 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008344 vk_testing::Sampler sampler(*m_device, sampler_ci);
8345 ASSERT_TRUE(sampler.initialized());
locke-lunarg0de02522020-10-27 22:55:17 -06008346
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008347 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008348 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8349 sampler_ci.pNext = &reduction_mode_ci;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008350 vk_testing::Sampler sampler_reduction(*m_device, sampler_ci);
locke-lunarg0de02522020-10-27 22:55:17 -06008351
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008352 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008353
8354 CreatePipelineHelper g_pipe(*this);
8355 g_pipe.InitInfo();
8356 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8357 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8358 g_pipe.InitState();
8359 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8360
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008361 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_reduction.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008362 g_pipe.descriptor_set_->UpdateDescriptorSets();
8363
8364 m_commandBuffer->begin();
8365 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8366 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8367 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8368 &g_pipe.descriptor_set_->set_, 0, nullptr);
8369
8370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8371 m_commandBuffer->Draw(1, 0, 0, 0);
8372 m_errorMonitor->VerifyFound();
8373
8374 m_commandBuffer->EndRenderPass();
8375 m_commandBuffer->end();
8376 m_commandBuffer->reset();
8377
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008378 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008379 g_pipe.descriptor_set_->UpdateDescriptorSets();
8380
8381 m_commandBuffer->begin();
8382 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8383 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8384 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8385 &g_pipe.descriptor_set_->set_, 0, nullptr);
8386
8387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8388 m_commandBuffer->Draw(1, 0, 0, 0);
8389 m_errorMonitor->VerifyFound();
8390
8391 m_commandBuffer->EndRenderPass();
8392 m_commandBuffer->end();
8393}
8394
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008395TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008396 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 -07008397
Clemens Kern5a42ea62021-09-29 16:30:23 +02008398 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8399 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked700bc02022-05-30 16:35:06 +09008400 if (!AreRequiredExtensionsEnabled()) {
8401 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008402 }
8403
8404 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8406
8407 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8408 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008409 auto image_ci = vk_testing::Image::create_info();
8410 image_ci.imageType = VK_IMAGE_TYPE_3D;
8411 image_ci.format = format;
8412 image_ci.extent.width = 128;
8413 image_ci.extent.height = 128;
8414 image_ci.mipLevels = 1;
8415 image_ci.arrayLayers = 1;
8416 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8417 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8418 image_ci.usage = usage;
8419 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008420
8421 VkImageObj image(m_device);
8422 image.Init(image_ci);
8423 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8424 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8425
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008426 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008427 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8428 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008429 vk_testing::Sampler sampler(*m_device, sampler_ci);
8430 ASSERT_TRUE(sampler.initialized());
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008431
Clemens Kern5a42ea62021-09-29 16:30:23 +02008432 static const char fs_src[] = R"glsl(
8433 #version 450
8434 layout(set=0, binding=0) uniform sampler3D s;
8435 layout(location=0) out vec4 x;
8436 void main(){
8437 x = texture(s, vec3(1));
8438 }
8439 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008440 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008441
8442 CreatePipelineHelper g_pipe(*this);
8443 g_pipe.InitInfo();
8444 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8445 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8446 g_pipe.InitState();
8447 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8448
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008449 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008450 g_pipe.descriptor_set_->UpdateDescriptorSets();
8451
8452 m_commandBuffer->begin();
8453 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8454 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8455 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8456 &g_pipe.descriptor_set_->set_, 0, nullptr);
8457
8458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8459 m_commandBuffer->Draw(1, 0, 0, 0);
8460 m_errorMonitor->VerifyFound();
8461
8462 m_commandBuffer->EndRenderPass();
8463 m_commandBuffer->end();
8464}
8465
locke-lunarg0de02522020-10-27 22:55:17 -06008466TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8467 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
sjfricked8e01c52022-07-06 14:09:04 +09008468 SetTargetApiVersion(VK_API_VERSION_1_1);
8469 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
locke-lunarg0de02522020-10-27 22:55:17 -06008470 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8471
sjfricked8e01c52022-07-06 14:09:04 +09008472 if (!AreRequiredExtensionsEnabled()) {
8473 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
8474 }
8475 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8476 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
locke-lunarg0de02522020-10-27 22:55:17 -06008477 }
8478
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008479 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008480 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008481 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008482
8483 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8485
8486 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8487 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8488 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008489 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8490 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008491 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8492 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8493 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8494 return;
8495 }
8496 CreatePipelineHelper pipe(*this);
8497 pipe.InitInfo();
8498 pipe.InitState();
8499 pipe.CreateGraphicsPipeline();
8500
8501 m_commandBuffer->begin();
8502 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8503 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8504
8505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8506 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8507 m_errorMonitor->VerifyFound();
8508
8509 m_commandBuffer->EndRenderPass();
8510 m_commandBuffer->end();
8511}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008512
8513TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8514 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8515
8516 // Enable KHR_fragment_shading_rate and all of its required extensions
8517 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8518 if (fsr_extensions) {
8519 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8520 }
8521 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8522
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008523 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8524 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008525 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8526 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8527 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8528 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008529 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8530 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008531 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8532 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8533 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8534 } else {
8535 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8536 return;
8537 }
8538
sfricke-samsung1c61f192021-12-31 01:53:03 -06008539 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008540 fsr_features.pipelineFragmentShadingRate = true;
8541
sfricke-samsung1c61f192021-12-31 01:53:03 -06008542 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008543
8544 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8545
8546 // Find address of extension call and make the call
8547 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8548 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8549 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8550
8551 VkExtent2D fragmentSize = {1, 1};
8552 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8553 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8554
8555 m_commandBuffer->begin();
8556 fragmentSize.width = 0;
8557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8558 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8559 m_errorMonitor->VerifyFound();
8560 fragmentSize.width = 1;
8561
8562 fragmentSize.height = 0;
8563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8564 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8565 m_errorMonitor->VerifyFound();
8566 fragmentSize.height = 1;
8567
8568 fragmentSize.width = 3;
8569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8570 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8571 m_errorMonitor->VerifyFound();
8572 fragmentSize.width = 1;
8573
8574 fragmentSize.height = 3;
8575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8576 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8577 m_errorMonitor->VerifyFound();
8578 fragmentSize.height = 1;
8579
8580 fragmentSize.width = 8;
8581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8582 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8583 m_errorMonitor->VerifyFound();
8584 fragmentSize.width = 1;
8585
8586 fragmentSize.height = 8;
8587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8588 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8589 m_errorMonitor->VerifyFound();
8590 fragmentSize.height = 1;
8591 m_commandBuffer->end();
8592}
8593
8594TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8595 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8596
8597 // Enable KHR_fragment_shading_rate and all of its required extensions
8598 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8599 if (fsr_extensions) {
8600 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8601 }
8602 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8603
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008604 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8605 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008606 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8607 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8608 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8609 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008610 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8611 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008612 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8613 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8614 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8615 } else {
8616 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8617 return;
8618 }
8619
8620 ASSERT_NO_FATAL_FAILURE(InitState());
8621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8622
8623 // Find address of extension call and make the call
8624 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8625 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8626 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8627
8628 VkExtent2D fragmentSize = {1, 1};
8629 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8630 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8631
8632 m_commandBuffer->begin();
8633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8634 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8635 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8636 m_errorMonitor->VerifyFound();
8637 m_commandBuffer->end();
8638}
8639
8640TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8641 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8642
8643 // Enable KHR_fragment_shading_rate and all of its required extensions
8644 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8645 if (fsr_extensions) {
8646 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8647 }
8648 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8649
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008650 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8651 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008652 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8653 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8654 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8655 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008656 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8657 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008658 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8659 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8660 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8661 } else {
8662 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8663 return;
8664 }
8665
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008666 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8667 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008668
8669 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8670 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8671 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8672
8673 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8675
8676 // Find address of extension call and make the call
8677 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8678 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8679 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8680
8681 VkExtent2D fragmentSize = {1, 1};
8682 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8683 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8684
8685 m_commandBuffer->begin();
8686
8687 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8689 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8690 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8691 m_errorMonitor->VerifyFound();
8692 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8693
8694 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8696 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8697 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8698 m_errorMonitor->VerifyFound();
8699 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8700
8701 m_commandBuffer->end();
8702}
8703
8704TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8705 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8706
8707 // Enable KHR_fragment_shading_rate and all of its required extensions
8708 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8709 if (fsr_extensions) {
8710 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8711 }
8712 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8713
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008714 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8715 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008716 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8717 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8718 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8719 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008720 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8721 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008722 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8723 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8724 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8725 } else {
8726 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8727 return;
8728 }
8729
8730 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8731 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8732 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008733 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8734 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008735 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8736
8737 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8738 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8739 return;
8740 }
8741
8742 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8743
8744 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8746
8747 // Find address of extension call and make the call
8748 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8749 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8750 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8751
8752 VkExtent2D fragmentSize = {1, 1};
8753 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8754 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8755
8756 m_commandBuffer->begin();
8757 fragmentSize.width = 2;
8758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8759 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8760 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8761 m_errorMonitor->VerifyFound();
8762 fragmentSize.width = 1;
8763
8764 fragmentSize.height = 2;
8765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8766 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8767 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8768 m_errorMonitor->VerifyFound();
8769 fragmentSize.height = 1;
8770}
8771
8772TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8773 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8774
8775 // Enable KHR_fragment_shading_rate and all of its required extensions
8776 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8777 if (fsr_extensions) {
8778 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8779 }
8780 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8781
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008782 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8783 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008784 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8785 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8786 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8787 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008788 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8789 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008790 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8791 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8792 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8793 } else {
8794 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8795 return;
8796 }
8797
8798 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8799 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8800 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8801 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008802 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8803 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008804 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8805
8806 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8807 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8808 return;
8809 }
8810
8811 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8812 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8813 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008814 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8815 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008816 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8817
8818 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8819 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8820 return;
8821 }
8822
8823 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8825
8826 // Find address of extension call and make the call
8827 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8828 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8829 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8830
8831 VkExtent2D fragmentSize = {1, 1};
8832 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8833 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8834
8835 m_commandBuffer->begin();
8836 if (fsr_features.primitiveFragmentShadingRate) {
8837 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8839 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8840 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8841 m_errorMonitor->VerifyFound();
8842 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8843 }
8844
8845 if (fsr_features.attachmentFragmentShadingRate) {
8846 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8848 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8849 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8850 m_errorMonitor->VerifyFound();
8851 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8852 }
8853 m_commandBuffer->end();
8854}
8855
8856TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8857 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8858
8859 // Enable KHR_fragment_shading_rate and all of its required extensions
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008860 AddRequiredExtensions(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8861 AddRequiredExtensions(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8862 ASSERT_NO_FATAL_FAILURE(InitFramework());
8863 if (!AreRequiredExtensionsEnabled()) {
8864 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008865 }
8866
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008867 auto fsr_properties = LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8868 GetPhysicalDeviceProperties2(fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008869
8870 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008871 GTEST_SKIP() << "Test requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008872 }
8873
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008874 auto eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
8875 auto fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8876 auto features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008877
8878 if (!fsr_features.primitiveFragmentShadingRate) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008879 GTEST_SKIP() << "Test requires primitiveFragmentShadingRate to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008880 }
8881
8882 if (!features2.features.multiViewport) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008883 GTEST_SKIP() << "%s requires multiViewport to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008884 }
8885
8886 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8888
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008889 char const *vsSource = R"glsl(
8890 #version 450
8891 #extension GL_EXT_fragment_shading_rate : enable
8892 void main() {
8893 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8894 }
8895 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008896
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008897 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008898
8899 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008900 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8901 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008902 pipe.AddShader(&fs);
8903 pipe.AddDefaultColorAttachment();
8904 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008905 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008906 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008907 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008908 pipe.AddShader(&vs);
8909 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8910 ASSERT_VK_SUCCESS(err);
8911 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008912 m_commandBuffer->begin();
8913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8914
8915 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8916
8917 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8918 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8919 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8920 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8921
8922 // error produced here.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-primitiveFragmentShadingRateWithMultipleViewports-04552");
Tobias Hector04f2ab22020-12-01 10:59:33 +00008924 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008925 m_errorMonitor->VerifyFound();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008926}
ziga-lunargdada63d2021-07-13 22:10:11 +02008927
8928TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
8929 TEST_DESCRIPTION("Update buffer with invalid dataSize");
8930
8931 ASSERT_NO_FATAL_FAILURE(Init());
8932
8933 uint32_t update_data[4] = {0, 0, 0, 0};
8934 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8935 VkMemoryPropertyFlags reqs = 0;
8936 VkBufferObj buffer;
8937 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8938
8939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
8940 m_commandBuffer->begin();
8941 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
8942 m_commandBuffer->end();
8943 m_errorMonitor->VerifyFound();
8944}
ziga-lunargc08456d2021-07-16 21:40:13 +02008945
8946TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
8947 TEST_DESCRIPTION("Update buffer with invalid dst offset");
8948
8949 ASSERT_NO_FATAL_FAILURE(Init());
8950
8951 uint32_t update_data[4] = {0, 0, 0, 0};
8952 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8953 VkMemoryPropertyFlags reqs = 0;
8954 VkBufferObj buffer;
8955 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8956
8957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
8958 m_commandBuffer->begin();
8959 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
8960 m_commandBuffer->end();
8961 m_errorMonitor->VerifyFound();
8962}
ziga-lunarg4e31a752021-07-22 14:35:03 +02008963
8964TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
8965 TEST_DESCRIPTION(
8966 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
8967
8968 ASSERT_NO_FATAL_FAILURE(Init());
8969
8970 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
8971 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
8972 if (INVALID_QUEUE == no_gfx_qfi) {
8973 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
8974 return;
8975 }
8976
8977 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
8978 ASSERT_TRUE(command_pool.initialized());
8979 VkCommandBufferObj command_buffer(m_device, &command_pool);
8980
8981 VkDescriptorPoolSize ds_type_count = {};
8982 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8983 ds_type_count.descriptorCount = 1;
8984
8985 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
8986 ds_pool_ci.maxSets = 1;
8987 ds_pool_ci.poolSizeCount = 1;
8988 ds_pool_ci.flags = 0;
8989 ds_pool_ci.pPoolSizes = &ds_type_count;
8990
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008991 vk_testing::DescriptorPool ds_pool(*m_device, ds_pool_ci);
8992 ASSERT_TRUE(ds_pool.initialized());
ziga-lunarg4e31a752021-07-22 14:35:03 +02008993
8994 VkDescriptorSetLayoutBinding dsl_binding = {};
8995 dsl_binding.binding = 0;
8996 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8997 dsl_binding.descriptorCount = 1;
8998 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8999 dsl_binding.pImmutableSamplers = nullptr;
9000
9001 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9002
9003 VkDescriptorSet descriptorSet;
9004 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9005 alloc_info.descriptorSetCount = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009006 alloc_info.descriptorPool = ds_pool.handle();
ziga-lunarg4e31a752021-07-22 14:35:03 +02009007 alloc_info.pSetLayouts = &ds_layout.handle();
9008 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9009
9010 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9011 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9012
9013 command_buffer.begin();
9014 // Set invalid set
9015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9016 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9017 &descriptorSet, 0, nullptr);
9018 m_errorMonitor->VerifyFound();
9019 command_buffer.end();
9020}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009021
9022TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9023 TEST_DESCRIPTION(
9024 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9025 "occlusion query is active.");
9026 ASSERT_NO_FATAL_FAILURE(Init());
9027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9028
9029 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9030 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9031 qpci.queryCount = 1;
9032
9033 VkQueryPool query_pool;
9034 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9035
9036 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9037
9038 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9039 cbii.renderPass = m_renderPass;
9040 cbii.framebuffer = m_framebuffer;
9041 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9042
9043 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9044 cbbi.pInheritanceInfo = &cbii;
9045
9046 VkCommandBuffer secondary_handle = secondary.handle();
9047 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9048 vk::EndCommandBuffer(secondary_handle);
9049
9050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9051 m_commandBuffer->begin();
9052 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9053 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9054 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9055 m_commandBuffer->end();
9056 m_errorMonitor->VerifyFound();
9057
9058 vk::DestroyQueryPool(device(), query_pool, nullptr);
9059}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009060
9061TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9062 TEST_DESCRIPTION("Test invalid null entries for clear color");
9063
9064 ASSERT_NO_FATAL_FAILURE(InitFramework());
9065 ASSERT_NO_FATAL_FAILURE(InitState());
9066
9067 VkImageObj image(m_device);
9068 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9069
9070 VkImageSubresourceRange isr = {};
9071 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9072 isr.baseArrayLayer = 0;
9073 isr.baseMipLevel = 0;
9074 isr.layerCount = 1;
9075 isr.levelCount = 1;
9076
9077 m_commandBuffer->begin();
9078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9079 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9080 m_errorMonitor->VerifyFound();
9081 m_commandBuffer->end();
9082}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009083
9084TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9085 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9086
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009087 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009088 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009089 if (!AreRequiredExtensionsEnabled()) {
9090 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009091 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009092
9093 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
9094 auto features2 = GetPhysicalDeviceFeatures2(multiview_features);
9095 if (!multiview_features.multiview) {
9096 GTEST_SKIP() << "VkPhysicalDeviceMultiviewFeatures::multiview not supported";
9097 }
9098 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9100
9101 VkAttachmentDescription attachmentDescription = {};
9102 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9103 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009104 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009105 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9106
9107 VkAttachmentReference colorAttachmentReference = {};
9108 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9109 colorAttachmentReference.attachment = 0;
9110
9111 VkSubpassDescription subpassDescription = {};
9112 subpassDescription.colorAttachmentCount = 1;
9113 subpassDescription.pColorAttachments = &colorAttachmentReference;
9114
9115 uint32_t viewMask = 0x1u;
9116 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9117 renderPassMultiviewCreateInfo.subpassCount = 1;
9118 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9119
9120 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9121 renderPassCreateInfo.attachmentCount = 1;
9122 renderPassCreateInfo.pAttachments = &attachmentDescription;
9123 renderPassCreateInfo.subpassCount = 1;
9124 renderPassCreateInfo.pSubpasses = &subpassDescription;
9125
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009126 vk_testing::RenderPass renderPass(*m_device, renderPassCreateInfo);
9127 ASSERT_TRUE(renderPass.initialized());
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009128
9129 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9130 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9131 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9132 image_create_info.extent.width = 32;
9133 image_create_info.extent.height = 32;
9134 image_create_info.extent.depth = 1;
9135 image_create_info.mipLevels = 1;
9136 image_create_info.arrayLayers = 4;
9137 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9138 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9139 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9140 image_create_info.flags = 0;
9141
9142 VkImageObj image(m_device);
9143 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009144 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9145 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009146
9147 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9148 framebufferCreateInfo.width = 32;
9149 framebufferCreateInfo.height = 32;
9150 framebufferCreateInfo.layers = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009151 framebufferCreateInfo.renderPass = renderPass.handle();
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009152 framebufferCreateInfo.attachmentCount = 1;
9153 framebufferCreateInfo.pAttachments = &imageView;
9154
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009155 vk_testing::Framebuffer framebuffer(*m_device, framebufferCreateInfo);
9156 ASSERT_TRUE(framebuffer.initialized());
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009157
9158 // Start no RenderPass
9159 m_commandBuffer->begin();
9160
9161 VkClearAttachment color_attachment;
9162 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9163 color_attachment.clearValue.color.float32[0] = 0;
9164 color_attachment.clearValue.color.float32[1] = 0;
9165 color_attachment.clearValue.color.float32[2] = 0;
9166 color_attachment.clearValue.color.float32[3] = 0;
9167 color_attachment.colorAttachment = 0;
9168
9169 VkClearRect clear_rect = {};
9170 clear_rect.rect.extent.width = 32;
9171 clear_rect.rect.extent.height = 32;
9172
9173 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009174 render_pass_begin_info.renderPass = renderPass.handle();
9175 render_pass_begin_info.framebuffer = framebuffer.handle();
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009176 render_pass_begin_info.renderArea.extent.width = 32;
9177 render_pass_begin_info.renderArea.extent.height = 32;
9178
9179 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9180 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9181 clear_rect.layerCount = 2;
9182 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9183 m_errorMonitor->VerifyFound();
9184
9185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9186 clear_rect.baseArrayLayer = 1;
9187 clear_rect.layerCount = 1;
9188 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9189 m_errorMonitor->VerifyFound();
9190}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009191
9192TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9193 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9194
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009195 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009196 ASSERT_NO_FATAL_FAILURE(InitFramework());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009197 if (!AreRequiredExtensionsEnabled()) {
9198 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunargdaff74b2021-08-14 23:16:25 +02009199 }
9200 ASSERT_NO_FATAL_FAILURE(InitState());
9201
9202 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9203 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9204
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009205 auto buffer_ci =
9206 vk_testing::Buffer::create_info(32, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT);
9207 vk_testing::Buffer buffer(*m_device, buffer_ci);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009208
9209 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9210 conditional_rendering_begin.buffer = buffer.handle();
9211
9212 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9213
9214 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9215 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9216 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9217 vk::EndCommandBuffer(m_commandBuffer->handle());
9218 m_errorMonitor->VerifyFound();
9219}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009220
9221TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9222 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9223
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009224 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9225 ASSERT_NO_FATAL_FAILURE(InitFramework());
9226 if (!AreRequiredExtensionsEnabled()) {
9227 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009228 }
9229
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009230 auto xfb_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9231 auto features2 = GetPhysicalDeviceFeatures2(xfb_features);
9232 if (!xfb_features.transformFeedback) {
9233 GTEST_SKIP() << "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback not supported.";
9234 }
9235 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9237
9238 CreatePipelineHelper pipe_one(*this);
9239 pipe_one.InitInfo();
9240 pipe_one.InitState();
9241 pipe_one.CreateGraphicsPipeline();
9242
9243 CreatePipelineHelper pipe_two(*this);
9244 pipe_two.InitInfo();
9245 pipe_two.InitState();
9246 pipe_two.CreateGraphicsPipeline();
9247
9248 auto vkCmdBeginTransformFeedbackEXT =
9249 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9250 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9251 auto vkCmdEndTransformFeedbackEXT =
9252 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9253 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9254
9255 m_commandBuffer->begin();
9256 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9257 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9259 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9260 m_errorMonitor->VerifyFound();
9261 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9262 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009263}
9264
9265TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9266 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9267
9268 ASSERT_NO_FATAL_FAILURE(Init());
9269
9270 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9271 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9272
9273 // Load required functions
9274 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9275 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9276 return;
9277 }
9278
9279 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9280
9281 // Set format features from being found
9282 VkFormatProperties formatProps;
9283 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9284 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9285 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9286 return;
9287 }
9288 // Gets pass pipeline creation but not the actual tiling used
9289 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9290 // will be caught at draw time that feature for optimal image is not set
9291 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9292 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9293 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9294
9295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9296
9297 CreatePipelineHelper pipe(*this);
9298 pipe.InitInfo();
9299 pipe.InitState();
aitor-lunargf15acd52022-03-09 22:13:25 +01009300 pipe.cb_attachments_[0].blendEnable = VK_TRUE;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009301 pipe.CreateGraphicsPipeline();
9302
9303 m_commandBuffer->begin();
9304 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9305 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9306
9307 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9308 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9309 m_errorMonitor->VerifyFound();
9310
9311 m_commandBuffer->EndRenderPass();
9312 m_commandBuffer->end();
9313}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009314
9315TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9316 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9317
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009318 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009319 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009320 if (!AreRequiredExtensionsEnabled()) {
9321 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg88c0e392021-09-03 19:14:13 +02009322 }
ziga-lunarg88c0e392021-09-03 19:14:13 +02009323 ASSERT_NO_FATAL_FAILURE(InitState());
9324
9325 VkAttachmentDescription attach[] = {
9326 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9327 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9328 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9329 };
9330 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9331 VkSubpassDescription subpasses[] = {
9332 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9333 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9334 };
9335
9336 VkSubpassDependency dep = {0,
9337 1,
9338 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9339 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9340 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9341 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9342 VK_DEPENDENCY_BY_REGION_BIT};
9343
9344 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9345 rpci.attachmentCount = 1;
9346 rpci.pAttachments = attach;
9347 rpci.subpassCount = 2;
9348 rpci.pSubpasses = subpasses;
9349 rpci.dependencyCount = 1;
9350 rpci.pDependencies = &dep;
9351
9352 vk_testing::RenderPass render_pass;
9353 render_pass.init(*m_device, rpci);
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009354 ASSERT_TRUE(render_pass.initialized());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009355
9356 VkImageObj image(m_device);
9357 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9358 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9359
9360 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9361 fbci.renderPass = render_pass.handle();
9362 fbci.attachmentCount = 1;
9363 fbci.pAttachments = &imageView;
9364 fbci.width = 32;
9365 fbci.height = 32;
9366 fbci.layers = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009367 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9368 ASSERT_TRUE(framebuffer.initialized());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009369
9370 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9371 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9372 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9373 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9374
9375 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9376 buffer_create_info.size = 32;
9377 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9378 VkBufferObj buffer;
9379 buffer.init(*m_device, buffer_create_info);
9380
9381 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9382 conditional_rendering_begin.buffer = buffer.handle();
9383
9384 VkClearValue clear_value;
9385 clear_value.color = m_clear_color;
9386
9387 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9388 rpbi.renderPass = render_pass.handle();
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009389 rpbi.framebuffer = framebuffer.handle();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009390 rpbi.renderArea = {{0, 0}, {32, 32}};
9391 rpbi.clearValueCount = 1;
9392 rpbi.pClearValues = &clear_value;
9393
9394 m_commandBuffer->begin();
9395
9396 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9397 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9398 m_errorMonitor->VerifyFound();
9399
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009400 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9401 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009403 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009404 m_errorMonitor->VerifyFound();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009405 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9406 vk::CmdEndRenderPass(m_commandBuffer->handle());
9407 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009408
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009409 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9410 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9411 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009412 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009413 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009414 m_errorMonitor->VerifyFound();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009415 vk::CmdEndRenderPass(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009416}
ziga-lunarg58255142021-09-12 13:25:17 +02009417
9418TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9419 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9420
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009421 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9422 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
ziga-lunarg58255142021-09-12 13:25:17 +02009423 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009424 if (!AreRequiredExtensionsEnabled()) {
9425 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009426 }
ziga-lunarg58255142021-09-12 13:25:17 +02009427
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009428 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
9429 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(&mv_features);
9430 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
ziga-lunarg58255142021-09-12 13:25:17 +02009431
9432 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009433 GTEST_SKIP() << "transformFeedback not supported; skipped.";
9434 }
9435 if (!mv_features.multiview) {
9436 GTEST_SKIP() << "multiview not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009437 }
9438
9439 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9441
9442 VkAttachmentDescription attachmentDescription = {};
9443 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9444 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009445 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunarg58255142021-09-12 13:25:17 +02009446 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9447
9448 VkAttachmentReference colorAttachmentReference = {};
9449 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9450 colorAttachmentReference.attachment = 0;
9451
9452 VkSubpassDescription subpassDescription = {};
9453 subpassDescription.colorAttachmentCount = 1;
9454 subpassDescription.pColorAttachments = &colorAttachmentReference;
9455
9456 uint32_t viewMask = 0x1u;
9457 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9458 renderPassMultiviewCreateInfo.subpassCount = 1;
9459 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9460
9461 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9462 renderPassCreateInfo.attachmentCount = 1;
9463 renderPassCreateInfo.pAttachments = &attachmentDescription;
9464 renderPassCreateInfo.subpassCount = 1;
9465 renderPassCreateInfo.pSubpasses = &subpassDescription;
9466
9467 vk_testing::RenderPass render_pass;
9468 render_pass.init(*m_device, renderPassCreateInfo);
9469
9470 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9471 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9472 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9473 image_create_info.extent.width = 32;
9474 image_create_info.extent.height = 32;
9475 image_create_info.extent.depth = 1;
9476 image_create_info.mipLevels = 1;
9477 image_create_info.arrayLayers = 4;
9478 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9479 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9480 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9481 image_create_info.flags = 0;
9482
9483 VkImageObj image(m_device);
9484 image.Init(image_create_info);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009485 auto image_view_ci = image.TargetViewCI(VK_FORMAT_R8G8B8A8_UNORM);
9486 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
9487 VkImageView imageView = image.targetView(image_view_ci);
ziga-lunarg58255142021-09-12 13:25:17 +02009488
9489 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9490 framebufferCreateInfo.width = 32;
9491 framebufferCreateInfo.height = 32;
9492 framebufferCreateInfo.layers = 1;
9493 framebufferCreateInfo.renderPass = render_pass.handle();
9494 framebufferCreateInfo.attachmentCount = 1;
9495 framebufferCreateInfo.pAttachments = &imageView;
9496
9497 vk_testing::Framebuffer framebuffer;
9498 framebuffer.init(*m_device, framebufferCreateInfo);
9499
9500 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9501 render_pass_begin_info.renderPass = render_pass.handle();
9502 render_pass_begin_info.framebuffer = framebuffer.handle();
9503 render_pass_begin_info.renderArea.extent.width = 32;
9504 render_pass_begin_info.renderArea.extent.height = 32;
9505
9506 auto vkCmdBeginTransformFeedbackEXT =
9507 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9508 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9509
9510 m_commandBuffer->begin();
9511 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9512
9513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9514 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9515 m_errorMonitor->VerifyFound();
9516
9517 m_commandBuffer->EndRenderPass();
9518 m_commandBuffer->end();
9519}
stusmithd2f36832021-11-26 11:44:11 +00009520
9521TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9522 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9523
9524 SetTargetApiVersion(VK_API_VERSION_1_1);
9525
stusmithab8e2a22021-12-17 11:20:03 +00009526 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9527
stusmithd2f36832021-11-26 11:44:11 +00009528 ASSERT_NO_FATAL_FAILURE(InitFramework());
9529
sjfricked700bc02022-05-30 16:35:06 +09009530 if (!AreRequiredExtensionsEnabled()) {
9531 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009532 }
9533
9534 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009535 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009536 }
9537
9538 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9539 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9540 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9541 if (!dynamic_rendering_features.dynamicRendering) {
9542 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9543 return;
9544 }
9545
9546 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9547
sfricke-samsung1c61f192021-12-31 01:53:03 -06009548 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009549 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9550
sfricke-samsung1c61f192021-12-31 01:53:03 -06009551 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009552 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
ziga-lunargaa97cbb2022-03-18 19:06:35 +01009553 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009554 begin_rendering_info.colorAttachmentCount = 1;
9555 begin_rendering_info.pColorAttachments = &color_attachment;
9556
9557 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9558
9559 secondary.begin();
9560
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009561 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009562 secondary.BeginRendering(begin_rendering_info);
9563 m_errorMonitor->VerifyFound();
9564
9565 secondary.end();
9566}
9567
9568TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9569 TEST_DESCRIPTION(
9570 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9571 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9572
9573 ASSERT_NO_FATAL_FAILURE(Init());
9574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9575
9576 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9577
9578 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9579 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9580 nullptr, // pNext
9581 m_renderPass,
9582 0, // subpass
9583 m_framebuffer,
9584 };
9585
9586 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9587 nullptr, // pNext
9588 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9589 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9590 secondary.begin(&cmdbuff__bi);
9591 secondary.end();
9592
9593 m_commandBuffer->begin();
9594
9595 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9596 nullptr, // pNext
9597 m_renderPass,
9598 m_framebuffer,
9599 {{0, 0}, {32, 32}},
9600 static_cast<uint32_t>(m_renderPassClearValues.size()),
9601 m_renderPassClearValues.data()};
9602
9603 m_commandBuffer->BeginRenderPass(rp_bi);
9604
9605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009606 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-00095");
stusmithd2f36832021-11-26 11:44:11 +00009607 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9608 m_errorMonitor->VerifyFound();
9609
9610 m_commandBuffer->EndRenderPass();
9611 m_commandBuffer->end();
9612}
9613
9614TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9615 TEST_DESCRIPTION(
9616 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9617 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9618
9619 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009620
stusmithab8e2a22021-12-17 11:20:03 +00009621 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9622
stusmithd2f36832021-11-26 11:44:11 +00009623 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009624
sjfricked700bc02022-05-30 16:35:06 +09009625 if (!AreRequiredExtensionsEnabled()) {
9626 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009627 }
stusmithab8e2a22021-12-17 11:20:03 +00009628
9629 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009630 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009631 }
9632
stusmithd2f36832021-11-26 11:44:11 +00009633 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9634 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9635 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9636 if (!dynamic_rendering_features.dynamicRendering) {
9637 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9638 return;
9639 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009640
stusmithd2f36832021-11-26 11:44:11 +00009641 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9642
9643 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009644
9645 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009646 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9647
sfricke-samsung1c61f192021-12-31 01:53:03 -06009648 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9649 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009650 inheritance_rendering_info.colorAttachmentCount = 1;
9651 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009652 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009653
sfricke-samsung1c61f192021-12-31 01:53:03 -06009654 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009655 begin_rendering_info.colorAttachmentCount = 1;
9656 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009657 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009658
9659 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9660
9661 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9662 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9663 &inheritance_rendering_info, // pNext
9664 VK_NULL_HANDLE,
9665 0, // subpass
9666 VK_NULL_HANDLE,
9667 };
9668
9669 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9670 nullptr, // pNext
9671 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9672 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9673 secondary.begin(&cmdbuff__bi);
9674 secondary.end();
9675
9676 m_commandBuffer->begin();
9677
9678 m_commandBuffer->BeginRendering(begin_rendering_info);
9679
9680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9681 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9682 m_errorMonitor->VerifyFound();
9683
9684 m_commandBuffer->EndRendering();
9685 m_commandBuffer->end();
9686}
9687
9688TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9689 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9690
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009691 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithd2f36832021-11-26 11:44:11 +00009692 ASSERT_NO_FATAL_FAILURE(InitState());
9693
9694 // A renderpass with two subpasses, both writing the same attachment.
9695 VkAttachmentDescription attach[] = {
9696 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9697 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9698 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9699 };
9700 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9701 VkSubpassDescription subpasses[] = {
9702 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9703 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9704 };
9705
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009706 VkSubpassDependency dependencies = {
9707 0, // srcSubpass
9708 1, // dstSubpass
9709 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // srcStageMask
9710 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // dstStageMask
9711 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
9712 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
9713 0, // dependencyFlags
9714 };
9715
9716 auto rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9717 rpci.attachmentCount = 1;
9718 rpci.pAttachments = attach;
9719 rpci.subpassCount = 2;
9720 rpci.pSubpasses = subpasses;
9721 rpci.dependencyCount = 1;
9722 rpci.pDependencies = &dependencies;
9723 vk_testing::RenderPass render_pass(*m_device, rpci);
9724 ASSERT_TRUE(render_pass.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009725
9726 VkImageObj image(m_device);
9727 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9728 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9729
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009730 VkFramebufferCreateInfo fbci = {
9731 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass.handle(), 1, &imageView, 32, 32, 1};
9732 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9733 ASSERT_TRUE(framebuffer.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009734
9735 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9736
9737 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9738 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9739 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009740 render_pass.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009741 1, // subpass
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009742 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009743 };
9744
9745 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9746 nullptr, // pNext
9747 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9748 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9749 secondary.begin(&cmdbuff__bi);
9750 secondary.end();
9751
9752 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9753 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009754 render_pass.handle(),
9755 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009756 {{0, 0}, {32, 32}},
9757 0,
9758 nullptr};
9759
9760 m_commandBuffer->begin();
9761 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9762
9763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009764 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00097");
stusmithd2f36832021-11-26 11:44:11 +00009765 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9766 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +00009767}
9768
9769TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9770 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9771
9772 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9773 ASSERT_NO_FATAL_FAILURE(InitState());
9774
9775 // A renderpass with two subpasses, both writing the same attachment.
9776 VkAttachmentDescription attach[] = {
9777 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9778 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9779 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9780 };
9781 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9782 VkSubpassDescription subpasses[] = {
9783 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9784 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9785 };
9786
9787 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9788 VkRenderPass render_pass_1;
9789 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9790 ASSERT_VK_SUCCESS(err);
9791
9792 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9793 VkRenderPass render_pass_2;
9794 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9795 ASSERT_VK_SUCCESS(err);
9796
9797 VkImageObj image(m_device);
9798 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9799 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9800
9801 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9802 VkFramebuffer framebuffer;
9803 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9804 ASSERT_VK_SUCCESS(err);
9805
9806 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9807
9808 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9809 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9810 nullptr, // pNext
9811 render_pass_2,
9812 0, // subpass
9813 VK_NULL_HANDLE,
9814 };
9815
9816 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9817 nullptr, // pNext
9818 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9819 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9820 secondary.begin(&cmdbuff__bi);
9821 secondary.end();
9822
9823 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9824 nullptr, // pNext
9825 render_pass_1,
9826 framebuffer,
9827 {{0, 0}, {32, 32}},
9828 0,
9829 nullptr};
9830
9831 m_commandBuffer->begin();
9832 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9833
9834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
stusmithd2f36832021-11-26 11:44:11 +00009836 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9837 m_errorMonitor->VerifyFound();
9838
9839 m_commandBuffer->EndRenderPass();
9840 m_commandBuffer->end();
9841
9842 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9843 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
9844 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
9845}
9846
9847TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
9848 TEST_DESCRIPTION(
9849 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9850 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
9851
9852 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009853
stusmithab8e2a22021-12-17 11:20:03 +00009854 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9855
stusmithd2f36832021-11-26 11:44:11 +00009856 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009857
sjfricked700bc02022-05-30 16:35:06 +09009858 if (!AreRequiredExtensionsEnabled()) {
9859 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009860 }
stusmithab8e2a22021-12-17 11:20:03 +00009861
9862 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009863 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009864 }
9865
stusmithd2f36832021-11-26 11:44:11 +00009866 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9867 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9868 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9869 if (!dynamic_rendering_features.dynamicRendering) {
9870 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9871 return;
9872 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009873
stusmithd2f36832021-11-26 11:44:11 +00009874 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9875
9876 VkAttachmentDescription attach[] = {
9877 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9878 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9879 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9880 };
9881 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9882 VkSubpassDescription subpasses[] = {
9883 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9884 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9885 };
9886
9887 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9888 VkRenderPass render_pass;
9889 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9890 ASSERT_VK_SUCCESS(err);
9891
9892 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009893
9894 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009895 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9896
sfricke-samsung1c61f192021-12-31 01:53:03 -06009897 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9898 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009899 inheritance_rendering_info.colorAttachmentCount = 1;
9900 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009901 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009902
sfricke-samsung1c61f192021-12-31 01:53:03 -06009903 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009904 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9905 begin_rendering_info.colorAttachmentCount = 1;
9906 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009907 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009908
9909 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9910
9911 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9912 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9913 &inheritance_rendering_info, // pNext
9914 render_pass,
9915 0, // subpass
9916 VK_NULL_HANDLE,
9917 };
9918
9919 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9920 nullptr, // pNext
9921 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9922 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9923 secondary.begin(&cmdbuff__bi);
9924 secondary.end();
9925
9926 m_commandBuffer->begin();
9927
9928 m_commandBuffer->BeginRendering(begin_rendering_info);
9929
9930 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
9931 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9932 m_errorMonitor->VerifyFound();
9933
9934 m_commandBuffer->EndRendering();
9935 m_commandBuffer->end();
9936
9937 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9938}
9939
9940TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
9941 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
9942
9943 SetTargetApiVersion(VK_API_VERSION_1_1);
9944
stusmithab8e2a22021-12-17 11:20:03 +00009945 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9946
stusmithd2f36832021-11-26 11:44:11 +00009947 ASSERT_NO_FATAL_FAILURE(InitFramework());
9948
sjfricked700bc02022-05-30 16:35:06 +09009949 if (!AreRequiredExtensionsEnabled()) {
9950 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009951 }
9952
9953 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009954 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009955 }
9956
9957 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9958 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9959 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9960 if (!dynamic_rendering_features.dynamicRendering) {
9961 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9962 return;
9963 }
9964
9965 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9966
9967 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
9968
sfricke-samsung1c61f192021-12-31 01:53:03 -06009969 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009970 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9971
sfricke-samsung1c61f192021-12-31 01:53:03 -06009972 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9973 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009974 inheritance_rendering_info.colorAttachmentCount = 1;
9975 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009976 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009977
sfricke-samsung1c61f192021-12-31 01:53:03 -06009978 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009979 begin_rendering_info.flags =
9980 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
9981 begin_rendering_info.colorAttachmentCount = 1;
9982 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009983 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009984
9985 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9986
9987 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9988 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9989 &inheritance_rendering_info, // pNext
9990 VK_NULL_HANDLE,
9991 0, // subpass
9992 VK_NULL_HANDLE,
9993 };
9994
9995 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9996 nullptr, // pNext
9997 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9998 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9999 secondary.begin(&cmdbuff__bi);
10000 secondary.end();
10001
10002 m_commandBuffer->begin();
10003
10004 m_commandBuffer->BeginRendering(begin_rendering_info);
10005
10006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10007 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10008 m_errorMonitor->VerifyFound();
10009
10010 m_commandBuffer->EndRendering();
10011 m_commandBuffer->end();
10012}
10013
10014TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10015 TEST_DESCRIPTION(
10016 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
10017
10018 SetTargetApiVersion(VK_API_VERSION_1_1);
10019
stusmithab8e2a22021-12-17 11:20:03 +000010020 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10021
stusmithd2f36832021-11-26 11:44:11 +000010022 ASSERT_NO_FATAL_FAILURE(InitFramework());
10023
sjfricked700bc02022-05-30 16:35:06 +090010024 if (!AreRequiredExtensionsEnabled()) {
10025 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010026 }
10027
10028 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010029 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010030 }
10031
10032 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10033 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10034 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10035 if (!dynamic_rendering_features.dynamicRendering) {
10036 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10037 return;
10038 }
10039
10040 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10041
10042 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10043
sfricke-samsung1c61f192021-12-31 01:53:03 -060010044 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010045 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10046
sfricke-samsung1c61f192021-12-31 01:53:03 -060010047 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10048 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010049 inheritance_rendering_info.colorAttachmentCount = 0;
10050 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010051 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010052
sfricke-samsung1c61f192021-12-31 01:53:03 -060010053 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010054 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10055 begin_rendering_info.colorAttachmentCount = 1;
10056 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010057 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010058
10059 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10060
10061 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10062 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10063 &inheritance_rendering_info, // pNext
10064 VK_NULL_HANDLE,
10065 0, // subpass
10066 VK_NULL_HANDLE,
10067 };
10068
10069 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10070 nullptr, // pNext
10071 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10072 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10073 secondary.begin(&cmdbuff__bi);
10074 secondary.end();
10075
10076 m_commandBuffer->begin();
10077
10078 m_commandBuffer->BeginRendering(begin_rendering_info);
10079
10080 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10081 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10082 m_errorMonitor->VerifyFound();
10083
10084 m_commandBuffer->EndRendering();
10085 m_commandBuffer->end();
10086}
10087
10088TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10089 TEST_DESCRIPTION(
10090 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10091
10092 SetTargetApiVersion(VK_API_VERSION_1_1);
10093
stusmithab8e2a22021-12-17 11:20:03 +000010094 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10095
stusmithd2f36832021-11-26 11:44:11 +000010096 ASSERT_NO_FATAL_FAILURE(InitFramework());
10097
sjfricked700bc02022-05-30 16:35:06 +090010098 if (!AreRequiredExtensionsEnabled()) {
10099 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010100 }
10101
10102 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010103 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010104 }
10105
10106 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10107 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10108 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10109 if (!dynamic_rendering_features.dynamicRendering) {
10110 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10111 return;
10112 }
10113
10114 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10115
10116 VkImageObj image(m_device);
10117 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10118 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10119
sfricke-samsung1c61f192021-12-31 01:53:03 -060010120 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010121 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10122 color_attachment.imageView = imageView;
10123
10124 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10125
sfricke-samsung1c61f192021-12-31 01:53:03 -060010126 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10127 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010128 inheritance_rendering_info.colorAttachmentCount = 1;
10129 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010130 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010131
sfricke-samsung1c61f192021-12-31 01:53:03 -060010132 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010133 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10134 begin_rendering_info.colorAttachmentCount = 1;
10135 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010136 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010137
10138 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10139
10140 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10141 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10142 &inheritance_rendering_info, // pNext
10143 VK_NULL_HANDLE,
10144 0, // subpass
10145 VK_NULL_HANDLE,
10146 };
10147
10148 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10149 nullptr, // pNext
10150 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10151 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10152 secondary.begin(&cmdbuff__bi);
10153 secondary.end();
10154
10155 m_commandBuffer->begin();
10156
10157 m_commandBuffer->BeginRendering(begin_rendering_info);
10158
10159 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10160 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10161 m_errorMonitor->VerifyFound();
10162
10163 m_commandBuffer->EndRendering();
10164 m_commandBuffer->end();
10165}
10166
10167TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10168 TEST_DESCRIPTION(
10169 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10170 "format");
10171
10172 SetTargetApiVersion(VK_API_VERSION_1_1);
10173
stusmithab8e2a22021-12-17 11:20:03 +000010174 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10175
stusmithd2f36832021-11-26 11:44:11 +000010176 ASSERT_NO_FATAL_FAILURE(InitFramework());
10177
sjfricked700bc02022-05-30 16:35:06 +090010178 if (!AreRequiredExtensionsEnabled()) {
10179 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010180 }
10181
10182 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010183 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010184 }
10185
10186 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10187 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10188 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10189 if (!dynamic_rendering_features.dynamicRendering) {
10190 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10191 return;
10192 }
10193
10194 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10195
10196 VkImageObj image(m_device);
10197 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10198 if (!depth_stencil_format) {
10199 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10200 return;
10201 }
10202 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10203 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10204
sfricke-samsung1c61f192021-12-31 01:53:03 -060010205 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010206 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10207 depth_stencil_attachment.imageView = imageView;
10208
sfricke-samsung1c61f192021-12-31 01:53:03 -060010209 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10210 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010211 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
10212 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010213 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010214
sfricke-samsung1c61f192021-12-31 01:53:03 -060010215 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010216 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10217 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10218 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010219 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010220
10221 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10222
10223 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10224 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10225 &inheritance_rendering_info, // pNext
10226 VK_NULL_HANDLE,
10227 0, // subpass
10228 VK_NULL_HANDLE,
10229 };
10230
10231 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10232 nullptr, // pNext
10233 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10234 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10235 secondary.begin(&cmdbuff__bi);
10236 secondary.end();
10237
10238 m_commandBuffer->begin();
10239
10240 m_commandBuffer->BeginRendering(begin_rendering_info);
10241
10242 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10244 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10245 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010246}
10247
10248TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10249 TEST_DESCRIPTION(
10250 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10251
10252 SetTargetApiVersion(VK_API_VERSION_1_1);
10253
stusmithab8e2a22021-12-17 11:20:03 +000010254 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10255
stusmithd2f36832021-11-26 11:44:11 +000010256 ASSERT_NO_FATAL_FAILURE(InitFramework());
10257
sjfricked700bc02022-05-30 16:35:06 +090010258 if (!AreRequiredExtensionsEnabled()) {
10259 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010260 }
10261
10262 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010263 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010264 }
10265
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010266 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
10267 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(&mv_features);
10268 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +000010269 if (!dynamic_rendering_features.dynamicRendering) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010270 GTEST_SKIP() << "Test requires (unsupported) dynamicRendering , skipping.";
10271 }
10272 if (!mv_features.multiview) {
10273 GTEST_SKIP() << "multiview feature not supported.";
stusmithd2f36832021-11-26 11:44:11 +000010274 }
10275
10276 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10277
sfricke-samsung1c61f192021-12-31 01:53:03 -060010278 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010279 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10280
10281 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10282
sfricke-samsung1c61f192021-12-31 01:53:03 -060010283 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10284 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010285 inheritance_rendering_info.viewMask = 0;
10286 inheritance_rendering_info.colorAttachmentCount = 1;
10287 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010288 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010289
sfricke-samsung1c61f192021-12-31 01:53:03 -060010290 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010291 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10292 begin_rendering_info.viewMask = 1;
10293 begin_rendering_info.colorAttachmentCount = 1;
10294 begin_rendering_info.pColorAttachments = &color_attachment;
10295
10296 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10297
10298 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10299 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10300 &inheritance_rendering_info, // pNext
10301 VK_NULL_HANDLE,
10302 0, // subpass
10303 VK_NULL_HANDLE,
10304 };
10305
10306 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10307 nullptr, // pNext
10308 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10309 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10310 secondary.begin(&cmdbuff__bi);
10311 secondary.end();
10312
10313 m_commandBuffer->begin();
10314
10315 m_commandBuffer->BeginRendering(begin_rendering_info);
10316
10317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10318 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10319 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010320}
stusmithcba0c502021-12-21 17:16:28 +000010321
10322TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10323 TEST_DESCRIPTION(
10324 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10325
10326 SetTargetApiVersion(VK_API_VERSION_1_1);
10327
10328 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10329
10330 ASSERT_NO_FATAL_FAILURE(InitFramework());
10331
sjfricked700bc02022-05-30 16:35:06 +090010332 if (!AreRequiredExtensionsEnabled()) {
10333 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010334 }
10335
10336 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010337 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010338 }
10339
10340 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10341 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10342 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10343 if (!dynamic_rendering_features.dynamicRendering) {
10344 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10345 return;
10346 }
10347
10348 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10349
10350 VkImageObj image(m_device);
10351 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10352 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10353
sfricke-samsung1c61f192021-12-31 01:53:03 -060010354 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010355 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10356 color_attachment.imageView = imageView;
10357
10358 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10359
sfricke-samsung1c61f192021-12-31 01:53:03 -060010360 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10361 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010362 inheritance_rendering_info.colorAttachmentCount = 1;
10363 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10364 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10365
sfricke-samsung1c61f192021-12-31 01:53:03 -060010366 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010367 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10368 begin_rendering_info.colorAttachmentCount = 1;
10369 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010370 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010371
10372 // A pool we can reset in.
10373 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10374 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10375
10376 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10377 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10378 &inheritance_rendering_info, // pNext
10379 VK_NULL_HANDLE,
10380 0, // subpass
10381 VK_NULL_HANDLE,
10382 };
10383
10384 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10385 nullptr, // pNext
10386 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10387 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10388 secondary.begin(&cmdbuff__bi);
10389 secondary.end();
10390
10391 m_commandBuffer->begin();
10392
10393 // color samples mismatch
10394 m_commandBuffer->BeginRendering(begin_rendering_info);
10395 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10396 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10397 m_errorMonitor->VerifyFound();
10398 m_commandBuffer->EndRendering();
10399
10400 VkImageObj depthStencilImage(m_device);
10401 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10402 if (!depth_stencil_format) {
10403 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10404 return;
10405 }
10406 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10407 0);
10408 VkImageView depthStencilImageView =
10409 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10410
sfricke-samsung1c61f192021-12-31 01:53:03 -060010411 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010412 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10413 depth_stencil_attachment.imageView = depthStencilImageView;
10414
10415 begin_rendering_info.colorAttachmentCount = 0;
10416 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10417 inheritance_rendering_info.colorAttachmentCount = 0;
10418 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10419
10420 secondary.begin(&cmdbuff__bi);
10421 secondary.end();
10422
10423 // depth samples mismatch
10424 m_commandBuffer->BeginRendering(begin_rendering_info);
10425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10426 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10427 m_errorMonitor->VerifyFound();
10428 m_commandBuffer->EndRendering();
10429
10430 begin_rendering_info.pDepthAttachment = nullptr;
10431 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10432 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10433 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10434
10435 secondary.begin(&cmdbuff__bi);
10436 secondary.end();
10437
10438 // stencil samples mismatch
10439 m_commandBuffer->BeginRendering(begin_rendering_info);
10440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10441 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10442 m_errorMonitor->VerifyFound();
10443 m_commandBuffer->EndRendering();
10444
10445 m_commandBuffer->end();
10446}
10447
10448TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10449 TEST_DESCRIPTION(
10450 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10451 "attachment samples");
10452
10453 SetTargetApiVersion(VK_API_VERSION_1_1);
10454
10455 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10456
10457 ASSERT_NO_FATAL_FAILURE(InitFramework());
10458
sjfricked700bc02022-05-30 16:35:06 +090010459 if (!AreRequiredExtensionsEnabled()) {
10460 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010461 }
10462
10463 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010464 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010465 }
10466
10467 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10468 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10469 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10470 if (!dynamic_rendering_features.dynamicRendering) {
10471 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10472 return;
10473 }
10474
10475 bool amd_samples = false;
10476 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10477 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10478 amd_samples = true;
10479 }
10480
10481 bool nv_samples = false;
10482 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10483 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10484 nv_samples = true;
10485 }
10486
10487 if (!amd_samples && !nv_samples) {
10488 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10489 kSkipPrefix);
10490 return;
10491 }
10492
10493 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10494
10495 VkImageObj image(m_device);
10496 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10497 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10498
sfricke-samsung1c61f192021-12-31 01:53:03 -060010499 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010500 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10501 color_attachment.imageView = imageView;
10502
10503 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10504
10505 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10506 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10507 samples_info.colorAttachmentCount = 1;
10508 samples_info.pColorAttachmentSamples = &counts;
10509
10510 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010511 inheritance_rendering_info.colorAttachmentCount = 1;
10512 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10513 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10514
sfricke-samsung1c61f192021-12-31 01:53:03 -060010515 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010516 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10517 begin_rendering_info.colorAttachmentCount = 1;
10518 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010519 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010520
10521 // A pool we can reset in.
10522 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10523 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10524
10525 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10526 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10527 &inheritance_rendering_info, // pNext
10528 VK_NULL_HANDLE,
10529 0, // subpass
10530 VK_NULL_HANDLE,
10531 };
10532
10533 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10534 nullptr, // pNext
10535 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10536 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10537 secondary.begin(&cmdbuff__bi);
10538 secondary.end();
10539
10540 m_commandBuffer->begin();
10541
10542 // color samples mismatch
10543 m_commandBuffer->BeginRendering(begin_rendering_info);
10544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10545 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10546 m_errorMonitor->VerifyFound();
10547 m_commandBuffer->EndRendering();
10548
10549 VkImageObj depthStencilImage(m_device);
10550 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10551 if (!depth_stencil_format) {
10552 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10553 return;
10554 }
10555 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10556 0);
10557 VkImageView depthStencilImageView =
10558 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10559
sfricke-samsung1c61f192021-12-31 01:53:03 -060010560 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010561 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10562 depth_stencil_attachment.imageView = depthStencilImageView;
10563
10564 samples_info.colorAttachmentCount = 0;
10565 samples_info.pColorAttachmentSamples = nullptr;
10566 begin_rendering_info.colorAttachmentCount = 0;
10567 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10568 inheritance_rendering_info.colorAttachmentCount = 0;
10569 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10570 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10571
10572 secondary.begin(&cmdbuff__bi);
10573 secondary.end();
10574
10575 // depth samples mismatch
10576 m_commandBuffer->BeginRendering(begin_rendering_info);
10577 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10578 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10579 m_errorMonitor->VerifyFound();
10580 m_commandBuffer->EndRendering();
10581
10582 begin_rendering_info.pDepthAttachment = nullptr;
10583 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10584 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10585 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10586
10587 secondary.begin(&cmdbuff__bi);
10588 secondary.end();
10589
10590 // stencil samples mismatch
10591 m_commandBuffer->BeginRendering(begin_rendering_info);
10592 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10593 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10594 m_errorMonitor->VerifyFound();
10595 m_commandBuffer->EndRendering();
10596
10597 m_commandBuffer->end();
10598}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010599
10600TEST_F(VkLayerTest, CopyCommands2V13) {
10601 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10602
10603 SetTargetApiVersion(VK_API_VERSION_1_3);
10604 ASSERT_NO_FATAL_FAILURE(Init());
10605 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010606 GTEST_SKIP() << "At least Vulkan version 1.3 is required";
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010607 }
10608 VkImageObj image(m_device);
10609 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 +020010610 VkImageObj image2(m_device);
10611 image2.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10612 VK_IMAGE_TILING_OPTIMAL, 0);
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010613 ASSERT_TRUE(image.initialized());
10614 VkBufferObj dst_buffer;
10615 VkMemoryPropertyFlags reqs = 0;
10616 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10617 VkBufferObj src_buffer;
10618 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10619 auto copy_region = LvlInitStruct<VkImageCopy2>();
10620 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10621 copy_region.srcSubresource.layerCount = 1;
10622 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10623 copy_region.dstSubresource.layerCount = 1;
10624 copy_region.dstOffset = {4, 4, 0};
10625 copy_region.extent.width = 1;
10626 copy_region.extent.height = 1;
10627 copy_region.extent.depth = 1;
10628 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10629 copy_image_info.srcImage = image.handle();
10630 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10631 copy_image_info.dstImage = image.handle();
10632 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10633 copy_image_info.regionCount = 1;
10634 copy_image_info.pRegions = &copy_region;
10635 m_commandBuffer->begin();
10636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10637 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10638 m_errorMonitor->VerifyFound();
10639 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
ziga-lunarg852187f2022-03-16 21:21:33 +010010640 copy_buffer.dstOffset = 4;
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010641 copy_buffer.size = 4;
10642 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10643 copy_buffer_info.srcBuffer = dst_buffer.handle();
10644 copy_buffer_info.dstBuffer = dst_buffer.handle();
10645 copy_buffer_info.regionCount = 1;
10646 copy_buffer_info.pRegions = &copy_buffer;
10647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10648 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10649 m_errorMonitor->VerifyFound();
10650 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10651 bic_region.bufferRowLength = 128;
10652 bic_region.bufferImageHeight = 128;
10653 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10654 bic_region.imageSubresource.layerCount = 1;
10655 bic_region.imageExtent.height = 4;
10656 bic_region.imageExtent.width = 4;
10657 bic_region.imageExtent.depth = 1;
10658 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10659 buffer_image_info.srcBuffer = src_buffer.handle();
10660 buffer_image_info.dstImage = image.handle();
10661 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10662 buffer_image_info.regionCount = 1;
10663 buffer_image_info.pRegions = &bic_region;
10664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10665 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10666 m_errorMonitor->VerifyFound();
10667 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10668 image_buffer_info.dstBuffer = src_buffer.handle();
10669 image_buffer_info.srcImage = image.handle();
10670 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10671 image_buffer_info.regionCount = 1;
10672 image_buffer_info.pRegions = &bic_region;
10673 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10674 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10675 m_errorMonitor->VerifyFound();
10676 auto blit_region = LvlInitStruct<VkImageBlit2>();
10677 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10678 blit_region.srcSubresource.baseArrayLayer = 0;
10679 blit_region.srcSubresource.layerCount = 1;
10680 blit_region.srcSubresource.mipLevel = 0;
10681 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10682 blit_region.dstSubresource.baseArrayLayer = 0;
10683 blit_region.dstSubresource.layerCount = 1;
10684 blit_region.dstSubresource.mipLevel = 0;
10685 blit_region.srcOffsets[0] = {0, 0, 0};
aitor-lunarg3ad811f2022-03-31 22:00:39 +020010686 blit_region.srcOffsets[1] = {31, 31, 1};
10687 blit_region.dstOffsets[0] = {32, 32, 0};
10688 blit_region.dstOffsets[1] = {64, 64, 1};
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010689 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10690 blit_image_info.srcImage = image.handle();
10691 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10692 blit_image_info.dstImage = image.handle();
10693 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10694 blit_image_info.regionCount = 1;
10695 blit_image_info.pRegions = &blit_region;
10696 blit_image_info.filter = VK_FILTER_NEAREST;
10697 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10698 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10699 m_errorMonitor->VerifyFound();
10700 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10701 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10702 resolve_region.srcSubresource.mipLevel = 0;
10703 resolve_region.srcSubresource.baseArrayLayer = 0;
10704 resolve_region.srcSubresource.layerCount = 1;
10705 resolve_region.srcOffset.x = 0;
10706 resolve_region.srcOffset.y = 0;
10707 resolve_region.srcOffset.z = 0;
10708 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10709 resolve_region.dstSubresource.mipLevel = 0;
10710 resolve_region.dstSubresource.baseArrayLayer = 0;
10711 resolve_region.dstSubresource.layerCount = 1;
10712 resolve_region.dstOffset.x = 0;
10713 resolve_region.dstOffset.y = 0;
10714 resolve_region.dstOffset.z = 0;
10715 resolve_region.extent.width = 1;
10716 resolve_region.extent.height = 1;
10717 resolve_region.extent.depth = 1;
10718 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10719 resolve_image_info.srcImage = image.handle();
10720 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
ziga-lunarg0ce51882022-05-18 14:36:48 +020010721 resolve_image_info.dstImage = image2.handle();
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010722 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10723 resolve_image_info.regionCount = 1;
10724 resolve_image_info.pRegions = &resolve_region;
10725 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10726 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10727 m_errorMonitor->VerifyFound();
10728}
aitor-lunarga131fca2022-02-17 22:55:55 +010010729
10730TEST_F(VkLayerTest, ValidateMultiviewUnboundResourcesAfterBeginRenderPassAndNextSubpass) {
10731 TEST_DESCRIPTION(
10732 "Validate all required resources are bound if multiview is enabled after vkCmdBeginRenderPass and vkCmdNextSubpass");
10733
Aitor Camacho768bbc92022-06-10 16:57:44 +020010734 m_errorMonitor->ExpectSuccess();
10735
10736 constexpr unsigned multiview_count = 2u;
10737 constexpr unsigned extra_subpass_count = multiview_count - 1u;
10738
sjfricked700bc02022-05-30 16:35:06 +090010739 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
aitor-lunarga131fca2022-02-17 22:55:55 +010010740 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +090010741 if (!AreRequiredExtensionsEnabled()) {
10742 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
aitor-lunarga131fca2022-02-17 22:55:55 +010010743 }
10744
10745 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
Aitor Camacho768bbc92022-06-10 16:57:44 +020010746 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multiview_features);
10747 auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
10748 vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR"));
10749 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
10750 if (multiview_features.multiview == VK_FALSE) {
10751 GTEST_SKIP() << "Device does not support multiview.";
10752 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010753
Aitor Camacho768bbc92022-06-10 16:57:44 +020010754 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
aitor-lunarga131fca2022-02-17 22:55:55 +010010755
10756 VkAttachmentDescription attachmentDescription = {};
10757 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
10758 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010759 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
aitor-lunarga131fca2022-02-17 22:55:55 +010010760 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
10761
10762 VkAttachmentReference colorAttachmentReference = {};
10763 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
10764 colorAttachmentReference.attachment = 0;
10765
Aitor Camacho768bbc92022-06-10 16:57:44 +020010766 m_renderPass_subpasses.resize(multiview_count);
10767 for (unsigned i = 0; i < multiview_count; ++i) {
10768 m_renderPass_subpasses[i].colorAttachmentCount = 1;
10769 m_renderPass_subpasses[i].pColorAttachments = &colorAttachmentReference;
10770 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010771
Aitor Camacho768bbc92022-06-10 16:57:44 +020010772 uint32_t viewMasks[multiview_count] = {};
10773 for (unsigned i = 0; i < multiview_count; ++i) {
10774 viewMasks[i] = 1u << i;
10775 }
10776 auto renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
10777 renderPassMultiviewCreateInfo.subpassCount = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010778 renderPassMultiviewCreateInfo.pViewMasks = viewMasks;
10779
10780 m_renderPass_info = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
10781 m_renderPass_info.attachmentCount = 1;
10782 m_renderPass_info.pAttachments = &attachmentDescription;
10783 m_renderPass_info.subpassCount = m_renderPass_subpasses.size();
10784 m_renderPass_info.pSubpasses = m_renderPass_subpasses.data();
10785
Aitor Camacho768bbc92022-06-10 16:57:44 +020010786 m_renderPass_dependencies.resize(extra_subpass_count);
10787 for (unsigned i = 0; i < m_renderPass_dependencies.size(); ++i) {
10788 auto &subpass_dep = m_renderPass_dependencies[i];
10789 subpass_dep.srcSubpass = i;
10790 subpass_dep.dstSubpass = i + 1;
10791
10792 subpass_dep.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10793 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10794 subpass_dep.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10795 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10796
10797 subpass_dep.srcAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10798 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10799 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10800 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10801 subpass_dep.dstAccessMask = 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
10806 subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
10807 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010808
10809 m_renderPass_info.dependencyCount = static_cast<uint32_t>(m_renderPass_dependencies.size());
10810 m_renderPass_info.pDependencies = m_renderPass_dependencies.data();
10811
10812 vk::CreateRenderPass(m_device->handle(), &m_renderPass_info, nullptr, &m_renderPass);
10813
Aitor Camacho768bbc92022-06-10 16:57:44 +020010814 auto image_create_info = LvlInitStruct<VkImageCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010815 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10816 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
10817 image_create_info.extent.width = static_cast<uint32_t>(m_width);
10818 image_create_info.extent.height = static_cast<uint32_t>(m_height);
10819 image_create_info.extent.depth = 1;
10820 image_create_info.mipLevels = 1;
Aitor Camacho768bbc92022-06-10 16:57:44 +020010821 image_create_info.arrayLayers = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010822 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10823 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10824 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10825 image_create_info.flags = 0;
10826
10827 VkImageObj image(m_device);
10828 image.Init(image_create_info);
Aitor Camacho768bbc92022-06-10 16:57:44 +020010829 image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
aitor-lunarga131fca2022-02-17 22:55:55 +010010830 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
10831 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
10832
Aitor Camacho768bbc92022-06-10 16:57:44 +020010833 auto framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010834 framebufferCreateInfo.width = static_cast<uint32_t>(m_width);
10835 framebufferCreateInfo.height = static_cast<uint32_t>(m_height);
10836 framebufferCreateInfo.layers = 1;
10837 framebufferCreateInfo.renderPass = m_renderPass;
10838 framebufferCreateInfo.attachmentCount = 1;
10839 framebufferCreateInfo.pAttachments = &imageView;
10840
10841 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &m_framebuffer);
10842
10843 VkClearValue clear{};
10844 clear.color = m_clear_color;
10845 m_renderPassClearValues.emplace_back(clear);
10846 m_renderPassBeginInfo.renderPass = m_renderPass;
10847 m_renderPassBeginInfo.framebuffer = m_framebuffer;
10848 m_renderPassBeginInfo.renderArea.extent.width = static_cast<uint32_t>(m_width);
10849 m_renderPassBeginInfo.renderArea.extent.height = static_cast<uint32_t>(m_height);
10850 m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size();
10851 m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data();
10852
Aitor Camacho768bbc92022-06-10 16:57:44 +020010853 // Pipeline not bound test
10854 {
10855 // No need to create individual pipelines for each subpass since we are checking no bound pipeline
10856 CreatePipelineHelper pipe(*this);
10857 pipe.InitInfo();
10858 pipe.InitState();
10859 pipe.CreateGraphicsPipeline();
aitor-lunarga131fca2022-02-17 22:55:55 +010010860
Aitor Camacho768bbc92022-06-10 16:57:44 +020010861 m_commandBuffer->begin();
10862 // This bind should not be valid after we begin the renderpass
10863 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10864 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10865 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010866
Aitor Camacho768bbc92022-06-10 16:57:44 +020010867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10868 m_commandBuffer->Draw(1, 0, 0, 0);
10869 m_errorMonitor->VerifyFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010870
Aitor Camacho768bbc92022-06-10 16:57:44 +020010871 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10872 m_errorMonitor->ExpectSuccess();
aitor-lunarga131fca2022-02-17 22:55:55 +010010873
Aitor Camacho768bbc92022-06-10 16:57:44 +020010874 // This bind should not be valid for next subpass
10875 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10876 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10877 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010878
Aitor Camacho768bbc92022-06-10 16:57:44 +020010879 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10880 m_commandBuffer->Draw(1, 0, 0, 0);
10881 m_errorMonitor->VerifyFound();
10882 }
10883
10884 m_errorMonitor->ExpectSuccess();
10885 m_commandBuffer->EndRenderPass();
10886 m_commandBuffer->end();
10887 }
10888
10889 m_commandBuffer->reset();
10890
Aitor Camacho131d2192022-06-13 19:15:11 +020010891 // Dynamic state (checking with line width)
10892 {
10893 // Pipeline for subpass 0
10894 CreatePipelineHelper pipe(*this);
10895 pipe.InitInfo();
10896
10897 VkDynamicState dyn_states = VK_DYNAMIC_STATE_LINE_WIDTH;
10898 pipe.ia_ci_.topology = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
10899 pipe.dyn_state_ci_ = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
10900 pipe.dyn_state_ci_.dynamicStateCount = 1;
10901 pipe.dyn_state_ci_.pDynamicStates = &dyn_states;
10902 pipe.InitState();
10903 pipe.CreateGraphicsPipeline();
10904
10905 // Pipelines for all other subpasses
10906 vk_testing::Pipeline pipelines[extra_subpass_count];
10907 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10908 auto pipe_info = pipe.gp_ci_;
10909 pipe_info.subpass = i + 1;
10910 pipelines[i].init(*m_device, pipe_info);
10911 }
10912
10913 m_commandBuffer->begin();
10914 // This line width set should not be valid for next subpass
10915 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10916 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10917 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10918 m_errorMonitor->VerifyNotFound();
10919
10920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10921 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
10922 m_errorMonitor->VerifyFound();
10923
10924 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10925 m_errorMonitor->ExpectSuccess();
10926
10927 // This line width set should not be valid for next subpass
10928 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10929 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10930 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
10931 m_errorMonitor->VerifyNotFound();
10932
10933 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10934 m_commandBuffer->Draw(1, 0, 0, 0);
10935 m_errorMonitor->VerifyFound();
10936 }
10937
10938 m_errorMonitor->ExpectSuccess();
10939 m_commandBuffer->EndRenderPass();
10940 m_commandBuffer->end();
10941 }
10942
10943 m_commandBuffer->reset();
10944
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010945 // Push constants
10946 {
10947 char const *const vsSource = R"glsl(
10948 #version 450
10949 layout(push_constant, std430) uniform foo {
10950 mat3 m;
10951 } constants;
10952 void main(){
10953 vec3 v3 = constants.m[0];
10954 }
10955 )glsl";
10956
10957 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
10958 VkShaderObj const fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
10959
10960 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT, 0, 16};
10961 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
10962 pipeline_layout_info.pushConstantRangeCount = 1;
10963 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
10964
10965 vk_testing::PipelineLayout layout;
10966 layout.init(*m_device, pipeline_layout_info, std::vector<const vk_testing::DescriptorSetLayout *>{});
10967
10968 CreatePipelineHelper pipe(*this);
10969 pipe.InitInfo();
10970 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
10971 pipe.pipeline_layout_ci_ = pipeline_layout_info;
10972 pipe.InitState();
10973 pipe.CreateGraphicsPipeline();
10974
10975 // Pipelines for all other subpasses
10976 vk_testing::Pipeline pipelines[extra_subpass_count];
10977 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10978 auto pipe_info = pipe.gp_ci_;
10979 pipe_info.subpass = i + 1;
10980 pipelines[i].init(*m_device, pipe_info);
10981 }
10982 // Set up complete
10983
10984 const float dummy_values[16] = {};
10985 m_commandBuffer->begin();
10986 // This push constants should not be counted when render pass begins
10987 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
10988 push_constant_range.size, dummy_values);
10989 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10990 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10991 m_errorMonitor->VerifyNotFound();
10992
10993 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
10994 m_commandBuffer->Draw(1, 0, 0, 0);
10995 m_errorMonitor->VerifyFound();
10996
10997 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10998 m_errorMonitor->ExpectSuccess();
10999
11000 // This push constants should not be counted when we change subpass
11001 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
11002 push_constant_range.size, dummy_values);
11003 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11004 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11005 m_errorMonitor->VerifyNotFound();
11006
11007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
11008 m_commandBuffer->Draw(1, 0, 0, 0);
11009 m_errorMonitor->VerifyFound();
11010 }
11011
11012 m_errorMonitor->ExpectSuccess();
11013 m_commandBuffer->EndRenderPass();
11014 m_commandBuffer->end();
11015 }
11016
11017 m_commandBuffer->reset();
11018
Aitor Camacho097a2322022-06-14 14:08:23 +020011019 // Descriptor sets
11020 {
11021 OneOffDescriptorSet descriptor_set{m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}};
11022
11023 auto bci = LvlInitStruct<VkBufferCreateInfo>();
11024 bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
11025 bci.size = 8;
11026 VkBufferObj buffer;
11027 buffer.init(*m_device, bci);
11028 VkDescriptorBufferInfo buffer_info;
11029 buffer_info.buffer = buffer.handle();
11030 buffer_info.offset = 0;
11031 buffer_info.range = VK_WHOLE_SIZE;
11032 auto descriptor_write = LvlInitStruct<VkWriteDescriptorSet>();
11033 descriptor_write.dstSet = descriptor_set.set_;
11034 descriptor_write.dstBinding = 0;
11035 descriptor_write.descriptorCount = 1;
11036 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11037 descriptor_write.pBufferInfo = &buffer_info;
11038 vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11039
11040 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
11041 pipeline_layout_info.setLayoutCount = 1;
11042 pipeline_layout_info.pSetLayouts = &descriptor_set.layout_.handle();
11043
11044 vk_testing::PipelineLayout layout;
11045 layout.init(*m_device, pipeline_layout_info, std::vector<vk_testing::DescriptorSetLayout const *>{});
11046
11047 VkShaderObj const vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
11048 VkShaderObj const fs(this, bindStateFragUniformShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11049
11050 CreatePipelineHelper pipe(*this);
11051 pipe.InitInfo();
11052 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11053 pipe.pipeline_layout_ci_ = pipeline_layout_info;
11054 pipe.InitState();
11055 pipe.CreateGraphicsPipeline();
11056
11057 // Pipelines for all other subpasses
11058 vk_testing::Pipeline pipelines[extra_subpass_count];
11059 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11060 auto pipe_info = pipe.gp_ci_;
11061 pipe_info.subpass = i + 1;
11062 pipelines[i].init(*m_device, pipe_info);
11063 }
11064 // Set up complete
11065
11066 m_commandBuffer->begin();
11067 // This descriptor bind should not be counted when render pass begins
11068 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
11069 &descriptor_set.set_, 0, nullptr);
11070 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11071 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11072 m_errorMonitor->VerifyNotFound();
11073
11074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
11075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
11076 m_commandBuffer->Draw(1, 0, 0, 0);
11077 m_errorMonitor->VerifyFound();
11078
11079 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11080 m_errorMonitor->ExpectSuccess();
11081
11082 // This descriptor bind should not be counted when next subpass begins
11083 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0,
11084 1, &descriptor_set.set_, 0, nullptr);
11085 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11086 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11087 m_errorMonitor->VerifyNotFound();
11088
11089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
11090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
11091 m_commandBuffer->Draw(1, 0, 0, 0);
11092 m_errorMonitor->VerifyFound();
11093 }
11094
11095 m_errorMonitor->ExpectSuccess();
11096 m_commandBuffer->EndRenderPass();
11097 m_commandBuffer->end();
11098 }
11099
11100 m_commandBuffer->reset();
11101
Aitor Camachob379c4b2022-06-14 14:43:40 +020011102 // Vertex buffer
11103 {
11104 float const vertex_data[] = {1.0f, 0.0f};
11105 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11106 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11107
11108 VkVertexInputBindingDescription input_binding{};
11109 input_binding.binding = 0;
11110 input_binding.stride = sizeof(vertex_data);
11111 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11112
11113 VkVertexInputAttributeDescription input_attribs{};
11114 input_attribs.binding = 0;
11115 input_attribs.location = 0;
11116 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11117 input_attribs.offset = 0;
11118
11119 char const *const vsSource = R"glsl(
11120 #version 450
11121 layout(location = 0) in vec2 input0;
11122 void main(){
11123 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11124 }
11125 )glsl";
11126
11127 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11128 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11129
11130 CreatePipelineHelper pipe(*this);
11131 pipe.InitInfo();
11132 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11133 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11134 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11135 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11136 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11137 pipe.InitState();
11138 pipe.CreateGraphicsPipeline();
11139
11140 // Pipelines for all other subpasses
11141 vk_testing::Pipeline pipelines[extra_subpass_count];
11142 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11143 auto pipe_info = pipe.gp_ci_;
11144 pipe_info.subpass = i + 1;
11145 pipelines[i].init(*m_device, pipe_info);
11146 }
11147 // Set up complete
11148 VkDeviceSize offset = 0;
11149
11150 m_commandBuffer->begin();
11151 // This vertex buffer bind should not be counted when render pass begins
11152 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11153 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11154 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11155 m_errorMonitor->VerifyNotFound();
11156
11157 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11159 m_commandBuffer->Draw(1, 0, 0, 0);
11160 m_errorMonitor->VerifyFound();
11161
11162 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11163 m_errorMonitor->ExpectSuccess();
11164
11165 // This vertex buffer bind should not be counted when next subpass begins
11166 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11167 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11168 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11169 m_errorMonitor->VerifyNotFound();
11170
11171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11172 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11173 m_commandBuffer->Draw(1, 0, 0, 0);
11174 m_errorMonitor->VerifyFound();
11175 }
11176
11177 m_errorMonitor->ExpectSuccess();
11178 m_commandBuffer->EndRenderPass();
11179 m_commandBuffer->end();
11180 }
11181
11182 m_commandBuffer->reset();
11183
Aitor Camachoea9030a2022-06-14 15:07:25 +020011184 // Index buffer
11185 {
11186 float const vertex_data[] = {1.0f, 0.0f};
11187 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11188 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11189
11190 uint32_t const index_data[] = {0};
11191 VkConstantBufferObj ibo(m_device, static_cast<int>(sizeof(index_data)), reinterpret_cast<const void *>(index_data),
11192 VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
11193
11194 VkVertexInputBindingDescription input_binding{};
11195 input_binding.binding = 0;
11196 input_binding.stride = sizeof(vertex_data);
11197 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11198
11199 VkVertexInputAttributeDescription input_attribs{};
11200 input_attribs.binding = 0;
11201 input_attribs.location = 0;
11202 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11203 input_attribs.offset = 0;
11204
11205 char const *const vsSource = R"glsl(
11206 #version 450
11207 layout(location = 0) in vec2 input0;
11208 void main(){
11209 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11210 }
11211 )glsl";
11212
11213 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11214 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11215
11216 CreatePipelineHelper pipe(*this);
11217 pipe.InitInfo();
11218 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11219 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11220 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11221 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11222 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11223 pipe.InitState();
11224 pipe.CreateGraphicsPipeline();
11225
11226 // Pipelines for all other subpasses
11227 vk_testing::Pipeline pipelines[extra_subpass_count];
11228 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11229 auto pipe_info = pipe.gp_ci_;
11230 pipe_info.subpass = i + 1;
11231 pipelines[i].init(*m_device, pipe_info);
11232 }
11233 // Set up complete
11234
11235 VkDeviceSize offset = 0;
11236 m_commandBuffer->begin();
11237 // This index buffer bind should not be counted when render pass begins
11238 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11239 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11240 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11241 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11242 m_errorMonitor->VerifyNotFound();
11243
11244 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11245 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11246 m_errorMonitor->VerifyFound();
11247
11248 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11249 m_errorMonitor->ExpectSuccess();
11250
11251 // This index buffer bind should not be counted when next subpass begins
11252 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11253 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11254 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11255 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11256 m_errorMonitor->VerifyNotFound();
11257
11258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11259 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11260 m_errorMonitor->VerifyFound();
11261 }
11262
11263 m_errorMonitor->ExpectSuccess();
11264 m_commandBuffer->EndRenderPass();
11265 m_commandBuffer->end();
11266 }
11267
Aitor Camacho768bbc92022-06-10 16:57:44 +020011268 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010011269}
ziga-lunarg813fa012022-04-09 14:09:57 +020011270
11271TEST_F(VkLayerTest, TestCommandBufferInheritanceWithInvalidDepthFormat) {
11272 TEST_DESCRIPTION(
11273 "Test VkCommandBufferInheritanceRenderingInfoKHR with depthAttachmentFormat that does not include depth aspect");
11274
11275 SetTargetApiVersion(VK_API_VERSION_1_1);
11276
11277 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
11278
11279 ASSERT_NO_FATAL_FAILURE(InitFramework());
11280
sjfricked700bc02022-05-30 16:35:06 +090011281 if (!AreRequiredExtensionsEnabled()) {
11282 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunarg813fa012022-04-09 14:09:57 +020011283 }
11284
11285 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090011286 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
ziga-lunarg813fa012022-04-09 14:09:57 +020011287 }
11288
11289 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
11290 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
11291 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
11292 if (!dynamic_rendering_features.dynamicRendering) {
11293 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
11294 return;
11295 }
11296
11297 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
11298
11299 auto stencil_format = FindSupportedStencilOnlyFormat(gpu());
11300 if (!stencil_format) {
11301 printf("%s Couldn't stencil image format.\n", kSkipPrefix);
11302 return;
11303 }
11304
11305 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
11306 inheritance_rendering_info.depthAttachmentFormat = stencil_format;
11307
11308 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11309
11310 auto cmdbuf_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>(&inheritance_rendering_info);
11311 auto cmdbuf_bi = LvlInitStruct<VkCommandBufferBeginInfo>();
11312 cmdbuf_bi.pInheritanceInfo = &cmdbuf_ii;
11313
11314 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferInheritanceRenderingInfo-depthAttachmentFormat-06540");
11315
11316 vk::BeginCommandBuffer(secondary.handle(), &cmdbuf_bi);
11317
11318 m_errorMonitor->VerifyFound();
11319}
ziga-lunarg0ce51882022-05-18 14:36:48 +020011320
11321TEST_F(VkLayerTest, ResolveInvalidUsage) {
11322 TEST_DESCRIPTION("Resolve image with missing usage flags.");
11323
11324 if (!EnableDeviceProfileLayer()) {
11325 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
11326 return;
11327 }
11328
11329 ASSERT_NO_FATAL_FAILURE(Init());
11330
11331 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
11332 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
11333
11334 // Load required functions
11335 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
11336 printf("%s Failed to device profile layer.\n", kSkipPrefix);
11337 return;
11338 }
11339
11340 VkFormat src_format = VK_FORMAT_R8_UNORM;
11341 VkFormat dst_format = VK_FORMAT_R8_SNORM;
11342
11343 VkFormatProperties formatProps;
11344 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, &formatProps);
11345 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
11346 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, formatProps);
11347 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, &formatProps);
11348 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
11349 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, formatProps);
11350
11351 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
11352 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11353 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11354 image_create_info.extent.width = 32;
11355 image_create_info.extent.height = 1;
11356 image_create_info.extent.depth = 1;
11357 image_create_info.mipLevels = 1;
11358 image_create_info.arrayLayers = 1;
11359 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
11360 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11361 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11362 image_create_info.flags = 0;
11363
11364 VkImageObj srcImage(m_device);
11365 srcImage.init(&image_create_info);
11366 ASSERT_TRUE(srcImage.initialized());
11367
11368 image_create_info.format = dst_format;
11369 VkImageObj srcImage2(m_device);
11370 srcImage2.init(&image_create_info);
11371 ASSERT_TRUE(srcImage2.initialized());
11372
11373 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11374 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11375 VkImageObj invalidSrcImage(m_device);
11376 invalidSrcImage.init(&image_create_info);
11377 ASSERT_TRUE(invalidSrcImage.initialized());
11378
11379 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11380 image_create_info.format = src_format;
11381 VkImageObj invalidSrcImage2(m_device);
11382 invalidSrcImage2.init(&image_create_info);
11383 ASSERT_TRUE(invalidSrcImage2.initialized());
11384
11385 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11386 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11387 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11388 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11389 VkImageObj dstImage(m_device);
11390 dstImage.init(&image_create_info);
11391 ASSERT_TRUE(dstImage.initialized());
11392
11393 image_create_info.format = src_format;
11394 VkImageObj dstImage2(m_device);
11395 dstImage2.init(&image_create_info);
11396 ASSERT_TRUE(dstImage2.initialized());
11397
11398 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11399 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11400 VkImageObj invalidDstImage(m_device);
11401 invalidDstImage.init(&image_create_info);
11402 ASSERT_TRUE(invalidDstImage.initialized());
11403
11404 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11405 image_create_info.format = dst_format;
11406 VkImageObj invalidDstImage2(m_device);
11407 invalidDstImage2.init(&image_create_info);
11408 ASSERT_TRUE(invalidDstImage2.initialized());
11409
11410 m_commandBuffer->begin();
11411 VkImageResolve resolveRegion;
11412 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11413 resolveRegion.srcSubresource.mipLevel = 0;
11414 resolveRegion.srcSubresource.baseArrayLayer = 0;
11415 resolveRegion.srcSubresource.layerCount = 1;
11416 resolveRegion.srcOffset.x = 0;
11417 resolveRegion.srcOffset.y = 0;
11418 resolveRegion.srcOffset.z = 0;
11419 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11420 resolveRegion.dstSubresource.mipLevel = 0;
11421 resolveRegion.dstSubresource.baseArrayLayer = 0;
11422 resolveRegion.dstSubresource.layerCount = 1;
11423 resolveRegion.dstOffset.x = 0;
11424 resolveRegion.dstOffset.y = 0;
11425 resolveRegion.dstOffset.z = 0;
11426 resolveRegion.extent.width = 1;
11427 resolveRegion.extent.height = 1;
11428 resolveRegion.extent.depth = 1;
11429
11430 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06762");
11431 m_commandBuffer->ResolveImage(invalidSrcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11432 &resolveRegion);
11433 m_errorMonitor->VerifyFound();
11434
11435 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06764");
11436 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11437 &resolveRegion);
11438 m_errorMonitor->VerifyFound();
11439
11440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06763");
11441 m_commandBuffer->ResolveImage(invalidSrcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11442 1, &resolveRegion);
11443 m_errorMonitor->VerifyFound();
11444
11445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06765");
11446 m_commandBuffer->ResolveImage(srcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11447 1, &resolveRegion);
11448 m_errorMonitor->VerifyFound();
11449
11450 m_commandBuffer->end();
11451}