blob: e80284feb7d00f1fdb2a2d137a63aa5c4cc5becd [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) {
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006067 GTEST_SKIP() << "maxTransformFeedbackBufferDataStride is zero, skipping subtests";
Tony-LunarG983bbc52020-11-06 11:04:59 -07006068 }
6069
6070 std::vector<const char *> device_extension_names;
6071 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6072 VkDeviceObj test_device(0, gpu(), device_extension_names);
6073 VkCommandPoolObj commandPool(&test_device, 0);
6074 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6075 VkBufferObj counter_buffer2;
6076 counter_buffer2.init(test_device, buffer_create_info);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006077
Tony-LunarG983bbc52020-11-06 11:04:59 -07006078 VkPipelineLayoutObj pipelineLayout(&test_device);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006079
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;
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006084 vk_testing::RenderPass renderpass(test_device, rp_info);
6085 ASSERT_TRUE(renderpass.handle());
6086
Tony-LunarG983bbc52020-11-06 11:04:59 -07006087 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006088 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006089 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
sjfricke394227a2022-06-20 16:47:38 +09006090 vs.InitFromGLSLTry(false, &test_device);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006091 fs.InitFromGLSLTry(false, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006092 pipeline.AddShader(&vs);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006093 pipeline.AddShader(&fs);
6094 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass.handle());
6095 m_renderPassBeginInfo.renderPass = renderpass.handle();
6096 VkFramebufferCreateInfo fbci = {
6097 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass.handle(), 0, nullptr, 256, 256, 1};
6098 vk_testing::Framebuffer fb(test_device, fbci);
6099 ASSERT_TRUE(fb.initialized());
6100 m_renderPassBeginInfo.framebuffer = fb.handle();
6101 m_renderPassBeginInfo.renderPass = renderpass.handle();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006102 commandBuffer.begin();
6103 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6104 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6105 VkRect2D scissor = {{0, 0}, {16, 16}};
6106 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6107 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6108 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6109 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006111 }
6112 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6113 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6114 m_errorMonitor->VerifyFound();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006115}
6116
unknown088160a2019-05-23 17:43:13 -06006117TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6118 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6119
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006120 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6121 ASSERT_NO_FATAL_FAILURE(InitFramework());
6122 if (!AreRequiredExtensionsEnabled()) {
6123 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006124 }
6125 ASSERT_NO_FATAL_FAILURE(InitState());
6126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6127
unknown088160a2019-05-23 17:43:13 -06006128 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006129 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006130
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006131 CreatePipelineHelper pipe(*this);
6132 pipe.InitInfo();
6133 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006134 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006135 dyn_state_ci.dynamicStateCount = size(dyn_states);
6136 dyn_state_ci.pDynamicStates = dyn_states;
6137 pipe.dyn_state_ci_ = dyn_state_ci;
6138 pipe.InitState();
6139 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006140
6141 m_commandBuffer->begin();
6142 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6143
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006144 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6145 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6146 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006147
6148 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006149 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006150 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006151 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006152
sfricke-samsung1c61f192021-12-31 01:53:03 -06006153 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006154 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6155 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006156 vk_testing::Buffer draw_buffer;
6157 draw_buffer.init_no_mem(*m_device, buffer_create_info);
6158 ASSERT_TRUE(draw_buffer.initialized());
unknown088160a2019-05-23 17:43:13 -06006159
sjfrickeedd669c2022-06-02 17:37:19 +09006160 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006161 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006162 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006163 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006164 VkBufferObj count_buffer;
6165 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006166
Mark Lobodzinski20310782020-02-28 14:25:17 -07006167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006168 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006169 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006170 m_errorMonitor->VerifyFound();
6171
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006172 draw_buffer.bind_memory(*m_device, 0, 0);
unknown088160a2019-05-23 17:43:13 -06006173
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006174 vk_testing::Buffer count_buffer_unbound;
6175 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6176 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006177
sjfrickeedd669c2022-06-02 17:37:19 +09006178 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006179 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006180 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6181
Mark Lobodzinski20310782020-02-28 14:25:17 -07006182 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006183 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
6184 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006185 m_errorMonitor->VerifyFound();
6186
sjfrickeedd669c2022-06-02 17:37:19 +09006187 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, " VUID-vkCmdDrawIndirectCount-countBuffer-02715");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006188 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006189 sizeof(VkDrawIndirectCommand));
6190 m_errorMonitor->VerifyFound();
6191
Mark Lobodzinski20310782020-02-28 14:25:17 -07006192 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006193 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006194 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006195 m_errorMonitor->VerifyFound();
6196
Mark Lobodzinski20310782020-02-28 14:25:17 -07006197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006198 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006199 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006200 m_errorMonitor->VerifyFound();
6201
sjfrickeedd669c2022-06-02 17:37:19 +09006202 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-04129");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006203 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006204 sizeof(VkDrawIndirectCommand));
6205 m_errorMonitor->VerifyFound();
6206
Mark Lobodzinski20310782020-02-28 14:25:17 -07006207 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006208 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006209 m_errorMonitor->VerifyFound();
6210
unknown088160a2019-05-23 17:43:13 -06006211 m_commandBuffer->EndRenderPass();
6212 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006213}
6214
6215TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6216 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6217
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006218 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006219 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006220 if (!AreRequiredExtensionsEnabled()) {
6221 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006222 }
6223 ASSERT_NO_FATAL_FAILURE(InitState());
6224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6225
unknown088160a2019-05-23 17:43:13 -06006226 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006227 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006228
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006229 CreatePipelineHelper pipe(*this);
6230 pipe.InitInfo();
6231 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006232 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006233 dyn_state_ci.dynamicStateCount = size(dyn_states);
6234 dyn_state_ci.pDynamicStates = dyn_states;
6235 pipe.dyn_state_ci_ = dyn_state_ci;
6236 pipe.InitState();
6237 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006238
6239 m_commandBuffer->begin();
6240 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6241
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006242 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6243 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6244 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006245
6246 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006247 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006248 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006249 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006250
sfricke-samsung1c61f192021-12-31 01:53:03 -06006251 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006252 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6253 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006254 VkBufferObj draw_buffer;
6255 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006256
sjfrickeedd669c2022-06-02 17:37:19 +09006257 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006258 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006259 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006260 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006261 VkBufferObj count_buffer;
6262 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006263
sfricke-samsung1c61f192021-12-31 01:53:03 -06006264 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006265 index_buffer_create_info.size = sizeof(uint32_t);
6266 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006267 VkBufferObj index_buffer;
6268 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006269
Mark Lobodzinski20310782020-02-28 14:25:17 -07006270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006271 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006272 sizeof(VkDrawIndexedIndirectCommand));
6273 m_errorMonitor->VerifyFound();
6274
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006275 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006276
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006277 vk_testing::Buffer draw_buffer_unbound;
6278 draw_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6279 ASSERT_TRUE(draw_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006280
Mark Lobodzinski20310782020-02-28 14:25:17 -07006281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006282 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006283 sizeof(VkDrawIndexedIndirectCommand));
6284 m_errorMonitor->VerifyFound();
6285
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006286 vk_testing::Buffer count_buffer_unbound;
6287 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6288 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006289
sjfrickeedd669c2022-06-02 17:37:19 +09006290 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006291 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006292 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6293
Mark Lobodzinski20310782020-02-28 14:25:17 -07006294 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006295 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006296 sizeof(VkDrawIndexedIndirectCommand));
6297 m_errorMonitor->VerifyFound();
6298
sjfrickeedd669c2022-06-02 17:37:19 +09006299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715");
6300 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
6301 sizeof(VkDrawIndexedIndirectCommand));
6302 m_errorMonitor->VerifyFound();
6303
Mark Lobodzinski20310782020-02-28 14:25:17 -07006304 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006305 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006306 sizeof(VkDrawIndexedIndirectCommand));
6307 m_errorMonitor->VerifyFound();
6308
Mark Lobodzinski20310782020-02-28 14:25:17 -07006309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006310 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006311 sizeof(VkDrawIndexedIndirectCommand));
6312 m_errorMonitor->VerifyFound();
6313
sjfrickeedd669c2022-06-02 17:37:19 +09006314 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-04129");
6315 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size,
6316 1, sizeof(VkDrawIndexedIndirectCommand));
6317 m_errorMonitor->VerifyFound();
6318
Mark Lobodzinski20310782020-02-28 14:25:17 -07006319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006320 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006321 m_errorMonitor->VerifyFound();
6322
unknown088160a2019-05-23 17:43:13 -06006323 m_commandBuffer->EndRenderPass();
6324 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006325}
6326
sfricke-samsung860d3b22020-05-04 21:08:29 -07006327TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6328 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6329
6330 SetTargetApiVersion(VK_API_VERSION_1_2);
6331 ASSERT_NO_FATAL_FAILURE(Init());
6332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6333 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09006334 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
sfricke-samsung860d3b22020-05-04 21:08:29 -07006335 }
6336
6337 VkBufferObj indirect_buffer;
6338 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6339 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6340
6341 VkBufferObj indexed_indirect_buffer;
6342 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6343 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6344
6345 VkBufferObj count_buffer;
6346 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6347
6348 VkBufferObj index_buffer;
6349 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6350
6351 CreatePipelineHelper pipe(*this);
6352 pipe.InitInfo();
6353 pipe.InitState();
6354 pipe.CreateGraphicsPipeline();
6355
6356 // Make calls to valid commands but without the drawIndirectCount feature set
6357 m_commandBuffer->begin();
6358 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6359
6360 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6361
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006363 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6364 sizeof(VkDrawIndirectCommand));
6365 m_errorMonitor->VerifyFound();
6366
6367 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6368
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006369 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006370 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6371 sizeof(VkDrawIndexedIndirectCommand));
6372 m_errorMonitor->VerifyFound();
6373
6374 m_commandBuffer->EndRenderPass();
6375 m_commandBuffer->end();
6376}
6377
unknown088160a2019-05-23 17:43:13 -06006378TEST_F(VkLayerTest, ExclusiveScissorNV) {
6379 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6380
6381 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6382 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6383 } else {
6384 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6385 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6386 return;
6387 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006388 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006389 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6390 for (auto device_extension : required_device_extensions) {
6391 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6392 m_device_extension_names.push_back(device_extension);
6393 } else {
6394 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6395 return;
6396 }
6397 }
6398
6399 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006400 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006401 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6402
6403 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006404 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6405 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006406 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6407
6408 features2.features.multiViewport = VK_FALSE;
6409
6410 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6412
6413 if (m_device->phy().properties().limits.maxViewports) {
6414 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6415 return;
6416 }
6417
6418 // Based on PSOViewportStateTests
6419 {
6420 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6421 VkViewport viewports[] = {viewport, viewport};
6422 VkRect2D scissor = {{0, 0}, {64, 64}};
6423 VkRect2D scissors[100] = {scissor, scissor};
6424
6425 using std::vector;
6426 struct TestCase {
6427 uint32_t viewport_count;
6428 VkViewport *viewports;
6429 uint32_t scissor_count;
6430 VkRect2D *scissors;
6431 uint32_t exclusive_scissor_count;
6432 VkRect2D *exclusive_scissors;
6433
6434 vector<std::string> vuids;
6435 };
6436
6437 vector<TestCase> test_cases = {
6438 {1,
6439 viewports,
6440 1,
6441 scissors,
6442 2,
6443 scissors,
6444 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6445 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6446 {1,
6447 viewports,
6448 1,
6449 scissors,
6450 100,
6451 scissors,
6452 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6453 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6454 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006455 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006456 };
6457
6458 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006459 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6460 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006461
6462 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6463 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6464 helper.vp_state_ci_.pViewports = test_case.viewports;
6465 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6466 helper.vp_state_ci_.pScissors = test_case.scissors;
6467 helper.vp_state_ci_.pNext = &exc;
6468
6469 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6470 exc.pExclusiveScissors = test_case.exclusive_scissors;
6471 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006472 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006473 }
6474 }
6475
6476 // Based on SetDynScissorParamTests
6477 {
6478 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006479 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006480
6481 const VkRect2D scissor = {{0, 0}, {16, 16}};
6482 const VkRect2D scissors[] = {scissor, scissor};
6483
6484 m_commandBuffer->begin();
6485
Mark Lobodzinski20310782020-02-28 14:25:17 -07006486 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006487 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6488 m_errorMonitor->VerifyFound();
6489
Mark Lobodzinski20310782020-02-28 14:25:17 -07006490 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006491 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6492 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6493 m_errorMonitor->VerifyFound();
6494
Mark Lobodzinski20310782020-02-28 14:25:17 -07006495 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006496 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6497 m_errorMonitor->VerifyFound();
6498
Mark Lobodzinski20310782020-02-28 14:25:17 -07006499 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006500 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006501 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006502 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6503 m_errorMonitor->VerifyFound();
6504
Mark Lobodzinski20310782020-02-28 14:25:17 -07006505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6506 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006507 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6508 m_errorMonitor->VerifyFound();
6509
Mark Lobodzinski20310782020-02-28 14:25:17 -07006510 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006511 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6512 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6513 m_errorMonitor->VerifyFound();
6514
6515 struct TestCase {
6516 VkRect2D scissor;
6517 std::string vuid;
6518 };
6519
6520 std::vector<TestCase> test_cases = {
6521 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6522 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6523 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6524 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6525 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6526 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6527 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6528 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6529
6530 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006531 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006532 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6533 m_errorMonitor->VerifyFound();
6534 }
6535
6536 m_commandBuffer->end();
6537 }
6538}
6539
6540TEST_F(VkLayerTest, MeshShaderNV) {
6541 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6542
sjfricked8e01c52022-07-06 14:09:04 +09006543 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6544 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006545 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09006546 if (!AreRequiredExtensionsEnabled()) {
6547 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
unknown088160a2019-05-23 17:43:13 -06006548 }
6549
Tony-LunarG048f5012020-04-29 16:55:11 -06006550 if (IsPlatform(kMockICD) || DeviceSimulation()) {
sjfricke11b24692022-06-21 20:49:53 +09006551 GTEST_SKIP() << "Test not supported by MockICD";
unknown088160a2019-05-23 17:43:13 -06006552 }
6553
6554 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006555 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006556 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6557
6558 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006559 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6560 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006561 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6562 features2.features.multiDrawIndirect = VK_FALSE;
6563
6564 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6565 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6566
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006567 static const char vertShaderText[] = R"glsl(
6568 #version 450
6569 vec2 vertices[3];
6570 void main() {
6571 vertices[0] = vec2(-1.0, -1.0);
6572 vertices[1] = vec2( 1.0, -1.0);
6573 vertices[2] = vec2( 0.0, 1.0);
6574 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6575 gl_PointSize = 1.0f;
6576 }
6577 )glsl";
unknown088160a2019-05-23 17:43:13 -06006578
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006579 static const char meshShaderText[] = R"glsl(
6580 #version 450
6581 #extension GL_NV_mesh_shader : require
6582 layout(local_size_x = 1) in;
6583 layout(max_vertices = 3) out;
6584 layout(max_primitives = 1) out;
6585 layout(triangles) out;
6586 void main() {
6587 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6588 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6589 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6590 gl_PrimitiveIndicesNV[0] = 0;
6591 gl_PrimitiveIndicesNV[1] = 1;
6592 gl_PrimitiveIndicesNV[2] = 2;
6593 gl_PrimitiveCountNV = 1;
6594 }
6595 )glsl";
unknown088160a2019-05-23 17:43:13 -06006596
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006597 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6598 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6599 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006600
6601 // Test pipeline creation
6602 {
6603 // can't mix mesh with vertex
6604 const auto break_vp = [&](CreatePipelineHelper &helper) {
6605 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6606 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006607 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006608 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6609
6610 // vertex or mesh must be present
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006611 // 02096 overlaps with 06896
unknown088160a2019-05-23 17:43:13 -06006612 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006613 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006614 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096",
6615 "VUID-VkGraphicsPipelineCreateInfo-pStages-06896"}));
unknown088160a2019-05-23 17:43:13 -06006616
6617 // vertexinput and inputassembly must be valid when vertex stage is present
6618 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6619 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6620 helper.gp_ci_.pVertexInputState = nullptr;
6621 helper.gp_ci_.pInputAssemblyState = nullptr;
6622 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006623 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006624 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6625 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6626 }
6627
6628 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006629 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006630
sfricke-samsung1c61f192021-12-31 01:53:03 -06006631 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006632 buffer_create_info.size = sizeof(uint32_t);
6633 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6634 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006635 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006636 ASSERT_VK_SUCCESS(result);
6637
6638 m_commandBuffer->begin();
6639
Mark Lobodzinski20310782020-02-28 14:25:17 -07006640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6641 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006642 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6643 m_errorMonitor->VerifyFound();
6644
6645 m_commandBuffer->end();
6646
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006647 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006648}
6649
6650TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6651 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006652
sjfricked700bc02022-05-30 16:35:06 +09006653 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006654 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +09006655 if (!AreRequiredExtensionsEnabled()) {
6656 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006657 }
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006658
6659 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006660 GetPhysicalDeviceFeatures2(mesh_shader_features);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006661 if (mesh_shader_features.meshShader != VK_TRUE) {
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006662 GTEST_SKIP() << "Mesh shader feature not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006663 }
6664
6665 mesh_shader_features.meshShader = VK_FALSE;
6666 mesh_shader_features.taskShader = VK_FALSE;
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006667 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &mesh_shader_features));
unknown088160a2019-05-23 17:43:13 -06006668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6669
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006670 vk_testing::Event event_obj(*m_device);
6671 const auto event = event_obj.handle();
6672 ASSERT_TRUE(event_obj.initialized());
unknown088160a2019-05-23 17:43:13 -06006673
6674 m_commandBuffer->begin();
6675
Shannon McPherson93970b12020-06-12 14:34:35 -06006676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006677 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006678 m_errorMonitor->VerifyFound();
6679
Shannon McPherson93970b12020-06-12 14:34:35 -06006680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006681 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006682 m_errorMonitor->VerifyFound();
6683
Shannon McPherson93970b12020-06-12 14:34:35 -06006684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006685 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006686 m_errorMonitor->VerifyFound();
6687
Shannon McPherson93970b12020-06-12 14:34:35 -06006688 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006689 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006690 m_errorMonitor->VerifyFound();
6691
Shannon McPherson93970b12020-06-12 14:34:35 -06006692 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006694 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6695 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006696 m_errorMonitor->VerifyFound();
6697
Shannon McPherson93970b12020-06-12 14:34:35 -06006698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006700 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6701 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006702 m_errorMonitor->VerifyFound();
6703
Shannon McPherson93970b12020-06-12 14:34:35 -06006704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006706 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6707 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006708 m_errorMonitor->VerifyFound();
6709
Shannon McPherson93970b12020-06-12 14:34:35 -06006710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006712 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6713 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006714 m_errorMonitor->VerifyFound();
6715
6716 m_commandBuffer->end();
6717
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006718 vk_testing::Semaphore semaphore_obj(*m_device);
6719 const auto semaphore = semaphore_obj.handle();
6720 ASSERT_TRUE(semaphore_obj.initialized());
unknown088160a2019-05-23 17:43:13 -06006721
6722 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006723 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006724
6725 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006726 submit_info.signalSemaphoreCount = 1;
6727 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006728 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006729 m_errorMonitor->VerifyNotFound();
6730
unknown088160a2019-05-23 17:43:13 -06006731 submit_info.signalSemaphoreCount = 0;
6732 submit_info.pSignalSemaphores = nullptr;
6733 submit_info.waitSemaphoreCount = 1;
6734 submit_info.pWaitSemaphores = &semaphore;
6735 submit_info.pWaitDstStageMask = &stage_flags;
6736
sfricke-samsung1ac64842021-09-23 14:11:17 -07006737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006739 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006740 m_errorMonitor->VerifyFound();
6741
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006742 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006743
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006744 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006745
6746 static const char task_src[] = R"glsl(
6747 #version 450
6748
6749 #extension GL_NV_mesh_shader : require
6750
6751 layout(local_size_x = 32) in;
6752
6753 taskNV out Task {
6754 uint baseID;
6755 } OUT;
6756
6757 void main() {
6758 OUT.baseID = 1;
6759 }
6760 )glsl";
6761
6762 static const char mesh_src[] = R"glsl(
6763 #version 450
6764
6765 #extension GL_NV_mesh_shader : require
6766
6767 layout(local_size_x = 1) in;
6768 layout(max_vertices = 3) out;
6769 layout(max_primitives = 1) out;
6770 layout(triangles) out;
6771
6772 taskNV in Task {
6773 uint baseID;
6774 } IN;
6775
6776 void main() {
6777 }
6778 )glsl";
6779
6780 VkShaderObj task_shader(this, task_src, VK_SHADER_STAGE_TASK_BIT_NV);
6781 VkShaderObj mesh_shader(this, mesh_src, VK_SHADER_STAGE_MESH_BIT_NV);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006782 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006783
6784 // mesh and task shaders not supported
6785 const auto break_vp = [&](CreatePipelineHelper &helper) {
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006786 helper.shader_stages_ = {task_shader.GetStageCreateInfo(), mesh_shader.GetStageCreateInfo(), fs.GetStageCreateInfo()};
unknown088160a2019-05-23 17:43:13 -06006787 };
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006788 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
6789 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6790 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
unknown088160a2019-05-23 17:43:13 -06006791}
Chris Mayerc93536f2019-09-19 16:34:49 +02006792
6793TEST_F(VkLayerTest, ViewportWScalingNV) {
6794 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6795
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006796 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006797
6798 VkPhysicalDeviceFeatures device_features = {};
6799 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6800
6801 if (!device_features.multiViewport) {
6802 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6803 return;
6804 }
6805
6806 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6807 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6808 } else {
6809 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6810 return;
6811 }
6812
6813 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6814 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6815
6816 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006817 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006818
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006819 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006820 #version 450
6821 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6822 vec2( 1.0f, 1.0f),
6823 vec2(-1.0f, -1.0f),
6824 vec2( 1.0f, -1.0f) };
6825 out gl_PerVertex {
6826 vec4 gl_Position;
6827 };
6828
6829 void main() {
6830 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006831 }
6832 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006833
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006834 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006835 #version 450
6836 layout(location = 0) out vec4 outColor;
6837
6838 void main() {
6839 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006840 }
6841 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006842
6843 const std::vector<VkViewport> vp = {
6844 {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}};
6845 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6846 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6847
6848 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6849
sfricke-samsung1c61f192021-12-31 01:53:03 -06006850 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006851 vpsi.viewportWScalingEnable = VK_TRUE;
6852 vpsi.viewportCount = vp_count;
6853 vpsi.pViewportWScalings = scale.data();
6854
sfricke-samsung1c61f192021-12-31 01:53:03 -06006855 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006856 vpci.viewportCount = vp_count;
6857 vpci.pViewports = vp.data();
6858 vpci.scissorCount = vp_count;
6859 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006860
6861 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6862
6863 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006864 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006865
6866 // Create pipeline with w-scaling enabled but without a valid scaling array
6867 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006868 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006869 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6870
6871 vpsi.pViewportWScalings = scale.data();
6872
6873 // Create pipeline with w-scaling enabled but without matching viewport counts
6874 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006875 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006876 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6877
6878 const VkPipelineLayoutObj pl(m_device);
6879
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006880 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6881 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006882
6883 VkPipelineObj pipe(m_device);
6884 pipe.AddDefaultColorAttachment();
6885 pipe.AddShader(&vs);
6886 pipe.AddShader(&fs);
6887 pipe.SetViewport(vp);
6888 pipe.SetScissor(sc);
6889 pipe.CreateVKPipeline(pl.handle(), renderPass());
6890
6891 VkPipelineObj pipeDynWScale(m_device);
6892 pipeDynWScale.AddDefaultColorAttachment();
6893 pipeDynWScale.AddShader(&vs);
6894 pipeDynWScale.AddShader(&fs);
6895 pipeDynWScale.SetViewport(vp);
6896 pipeDynWScale.SetScissor(sc);
6897 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6898 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6899
6900 m_commandBuffer->begin();
6901
6902 // Bind pipeline without dynamic w scaling enabled
6903 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006904 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006905 m_errorMonitor->VerifyNotFound();
6906
Chris Mayerc93536f2019-09-19 16:34:49 +02006907 // Bind pipeline that has dynamic w-scaling enabled
6908 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006909 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006910 m_errorMonitor->VerifyNotFound();
6911
6912 const auto max_vps = m_device->props.limits.maxViewports;
6913
Mark Lobodzinski20310782020-02-28 14:25:17 -07006914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006915 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6916 m_errorMonitor->VerifyFound();
6917
6918 m_errorMonitor->ExpectSuccess();
6919 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6920 m_errorMonitor->VerifyNotFound();
6921
6922 m_commandBuffer->end();
6923}
sfricke-samsung914e8002020-01-07 22:26:18 -08006924
6925TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6926 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6927
6928 // Enable Sampler YCbCr Conversion req'd extensions
6929 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6930 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6931 if (mp_extensions) {
6932 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6933 }
6934 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006935 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006936 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006937 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6938 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6939 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6940 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006941 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006942 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6943 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6944 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6945 } else {
6946 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6947 return;
6948 }
6949
6950 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06006951 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08006952 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6953 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6954
6955 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6956 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6957 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6958 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6959 return;
6960 }
6961
6962 // Create Ycbcr conversion
6963 VkSamplerYcbcrConversion conversions;
6964 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6965 NULL,
6966 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6967 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6968 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6969 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6970 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6971 VK_CHROMA_LOCATION_COSITED_EVEN,
6972 VK_CHROMA_LOCATION_COSITED_EVEN,
6973 VK_FILTER_NEAREST,
6974 false};
6975
Mark Lobodzinski20310782020-02-28 14:25:17 -07006976 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006977 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6978 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006979}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006980
6981TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6982 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6983
sjfricked8e01c52022-07-06 14:09:04 +09006984 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006985
6986 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6987
sjfricked8e01c52022-07-06 14:09:04 +09006988 if (!AreRequiredExtensionsEnabled()) {
6989 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006990 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006991
6992 {
6993 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6994 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6995 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6996
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006997 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6998 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006999 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7000
7001 if (!tf_features.transformFeedback) {
7002 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7003 return;
7004 }
7005 }
7006
7007 ASSERT_NO_FATAL_FAILURE(InitState());
7008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7009
7010 {
7011 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
7012 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7013 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7014
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007015 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007016 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7017 info.size = 4;
7018 VkBufferObj buffer;
7019 buffer.init(*m_device, info);
7020 VkDeviceSize offsets[1]{};
7021
7022 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
7023 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
7024 m_errorMonitor->VerifyFound();
7025 }
7026
7027 {
7028 auto vkCmdBeginTransformFeedbackEXT =
7029 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7030 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7031
7032 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
7033 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7034 m_errorMonitor->VerifyFound();
7035 }
7036
7037 {
7038 auto vkCmdEndTransformFeedbackEXT =
7039 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7040 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7041
7042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
7043 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7044 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7045 m_errorMonitor->VerifyFound();
7046 }
7047}
7048
7049TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
7050 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
7051
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007052 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7053 ASSERT_NO_FATAL_FAILURE(InitFramework());
7054 if (!AreRequiredExtensionsEnabled()) {
7055 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007056 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007057
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007058 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007059 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007060 }
7061
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007062 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007063 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007064 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007065
7066 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007067 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007068 }
7069
7070 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7071 }
7072
7073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7074
7075 auto vkCmdBindTransformFeedbackBuffersEXT =
7076 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7077 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7078
7079 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007080 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007081 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007082
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007083 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007084 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7085 info.size = 8;
7086 VkBufferObj const buffer_obj(*m_device, info);
7087
7088 // Request a firstBinding that is too large.
7089 {
7090 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7091 VkDeviceSize const offsets[1]{};
7092
7093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7094 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7095 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7096 nullptr);
7097 m_errorMonitor->VerifyFound();
7098 }
7099
7100 // Request too many bindings.
7101 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7102 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7103 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7104
7105 std::vector<VkDeviceSize> offsets(bindingCount);
7106
7107 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7108 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7109 nullptr);
7110 m_errorMonitor->VerifyFound();
7111 }
7112
7113 // Request a size that is larger than the maximum size.
7114 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7115 VkDeviceSize const offsets[1]{};
7116 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7117
7118 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7119 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7120 m_errorMonitor->VerifyFound();
7121 }
7122 }
7123
7124 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007125 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007126 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7127 info.size = 8;
7128 VkBufferObj const buffer_obj(*m_device, info);
7129
7130 // Request an offset that is too large.
7131 {
7132 VkDeviceSize const offsets[1]{info.size + 4};
7133
7134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7135 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7136 m_errorMonitor->VerifyFound();
7137 }
7138
7139 // Request an offset that is not a multiple of 4.
7140 {
7141 VkDeviceSize const offsets[1]{1};
7142
7143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7144 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7145 m_errorMonitor->VerifyFound();
7146 }
7147
7148 // Request a size that is larger than the buffer's size.
7149 {
7150 VkDeviceSize const offsets[1]{};
7151 VkDeviceSize const sizes[1]{info.size + 1};
7152
7153 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007154 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7155 m_errorMonitor->VerifyFound();
7156 }
7157
7158 // Request an offset and size whose sum is larger than the buffer's size.
7159 {
7160 VkDeviceSize const offsets[1]{4};
7161 VkDeviceSize const sizes[1]{info.size - 3};
7162
7163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7164 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7165 m_errorMonitor->VerifyFound();
7166 }
7167
7168 // Bind while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007169 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007170 auto vkCmdBeginTransformFeedbackEXT =
7171 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7172 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7173 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7174
7175 VkDeviceSize const offsets[1]{};
7176
7177 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7178 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7179 m_errorMonitor->VerifyFound();
7180
7181 auto vkCmdEndTransformFeedbackEXT =
7182 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7183 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7184 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7185 }
7186 }
7187
7188 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7189 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007190 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007191 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7192 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007193 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007194 VkBufferObj const buffer_obj(*m_device, info);
7195
7196 VkDeviceSize const offsets[1]{};
7197
7198 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7199 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7200 m_errorMonitor->VerifyFound();
7201 }
7202
7203 // Don't bind memory.
7204 {
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007205 vk_testing::Buffer buffer;
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007206 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007207 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007208 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7209 info.size = 4;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007210 buffer.init_no_mem(*m_device, info);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007211 }
7212
7213 VkDeviceSize const offsets[1]{};
7214
7215 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007216 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007217 m_errorMonitor->VerifyFound();
7218 }
7219}
7220
7221TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7222 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7223
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007224 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7225 ASSERT_NO_FATAL_FAILURE(InitFramework());
7226 if (!AreRequiredExtensionsEnabled()) {
7227 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007228 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007229
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007230 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007231 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007232 }
7233
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007234 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007235 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007236 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007237
7238 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007239 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007240 }
7241
7242 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7243 }
7244
7245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7246
7247 auto vkCmdBeginTransformFeedbackEXT =
7248 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7249 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7250
7251 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007252 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007253 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007254
7255 // Request a firstCounterBuffer that is too large.
7256 {
7257 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7258
7259 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7260 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7261 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7262 m_errorMonitor->VerifyFound();
7263 }
7264
7265 // Request too many buffers.
7266 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7267 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7268
7269 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7270 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7271 m_errorMonitor->VerifyFound();
7272 }
7273 }
7274
7275 // Request an out-of-bounds location.
7276 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007277 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007278 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7279 info.size = 4;
7280 VkBufferObj const buffer_obj(*m_device, info);
7281
7282 VkDeviceSize const offsets[1]{1};
7283
7284 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7285 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7286 m_errorMonitor->VerifyFound();
7287 }
7288
7289 // Request specific offsets without specifying buffers.
7290 {
7291 VkDeviceSize const offsets[1]{};
7292
7293 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7294 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7295 m_errorMonitor->VerifyFound();
7296 }
7297
7298 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7299 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007300 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007301 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7302 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007303 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007304 VkBufferObj const buffer_obj(*m_device, info);
7305
7306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7307 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7308 m_errorMonitor->VerifyFound();
7309 }
7310
7311 // Begin while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007312 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007313 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7314
7315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7316 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7317 m_errorMonitor->VerifyFound();
7318
7319 auto vkCmdEndTransformFeedbackEXT =
7320 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7321 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7322
7323 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7324 }
7325}
7326
7327TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7328 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7329
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007330 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007331 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007332 if (!AreRequiredExtensionsEnabled()) {
7333 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
7334 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007335
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007336 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007337 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007338 }
7339
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007340 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007341 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007342 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007343
7344 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007345 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007346 }
7347
7348 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7349 }
7350
7351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7352
7353 auto vkCmdEndTransformFeedbackEXT =
7354 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7355 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7356
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007357 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007358 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007359 // Activate transform feedback.
7360 auto vkCmdBeginTransformFeedbackEXT =
7361 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7362 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7363 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007364
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007365 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007366 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7367 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007368
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007369 // Request a firstCounterBuffer that is too large.
7370 {
7371 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7372
7373 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7374 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7375 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7376 m_errorMonitor->VerifyFound();
7377 }
7378
7379 // Request too many buffers.
7380 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7381 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7382
7383 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7384 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7385 m_errorMonitor->VerifyFound();
7386 }
7387 }
7388
7389 // Request an out-of-bounds location.
7390 {
7391 auto info = LvlInitStruct<VkBufferCreateInfo>();
7392 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7393 info.size = 4;
7394 VkBufferObj const buffer_obj(*m_device, info);
7395
7396 VkDeviceSize const offsets[1]{1};
7397
7398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7399 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007400 m_errorMonitor->VerifyFound();
7401 }
7402
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007403 // Request specific offsets without specifying buffers.
7404 {
7405 VkDeviceSize const offsets[1]{};
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007406
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007407 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7408 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7409 m_errorMonitor->VerifyFound();
7410 }
7411
7412 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7413 {
7414 auto info = LvlInitStruct<VkBufferCreateInfo>();
7415 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7416 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007417 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007418 VkBufferObj const buffer_obj(*m_device, info);
7419
7420 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7421 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007422 m_errorMonitor->VerifyFound();
7423 }
7424 }
7425
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007426 // End while transform feedback is inactive.
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007427 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007428 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007429
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007430 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7431 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007432 m_errorMonitor->VerifyFound();
7433 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007434 }
7435}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007436
sfricke-samsung39ee2442020-07-22 21:21:15 -07007437TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7438 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007439
7440 // protect memory added in VK 1.1
7441 SetTargetApiVersion(VK_API_VERSION_1_1);
7442
sjfricked8e01c52022-07-06 14:09:04 +09007443 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7444
sfricke-samsung071af2d2020-07-02 10:37:22 -07007445 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7446
sjfricked8e01c52022-07-06 14:09:04 +09007447 if (!AreRequiredExtensionsEnabled()) {
7448 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7449 }
7450
sfricke-samsung071af2d2020-07-02 10:37:22 -07007451 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7452 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7453 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7454
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007455 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7456 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007457 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7458
7459 if (protected_memory_features.protectedMemory == VK_FALSE) {
7460 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7461 return;
7462 };
7463
7464 // Turns m_commandBuffer into a protected command buffer
7465 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7466
7467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7468 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007469 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung071af2d2020-07-02 10:37:22 -07007470 }
7471
7472 VkBufferObj indirect_buffer;
7473 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7474 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7475
7476 VkBufferObj indexed_indirect_buffer;
7477 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7478 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7479
7480 VkBufferObj index_buffer;
7481 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7482
7483 CreatePipelineHelper pipe(*this);
7484 pipe.InitInfo();
7485 pipe.InitState();
7486 pipe.CreateGraphicsPipeline();
7487
sfricke-samsung39ee2442020-07-22 21:21:15 -07007488 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007489 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007490 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7491 query_pool_create_info.queryCount = 1;
7492 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7493
sfricke-samsung071af2d2020-07-02 10:37:22 -07007494 m_commandBuffer->begin();
7495 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7496
7497 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7498
7499 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7500 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7501 m_errorMonitor->VerifyFound();
7502
7503 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7504
7505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7506 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7507 sizeof(VkDrawIndexedIndirectCommand));
7508 m_errorMonitor->VerifyFound();
7509
7510 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007511
7512 // Query should be outside renderpass
7513 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7514
7515 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7516 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7517 m_errorMonitor->VerifyFound();
7518
7519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7520 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7521 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7522 m_errorMonitor->VerifyFound();
7523
sfricke-samsung071af2d2020-07-02 10:37:22 -07007524 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007525
7526 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007527}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007528
7529TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7530 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7531
7532 SetTargetApiVersion(VK_API_VERSION_1_1);
sjfricked8e01c52022-07-06 14:09:04 +09007533 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007534
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007535 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7536
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007537 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7538 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7539 return;
7540 }
sjfricked8e01c52022-07-06 14:09:04 +09007541 if (!AreRequiredExtensionsEnabled()) {
7542 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7543 }
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007544
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007545 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7546 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7547 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007548 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7549 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7550 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007551
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007552 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7553 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007554 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7555
7556 if (protected_memory_features.protectedMemory == VK_FALSE) {
7557 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7558 return;
7559 };
7560
sfricke-samsung21286f82021-11-16 08:21:46 -08007561 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7562 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7563 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7564 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7565
7566 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
sjfricke8ab00c12022-07-08 17:33:48 +09007567 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007568
7569 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7570 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7571
7572 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007573 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007574 }
7575
7576 // Create actual protected and unprotected buffers
7577 VkBuffer buffer_protected = VK_NULL_HANDLE;
7578 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007579 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007580 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007581 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7582 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7583 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007584 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7585
7586 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7587 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7588 buffer_create_info.flags = 0;
7589 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7590
7591 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007592 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007593 VkImageObj image_protected(m_device);
7594 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007595 VkImageObj image_protected_descriptor(m_device);
7596 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007597 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007598 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007599 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007600 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007601 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7603 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007604 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7605 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007606 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7607 image_create_info.arrayLayers = 1;
7608 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007609 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7610 image_protected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007611 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007612
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007613 image_create_info.flags = 0;
7614 image_unprotected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007615 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007616
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007617 // Create protected and unproteced memory
7618 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7619 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7620
sfricke-samsung1c61f192021-12-31 01:53:03 -06007621 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007622 alloc_info.allocationSize = 0;
7623
7624 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7625 VkMemoryRequirements mem_reqs_protected;
7626 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7627 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7628 VkMemoryRequirements mem_reqs_unprotected;
7629 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7630 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7631
7632 // Get memory index for a protected and unprotected memory
7633 VkPhysicalDeviceMemoryProperties phys_mem_props;
7634 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7635 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7636 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7637 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7638 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7639 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7640 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7641 memory_type_unprotected = i;
7642 }
7643 // Check just protected bit is in type at all
7644 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7645 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7646 memory_type_protected = i;
7647 }
7648 }
7649 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7650 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7651 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7652 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7653 return;
7654 }
7655
7656 alloc_info.memoryTypeIndex = memory_type_protected;
7657 alloc_info.allocationSize = mem_reqs_protected.size;
7658 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7659
7660 alloc_info.allocationSize = mem_reqs_unprotected.size;
7661 alloc_info.memoryTypeIndex = memory_type_unprotected;
7662 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7663
7664 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7665 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7666 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7667 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007668 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7669 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7670
Aitor Camacho6ba32ff2022-06-16 19:11:12 +02007671 // Change layout once memory is bound
7672 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7673 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7674 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7675 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7676
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007677 // need memory bound at image view creation time
7678 image_views[0] = image_protected.targetView(image_format);
7679 image_views[1] = image_unprotected.targetView(image_format);
7680 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7681 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007682
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007683 // A renderpass and framebuffer that contains a protected and unprotected image view
7684 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007685 {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 -07007686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007688 {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 -07007689 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7690 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7691 };
7692 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7693 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7694 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7695 VkSubpassDependency dependency = {0,
7696 0,
7697 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7698 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7699 VK_ACCESS_SHADER_WRITE_BIT,
7700 VK_ACCESS_SHADER_WRITE_BIT,
7701 VK_DEPENDENCY_BY_REGION_BIT};
7702 VkRenderPassCreateInfo render_pass_create_info = {
7703 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7704 VkRenderPass render_pass;
7705 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7706 VkFramebufferCreateInfo framebuffer_create_info = {
7707 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7708 VkFramebuffer framebuffer;
7709 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7710
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007711 // Various structs used for commands
7712 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7713 VkImageBlit blit_region = {};
7714 blit_region.srcSubresource = image_subresource;
7715 blit_region.dstSubresource = image_subresource;
7716 blit_region.srcOffsets[0] = {0, 0, 0};
7717 blit_region.srcOffsets[1] = {8, 8, 1};
7718 blit_region.dstOffsets[0] = {0, 8, 0};
7719 blit_region.dstOffsets[1] = {8, 8, 1};
7720 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7721 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7722 VkBufferCopy buffer_copy = {0, 0, 64};
7723 VkBufferImageCopy buffer_image_copy = {};
7724 buffer_image_copy.bufferRowLength = 0;
7725 buffer_image_copy.bufferImageHeight = 0;
7726 buffer_image_copy.imageSubresource = image_subresource;
7727 buffer_image_copy.imageOffset = {0, 0, 0};
7728 buffer_image_copy.imageExtent = {1, 1, 1};
7729 buffer_image_copy.bufferOffset = 0;
7730 VkImageCopy image_copy = {};
7731 image_copy.srcSubresource = image_subresource;
7732 image_copy.srcOffset = {0, 0, 0};
7733 image_copy.dstSubresource = image_subresource;
7734 image_copy.dstOffset = {0, 0, 0};
7735 image_copy.extent = {1, 1, 1};
7736 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007737 VkRect2D render_area = {{0, 0}, {8, 8}};
7738 VkRenderPassBeginInfo render_pass_begin = {
7739 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7740 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7741 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7742 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007743
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007744 const char fsSource[] = R"glsl(
7745 #version 450
7746 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7747 layout(set=0, binding=1, rgba8) uniform image2D si1;
7748 layout(location=0) out vec4 x;
7749 void main(){
7750 x = vec4(bar.y);
7751 imageStore(si1, ivec2(0), vec4(0));
7752 }
7753 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007754 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007755
aitor-lunargf15acd52022-03-09 22:13:25 +01007756 CreatePipelineHelper g_pipe(*this, 2u);
locke-lunarg0de02522020-10-27 22:55:17 -06007757 g_pipe.InitInfo();
7758 g_pipe.gp_ci_.renderPass = render_pass;
7759 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7760 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7761 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg0de02522020-10-27 22:55:17 -06007762 g_pipe.InitState();
7763 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7764
7765 VkSampler sampler;
7766 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7767 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7768 ASSERT_VK_SUCCESS(err);
7769
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007770 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007771 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007772 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7773 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7774 g_pipe.descriptor_set_->UpdateDescriptorSets();
7775
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007776 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007777 // will get undefined values, but not invalid if protectedNoFault is supported
7778 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7779 if (!protected_memory_properties.protectedNoFault) {
7780 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7781 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7782 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7783 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007784
sfricke-samsung21286f82021-11-16 08:21:46 -08007785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7786 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7787 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7788 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007789
sfricke-samsung21286f82021-11-16 08:21:46 -08007790 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7791 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7792 &subresource_range);
7793 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007794
sfricke-samsung21286f82021-11-16 08:21:46 -08007795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7796 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7797 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007798
sfricke-samsung21286f82021-11-16 08:21:46 -08007799 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7800 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7801 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007802
sfricke-samsung21286f82021-11-16 08:21:46 -08007803 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7804 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7805 1, &buffer_image_copy);
7806 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007807
sfricke-samsung21286f82021-11-16 08:21:46 -08007808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7809 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7810 1, &buffer_image_copy);
7811 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007812
sfricke-samsung21286f82021-11-16 08:21:46 -08007813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7814 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7815 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7816 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007817
sfricke-samsung21286f82021-11-16 08:21:46 -08007818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7819 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7820 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7821 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007822
sfricke-samsung21286f82021-11-16 08:21:46 -08007823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7824 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7825 1, &buffer_image_copy);
7826 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007827
sfricke-samsung21286f82021-11-16 08:21:46 -08007828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7829 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7830 1, &buffer_image_copy);
7831 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007832
sfricke-samsung21286f82021-11-16 08:21:46 -08007833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7834 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7835 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007836
sfricke-samsung21286f82021-11-16 08:21:46 -08007837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7838 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7839 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007840
sfricke-samsung21286f82021-11-16 08:21:46 -08007841 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007842
sfricke-samsung21286f82021-11-16 08:21:46 -08007843 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7844 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7845 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007846
sfricke-samsung21286f82021-11-16 08:21:46 -08007847 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7848 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7849 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7850 VkDeviceSize offset = 0;
7851 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7852 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007853
sfricke-samsung21286f82021-11-16 08:21:46 -08007854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7857 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007859
sfricke-samsung21286f82021-11-16 08:21:46 -08007860 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7861 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007862
sfricke-samsung21286f82021-11-16 08:21:46 -08007863 vk::CmdEndRenderPass(m_commandBuffer->handle());
7864 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007865 m_commandBuffer->end();
7866
7867 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007868 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007869 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7870 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007871 g_pipe.descriptor_set_->UpdateDescriptorSets();
7872
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007873 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007874 if (!protected_memory_properties.protectedNoFault) {
7875 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7876 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7877 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7878 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007879
sfricke-samsung21286f82021-11-16 08:21:46 -08007880 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7881 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7882 1, &subresource_range);
7883 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007884
sfricke-samsung21286f82021-11-16 08:21:46 -08007885 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7886 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7887 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007888
sfricke-samsung21286f82021-11-16 08:21:46 -08007889 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7890 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7891 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
7892 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007893
sfricke-samsung21286f82021-11-16 08:21:46 -08007894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7895 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7896 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7897 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007898
sfricke-samsung21286f82021-11-16 08:21:46 -08007899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7900 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7901 buffer_unprotected, 1, &buffer_image_copy);
7902 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007903
sfricke-samsung21286f82021-11-16 08:21:46 -08007904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7905 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7906 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007907
sfricke-samsung21286f82021-11-16 08:21:46 -08007908 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7909 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7910 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007911
sfricke-samsung21286f82021-11-16 08:21:46 -08007912 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007913
sfricke-samsung21286f82021-11-16 08:21:46 -08007914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7915 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7916 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007917
sfricke-samsung21286f82021-11-16 08:21:46 -08007918 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7919 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7920 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7921 VkDeviceSize offset = 0;
7922 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7923 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007924
sfricke-samsung21286f82021-11-16 08:21:46 -08007925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7927 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7928 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007929
sfricke-samsung21286f82021-11-16 08:21:46 -08007930 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
7931 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007932 protectedCommandBuffer.end();
7933
sfricke-samsung96cd9932020-08-23 20:57:11 -07007934 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7935 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7936
sfricke-samsung1c61f192021-12-31 01:53:03 -06007937 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
7938 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07007939 submit_info.commandBufferCount = 2;
7940 submit_info.pCommandBuffers = comman_buffers;
7941
7942 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08007943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007945 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7946 m_errorMonitor->VerifyFound();
7947
7948 protected_submit_info.protectedSubmit = VK_FALSE;
7949 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7950 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7951 m_errorMonitor->VerifyFound();
7952
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007953 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7954 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7955 vk::FreeMemory(device(), memory_protected, nullptr);
7956 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007957 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7958 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007959}
locke-lunarg6b0de702020-08-07 17:42:13 -06007960
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007961TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007962 TEST_DESCRIPTION(
7963 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7964 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7965
sjfricked8e01c52022-07-06 14:09:04 +09007966 AddRequiredExtensions(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007967
sjfricked8e01c52022-07-06 14:09:04 +09007968 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7969 if (!AreRequiredExtensionsEnabled()) {
7970 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7971 }
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007972 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7973 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7974 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7975
7976 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
7977 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
7978 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7979 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7980
7981 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
7982 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
7983 return;
7984 }
locke-lunarg6b0de702020-08-07 17:42:13 -06007985
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007986 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06007987 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7988 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7989 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7990 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7991
7992 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7993 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7994 return;
7995 }
7996
7997 VkFormat buffer_view_format =
7998 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7999 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8000 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8001 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8002 return;
8003 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008004 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8006
8007 VkPhysicalDeviceFeatures device_features = {};
8008 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8009 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8010 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8011 return;
8012 }
8013
8014 VkImageObj image(m_device);
8015 image.Init(image_ci);
8016 VkImageView image_view = image.targetView(image_format);
8017
8018 VkSampler sampler = VK_NULL_HANDLE;
8019 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8020 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8021
8022 VkBufferObj buffer;
8023 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8024
sfricke-samsung1c61f192021-12-31 01:53:03 -06008025 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06008026 bvci.buffer = buffer.handle();
8027 bvci.format = buffer_view_format;
8028 bvci.range = VK_WHOLE_SIZE;
8029 VkBufferView buffer_view;
8030 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8031
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008032 char const *fsSource = R"glsl(
8033 #version 450
8034 layout(set=0, binding=3, r32f) uniform image2D si0;
8035 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8036 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8037 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8038 void main() {
8039 imageAtomicExchange(si0, ivec2(0), 1);
8040 imageAtomicExchange(si1[0], ivec2(0), 1);
8041 imageAtomicExchange(si1[1], ivec2(0), 1);
8042 imageAtomicExchange(stb2, 0, 1);
8043 imageAtomicExchange(stb3[0], 0, 1);
8044 imageAtomicExchange(stb3[1], 0, 1);
8045 }
8046 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008047
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008048 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
8049 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06008050
8051 CreatePipelineHelper g_pipe(*this);
8052 g_pipe.InitInfo();
8053 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008054 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8055 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8056 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8057 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008058 g_pipe.InitState();
8059 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8060
locke-lunarg76e8dee2020-08-21 13:20:02 -06008061 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008062 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008063 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008064 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008065 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008066 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008067 g_pipe.descriptor_set_->UpdateDescriptorSets();
8068
8069 m_commandBuffer->begin();
8070 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8071 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8072 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8073 &g_pipe.descriptor_set_->set_, 0, nullptr);
8074
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008075 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8080 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8081 m_errorMonitor->VerifyFound();
8082
8083 m_commandBuffer->EndRenderPass();
8084 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008085 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8086 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008087}
locke-lunargae1bbab2020-09-10 11:55:56 -06008088
8089TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8090 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8091
8092 ASSERT_NO_FATAL_FAILURE(Init());
8093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8094
8095 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008096 char const *const vsSource = R"glsl(
8097 #version 450
8098 layout(push_constant, std430) uniform foo {
8099 bool b;
8100 float f2[3];
8101 vec3 v;
8102 vec4 v2[2];
8103 mat3 m;
8104 } constants;
8105 void func1( float f ){
8106 // use the whole v2[1]. byte: 48-63.
8107 vec2 v2 = constants.v2[1].yz;
8108 }
8109 void main(){
8110 // use only v2[0].z. byte: 40-43.
8111 func1( constants.v2[0].z);
8112 // index of m is variable. The all m is used. byte: 64-99.
8113 for(int i=1;i<2;++i) {
8114 vec3 v3 = constants.m[i];
8115 }
8116 }
8117 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008118
8119 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008120 char const *const fsSource = R"glsl(
8121 #version 450
8122 struct foo1{
8123 int i[4];
8124 }f;
8125 layout(push_constant, std430) uniform foo {
8126 float x[2][2][2];
8127 foo1 s;
8128 foo1 ss[3];
8129 } constants;
8130 void main(){
8131 // use s. byte: 32-47.
8132 f = constants.s;
8133 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8134 for(int i=1;i<2;++i) {
8135 int ii = constants.ss[i].i[3];
8136 }
8137 }
8138 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008139
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008140 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8141 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008142
8143 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8144 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8145
Aitor Camacho2933a0a2022-06-13 20:46:34 +02008146 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
8147 pipeline_layout_info.pushConstantRangeCount = 1;
8148 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
locke-lunargae1bbab2020-09-10 11:55:56 -06008149
8150 VkPipelineLayout pipeline_layout;
8151 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8152
8153 CreatePipelineHelper g_pipe(*this);
8154 g_pipe.InitInfo();
8155 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8156 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8157 g_pipe.InitState();
8158 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8159
8160 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8161 VkPipelineLayout pipeline_layout_small;
8162 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8163
8164 CreatePipelineHelper g_pipe_small_range(*this);
8165 g_pipe_small_range.InitInfo();
8166 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8167 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8168 g_pipe_small_range.InitState();
8169
sfricke-samsung7699b912021-04-12 23:01:51 -07008170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008172 g_pipe_small_range.CreateGraphicsPipeline();
8173 m_errorMonitor->VerifyFound();
8174
8175 m_commandBuffer->begin();
8176 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8177
Piers Daniella7f93b62021-11-20 12:32:04 -07008178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008179 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8180 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8181 &g_pipe.descriptor_set_->set_, 0, nullptr);
8182 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8183 m_errorMonitor->VerifyFound();
8184
locke-lunargae1bbab2020-09-10 11:55:56 -06008185 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008186
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008187 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8188 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8189 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8190 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008191 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008192 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8193 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8194 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8195 // m_errorMonitor->VerifyFound();
8196
Piers Daniella7f93b62021-11-20 12:32:04 -07008197 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008198 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8199 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8200 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008201
8202 m_errorMonitor->ExpectSuccess();
8203 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8204 68, dummy_values);
8205 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8206 m_errorMonitor->VerifyNotFound();
paul-lunarg6b0b1f62022-07-11 14:00:48 -06008207
8208 m_commandBuffer->EndRenderPass();
8209 m_commandBuffer->end();
8210
8211 vk::DestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
8212 vk::DestroyPipelineLayout(m_device->handle(), pipeline_layout_small, nullptr);
locke-lunarg41b8c362020-10-16 23:30:12 -06008213}
8214
8215TEST_F(VkLayerTest, VerifyVertextBinding) {
8216 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8217
8218 ASSERT_NO_FATAL_FAILURE(Init());
8219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8220
8221 VkBufferObj vtx_buf;
8222 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8223 vtx_buf.init(*m_device, info);
8224
8225 CreatePipelineHelper pipe(*this);
8226 pipe.InitInfo();
8227 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8228 VkVertexInputBindingDescription vtx_binding_des[3] = {
8229 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8230
8231 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8232 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8233 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8234 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8235 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8236 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8237 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8238 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8239 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8240 pipe.InitState();
8241 pipe.CreateGraphicsPipeline();
8242
8243 m_commandBuffer->begin();
8244 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8245 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8246 VkDeviceSize offset = 0;
8247 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8248
8249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8254 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8255 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008256
8257 m_commandBuffer->EndRenderPass();
8258 m_commandBuffer->end();
8259}
locke-lunargd7a08e92020-10-21 00:24:00 -06008260
8261TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8262 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8263 ASSERT_NO_FATAL_FAILURE(Init());
8264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8265
8266 CreatePipelineHelper pipe(*this);
8267 pipe.InitInfo();
8268
8269 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8270
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008271 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008272 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8273 dyn_state_ci.pDynamicStates = dyn_states.data();
8274 pipe.dyn_state_ci_ = dyn_state_ci;
8275 pipe.InitState();
8276 pipe.CreateGraphicsPipeline();
8277
8278 m_commandBuffer->begin();
8279 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8280 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8281
8282 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8283 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8284 VkRect2D scissor = {{0, 0}, {16, 16}};
8285 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8286 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8287
8288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8289 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8290 m_errorMonitor->VerifyFound();
8291
8292 m_commandBuffer->EndRenderPass();
8293 m_commandBuffer->end();
8294}
locke-lunarg0de02522020-10-27 22:55:17 -06008295
8296TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8297 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008298 SetTargetApiVersion(VK_API_VERSION_1_1);
8299 AddRequiredExtensions(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8300 AddRequiredExtensions(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
8301 ASSERT_NO_FATAL_FAILURE(InitFramework());
8302 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8303 GTEST_SKIP() << "Test requires at least Vulkan 1.1";
locke-lunarg0de02522020-10-27 22:55:17 -06008304 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008305 if (!AreRequiredExtensionsEnabled()) {
8306 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
locke-lunarg0de02522020-10-27 22:55:17 -06008307 }
8308
8309 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8311
8312 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8313 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008314
8315 VkFormatProperties format_props;
8316 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8317 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008318 GTEST_SKIP() << "SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.";
sfricke-samsung715e3d12020-12-01 22:45:49 -08008319 }
8320
locke-lunarg0de02522020-10-27 22:55:17 -06008321 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8322 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8323
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008324 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008325 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008326 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008327 image_format_info.type = image_ci.imageType;
8328 image_format_info.format = image_ci.format;
8329 image_format_info.tiling = image_ci.tiling;
8330 image_format_info.usage = image_ci.usage;
8331 image_format_info.flags = image_ci.flags;
8332
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008333 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8334 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008335
8336 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8337
8338 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008339 GTEST_SKIP() << "Image and ImageView supports filter cubic ; skipped.";
locke-lunarg0de02522020-10-27 22:55:17 -06008340 }
8341
8342 VkImageObj image(m_device);
8343 image.Init(image_ci);
8344 VkImageView imageView = image.targetView(format, imageViewType);
8345
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008346 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008347 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8348 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008349 vk_testing::Sampler sampler(*m_device, sampler_ci);
8350 ASSERT_TRUE(sampler.initialized());
locke-lunarg0de02522020-10-27 22:55:17 -06008351
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008352 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008353 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8354 sampler_ci.pNext = &reduction_mode_ci;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008355 vk_testing::Sampler sampler_reduction(*m_device, sampler_ci);
locke-lunarg0de02522020-10-27 22:55:17 -06008356
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008357 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008358
8359 CreatePipelineHelper g_pipe(*this);
8360 g_pipe.InitInfo();
8361 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8362 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8363 g_pipe.InitState();
8364 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8365
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008366 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_reduction.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008367 g_pipe.descriptor_set_->UpdateDescriptorSets();
8368
8369 m_commandBuffer->begin();
8370 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8371 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8372 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8373 &g_pipe.descriptor_set_->set_, 0, nullptr);
8374
8375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8376 m_commandBuffer->Draw(1, 0, 0, 0);
8377 m_errorMonitor->VerifyFound();
8378
8379 m_commandBuffer->EndRenderPass();
8380 m_commandBuffer->end();
8381 m_commandBuffer->reset();
8382
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008383 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008384 g_pipe.descriptor_set_->UpdateDescriptorSets();
8385
8386 m_commandBuffer->begin();
8387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8388 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8389 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8390 &g_pipe.descriptor_set_->set_, 0, nullptr);
8391
8392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8393 m_commandBuffer->Draw(1, 0, 0, 0);
8394 m_errorMonitor->VerifyFound();
8395
8396 m_commandBuffer->EndRenderPass();
8397 m_commandBuffer->end();
8398}
8399
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008400TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008401 TEST_DESCRIPTION("Verify if sampler is filter cubic with the VK_IMG_filter cubic extension that it's a valid ImageViewType.");
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008402
Clemens Kern5a42ea62021-09-29 16:30:23 +02008403 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8404 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked700bc02022-05-30 16:35:06 +09008405 if (!AreRequiredExtensionsEnabled()) {
8406 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008407 }
8408
8409 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8411
8412 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8413 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008414 auto image_ci = vk_testing::Image::create_info();
8415 image_ci.imageType = VK_IMAGE_TYPE_3D;
8416 image_ci.format = format;
8417 image_ci.extent.width = 128;
8418 image_ci.extent.height = 128;
8419 image_ci.mipLevels = 1;
8420 image_ci.arrayLayers = 1;
8421 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8422 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8423 image_ci.usage = usage;
8424 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008425
8426 VkImageObj image(m_device);
8427 image.Init(image_ci);
8428 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8429 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8430
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008431 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008432 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8433 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008434 vk_testing::Sampler sampler(*m_device, sampler_ci);
8435 ASSERT_TRUE(sampler.initialized());
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008436
Clemens Kern5a42ea62021-09-29 16:30:23 +02008437 static const char fs_src[] = R"glsl(
8438 #version 450
8439 layout(set=0, binding=0) uniform sampler3D s;
8440 layout(location=0) out vec4 x;
8441 void main(){
8442 x = texture(s, vec3(1));
8443 }
8444 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008445 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008446
8447 CreatePipelineHelper g_pipe(*this);
8448 g_pipe.InitInfo();
8449 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8450 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8451 g_pipe.InitState();
8452 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8453
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008454 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008455 g_pipe.descriptor_set_->UpdateDescriptorSets();
8456
8457 m_commandBuffer->begin();
8458 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8459 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8460 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8461 &g_pipe.descriptor_set_->set_, 0, nullptr);
8462
8463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8464 m_commandBuffer->Draw(1, 0, 0, 0);
8465 m_errorMonitor->VerifyFound();
8466
8467 m_commandBuffer->EndRenderPass();
8468 m_commandBuffer->end();
8469}
8470
locke-lunarg0de02522020-10-27 22:55:17 -06008471TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8472 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
sjfricked8e01c52022-07-06 14:09:04 +09008473 SetTargetApiVersion(VK_API_VERSION_1_1);
8474 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
locke-lunarg0de02522020-10-27 22:55:17 -06008475 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8476
sjfricked8e01c52022-07-06 14:09:04 +09008477 if (!AreRequiredExtensionsEnabled()) {
8478 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
8479 }
8480 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8481 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
locke-lunarg0de02522020-10-27 22:55:17 -06008482 }
8483
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008484 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008485 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008486 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008487
8488 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8490
8491 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8492 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8493 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008494 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8495 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008496 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8497 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8498 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8499 return;
8500 }
8501 CreatePipelineHelper pipe(*this);
8502 pipe.InitInfo();
8503 pipe.InitState();
8504 pipe.CreateGraphicsPipeline();
8505
8506 m_commandBuffer->begin();
8507 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8508 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8509
8510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8511 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8512 m_errorMonitor->VerifyFound();
8513
8514 m_commandBuffer->EndRenderPass();
8515 m_commandBuffer->end();
8516}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008517
8518TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8519 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8520
8521 // Enable KHR_fragment_shading_rate and all of its required extensions
8522 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8523 if (fsr_extensions) {
8524 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8525 }
8526 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8527
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008528 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8529 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008530 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8531 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8532 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8533 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008534 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8535 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008536 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8537 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8538 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8539 } else {
8540 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8541 return;
8542 }
8543
sfricke-samsung1c61f192021-12-31 01:53:03 -06008544 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008545 fsr_features.pipelineFragmentShadingRate = true;
8546
sfricke-samsung1c61f192021-12-31 01:53:03 -06008547 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008548
8549 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8550
8551 // Find address of extension call and make the call
8552 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8553 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8554 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8555
8556 VkExtent2D fragmentSize = {1, 1};
8557 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8558 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8559
8560 m_commandBuffer->begin();
8561 fragmentSize.width = 0;
8562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8563 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8564 m_errorMonitor->VerifyFound();
8565 fragmentSize.width = 1;
8566
8567 fragmentSize.height = 0;
8568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8569 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8570 m_errorMonitor->VerifyFound();
8571 fragmentSize.height = 1;
8572
8573 fragmentSize.width = 3;
8574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8575 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8576 m_errorMonitor->VerifyFound();
8577 fragmentSize.width = 1;
8578
8579 fragmentSize.height = 3;
8580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8581 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8582 m_errorMonitor->VerifyFound();
8583 fragmentSize.height = 1;
8584
8585 fragmentSize.width = 8;
8586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8587 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8588 m_errorMonitor->VerifyFound();
8589 fragmentSize.width = 1;
8590
8591 fragmentSize.height = 8;
8592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8593 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8594 m_errorMonitor->VerifyFound();
8595 fragmentSize.height = 1;
8596 m_commandBuffer->end();
8597}
8598
8599TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8600 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8601
8602 // Enable KHR_fragment_shading_rate and all of its required extensions
8603 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8604 if (fsr_extensions) {
8605 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8606 }
8607 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8608
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008609 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8610 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008611 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8612 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8613 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8614 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008615 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8616 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008617 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8618 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8619 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8620 } else {
8621 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8622 return;
8623 }
8624
8625 ASSERT_NO_FATAL_FAILURE(InitState());
8626 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8627
8628 // Find address of extension call and make the call
8629 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8630 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8631 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8632
8633 VkExtent2D fragmentSize = {1, 1};
8634 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8635 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8636
8637 m_commandBuffer->begin();
8638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8639 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8640 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8641 m_errorMonitor->VerifyFound();
8642 m_commandBuffer->end();
8643}
8644
8645TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8646 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8647
8648 // Enable KHR_fragment_shading_rate and all of its required extensions
8649 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8650 if (fsr_extensions) {
8651 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8652 }
8653 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8654
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008655 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8656 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008657 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8658 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8659 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8660 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008661 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8662 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008663 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8664 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8665 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8666 } else {
8667 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8668 return;
8669 }
8670
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008671 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8672 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008673
8674 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8675 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8676 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8677
8678 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8680
8681 // Find address of extension call and make the call
8682 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8683 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8684 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8685
8686 VkExtent2D fragmentSize = {1, 1};
8687 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8688 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8689
8690 m_commandBuffer->begin();
8691
8692 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8694 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8695 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8696 m_errorMonitor->VerifyFound();
8697 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8698
8699 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8701 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8702 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8703 m_errorMonitor->VerifyFound();
8704 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8705
8706 m_commandBuffer->end();
8707}
8708
8709TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8710 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8711
8712 // Enable KHR_fragment_shading_rate and all of its required extensions
8713 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8714 if (fsr_extensions) {
8715 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8716 }
8717 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8718
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008719 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8720 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008721 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8722 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8723 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8724 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008725 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8726 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008727 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8728 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8729 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8730 } else {
8731 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8732 return;
8733 }
8734
8735 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8736 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8737 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008738 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8739 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008740 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8741
8742 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8743 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8744 return;
8745 }
8746
8747 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8748
8749 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8751
8752 // Find address of extension call and make the call
8753 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8754 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8755 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8756
8757 VkExtent2D fragmentSize = {1, 1};
8758 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8759 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8760
8761 m_commandBuffer->begin();
8762 fragmentSize.width = 2;
8763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8764 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8765 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8766 m_errorMonitor->VerifyFound();
8767 fragmentSize.width = 1;
8768
8769 fragmentSize.height = 2;
8770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8771 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8772 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8773 m_errorMonitor->VerifyFound();
8774 fragmentSize.height = 1;
8775}
8776
8777TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8778 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8779
8780 // Enable KHR_fragment_shading_rate and all of its required extensions
8781 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8782 if (fsr_extensions) {
8783 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8784 }
8785 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8786
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008787 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8788 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008789 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8790 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8791 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8792 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008793 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8794 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008795 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8796 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8797 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8798 } else {
8799 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8800 return;
8801 }
8802
8803 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8804 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8805 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8806 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008807 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8808 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008809 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8810
8811 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8812 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8813 return;
8814 }
8815
8816 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8817 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8818 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008819 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8820 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008821 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8822
8823 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8824 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8825 return;
8826 }
8827
8828 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8830
8831 // Find address of extension call and make the call
8832 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8833 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8834 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8835
8836 VkExtent2D fragmentSize = {1, 1};
8837 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8838 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8839
8840 m_commandBuffer->begin();
8841 if (fsr_features.primitiveFragmentShadingRate) {
8842 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8844 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8845 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8846 m_errorMonitor->VerifyFound();
8847 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8848 }
8849
8850 if (fsr_features.attachmentFragmentShadingRate) {
8851 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8853 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8854 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8855 m_errorMonitor->VerifyFound();
8856 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8857 }
8858 m_commandBuffer->end();
8859}
8860
8861TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8862 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8863
8864 // Enable KHR_fragment_shading_rate and all of its required extensions
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008865 AddRequiredExtensions(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8866 AddRequiredExtensions(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8867 ASSERT_NO_FATAL_FAILURE(InitFramework());
8868 if (!AreRequiredExtensionsEnabled()) {
8869 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008870 }
8871
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008872 auto fsr_properties = LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8873 GetPhysicalDeviceProperties2(fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008874
8875 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008876 GTEST_SKIP() << "Test requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008877 }
8878
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008879 auto eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
8880 auto fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8881 auto features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008882
8883 if (!fsr_features.primitiveFragmentShadingRate) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008884 GTEST_SKIP() << "Test requires primitiveFragmentShadingRate to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008885 }
8886
8887 if (!features2.features.multiViewport) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008888 GTEST_SKIP() << "%s requires multiViewport to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008889 }
8890
8891 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8893
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008894 char const *vsSource = R"glsl(
8895 #version 450
8896 #extension GL_EXT_fragment_shading_rate : enable
8897 void main() {
8898 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8899 }
8900 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008901
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008902 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008903
8904 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008905 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8906 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008907 pipe.AddShader(&fs);
8908 pipe.AddDefaultColorAttachment();
8909 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008910 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008911 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008912 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008913 pipe.AddShader(&vs);
8914 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8915 ASSERT_VK_SUCCESS(err);
8916 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008917 m_commandBuffer->begin();
8918 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8919
8920 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8921
8922 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8923 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8924 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8925 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8926
8927 // error produced here.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-primitiveFragmentShadingRateWithMultipleViewports-04552");
Tobias Hector04f2ab22020-12-01 10:59:33 +00008929 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008930 m_errorMonitor->VerifyFound();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008931}
ziga-lunargdada63d2021-07-13 22:10:11 +02008932
8933TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
8934 TEST_DESCRIPTION("Update buffer with invalid dataSize");
8935
8936 ASSERT_NO_FATAL_FAILURE(Init());
8937
8938 uint32_t update_data[4] = {0, 0, 0, 0};
8939 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8940 VkMemoryPropertyFlags reqs = 0;
8941 VkBufferObj buffer;
8942 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8943
8944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
8945 m_commandBuffer->begin();
8946 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
8947 m_commandBuffer->end();
8948 m_errorMonitor->VerifyFound();
8949}
ziga-lunargc08456d2021-07-16 21:40:13 +02008950
8951TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
8952 TEST_DESCRIPTION("Update buffer with invalid dst offset");
8953
8954 ASSERT_NO_FATAL_FAILURE(Init());
8955
8956 uint32_t update_data[4] = {0, 0, 0, 0};
8957 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8958 VkMemoryPropertyFlags reqs = 0;
8959 VkBufferObj buffer;
8960 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8961
8962 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
8963 m_commandBuffer->begin();
8964 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
8965 m_commandBuffer->end();
8966 m_errorMonitor->VerifyFound();
8967}
ziga-lunarg4e31a752021-07-22 14:35:03 +02008968
8969TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
8970 TEST_DESCRIPTION(
8971 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
8972
8973 ASSERT_NO_FATAL_FAILURE(Init());
8974
8975 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
8976 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
8977 if (INVALID_QUEUE == no_gfx_qfi) {
8978 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
8979 return;
8980 }
8981
8982 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
8983 ASSERT_TRUE(command_pool.initialized());
8984 VkCommandBufferObj command_buffer(m_device, &command_pool);
8985
8986 VkDescriptorPoolSize ds_type_count = {};
8987 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8988 ds_type_count.descriptorCount = 1;
8989
8990 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
8991 ds_pool_ci.maxSets = 1;
8992 ds_pool_ci.poolSizeCount = 1;
8993 ds_pool_ci.flags = 0;
8994 ds_pool_ci.pPoolSizes = &ds_type_count;
8995
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008996 vk_testing::DescriptorPool ds_pool(*m_device, ds_pool_ci);
8997 ASSERT_TRUE(ds_pool.initialized());
ziga-lunarg4e31a752021-07-22 14:35:03 +02008998
8999 VkDescriptorSetLayoutBinding dsl_binding = {};
9000 dsl_binding.binding = 0;
9001 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9002 dsl_binding.descriptorCount = 1;
9003 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9004 dsl_binding.pImmutableSamplers = nullptr;
9005
9006 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9007
9008 VkDescriptorSet descriptorSet;
9009 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9010 alloc_info.descriptorSetCount = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009011 alloc_info.descriptorPool = ds_pool.handle();
ziga-lunarg4e31a752021-07-22 14:35:03 +02009012 alloc_info.pSetLayouts = &ds_layout.handle();
9013 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9014
9015 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9016 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9017
9018 command_buffer.begin();
9019 // Set invalid set
9020 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9021 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9022 &descriptorSet, 0, nullptr);
9023 m_errorMonitor->VerifyFound();
9024 command_buffer.end();
9025}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009026
9027TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9028 TEST_DESCRIPTION(
9029 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9030 "occlusion query is active.");
9031 ASSERT_NO_FATAL_FAILURE(Init());
9032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9033
9034 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9035 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9036 qpci.queryCount = 1;
9037
9038 VkQueryPool query_pool;
9039 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9040
9041 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9042
9043 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9044 cbii.renderPass = m_renderPass;
9045 cbii.framebuffer = m_framebuffer;
9046 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9047
9048 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9049 cbbi.pInheritanceInfo = &cbii;
9050
9051 VkCommandBuffer secondary_handle = secondary.handle();
9052 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9053 vk::EndCommandBuffer(secondary_handle);
9054
9055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9056 m_commandBuffer->begin();
9057 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9058 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9059 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9060 m_commandBuffer->end();
9061 m_errorMonitor->VerifyFound();
9062
9063 vk::DestroyQueryPool(device(), query_pool, nullptr);
9064}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009065
9066TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9067 TEST_DESCRIPTION("Test invalid null entries for clear color");
9068
9069 ASSERT_NO_FATAL_FAILURE(InitFramework());
9070 ASSERT_NO_FATAL_FAILURE(InitState());
9071
9072 VkImageObj image(m_device);
9073 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9074
9075 VkImageSubresourceRange isr = {};
9076 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9077 isr.baseArrayLayer = 0;
9078 isr.baseMipLevel = 0;
9079 isr.layerCount = 1;
9080 isr.levelCount = 1;
9081
9082 m_commandBuffer->begin();
9083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9084 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9085 m_errorMonitor->VerifyFound();
9086 m_commandBuffer->end();
9087}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009088
9089TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9090 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9091
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009092 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009093 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009094 if (!AreRequiredExtensionsEnabled()) {
9095 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009096 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009097
9098 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
9099 auto features2 = GetPhysicalDeviceFeatures2(multiview_features);
9100 if (!multiview_features.multiview) {
9101 GTEST_SKIP() << "VkPhysicalDeviceMultiviewFeatures::multiview not supported";
9102 }
9103 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9105
9106 VkAttachmentDescription attachmentDescription = {};
9107 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9108 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009109 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009110 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9111
9112 VkAttachmentReference colorAttachmentReference = {};
9113 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9114 colorAttachmentReference.attachment = 0;
9115
9116 VkSubpassDescription subpassDescription = {};
9117 subpassDescription.colorAttachmentCount = 1;
9118 subpassDescription.pColorAttachments = &colorAttachmentReference;
9119
9120 uint32_t viewMask = 0x1u;
9121 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9122 renderPassMultiviewCreateInfo.subpassCount = 1;
9123 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9124
9125 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9126 renderPassCreateInfo.attachmentCount = 1;
9127 renderPassCreateInfo.pAttachments = &attachmentDescription;
9128 renderPassCreateInfo.subpassCount = 1;
9129 renderPassCreateInfo.pSubpasses = &subpassDescription;
9130
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009131 vk_testing::RenderPass renderPass(*m_device, renderPassCreateInfo);
9132 ASSERT_TRUE(renderPass.initialized());
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009133
9134 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9135 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9136 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9137 image_create_info.extent.width = 32;
9138 image_create_info.extent.height = 32;
9139 image_create_info.extent.depth = 1;
9140 image_create_info.mipLevels = 1;
9141 image_create_info.arrayLayers = 4;
9142 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9143 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9144 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9145 image_create_info.flags = 0;
9146
9147 VkImageObj image(m_device);
9148 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009149 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9150 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009151
9152 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9153 framebufferCreateInfo.width = 32;
9154 framebufferCreateInfo.height = 32;
9155 framebufferCreateInfo.layers = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009156 framebufferCreateInfo.renderPass = renderPass.handle();
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009157 framebufferCreateInfo.attachmentCount = 1;
9158 framebufferCreateInfo.pAttachments = &imageView;
9159
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009160 vk_testing::Framebuffer framebuffer(*m_device, framebufferCreateInfo);
9161 ASSERT_TRUE(framebuffer.initialized());
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009162
9163 // Start no RenderPass
9164 m_commandBuffer->begin();
9165
9166 VkClearAttachment color_attachment;
9167 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9168 color_attachment.clearValue.color.float32[0] = 0;
9169 color_attachment.clearValue.color.float32[1] = 0;
9170 color_attachment.clearValue.color.float32[2] = 0;
9171 color_attachment.clearValue.color.float32[3] = 0;
9172 color_attachment.colorAttachment = 0;
9173
9174 VkClearRect clear_rect = {};
9175 clear_rect.rect.extent.width = 32;
9176 clear_rect.rect.extent.height = 32;
9177
9178 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009179 render_pass_begin_info.renderPass = renderPass.handle();
9180 render_pass_begin_info.framebuffer = framebuffer.handle();
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009181 render_pass_begin_info.renderArea.extent.width = 32;
9182 render_pass_begin_info.renderArea.extent.height = 32;
9183
9184 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9186 clear_rect.layerCount = 2;
9187 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9188 m_errorMonitor->VerifyFound();
9189
9190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9191 clear_rect.baseArrayLayer = 1;
9192 clear_rect.layerCount = 1;
9193 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9194 m_errorMonitor->VerifyFound();
9195}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009196
9197TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9198 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9199
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009200 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009201 ASSERT_NO_FATAL_FAILURE(InitFramework());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009202 if (!AreRequiredExtensionsEnabled()) {
9203 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunargdaff74b2021-08-14 23:16:25 +02009204 }
9205 ASSERT_NO_FATAL_FAILURE(InitState());
9206
9207 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9208 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9209
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009210 auto buffer_ci =
9211 vk_testing::Buffer::create_info(32, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT);
9212 vk_testing::Buffer buffer(*m_device, buffer_ci);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009213
9214 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9215 conditional_rendering_begin.buffer = buffer.handle();
9216
9217 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9218
9219 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9220 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9222 vk::EndCommandBuffer(m_commandBuffer->handle());
9223 m_errorMonitor->VerifyFound();
9224}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009225
9226TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9227 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9228
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009229 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9230 ASSERT_NO_FATAL_FAILURE(InitFramework());
9231 if (!AreRequiredExtensionsEnabled()) {
9232 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009233 }
9234
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009235 auto xfb_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9236 auto features2 = GetPhysicalDeviceFeatures2(xfb_features);
9237 if (!xfb_features.transformFeedback) {
9238 GTEST_SKIP() << "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback not supported.";
9239 }
9240 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9242
9243 CreatePipelineHelper pipe_one(*this);
9244 pipe_one.InitInfo();
9245 pipe_one.InitState();
9246 pipe_one.CreateGraphicsPipeline();
9247
9248 CreatePipelineHelper pipe_two(*this);
9249 pipe_two.InitInfo();
9250 pipe_two.InitState();
9251 pipe_two.CreateGraphicsPipeline();
9252
9253 auto vkCmdBeginTransformFeedbackEXT =
9254 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9255 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9256 auto vkCmdEndTransformFeedbackEXT =
9257 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9258 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9259
9260 m_commandBuffer->begin();
9261 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9262 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9264 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9265 m_errorMonitor->VerifyFound();
9266 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9267 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009268}
9269
9270TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9271 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9272
9273 ASSERT_NO_FATAL_FAILURE(Init());
9274
9275 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9276 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9277
9278 // Load required functions
9279 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9280 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9281 return;
9282 }
9283
9284 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9285
9286 // Set format features from being found
9287 VkFormatProperties formatProps;
9288 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9289 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9290 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9291 return;
9292 }
9293 // Gets pass pipeline creation but not the actual tiling used
9294 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9295 // will be caught at draw time that feature for optimal image is not set
9296 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9297 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9298 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9299
9300 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9301
9302 CreatePipelineHelper pipe(*this);
9303 pipe.InitInfo();
9304 pipe.InitState();
aitor-lunargf15acd52022-03-09 22:13:25 +01009305 pipe.cb_attachments_[0].blendEnable = VK_TRUE;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009306 pipe.CreateGraphicsPipeline();
9307
9308 m_commandBuffer->begin();
9309 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9310 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9311
9312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9313 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9314 m_errorMonitor->VerifyFound();
9315
9316 m_commandBuffer->EndRenderPass();
9317 m_commandBuffer->end();
9318}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009319
9320TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9321 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9322
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009323 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009324 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009325 if (!AreRequiredExtensionsEnabled()) {
9326 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg88c0e392021-09-03 19:14:13 +02009327 }
ziga-lunarg88c0e392021-09-03 19:14:13 +02009328 ASSERT_NO_FATAL_FAILURE(InitState());
9329
9330 VkAttachmentDescription attach[] = {
9331 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9332 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9333 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9334 };
9335 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9336 VkSubpassDescription subpasses[] = {
9337 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9338 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9339 };
9340
9341 VkSubpassDependency dep = {0,
9342 1,
9343 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9344 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9345 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9346 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9347 VK_DEPENDENCY_BY_REGION_BIT};
9348
9349 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9350 rpci.attachmentCount = 1;
9351 rpci.pAttachments = attach;
9352 rpci.subpassCount = 2;
9353 rpci.pSubpasses = subpasses;
9354 rpci.dependencyCount = 1;
9355 rpci.pDependencies = &dep;
9356
9357 vk_testing::RenderPass render_pass;
9358 render_pass.init(*m_device, rpci);
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009359 ASSERT_TRUE(render_pass.initialized());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009360
9361 VkImageObj image(m_device);
9362 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9363 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9364
9365 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9366 fbci.renderPass = render_pass.handle();
9367 fbci.attachmentCount = 1;
9368 fbci.pAttachments = &imageView;
9369 fbci.width = 32;
9370 fbci.height = 32;
9371 fbci.layers = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009372 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9373 ASSERT_TRUE(framebuffer.initialized());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009374
9375 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9376 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9377 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9378 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9379
9380 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9381 buffer_create_info.size = 32;
9382 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9383 VkBufferObj buffer;
9384 buffer.init(*m_device, buffer_create_info);
9385
9386 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9387 conditional_rendering_begin.buffer = buffer.handle();
9388
9389 VkClearValue clear_value;
9390 clear_value.color = m_clear_color;
9391
9392 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9393 rpbi.renderPass = render_pass.handle();
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009394 rpbi.framebuffer = framebuffer.handle();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009395 rpbi.renderArea = {{0, 0}, {32, 32}};
9396 rpbi.clearValueCount = 1;
9397 rpbi.pClearValues = &clear_value;
9398
9399 m_commandBuffer->begin();
9400
9401 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9402 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9403 m_errorMonitor->VerifyFound();
9404
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009405 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9406 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009407 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009408 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009409 m_errorMonitor->VerifyFound();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009410 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9411 vk::CmdEndRenderPass(m_commandBuffer->handle());
9412 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009413
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009414 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9415 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9416 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009418 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009419 m_errorMonitor->VerifyFound();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009420 vk::CmdEndRenderPass(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009421}
ziga-lunarg58255142021-09-12 13:25:17 +02009422
9423TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9424 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9425
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009426 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9427 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
ziga-lunarg58255142021-09-12 13:25:17 +02009428 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009429 if (!AreRequiredExtensionsEnabled()) {
9430 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009431 }
ziga-lunarg58255142021-09-12 13:25:17 +02009432
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009433 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
9434 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(&mv_features);
9435 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
ziga-lunarg58255142021-09-12 13:25:17 +02009436
9437 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009438 GTEST_SKIP() << "transformFeedback not supported; skipped.";
9439 }
9440 if (!mv_features.multiview) {
9441 GTEST_SKIP() << "multiview not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009442 }
9443
9444 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9446
9447 VkAttachmentDescription attachmentDescription = {};
9448 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9449 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009450 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunarg58255142021-09-12 13:25:17 +02009451 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9452
9453 VkAttachmentReference colorAttachmentReference = {};
9454 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9455 colorAttachmentReference.attachment = 0;
9456
9457 VkSubpassDescription subpassDescription = {};
9458 subpassDescription.colorAttachmentCount = 1;
9459 subpassDescription.pColorAttachments = &colorAttachmentReference;
9460
9461 uint32_t viewMask = 0x1u;
9462 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9463 renderPassMultiviewCreateInfo.subpassCount = 1;
9464 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9465
9466 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9467 renderPassCreateInfo.attachmentCount = 1;
9468 renderPassCreateInfo.pAttachments = &attachmentDescription;
9469 renderPassCreateInfo.subpassCount = 1;
9470 renderPassCreateInfo.pSubpasses = &subpassDescription;
9471
9472 vk_testing::RenderPass render_pass;
9473 render_pass.init(*m_device, renderPassCreateInfo);
9474
9475 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9476 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9477 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9478 image_create_info.extent.width = 32;
9479 image_create_info.extent.height = 32;
9480 image_create_info.extent.depth = 1;
9481 image_create_info.mipLevels = 1;
9482 image_create_info.arrayLayers = 4;
9483 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9484 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9485 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9486 image_create_info.flags = 0;
9487
9488 VkImageObj image(m_device);
9489 image.Init(image_create_info);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009490 auto image_view_ci = image.TargetViewCI(VK_FORMAT_R8G8B8A8_UNORM);
9491 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
9492 VkImageView imageView = image.targetView(image_view_ci);
ziga-lunarg58255142021-09-12 13:25:17 +02009493
9494 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9495 framebufferCreateInfo.width = 32;
9496 framebufferCreateInfo.height = 32;
9497 framebufferCreateInfo.layers = 1;
9498 framebufferCreateInfo.renderPass = render_pass.handle();
9499 framebufferCreateInfo.attachmentCount = 1;
9500 framebufferCreateInfo.pAttachments = &imageView;
9501
9502 vk_testing::Framebuffer framebuffer;
9503 framebuffer.init(*m_device, framebufferCreateInfo);
9504
9505 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9506 render_pass_begin_info.renderPass = render_pass.handle();
9507 render_pass_begin_info.framebuffer = framebuffer.handle();
9508 render_pass_begin_info.renderArea.extent.width = 32;
9509 render_pass_begin_info.renderArea.extent.height = 32;
9510
9511 auto vkCmdBeginTransformFeedbackEXT =
9512 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9513 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9514
9515 m_commandBuffer->begin();
9516 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9517
9518 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9519 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9520 m_errorMonitor->VerifyFound();
9521
9522 m_commandBuffer->EndRenderPass();
9523 m_commandBuffer->end();
9524}
stusmithd2f36832021-11-26 11:44:11 +00009525
9526TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9527 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9528
9529 SetTargetApiVersion(VK_API_VERSION_1_1);
9530
stusmithab8e2a22021-12-17 11:20:03 +00009531 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9532
stusmithd2f36832021-11-26 11:44:11 +00009533 ASSERT_NO_FATAL_FAILURE(InitFramework());
9534
sjfricked700bc02022-05-30 16:35:06 +09009535 if (!AreRequiredExtensionsEnabled()) {
9536 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009537 }
9538
9539 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009540 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009541 }
9542
9543 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9544 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9545 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9546 if (!dynamic_rendering_features.dynamicRendering) {
9547 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9548 return;
9549 }
9550
9551 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9552
sfricke-samsung1c61f192021-12-31 01:53:03 -06009553 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009554 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9555
sfricke-samsung1c61f192021-12-31 01:53:03 -06009556 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009557 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
ziga-lunargaa97cbb2022-03-18 19:06:35 +01009558 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009559 begin_rendering_info.colorAttachmentCount = 1;
9560 begin_rendering_info.pColorAttachments = &color_attachment;
9561
9562 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9563
9564 secondary.begin();
9565
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009567 secondary.BeginRendering(begin_rendering_info);
9568 m_errorMonitor->VerifyFound();
9569
9570 secondary.end();
9571}
9572
9573TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9574 TEST_DESCRIPTION(
9575 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9576 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9577
9578 ASSERT_NO_FATAL_FAILURE(Init());
9579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9580
9581 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9582
9583 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9584 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9585 nullptr, // pNext
9586 m_renderPass,
9587 0, // subpass
9588 m_framebuffer,
9589 };
9590
9591 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9592 nullptr, // pNext
9593 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9594 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9595 secondary.begin(&cmdbuff__bi);
9596 secondary.end();
9597
9598 m_commandBuffer->begin();
9599
9600 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9601 nullptr, // pNext
9602 m_renderPass,
9603 m_framebuffer,
9604 {{0, 0}, {32, 32}},
9605 static_cast<uint32_t>(m_renderPassClearValues.size()),
9606 m_renderPassClearValues.data()};
9607
9608 m_commandBuffer->BeginRenderPass(rp_bi);
9609
9610 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009611 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-00095");
stusmithd2f36832021-11-26 11:44:11 +00009612 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9613 m_errorMonitor->VerifyFound();
9614
9615 m_commandBuffer->EndRenderPass();
9616 m_commandBuffer->end();
9617}
9618
9619TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9620 TEST_DESCRIPTION(
9621 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9622 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9623
9624 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009625
stusmithab8e2a22021-12-17 11:20:03 +00009626 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9627
stusmithd2f36832021-11-26 11:44:11 +00009628 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009629
sjfricked700bc02022-05-30 16:35:06 +09009630 if (!AreRequiredExtensionsEnabled()) {
9631 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009632 }
stusmithab8e2a22021-12-17 11:20:03 +00009633
9634 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009635 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009636 }
9637
stusmithd2f36832021-11-26 11:44:11 +00009638 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9639 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9640 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9641 if (!dynamic_rendering_features.dynamicRendering) {
9642 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9643 return;
9644 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009645
stusmithd2f36832021-11-26 11:44:11 +00009646 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9647
9648 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009649
9650 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009651 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9652
sfricke-samsung1c61f192021-12-31 01:53:03 -06009653 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9654 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009655 inheritance_rendering_info.colorAttachmentCount = 1;
9656 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009657 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009658
sfricke-samsung1c61f192021-12-31 01:53:03 -06009659 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009660 begin_rendering_info.colorAttachmentCount = 1;
9661 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009662 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009663
9664 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9665
9666 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9667 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9668 &inheritance_rendering_info, // pNext
9669 VK_NULL_HANDLE,
9670 0, // subpass
9671 VK_NULL_HANDLE,
9672 };
9673
9674 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9675 nullptr, // pNext
9676 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9677 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9678 secondary.begin(&cmdbuff__bi);
9679 secondary.end();
9680
9681 m_commandBuffer->begin();
9682
9683 m_commandBuffer->BeginRendering(begin_rendering_info);
9684
9685 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9686 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9687 m_errorMonitor->VerifyFound();
9688
9689 m_commandBuffer->EndRendering();
9690 m_commandBuffer->end();
9691}
9692
9693TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9694 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9695
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009696 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithd2f36832021-11-26 11:44:11 +00009697 ASSERT_NO_FATAL_FAILURE(InitState());
9698
9699 // A renderpass with two subpasses, both writing the same attachment.
9700 VkAttachmentDescription attach[] = {
9701 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9702 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9703 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9704 };
9705 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9706 VkSubpassDescription subpasses[] = {
9707 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9708 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9709 };
9710
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009711 VkSubpassDependency dependencies = {
9712 0, // srcSubpass
9713 1, // dstSubpass
9714 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // srcStageMask
9715 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // dstStageMask
9716 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
9717 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
9718 0, // dependencyFlags
9719 };
9720
9721 auto rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9722 rpci.attachmentCount = 1;
9723 rpci.pAttachments = attach;
9724 rpci.subpassCount = 2;
9725 rpci.pSubpasses = subpasses;
9726 rpci.dependencyCount = 1;
9727 rpci.pDependencies = &dependencies;
9728 vk_testing::RenderPass render_pass(*m_device, rpci);
9729 ASSERT_TRUE(render_pass.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009730
9731 VkImageObj image(m_device);
9732 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9733 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9734
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009735 VkFramebufferCreateInfo fbci = {
9736 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass.handle(), 1, &imageView, 32, 32, 1};
9737 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9738 ASSERT_TRUE(framebuffer.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009739
9740 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9741
9742 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9743 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9744 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009745 render_pass.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009746 1, // subpass
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009747 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009748 };
9749
9750 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9751 nullptr, // pNext
9752 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9753 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9754 secondary.begin(&cmdbuff__bi);
9755 secondary.end();
9756
9757 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9758 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009759 render_pass.handle(),
9760 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009761 {{0, 0}, {32, 32}},
9762 0,
9763 nullptr};
9764
9765 m_commandBuffer->begin();
9766 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9767
9768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00097");
stusmithd2f36832021-11-26 11:44:11 +00009770 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9771 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +00009772}
9773
9774TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9775 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9776
9777 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9778 ASSERT_NO_FATAL_FAILURE(InitState());
9779
9780 // A renderpass with two subpasses, both writing the same attachment.
9781 VkAttachmentDescription attach[] = {
9782 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9783 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9784 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9785 };
9786 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9787 VkSubpassDescription subpasses[] = {
9788 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9789 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9790 };
9791
9792 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9793 VkRenderPass render_pass_1;
9794 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9795 ASSERT_VK_SUCCESS(err);
9796
9797 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9798 VkRenderPass render_pass_2;
9799 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9800 ASSERT_VK_SUCCESS(err);
9801
9802 VkImageObj image(m_device);
9803 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9804 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9805
9806 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9807 VkFramebuffer framebuffer;
9808 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9809 ASSERT_VK_SUCCESS(err);
9810
9811 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9812
9813 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9814 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9815 nullptr, // pNext
9816 render_pass_2,
9817 0, // subpass
9818 VK_NULL_HANDLE,
9819 };
9820
9821 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9822 nullptr, // pNext
9823 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9824 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9825 secondary.begin(&cmdbuff__bi);
9826 secondary.end();
9827
9828 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9829 nullptr, // pNext
9830 render_pass_1,
9831 framebuffer,
9832 {{0, 0}, {32, 32}},
9833 0,
9834 nullptr};
9835
9836 m_commandBuffer->begin();
9837 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9838
9839 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009840 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
stusmithd2f36832021-11-26 11:44:11 +00009841 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9842 m_errorMonitor->VerifyFound();
9843
9844 m_commandBuffer->EndRenderPass();
9845 m_commandBuffer->end();
9846
9847 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9848 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
9849 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
9850}
9851
9852TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
9853 TEST_DESCRIPTION(
9854 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9855 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
9856
9857 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009858
stusmithab8e2a22021-12-17 11:20:03 +00009859 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9860
stusmithd2f36832021-11-26 11:44:11 +00009861 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009862
sjfricked700bc02022-05-30 16:35:06 +09009863 if (!AreRequiredExtensionsEnabled()) {
9864 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009865 }
stusmithab8e2a22021-12-17 11:20:03 +00009866
9867 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009868 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009869 }
9870
stusmithd2f36832021-11-26 11:44:11 +00009871 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9872 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9873 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9874 if (!dynamic_rendering_features.dynamicRendering) {
9875 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9876 return;
9877 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009878
stusmithd2f36832021-11-26 11:44:11 +00009879 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9880
9881 VkAttachmentDescription attach[] = {
9882 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9883 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9884 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9885 };
9886 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9887 VkSubpassDescription subpasses[] = {
9888 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9889 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9890 };
9891
9892 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9893 VkRenderPass render_pass;
9894 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9895 ASSERT_VK_SUCCESS(err);
9896
9897 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009898
9899 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009900 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9901
sfricke-samsung1c61f192021-12-31 01:53:03 -06009902 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9903 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009904 inheritance_rendering_info.colorAttachmentCount = 1;
9905 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009906 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009907
sfricke-samsung1c61f192021-12-31 01:53:03 -06009908 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009909 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9910 begin_rendering_info.colorAttachmentCount = 1;
9911 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009912 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009913
9914 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9915
9916 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9917 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9918 &inheritance_rendering_info, // pNext
9919 render_pass,
9920 0, // subpass
9921 VK_NULL_HANDLE,
9922 };
9923
9924 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9925 nullptr, // pNext
9926 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9927 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9928 secondary.begin(&cmdbuff__bi);
9929 secondary.end();
9930
9931 m_commandBuffer->begin();
9932
9933 m_commandBuffer->BeginRendering(begin_rendering_info);
9934
9935 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
9936 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9937 m_errorMonitor->VerifyFound();
9938
9939 m_commandBuffer->EndRendering();
9940 m_commandBuffer->end();
9941
9942 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9943}
9944
9945TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
9946 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
9947
9948 SetTargetApiVersion(VK_API_VERSION_1_1);
9949
stusmithab8e2a22021-12-17 11:20:03 +00009950 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9951
stusmithd2f36832021-11-26 11:44:11 +00009952 ASSERT_NO_FATAL_FAILURE(InitFramework());
9953
sjfricked700bc02022-05-30 16:35:06 +09009954 if (!AreRequiredExtensionsEnabled()) {
9955 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009956 }
9957
9958 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009959 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009960 }
9961
9962 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9963 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9964 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9965 if (!dynamic_rendering_features.dynamicRendering) {
9966 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9967 return;
9968 }
9969
9970 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9971
9972 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
9973
sfricke-samsung1c61f192021-12-31 01:53:03 -06009974 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009975 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9976
sfricke-samsung1c61f192021-12-31 01:53:03 -06009977 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9978 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009979 inheritance_rendering_info.colorAttachmentCount = 1;
9980 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009981 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009982
sfricke-samsung1c61f192021-12-31 01:53:03 -06009983 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009984 begin_rendering_info.flags =
9985 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
9986 begin_rendering_info.colorAttachmentCount = 1;
9987 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009988 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009989
9990 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9991
9992 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9993 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9994 &inheritance_rendering_info, // pNext
9995 VK_NULL_HANDLE,
9996 0, // subpass
9997 VK_NULL_HANDLE,
9998 };
9999
10000 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10001 nullptr, // pNext
10002 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10003 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10004 secondary.begin(&cmdbuff__bi);
10005 secondary.end();
10006
10007 m_commandBuffer->begin();
10008
10009 m_commandBuffer->BeginRendering(begin_rendering_info);
10010
10011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10012 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10013 m_errorMonitor->VerifyFound();
10014
10015 m_commandBuffer->EndRendering();
10016 m_commandBuffer->end();
10017}
10018
10019TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10020 TEST_DESCRIPTION(
10021 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
10022
10023 SetTargetApiVersion(VK_API_VERSION_1_1);
10024
stusmithab8e2a22021-12-17 11:20:03 +000010025 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10026
stusmithd2f36832021-11-26 11:44:11 +000010027 ASSERT_NO_FATAL_FAILURE(InitFramework());
10028
sjfricked700bc02022-05-30 16:35:06 +090010029 if (!AreRequiredExtensionsEnabled()) {
10030 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010031 }
10032
10033 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010034 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010035 }
10036
10037 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10038 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10039 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10040 if (!dynamic_rendering_features.dynamicRendering) {
10041 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10042 return;
10043 }
10044
10045 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10046
10047 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10048
sfricke-samsung1c61f192021-12-31 01:53:03 -060010049 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010050 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10051
sfricke-samsung1c61f192021-12-31 01:53:03 -060010052 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10053 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010054 inheritance_rendering_info.colorAttachmentCount = 0;
10055 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010056 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010057
sfricke-samsung1c61f192021-12-31 01:53:03 -060010058 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010059 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10060 begin_rendering_info.colorAttachmentCount = 1;
10061 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010062 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010063
10064 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10065
10066 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10067 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10068 &inheritance_rendering_info, // pNext
10069 VK_NULL_HANDLE,
10070 0, // subpass
10071 VK_NULL_HANDLE,
10072 };
10073
10074 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10075 nullptr, // pNext
10076 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10077 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10078 secondary.begin(&cmdbuff__bi);
10079 secondary.end();
10080
10081 m_commandBuffer->begin();
10082
10083 m_commandBuffer->BeginRendering(begin_rendering_info);
10084
10085 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10086 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10087 m_errorMonitor->VerifyFound();
10088
10089 m_commandBuffer->EndRendering();
10090 m_commandBuffer->end();
10091}
10092
10093TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10094 TEST_DESCRIPTION(
10095 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10096
10097 SetTargetApiVersion(VK_API_VERSION_1_1);
10098
stusmithab8e2a22021-12-17 11:20:03 +000010099 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10100
stusmithd2f36832021-11-26 11:44:11 +000010101 ASSERT_NO_FATAL_FAILURE(InitFramework());
10102
sjfricked700bc02022-05-30 16:35:06 +090010103 if (!AreRequiredExtensionsEnabled()) {
10104 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010105 }
10106
10107 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010108 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010109 }
10110
10111 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10112 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10113 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10114 if (!dynamic_rendering_features.dynamicRendering) {
10115 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10116 return;
10117 }
10118
10119 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10120
10121 VkImageObj image(m_device);
10122 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10123 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10124
sfricke-samsung1c61f192021-12-31 01:53:03 -060010125 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010126 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10127 color_attachment.imageView = imageView;
10128
10129 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10130
sfricke-samsung1c61f192021-12-31 01:53:03 -060010131 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10132 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010133 inheritance_rendering_info.colorAttachmentCount = 1;
10134 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010135 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010136
sfricke-samsung1c61f192021-12-31 01:53:03 -060010137 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010138 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10139 begin_rendering_info.colorAttachmentCount = 1;
10140 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010141 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010142
10143 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10144
10145 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10146 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10147 &inheritance_rendering_info, // pNext
10148 VK_NULL_HANDLE,
10149 0, // subpass
10150 VK_NULL_HANDLE,
10151 };
10152
10153 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10154 nullptr, // pNext
10155 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10156 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10157 secondary.begin(&cmdbuff__bi);
10158 secondary.end();
10159
10160 m_commandBuffer->begin();
10161
10162 m_commandBuffer->BeginRendering(begin_rendering_info);
10163
10164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10165 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10166 m_errorMonitor->VerifyFound();
10167
10168 m_commandBuffer->EndRendering();
10169 m_commandBuffer->end();
10170}
10171
10172TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10173 TEST_DESCRIPTION(
10174 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10175 "format");
10176
10177 SetTargetApiVersion(VK_API_VERSION_1_1);
10178
stusmithab8e2a22021-12-17 11:20:03 +000010179 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10180
stusmithd2f36832021-11-26 11:44:11 +000010181 ASSERT_NO_FATAL_FAILURE(InitFramework());
10182
sjfricked700bc02022-05-30 16:35:06 +090010183 if (!AreRequiredExtensionsEnabled()) {
10184 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010185 }
10186
10187 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010188 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010189 }
10190
10191 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10192 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10193 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10194 if (!dynamic_rendering_features.dynamicRendering) {
10195 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10196 return;
10197 }
10198
10199 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10200
10201 VkImageObj image(m_device);
10202 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10203 if (!depth_stencil_format) {
10204 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10205 return;
10206 }
10207 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10208 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10209
sfricke-samsung1c61f192021-12-31 01:53:03 -060010210 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010211 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10212 depth_stencil_attachment.imageView = imageView;
10213
sfricke-samsung1c61f192021-12-31 01:53:03 -060010214 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10215 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010216 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
10217 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010218 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010219
sfricke-samsung1c61f192021-12-31 01:53:03 -060010220 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010221 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10222 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10223 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010224 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010225
10226 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10227
10228 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10229 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10230 &inheritance_rendering_info, // pNext
10231 VK_NULL_HANDLE,
10232 0, // subpass
10233 VK_NULL_HANDLE,
10234 };
10235
10236 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10237 nullptr, // pNext
10238 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10239 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10240 secondary.begin(&cmdbuff__bi);
10241 secondary.end();
10242
10243 m_commandBuffer->begin();
10244
10245 m_commandBuffer->BeginRendering(begin_rendering_info);
10246
10247 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10249 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10250 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010251}
10252
10253TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10254 TEST_DESCRIPTION(
10255 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10256
10257 SetTargetApiVersion(VK_API_VERSION_1_1);
10258
stusmithab8e2a22021-12-17 11:20:03 +000010259 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10260
stusmithd2f36832021-11-26 11:44:11 +000010261 ASSERT_NO_FATAL_FAILURE(InitFramework());
10262
sjfricked700bc02022-05-30 16:35:06 +090010263 if (!AreRequiredExtensionsEnabled()) {
10264 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010265 }
10266
10267 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010268 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010269 }
10270
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010271 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
10272 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(&mv_features);
10273 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +000010274 if (!dynamic_rendering_features.dynamicRendering) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010275 GTEST_SKIP() << "Test requires (unsupported) dynamicRendering , skipping.";
10276 }
10277 if (!mv_features.multiview) {
10278 GTEST_SKIP() << "multiview feature not supported.";
stusmithd2f36832021-11-26 11:44:11 +000010279 }
10280
10281 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10282
sfricke-samsung1c61f192021-12-31 01:53:03 -060010283 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010284 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10285
10286 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10287
sfricke-samsung1c61f192021-12-31 01:53:03 -060010288 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10289 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010290 inheritance_rendering_info.viewMask = 0;
10291 inheritance_rendering_info.colorAttachmentCount = 1;
10292 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010293 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010294
sfricke-samsung1c61f192021-12-31 01:53:03 -060010295 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010296 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10297 begin_rendering_info.viewMask = 1;
10298 begin_rendering_info.colorAttachmentCount = 1;
10299 begin_rendering_info.pColorAttachments = &color_attachment;
10300
10301 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10302
10303 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10304 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10305 &inheritance_rendering_info, // pNext
10306 VK_NULL_HANDLE,
10307 0, // subpass
10308 VK_NULL_HANDLE,
10309 };
10310
10311 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10312 nullptr, // pNext
10313 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10314 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10315 secondary.begin(&cmdbuff__bi);
10316 secondary.end();
10317
10318 m_commandBuffer->begin();
10319
10320 m_commandBuffer->BeginRendering(begin_rendering_info);
10321
10322 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10323 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10324 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010325}
stusmithcba0c502021-12-21 17:16:28 +000010326
10327TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10328 TEST_DESCRIPTION(
10329 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10330
10331 SetTargetApiVersion(VK_API_VERSION_1_1);
10332
10333 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10334
10335 ASSERT_NO_FATAL_FAILURE(InitFramework());
10336
sjfricked700bc02022-05-30 16:35:06 +090010337 if (!AreRequiredExtensionsEnabled()) {
10338 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010339 }
10340
10341 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010342 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010343 }
10344
10345 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10346 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10347 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10348 if (!dynamic_rendering_features.dynamicRendering) {
10349 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10350 return;
10351 }
10352
10353 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10354
10355 VkImageObj image(m_device);
10356 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10357 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10358
sfricke-samsung1c61f192021-12-31 01:53:03 -060010359 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010360 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10361 color_attachment.imageView = imageView;
10362
10363 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10364
sfricke-samsung1c61f192021-12-31 01:53:03 -060010365 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10366 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010367 inheritance_rendering_info.colorAttachmentCount = 1;
10368 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10369 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10370
sfricke-samsung1c61f192021-12-31 01:53:03 -060010371 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010372 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10373 begin_rendering_info.colorAttachmentCount = 1;
10374 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010375 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010376
10377 // A pool we can reset in.
10378 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10379 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10380
10381 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10382 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10383 &inheritance_rendering_info, // pNext
10384 VK_NULL_HANDLE,
10385 0, // subpass
10386 VK_NULL_HANDLE,
10387 };
10388
10389 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10390 nullptr, // pNext
10391 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10392 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10393 secondary.begin(&cmdbuff__bi);
10394 secondary.end();
10395
10396 m_commandBuffer->begin();
10397
10398 // color samples mismatch
10399 m_commandBuffer->BeginRendering(begin_rendering_info);
10400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10401 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10402 m_errorMonitor->VerifyFound();
10403 m_commandBuffer->EndRendering();
10404
10405 VkImageObj depthStencilImage(m_device);
10406 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10407 if (!depth_stencil_format) {
10408 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10409 return;
10410 }
10411 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10412 0);
10413 VkImageView depthStencilImageView =
10414 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10415
sfricke-samsung1c61f192021-12-31 01:53:03 -060010416 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010417 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10418 depth_stencil_attachment.imageView = depthStencilImageView;
10419
10420 begin_rendering_info.colorAttachmentCount = 0;
10421 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10422 inheritance_rendering_info.colorAttachmentCount = 0;
10423 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10424
10425 secondary.begin(&cmdbuff__bi);
10426 secondary.end();
10427
10428 // depth samples mismatch
10429 m_commandBuffer->BeginRendering(begin_rendering_info);
10430 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10431 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10432 m_errorMonitor->VerifyFound();
10433 m_commandBuffer->EndRendering();
10434
10435 begin_rendering_info.pDepthAttachment = nullptr;
10436 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10437 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10438 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10439
10440 secondary.begin(&cmdbuff__bi);
10441 secondary.end();
10442
10443 // stencil samples mismatch
10444 m_commandBuffer->BeginRendering(begin_rendering_info);
10445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10446 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10447 m_errorMonitor->VerifyFound();
10448 m_commandBuffer->EndRendering();
10449
10450 m_commandBuffer->end();
10451}
10452
10453TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10454 TEST_DESCRIPTION(
10455 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10456 "attachment samples");
10457
10458 SetTargetApiVersion(VK_API_VERSION_1_1);
10459
10460 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10461
10462 ASSERT_NO_FATAL_FAILURE(InitFramework());
10463
sjfricked700bc02022-05-30 16:35:06 +090010464 if (!AreRequiredExtensionsEnabled()) {
10465 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010466 }
10467
10468 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010469 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010470 }
10471
10472 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10473 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10474 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10475 if (!dynamic_rendering_features.dynamicRendering) {
10476 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10477 return;
10478 }
10479
10480 bool amd_samples = false;
10481 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10482 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10483 amd_samples = true;
10484 }
10485
10486 bool nv_samples = false;
10487 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10488 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10489 nv_samples = true;
10490 }
10491
10492 if (!amd_samples && !nv_samples) {
10493 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10494 kSkipPrefix);
10495 return;
10496 }
10497
10498 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10499
10500 VkImageObj image(m_device);
10501 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10502 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10503
sfricke-samsung1c61f192021-12-31 01:53:03 -060010504 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010505 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10506 color_attachment.imageView = imageView;
10507
10508 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10509
10510 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10511 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10512 samples_info.colorAttachmentCount = 1;
10513 samples_info.pColorAttachmentSamples = &counts;
10514
10515 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010516 inheritance_rendering_info.colorAttachmentCount = 1;
10517 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10518 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10519
sfricke-samsung1c61f192021-12-31 01:53:03 -060010520 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010521 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10522 begin_rendering_info.colorAttachmentCount = 1;
10523 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010524 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010525
10526 // A pool we can reset in.
10527 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10528 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10529
10530 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10531 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10532 &inheritance_rendering_info, // pNext
10533 VK_NULL_HANDLE,
10534 0, // subpass
10535 VK_NULL_HANDLE,
10536 };
10537
10538 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10539 nullptr, // pNext
10540 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10541 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10542 secondary.begin(&cmdbuff__bi);
10543 secondary.end();
10544
10545 m_commandBuffer->begin();
10546
10547 // color samples mismatch
10548 m_commandBuffer->BeginRendering(begin_rendering_info);
10549 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10550 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10551 m_errorMonitor->VerifyFound();
10552 m_commandBuffer->EndRendering();
10553
10554 VkImageObj depthStencilImage(m_device);
10555 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10556 if (!depth_stencil_format) {
10557 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10558 return;
10559 }
10560 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10561 0);
10562 VkImageView depthStencilImageView =
10563 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10564
sfricke-samsung1c61f192021-12-31 01:53:03 -060010565 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010566 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10567 depth_stencil_attachment.imageView = depthStencilImageView;
10568
10569 samples_info.colorAttachmentCount = 0;
10570 samples_info.pColorAttachmentSamples = nullptr;
10571 begin_rendering_info.colorAttachmentCount = 0;
10572 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10573 inheritance_rendering_info.colorAttachmentCount = 0;
10574 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10575 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10576
10577 secondary.begin(&cmdbuff__bi);
10578 secondary.end();
10579
10580 // depth samples mismatch
10581 m_commandBuffer->BeginRendering(begin_rendering_info);
10582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10583 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10584 m_errorMonitor->VerifyFound();
10585 m_commandBuffer->EndRendering();
10586
10587 begin_rendering_info.pDepthAttachment = nullptr;
10588 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10589 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10590 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10591
10592 secondary.begin(&cmdbuff__bi);
10593 secondary.end();
10594
10595 // stencil samples mismatch
10596 m_commandBuffer->BeginRendering(begin_rendering_info);
10597 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10598 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10599 m_errorMonitor->VerifyFound();
10600 m_commandBuffer->EndRendering();
10601
10602 m_commandBuffer->end();
10603}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010604
10605TEST_F(VkLayerTest, CopyCommands2V13) {
10606 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10607
10608 SetTargetApiVersion(VK_API_VERSION_1_3);
10609 ASSERT_NO_FATAL_FAILURE(Init());
10610 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010611 GTEST_SKIP() << "At least Vulkan version 1.3 is required";
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010612 }
10613 VkImageObj image(m_device);
10614 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 +020010615 VkImageObj image2(m_device);
10616 image2.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10617 VK_IMAGE_TILING_OPTIMAL, 0);
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010618 ASSERT_TRUE(image.initialized());
10619 VkBufferObj dst_buffer;
10620 VkMemoryPropertyFlags reqs = 0;
10621 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10622 VkBufferObj src_buffer;
10623 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10624 auto copy_region = LvlInitStruct<VkImageCopy2>();
10625 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10626 copy_region.srcSubresource.layerCount = 1;
10627 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10628 copy_region.dstSubresource.layerCount = 1;
10629 copy_region.dstOffset = {4, 4, 0};
10630 copy_region.extent.width = 1;
10631 copy_region.extent.height = 1;
10632 copy_region.extent.depth = 1;
10633 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10634 copy_image_info.srcImage = image.handle();
10635 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10636 copy_image_info.dstImage = image.handle();
10637 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10638 copy_image_info.regionCount = 1;
10639 copy_image_info.pRegions = &copy_region;
10640 m_commandBuffer->begin();
10641 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10642 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10643 m_errorMonitor->VerifyFound();
10644 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
ziga-lunarg852187f2022-03-16 21:21:33 +010010645 copy_buffer.dstOffset = 4;
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010646 copy_buffer.size = 4;
10647 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10648 copy_buffer_info.srcBuffer = dst_buffer.handle();
10649 copy_buffer_info.dstBuffer = dst_buffer.handle();
10650 copy_buffer_info.regionCount = 1;
10651 copy_buffer_info.pRegions = &copy_buffer;
10652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10653 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10654 m_errorMonitor->VerifyFound();
10655 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10656 bic_region.bufferRowLength = 128;
10657 bic_region.bufferImageHeight = 128;
10658 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10659 bic_region.imageSubresource.layerCount = 1;
10660 bic_region.imageExtent.height = 4;
10661 bic_region.imageExtent.width = 4;
10662 bic_region.imageExtent.depth = 1;
10663 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10664 buffer_image_info.srcBuffer = src_buffer.handle();
10665 buffer_image_info.dstImage = image.handle();
10666 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10667 buffer_image_info.regionCount = 1;
10668 buffer_image_info.pRegions = &bic_region;
10669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10670 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10671 m_errorMonitor->VerifyFound();
10672 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10673 image_buffer_info.dstBuffer = src_buffer.handle();
10674 image_buffer_info.srcImage = image.handle();
10675 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10676 image_buffer_info.regionCount = 1;
10677 image_buffer_info.pRegions = &bic_region;
10678 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10679 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10680 m_errorMonitor->VerifyFound();
10681 auto blit_region = LvlInitStruct<VkImageBlit2>();
10682 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10683 blit_region.srcSubresource.baseArrayLayer = 0;
10684 blit_region.srcSubresource.layerCount = 1;
10685 blit_region.srcSubresource.mipLevel = 0;
10686 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10687 blit_region.dstSubresource.baseArrayLayer = 0;
10688 blit_region.dstSubresource.layerCount = 1;
10689 blit_region.dstSubresource.mipLevel = 0;
10690 blit_region.srcOffsets[0] = {0, 0, 0};
aitor-lunarg3ad811f2022-03-31 22:00:39 +020010691 blit_region.srcOffsets[1] = {31, 31, 1};
10692 blit_region.dstOffsets[0] = {32, 32, 0};
10693 blit_region.dstOffsets[1] = {64, 64, 1};
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010694 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10695 blit_image_info.srcImage = image.handle();
10696 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10697 blit_image_info.dstImage = image.handle();
10698 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10699 blit_image_info.regionCount = 1;
10700 blit_image_info.pRegions = &blit_region;
10701 blit_image_info.filter = VK_FILTER_NEAREST;
10702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10703 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10704 m_errorMonitor->VerifyFound();
10705 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10706 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10707 resolve_region.srcSubresource.mipLevel = 0;
10708 resolve_region.srcSubresource.baseArrayLayer = 0;
10709 resolve_region.srcSubresource.layerCount = 1;
10710 resolve_region.srcOffset.x = 0;
10711 resolve_region.srcOffset.y = 0;
10712 resolve_region.srcOffset.z = 0;
10713 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10714 resolve_region.dstSubresource.mipLevel = 0;
10715 resolve_region.dstSubresource.baseArrayLayer = 0;
10716 resolve_region.dstSubresource.layerCount = 1;
10717 resolve_region.dstOffset.x = 0;
10718 resolve_region.dstOffset.y = 0;
10719 resolve_region.dstOffset.z = 0;
10720 resolve_region.extent.width = 1;
10721 resolve_region.extent.height = 1;
10722 resolve_region.extent.depth = 1;
10723 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10724 resolve_image_info.srcImage = image.handle();
10725 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
ziga-lunarg0ce51882022-05-18 14:36:48 +020010726 resolve_image_info.dstImage = image2.handle();
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010727 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10728 resolve_image_info.regionCount = 1;
10729 resolve_image_info.pRegions = &resolve_region;
10730 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10731 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10732 m_errorMonitor->VerifyFound();
10733}
aitor-lunarga131fca2022-02-17 22:55:55 +010010734
10735TEST_F(VkLayerTest, ValidateMultiviewUnboundResourcesAfterBeginRenderPassAndNextSubpass) {
10736 TEST_DESCRIPTION(
10737 "Validate all required resources are bound if multiview is enabled after vkCmdBeginRenderPass and vkCmdNextSubpass");
10738
Aitor Camacho768bbc92022-06-10 16:57:44 +020010739 m_errorMonitor->ExpectSuccess();
10740
10741 constexpr unsigned multiview_count = 2u;
10742 constexpr unsigned extra_subpass_count = multiview_count - 1u;
10743
sjfricked700bc02022-05-30 16:35:06 +090010744 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
aitor-lunarga131fca2022-02-17 22:55:55 +010010745 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +090010746 if (!AreRequiredExtensionsEnabled()) {
10747 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
aitor-lunarga131fca2022-02-17 22:55:55 +010010748 }
10749
10750 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
Aitor Camacho768bbc92022-06-10 16:57:44 +020010751 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multiview_features);
10752 auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
10753 vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR"));
10754 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
10755 if (multiview_features.multiview == VK_FALSE) {
10756 GTEST_SKIP() << "Device does not support multiview.";
10757 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010758
Aitor Camacho768bbc92022-06-10 16:57:44 +020010759 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
aitor-lunarga131fca2022-02-17 22:55:55 +010010760
10761 VkAttachmentDescription attachmentDescription = {};
10762 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
10763 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010764 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
aitor-lunarga131fca2022-02-17 22:55:55 +010010765 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
10766
10767 VkAttachmentReference colorAttachmentReference = {};
10768 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
10769 colorAttachmentReference.attachment = 0;
10770
Aitor Camacho768bbc92022-06-10 16:57:44 +020010771 m_renderPass_subpasses.resize(multiview_count);
10772 for (unsigned i = 0; i < multiview_count; ++i) {
10773 m_renderPass_subpasses[i].colorAttachmentCount = 1;
10774 m_renderPass_subpasses[i].pColorAttachments = &colorAttachmentReference;
10775 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010776
Aitor Camacho768bbc92022-06-10 16:57:44 +020010777 uint32_t viewMasks[multiview_count] = {};
10778 for (unsigned i = 0; i < multiview_count; ++i) {
10779 viewMasks[i] = 1u << i;
10780 }
10781 auto renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
10782 renderPassMultiviewCreateInfo.subpassCount = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010783 renderPassMultiviewCreateInfo.pViewMasks = viewMasks;
10784
10785 m_renderPass_info = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
10786 m_renderPass_info.attachmentCount = 1;
10787 m_renderPass_info.pAttachments = &attachmentDescription;
10788 m_renderPass_info.subpassCount = m_renderPass_subpasses.size();
10789 m_renderPass_info.pSubpasses = m_renderPass_subpasses.data();
10790
Aitor Camacho768bbc92022-06-10 16:57:44 +020010791 m_renderPass_dependencies.resize(extra_subpass_count);
10792 for (unsigned i = 0; i < m_renderPass_dependencies.size(); ++i) {
10793 auto &subpass_dep = m_renderPass_dependencies[i];
10794 subpass_dep.srcSubpass = i;
10795 subpass_dep.dstSubpass = i + 1;
10796
10797 subpass_dep.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10798 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10799 subpass_dep.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10800 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10801
10802 subpass_dep.srcAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10803 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10804 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10805 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10806 subpass_dep.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10807 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10808 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10809 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10810
10811 subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
10812 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010813
10814 m_renderPass_info.dependencyCount = static_cast<uint32_t>(m_renderPass_dependencies.size());
10815 m_renderPass_info.pDependencies = m_renderPass_dependencies.data();
10816
10817 vk::CreateRenderPass(m_device->handle(), &m_renderPass_info, nullptr, &m_renderPass);
10818
Aitor Camacho768bbc92022-06-10 16:57:44 +020010819 auto image_create_info = LvlInitStruct<VkImageCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010820 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10821 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
10822 image_create_info.extent.width = static_cast<uint32_t>(m_width);
10823 image_create_info.extent.height = static_cast<uint32_t>(m_height);
10824 image_create_info.extent.depth = 1;
10825 image_create_info.mipLevels = 1;
Aitor Camacho768bbc92022-06-10 16:57:44 +020010826 image_create_info.arrayLayers = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010827 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10828 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10829 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10830 image_create_info.flags = 0;
10831
10832 VkImageObj image(m_device);
10833 image.Init(image_create_info);
Aitor Camacho768bbc92022-06-10 16:57:44 +020010834 image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
aitor-lunarga131fca2022-02-17 22:55:55 +010010835 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
10836 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
10837
Aitor Camacho768bbc92022-06-10 16:57:44 +020010838 auto framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010839 framebufferCreateInfo.width = static_cast<uint32_t>(m_width);
10840 framebufferCreateInfo.height = static_cast<uint32_t>(m_height);
10841 framebufferCreateInfo.layers = 1;
10842 framebufferCreateInfo.renderPass = m_renderPass;
10843 framebufferCreateInfo.attachmentCount = 1;
10844 framebufferCreateInfo.pAttachments = &imageView;
10845
10846 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &m_framebuffer);
10847
10848 VkClearValue clear{};
10849 clear.color = m_clear_color;
10850 m_renderPassClearValues.emplace_back(clear);
10851 m_renderPassBeginInfo.renderPass = m_renderPass;
10852 m_renderPassBeginInfo.framebuffer = m_framebuffer;
10853 m_renderPassBeginInfo.renderArea.extent.width = static_cast<uint32_t>(m_width);
10854 m_renderPassBeginInfo.renderArea.extent.height = static_cast<uint32_t>(m_height);
10855 m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size();
10856 m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data();
10857
Aitor Camacho768bbc92022-06-10 16:57:44 +020010858 // Pipeline not bound test
10859 {
10860 // No need to create individual pipelines for each subpass since we are checking no bound pipeline
10861 CreatePipelineHelper pipe(*this);
10862 pipe.InitInfo();
10863 pipe.InitState();
10864 pipe.CreateGraphicsPipeline();
aitor-lunarga131fca2022-02-17 22:55:55 +010010865
Aitor Camacho768bbc92022-06-10 16:57:44 +020010866 m_commandBuffer->begin();
10867 // This bind should not be valid after we begin the renderpass
10868 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10869 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10870 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010871
Aitor Camacho768bbc92022-06-10 16:57:44 +020010872 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10873 m_commandBuffer->Draw(1, 0, 0, 0);
10874 m_errorMonitor->VerifyFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010875
Aitor Camacho768bbc92022-06-10 16:57:44 +020010876 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10877 m_errorMonitor->ExpectSuccess();
aitor-lunarga131fca2022-02-17 22:55:55 +010010878
Aitor Camacho768bbc92022-06-10 16:57:44 +020010879 // This bind should not be valid for next subpass
10880 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10881 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10882 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010883
Aitor Camacho768bbc92022-06-10 16:57:44 +020010884 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10885 m_commandBuffer->Draw(1, 0, 0, 0);
10886 m_errorMonitor->VerifyFound();
10887 }
10888
10889 m_errorMonitor->ExpectSuccess();
10890 m_commandBuffer->EndRenderPass();
10891 m_commandBuffer->end();
10892 }
10893
10894 m_commandBuffer->reset();
10895
Aitor Camacho131d2192022-06-13 19:15:11 +020010896 // Dynamic state (checking with line width)
10897 {
10898 // Pipeline for subpass 0
10899 CreatePipelineHelper pipe(*this);
10900 pipe.InitInfo();
10901
10902 VkDynamicState dyn_states = VK_DYNAMIC_STATE_LINE_WIDTH;
10903 pipe.ia_ci_.topology = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
10904 pipe.dyn_state_ci_ = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
10905 pipe.dyn_state_ci_.dynamicStateCount = 1;
10906 pipe.dyn_state_ci_.pDynamicStates = &dyn_states;
10907 pipe.InitState();
10908 pipe.CreateGraphicsPipeline();
10909
10910 // Pipelines for all other subpasses
10911 vk_testing::Pipeline pipelines[extra_subpass_count];
10912 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10913 auto pipe_info = pipe.gp_ci_;
10914 pipe_info.subpass = i + 1;
10915 pipelines[i].init(*m_device, pipe_info);
10916 }
10917
10918 m_commandBuffer->begin();
10919 // This line width set should not be valid for next subpass
10920 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10921 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10922 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10923 m_errorMonitor->VerifyNotFound();
10924
10925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10926 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
10927 m_errorMonitor->VerifyFound();
10928
10929 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10930 m_errorMonitor->ExpectSuccess();
10931
10932 // This line width set should not be valid for next subpass
10933 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10934 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10935 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
10936 m_errorMonitor->VerifyNotFound();
10937
10938 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10939 m_commandBuffer->Draw(1, 0, 0, 0);
10940 m_errorMonitor->VerifyFound();
10941 }
10942
10943 m_errorMonitor->ExpectSuccess();
10944 m_commandBuffer->EndRenderPass();
10945 m_commandBuffer->end();
10946 }
10947
10948 m_commandBuffer->reset();
10949
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010950 // Push constants
10951 {
10952 char const *const vsSource = R"glsl(
10953 #version 450
10954 layout(push_constant, std430) uniform foo {
10955 mat3 m;
10956 } constants;
10957 void main(){
10958 vec3 v3 = constants.m[0];
10959 }
10960 )glsl";
10961
10962 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
10963 VkShaderObj const fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
10964
10965 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT, 0, 16};
10966 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
10967 pipeline_layout_info.pushConstantRangeCount = 1;
10968 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
10969
10970 vk_testing::PipelineLayout layout;
10971 layout.init(*m_device, pipeline_layout_info, std::vector<const vk_testing::DescriptorSetLayout *>{});
10972
10973 CreatePipelineHelper pipe(*this);
10974 pipe.InitInfo();
10975 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
10976 pipe.pipeline_layout_ci_ = pipeline_layout_info;
10977 pipe.InitState();
10978 pipe.CreateGraphicsPipeline();
10979
10980 // Pipelines for all other subpasses
10981 vk_testing::Pipeline pipelines[extra_subpass_count];
10982 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10983 auto pipe_info = pipe.gp_ci_;
10984 pipe_info.subpass = i + 1;
10985 pipelines[i].init(*m_device, pipe_info);
10986 }
10987 // Set up complete
10988
10989 const float dummy_values[16] = {};
10990 m_commandBuffer->begin();
10991 // This push constants should not be counted when render pass begins
10992 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
10993 push_constant_range.size, dummy_values);
10994 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10995 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10996 m_errorMonitor->VerifyNotFound();
10997
10998 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
10999 m_commandBuffer->Draw(1, 0, 0, 0);
11000 m_errorMonitor->VerifyFound();
11001
11002 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11003 m_errorMonitor->ExpectSuccess();
11004
11005 // This push constants should not be counted when we change subpass
11006 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
11007 push_constant_range.size, dummy_values);
11008 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11009 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11010 m_errorMonitor->VerifyNotFound();
11011
11012 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
11013 m_commandBuffer->Draw(1, 0, 0, 0);
11014 m_errorMonitor->VerifyFound();
11015 }
11016
11017 m_errorMonitor->ExpectSuccess();
11018 m_commandBuffer->EndRenderPass();
11019 m_commandBuffer->end();
11020 }
11021
11022 m_commandBuffer->reset();
11023
Aitor Camacho097a2322022-06-14 14:08:23 +020011024 // Descriptor sets
11025 {
11026 OneOffDescriptorSet descriptor_set{m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}};
11027
11028 auto bci = LvlInitStruct<VkBufferCreateInfo>();
11029 bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
11030 bci.size = 8;
11031 VkBufferObj buffer;
11032 buffer.init(*m_device, bci);
11033 VkDescriptorBufferInfo buffer_info;
11034 buffer_info.buffer = buffer.handle();
11035 buffer_info.offset = 0;
11036 buffer_info.range = VK_WHOLE_SIZE;
11037 auto descriptor_write = LvlInitStruct<VkWriteDescriptorSet>();
11038 descriptor_write.dstSet = descriptor_set.set_;
11039 descriptor_write.dstBinding = 0;
11040 descriptor_write.descriptorCount = 1;
11041 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11042 descriptor_write.pBufferInfo = &buffer_info;
11043 vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11044
11045 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
11046 pipeline_layout_info.setLayoutCount = 1;
11047 pipeline_layout_info.pSetLayouts = &descriptor_set.layout_.handle();
11048
11049 vk_testing::PipelineLayout layout;
11050 layout.init(*m_device, pipeline_layout_info, std::vector<vk_testing::DescriptorSetLayout const *>{});
11051
11052 VkShaderObj const vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
11053 VkShaderObj const fs(this, bindStateFragUniformShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11054
11055 CreatePipelineHelper pipe(*this);
11056 pipe.InitInfo();
11057 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11058 pipe.pipeline_layout_ci_ = pipeline_layout_info;
11059 pipe.InitState();
11060 pipe.CreateGraphicsPipeline();
11061
11062 // Pipelines for all other subpasses
11063 vk_testing::Pipeline pipelines[extra_subpass_count];
11064 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11065 auto pipe_info = pipe.gp_ci_;
11066 pipe_info.subpass = i + 1;
11067 pipelines[i].init(*m_device, pipe_info);
11068 }
11069 // Set up complete
11070
11071 m_commandBuffer->begin();
11072 // This descriptor bind should not be counted when render pass begins
11073 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
11074 &descriptor_set.set_, 0, nullptr);
11075 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11076 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11077 m_errorMonitor->VerifyNotFound();
11078
11079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
11080 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
11081 m_commandBuffer->Draw(1, 0, 0, 0);
11082 m_errorMonitor->VerifyFound();
11083
11084 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11085 m_errorMonitor->ExpectSuccess();
11086
11087 // This descriptor bind should not be counted when next subpass begins
11088 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0,
11089 1, &descriptor_set.set_, 0, nullptr);
11090 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11091 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11092 m_errorMonitor->VerifyNotFound();
11093
11094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
11095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
11096 m_commandBuffer->Draw(1, 0, 0, 0);
11097 m_errorMonitor->VerifyFound();
11098 }
11099
11100 m_errorMonitor->ExpectSuccess();
11101 m_commandBuffer->EndRenderPass();
11102 m_commandBuffer->end();
11103 }
11104
11105 m_commandBuffer->reset();
11106
Aitor Camachob379c4b2022-06-14 14:43:40 +020011107 // Vertex buffer
11108 {
11109 float const vertex_data[] = {1.0f, 0.0f};
11110 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11111 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11112
11113 VkVertexInputBindingDescription input_binding{};
11114 input_binding.binding = 0;
11115 input_binding.stride = sizeof(vertex_data);
11116 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11117
11118 VkVertexInputAttributeDescription input_attribs{};
11119 input_attribs.binding = 0;
11120 input_attribs.location = 0;
11121 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11122 input_attribs.offset = 0;
11123
11124 char const *const vsSource = R"glsl(
11125 #version 450
11126 layout(location = 0) in vec2 input0;
11127 void main(){
11128 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11129 }
11130 )glsl";
11131
11132 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11133 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11134
11135 CreatePipelineHelper pipe(*this);
11136 pipe.InitInfo();
11137 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11138 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11139 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11140 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11141 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11142 pipe.InitState();
11143 pipe.CreateGraphicsPipeline();
11144
11145 // Pipelines for all other subpasses
11146 vk_testing::Pipeline pipelines[extra_subpass_count];
11147 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11148 auto pipe_info = pipe.gp_ci_;
11149 pipe_info.subpass = i + 1;
11150 pipelines[i].init(*m_device, pipe_info);
11151 }
11152 // Set up complete
11153 VkDeviceSize offset = 0;
11154
11155 m_commandBuffer->begin();
11156 // This vertex buffer bind should not be counted when render pass begins
11157 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11158 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11159 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11160 m_errorMonitor->VerifyNotFound();
11161
11162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11164 m_commandBuffer->Draw(1, 0, 0, 0);
11165 m_errorMonitor->VerifyFound();
11166
11167 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11168 m_errorMonitor->ExpectSuccess();
11169
11170 // This vertex buffer bind should not be counted when next subpass begins
11171 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11172 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11173 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11174 m_errorMonitor->VerifyNotFound();
11175
11176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11177 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11178 m_commandBuffer->Draw(1, 0, 0, 0);
11179 m_errorMonitor->VerifyFound();
11180 }
11181
11182 m_errorMonitor->ExpectSuccess();
11183 m_commandBuffer->EndRenderPass();
11184 m_commandBuffer->end();
11185 }
11186
11187 m_commandBuffer->reset();
11188
Aitor Camachoea9030a2022-06-14 15:07:25 +020011189 // Index buffer
11190 {
11191 float const vertex_data[] = {1.0f, 0.0f};
11192 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11193 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11194
11195 uint32_t const index_data[] = {0};
11196 VkConstantBufferObj ibo(m_device, static_cast<int>(sizeof(index_data)), reinterpret_cast<const void *>(index_data),
11197 VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
11198
11199 VkVertexInputBindingDescription input_binding{};
11200 input_binding.binding = 0;
11201 input_binding.stride = sizeof(vertex_data);
11202 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11203
11204 VkVertexInputAttributeDescription input_attribs{};
11205 input_attribs.binding = 0;
11206 input_attribs.location = 0;
11207 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11208 input_attribs.offset = 0;
11209
11210 char const *const vsSource = R"glsl(
11211 #version 450
11212 layout(location = 0) in vec2 input0;
11213 void main(){
11214 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11215 }
11216 )glsl";
11217
11218 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11219 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11220
11221 CreatePipelineHelper pipe(*this);
11222 pipe.InitInfo();
11223 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11224 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11225 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11226 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11227 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11228 pipe.InitState();
11229 pipe.CreateGraphicsPipeline();
11230
11231 // Pipelines for all other subpasses
11232 vk_testing::Pipeline pipelines[extra_subpass_count];
11233 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11234 auto pipe_info = pipe.gp_ci_;
11235 pipe_info.subpass = i + 1;
11236 pipelines[i].init(*m_device, pipe_info);
11237 }
11238 // Set up complete
11239
11240 VkDeviceSize offset = 0;
11241 m_commandBuffer->begin();
11242 // This index buffer bind should not be counted when render pass begins
11243 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11244 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11245 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11246 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11247 m_errorMonitor->VerifyNotFound();
11248
11249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11250 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11251 m_errorMonitor->VerifyFound();
11252
11253 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11254 m_errorMonitor->ExpectSuccess();
11255
11256 // This index buffer bind should not be counted when next subpass begins
11257 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11258 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11259 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11260 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11261 m_errorMonitor->VerifyNotFound();
11262
11263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11264 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11265 m_errorMonitor->VerifyFound();
11266 }
11267
11268 m_errorMonitor->ExpectSuccess();
11269 m_commandBuffer->EndRenderPass();
11270 m_commandBuffer->end();
11271 }
11272
Aitor Camacho768bbc92022-06-10 16:57:44 +020011273 m_errorMonitor->VerifyNotFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010011274}
ziga-lunarg813fa012022-04-09 14:09:57 +020011275
11276TEST_F(VkLayerTest, TestCommandBufferInheritanceWithInvalidDepthFormat) {
11277 TEST_DESCRIPTION(
11278 "Test VkCommandBufferInheritanceRenderingInfoKHR with depthAttachmentFormat that does not include depth aspect");
11279
11280 SetTargetApiVersion(VK_API_VERSION_1_1);
11281
11282 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
11283
11284 ASSERT_NO_FATAL_FAILURE(InitFramework());
11285
sjfricked700bc02022-05-30 16:35:06 +090011286 if (!AreRequiredExtensionsEnabled()) {
11287 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunarg813fa012022-04-09 14:09:57 +020011288 }
11289
11290 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090011291 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
ziga-lunarg813fa012022-04-09 14:09:57 +020011292 }
11293
11294 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
11295 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
11296 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
11297 if (!dynamic_rendering_features.dynamicRendering) {
11298 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
11299 return;
11300 }
11301
11302 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
11303
11304 auto stencil_format = FindSupportedStencilOnlyFormat(gpu());
11305 if (!stencil_format) {
11306 printf("%s Couldn't stencil image format.\n", kSkipPrefix);
11307 return;
11308 }
11309
11310 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
11311 inheritance_rendering_info.depthAttachmentFormat = stencil_format;
11312
11313 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11314
11315 auto cmdbuf_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>(&inheritance_rendering_info);
11316 auto cmdbuf_bi = LvlInitStruct<VkCommandBufferBeginInfo>();
11317 cmdbuf_bi.pInheritanceInfo = &cmdbuf_ii;
11318
11319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferInheritanceRenderingInfo-depthAttachmentFormat-06540");
11320
11321 vk::BeginCommandBuffer(secondary.handle(), &cmdbuf_bi);
11322
11323 m_errorMonitor->VerifyFound();
11324}
ziga-lunarg0ce51882022-05-18 14:36:48 +020011325
11326TEST_F(VkLayerTest, ResolveInvalidUsage) {
11327 TEST_DESCRIPTION("Resolve image with missing usage flags.");
11328
11329 if (!EnableDeviceProfileLayer()) {
11330 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
11331 return;
11332 }
11333
11334 ASSERT_NO_FATAL_FAILURE(Init());
11335
11336 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
11337 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
11338
11339 // Load required functions
11340 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
11341 printf("%s Failed to device profile layer.\n", kSkipPrefix);
11342 return;
11343 }
11344
11345 VkFormat src_format = VK_FORMAT_R8_UNORM;
11346 VkFormat dst_format = VK_FORMAT_R8_SNORM;
11347
11348 VkFormatProperties formatProps;
11349 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, &formatProps);
11350 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
11351 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, formatProps);
11352 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, &formatProps);
11353 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
11354 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, formatProps);
11355
11356 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
11357 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11358 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11359 image_create_info.extent.width = 32;
11360 image_create_info.extent.height = 1;
11361 image_create_info.extent.depth = 1;
11362 image_create_info.mipLevels = 1;
11363 image_create_info.arrayLayers = 1;
11364 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
11365 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11367 image_create_info.flags = 0;
11368
11369 VkImageObj srcImage(m_device);
11370 srcImage.init(&image_create_info);
11371 ASSERT_TRUE(srcImage.initialized());
11372
11373 image_create_info.format = dst_format;
11374 VkImageObj srcImage2(m_device);
11375 srcImage2.init(&image_create_info);
11376 ASSERT_TRUE(srcImage2.initialized());
11377
11378 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11379 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11380 VkImageObj invalidSrcImage(m_device);
11381 invalidSrcImage.init(&image_create_info);
11382 ASSERT_TRUE(invalidSrcImage.initialized());
11383
11384 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11385 image_create_info.format = src_format;
11386 VkImageObj invalidSrcImage2(m_device);
11387 invalidSrcImage2.init(&image_create_info);
11388 ASSERT_TRUE(invalidSrcImage2.initialized());
11389
11390 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11391 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11392 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11393 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11394 VkImageObj dstImage(m_device);
11395 dstImage.init(&image_create_info);
11396 ASSERT_TRUE(dstImage.initialized());
11397
11398 image_create_info.format = src_format;
11399 VkImageObj dstImage2(m_device);
11400 dstImage2.init(&image_create_info);
11401 ASSERT_TRUE(dstImage2.initialized());
11402
11403 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11404 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11405 VkImageObj invalidDstImage(m_device);
11406 invalidDstImage.init(&image_create_info);
11407 ASSERT_TRUE(invalidDstImage.initialized());
11408
11409 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11410 image_create_info.format = dst_format;
11411 VkImageObj invalidDstImage2(m_device);
11412 invalidDstImage2.init(&image_create_info);
11413 ASSERT_TRUE(invalidDstImage2.initialized());
11414
11415 m_commandBuffer->begin();
11416 VkImageResolve resolveRegion;
11417 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11418 resolveRegion.srcSubresource.mipLevel = 0;
11419 resolveRegion.srcSubresource.baseArrayLayer = 0;
11420 resolveRegion.srcSubresource.layerCount = 1;
11421 resolveRegion.srcOffset.x = 0;
11422 resolveRegion.srcOffset.y = 0;
11423 resolveRegion.srcOffset.z = 0;
11424 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11425 resolveRegion.dstSubresource.mipLevel = 0;
11426 resolveRegion.dstSubresource.baseArrayLayer = 0;
11427 resolveRegion.dstSubresource.layerCount = 1;
11428 resolveRegion.dstOffset.x = 0;
11429 resolveRegion.dstOffset.y = 0;
11430 resolveRegion.dstOffset.z = 0;
11431 resolveRegion.extent.width = 1;
11432 resolveRegion.extent.height = 1;
11433 resolveRegion.extent.depth = 1;
11434
11435 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06762");
11436 m_commandBuffer->ResolveImage(invalidSrcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11437 &resolveRegion);
11438 m_errorMonitor->VerifyFound();
11439
11440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06764");
11441 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11442 &resolveRegion);
11443 m_errorMonitor->VerifyFound();
11444
11445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06763");
11446 m_commandBuffer->ResolveImage(invalidSrcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11447 1, &resolveRegion);
11448 m_errorMonitor->VerifyFound();
11449
11450 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06765");
11451 m_commandBuffer->ResolveImage(srcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11452 1, &resolveRegion);
11453 m_errorMonitor->VerifyFound();
11454
11455 m_commandBuffer->end();
11456}