blob: 175b68d6dbeefc1a454fad58e42f4823c56e6e9a [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
Mark Lobodzinski07d0a612020-12-30 15:42:31 -0700191 auto line_rasterization_features = LvlInitStruct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
sjfricke11db0c72022-08-18 13:23:11 +0900192 auto features2 = GetPhysicalDeviceFeatures2(line_rasterization_features);
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500193 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
194 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
195 return;
196 }
197
198 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
199
Mark Lobodzinski20310782020-02-28 14:25:17 -0700200 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500201 VKTriangleTest(BsoFailLineStipple);
202 m_errorMonitor->VerifyFound();
203}
204
unknown088160a2019-05-23 17:43:13 -0600205TEST_F(VkLayerTest, DynamicViewportNotBound) {
206 TEST_DESCRIPTION(
207 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
208
209 ASSERT_NO_FATAL_FAILURE(Init());
210 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700211 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600212 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
213 VKTriangleTest(BsoFailViewport);
214 m_errorMonitor->VerifyFound();
215}
216
217TEST_F(VkLayerTest, DynamicScissorNotBound) {
218 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
219
220 ASSERT_NO_FATAL_FAILURE(Init());
221 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700222 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600223 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
224 VKTriangleTest(BsoFailScissor);
225 m_errorMonitor->VerifyFound();
226}
227
228TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
229 TEST_DESCRIPTION(
230 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
231
232 ASSERT_NO_FATAL_FAILURE(Init());
233 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700234 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600235 VKTriangleTest(BsoFailBlend);
236 m_errorMonitor->VerifyFound();
237}
238
239TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
240 TEST_DESCRIPTION(
241 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
242
243 ASSERT_NO_FATAL_FAILURE(Init());
244 if (!m_device->phy().features().depthBounds) {
245 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
246 return;
247 }
248 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600250 VKTriangleTest(BsoFailDepthBounds);
251 m_errorMonitor->VerifyFound();
252}
253
254TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
255 TEST_DESCRIPTION(
256 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
257
258 ASSERT_NO_FATAL_FAILURE(Init());
259 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600261 VKTriangleTest(BsoFailStencilReadMask);
262 m_errorMonitor->VerifyFound();
263}
264
265TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
266 TEST_DESCRIPTION(
267 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
268
269 ASSERT_NO_FATAL_FAILURE(Init());
270 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700271 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600272 VKTriangleTest(BsoFailStencilWriteMask);
273 m_errorMonitor->VerifyFound();
274}
275
276TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
277 TEST_DESCRIPTION(
278 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
279
280 ASSERT_NO_FATAL_FAILURE(Init());
281 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700282 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600283 VKTriangleTest(BsoFailStencilReference);
284 m_errorMonitor->VerifyFound();
285}
286
287TEST_F(VkLayerTest, IndexBufferNotBound) {
288 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
289
290 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700291 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600292 VKTriangleTest(BsoFailIndexBuffer);
293 m_errorMonitor->VerifyFound();
294}
295
296TEST_F(VkLayerTest, IndexBufferBadSize) {
297 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
298
299 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600301 VKTriangleTest(BsoFailIndexBufferBadSize);
302 m_errorMonitor->VerifyFound();
303}
304
305TEST_F(VkLayerTest, IndexBufferBadOffset) {
306 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
307
308 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600310 VKTriangleTest(BsoFailIndexBufferBadOffset);
311 m_errorMonitor->VerifyFound();
312}
313
314TEST_F(VkLayerTest, IndexBufferBadBindSize) {
315 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
316
317 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600319 VKTriangleTest(BsoFailIndexBufferBadMapSize);
320 m_errorMonitor->VerifyFound();
321}
322
323TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
324 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
325
326 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600328 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
329 m_errorMonitor->VerifyFound();
330}
331
332TEST_F(VkLayerTest, MissingClearAttachment) {
333 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
334 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700335 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600336
337 VKTriangleTest(BsoFailCmdClearAttachments);
338 m_errorMonitor->VerifyFound();
339}
340
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700341TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
342 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700343 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700344
345 ASSERT_NO_FATAL_FAILURE(Init());
346
347 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
348 secondary.begin();
349 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
350 secondary.end();
351
sfricke-samsung1c61f192021-12-31 01:53:03 -0600352 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700353 submit_info.waitSemaphoreCount = 0;
354 submit_info.pWaitSemaphores = NULL;
355 submit_info.pWaitDstStageMask = NULL;
356 submit_info.commandBufferCount = 1;
357 submit_info.pCommandBuffers = &secondary.handle();
358 submit_info.signalSemaphoreCount = 0;
359 submit_info.pSignalSemaphores = NULL;
360
361 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
362 m_errorMonitor->VerifyFound();
363}
364
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700365TEST_F(VkLayerTest, Sync2SecondaryCommandbufferAsPrimary) {
366 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit2KHR.");
367 SetTargetApiVersion(VK_API_VERSION_1_2);
368 ASSERT_NO_FATAL_FAILURE(InitFramework());
369 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
370 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
371 } else {
sjfricke20f4a872022-08-12 08:28:05 +0900372 GTEST_SKIP() << "Synchronization2 not supported";
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700373 }
374
375 if (!CheckSynchronization2SupportAndInitState(this)) {
sjfricke20f4a872022-08-12 08:28:05 +0900376 GTEST_SKIP() << "Synchronization2 not supported";
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700377 }
378 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
Tony-LunarG279601c2021-11-16 10:50:51 -0700379 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferSubmitInfo-commandBuffer-03890");
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700380
381 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
382 secondary.begin();
383 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
384 secondary.end();
385
386 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
387 cb_info.commandBuffer = secondary.handle();
388
389 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
390 submit_info.commandBufferInfoCount = 1;
391 submit_info.pCommandBufferInfos = &cb_info;
392
393 fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
394 m_errorMonitor->VerifyFound();
395}
396
unknown088160a2019-05-23 17:43:13 -0600397TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600399 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
400
401 ASSERT_NO_FATAL_FAILURE(Init());
402 ASSERT_NO_FATAL_FAILURE(InitViewport());
403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
404
405 // We luck out b/c by default the framework creates CB w/ the
406 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
407 m_commandBuffer->begin();
408 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
409 m_commandBuffer->end();
410
411 // Bypass framework since it does the waits automatically
412 VkResult err = VK_SUCCESS;
sfricke-samsung1c61f192021-12-31 01:53:03 -0600413 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -0600414 submit_info.waitSemaphoreCount = 0;
415 submit_info.pWaitSemaphores = NULL;
416 submit_info.pWaitDstStageMask = NULL;
417 submit_info.commandBufferCount = 1;
418 submit_info.pCommandBuffers = &m_commandBuffer->handle();
419 submit_info.signalSemaphoreCount = 0;
420 submit_info.pSignalSemaphores = NULL;
421
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600422 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600423 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600424 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600425
426 // Cause validation error by re-submitting cmd buffer that should only be
427 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600428 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
429 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600430
431 m_errorMonitor->VerifyFound();
432}
433
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700434TEST_F(VkLayerTest, Sync2CommandBufferTwoSubmits) {
435 SetTargetApiVersion(VK_API_VERSION_1_2);
436 ASSERT_NO_FATAL_FAILURE(InitFramework());
437 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
438 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
439 } else {
sjfricke20f4a872022-08-12 08:28:05 +0900440 GTEST_SKIP() << "Synchronization2 not supported";
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700441 }
442
443 if (!CheckSynchronization2SupportAndInitState(this)) {
sjfricke20f4a872022-08-12 08:28:05 +0900444 GTEST_SKIP() << "Synchronization2 not supported";
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700445 }
446 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
447
448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
449 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
450 ASSERT_NO_FATAL_FAILURE(InitViewport());
451 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
452
453 // We luck out b/c by default the framework creates CB w/ the
454 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
455 m_commandBuffer->begin();
456 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
457 m_commandBuffer->end();
458
459 // Bypass framework since it does the waits automatically
460 VkResult err = VK_SUCCESS;
461 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
462 cb_info.commandBuffer = m_commandBuffer->handle();
463
464 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
465 submit_info.commandBufferInfoCount = 1;
466 submit_info.pCommandBufferInfos = &cb_info;
467
468 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
469 ASSERT_VK_SUCCESS(err);
470 vk::QueueWaitIdle(m_device->m_queue);
471
472 // Cause validation error by re-submitting cmd buffer that should only be
473 // submitted once
474 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
475 vk::QueueWaitIdle(m_device->m_queue);
476
477 m_errorMonitor->VerifyFound();
478}
479
unknown088160a2019-05-23 17:43:13 -0600480TEST_F(VkLayerTest, InvalidPushConstants) {
481 ASSERT_NO_FATAL_FAILURE(Init());
482 ASSERT_NO_FATAL_FAILURE(InitViewport());
483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
484
485 VkPipelineLayout pipeline_layout;
486 VkPushConstantRange pc_range = {};
sfricke-samsung1c61f192021-12-31 01:53:03 -0600487 VkPipelineLayoutCreateInfo pipeline_layout_ci = LvlInitStruct<VkPipelineLayoutCreateInfo>();
unknown088160a2019-05-23 17:43:13 -0600488 pipeline_layout_ci.pushConstantRangeCount = 1;
489 pipeline_layout_ci.pPushConstantRanges = &pc_range;
490
491 //
492 // Check for invalid push constant ranges in pipeline layouts.
493 //
494 struct PipelineLayoutTestCase {
495 VkPushConstantRange const range;
496 char const *msg;
497 };
498
499 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
500 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700501 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
502 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
503 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
504 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
505 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
506 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
507 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
508 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
509 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
510 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600511 }};
512
513 // Check for invalid offset and size
514 for (const auto &iter : range_tests) {
515 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700516 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600517 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600518 m_errorMonitor->VerifyFound();
519 }
520
521 // Check for invalid stage flag
522 pc_range.offset = 0;
523 pc_range.size = 16;
524 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600526 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600527 m_errorMonitor->VerifyFound();
528
529 // Check for duplicate stage flags in a list of push constant ranges.
530 // A shader can only have one push constant block and that block is mapped
531 // to the push constant range that has that shader's stage flag set.
532 // The shader's stage flag can only appear once in all the ranges, so the
533 // implementation can find the one and only range to map it to.
534 const uint32_t ranges_per_test = 5;
535 struct DuplicateStageFlagsTestCase {
536 VkPushConstantRange const ranges[ranges_per_test];
537 std::vector<char const *> const msg;
538 };
539 // Overlapping ranges are OK, but a stage flag can appear only once.
540 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
541 {
542 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
543 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
544 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
545 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
546 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
547 {
548 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
549 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
550 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
551 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
552 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
553 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
554 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
555 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
556 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
557 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
558 }},
559 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
560 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
561 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
562 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
563 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
564 {
565 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
566 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
567 }},
568 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
569 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
570 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
571 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
572 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
573 {
574 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
575 }},
576 },
577 };
578
579 for (const auto &iter : duplicate_stageFlags_tests) {
580 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
581 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600583 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600584 m_errorMonitor->VerifyFound();
585 }
586
587 //
588 // CmdPushConstants tests
589 //
590
591 // Setup a pipeline layout with ranges: [0,32) [16,80)
592 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
593 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
594 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
595
596 const uint8_t dummy_values[100] = {};
597
598 m_commandBuffer->begin();
599 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
600
601 // Check for invalid stage flag
602 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700603 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600604 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600605 m_errorMonitor->VerifyFound();
606
607 // Positive tests for the overlapping ranges
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600608 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
609 dummy_values);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600610 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600611 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
612 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600613
614 // Wrong cmd stages for extant range
615 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700616 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600617 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600619 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
620 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600621 m_errorMonitor->VerifyFound();
622
623 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600625 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
626 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600627 m_errorMonitor->VerifyFound();
628
629 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600631 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
632 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600633 m_errorMonitor->VerifyFound();
634
635 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600637 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600638 m_errorMonitor->VerifyFound();
639
640 m_commandBuffer->EndRenderPass();
641 m_commandBuffer->end();
642}
643
644TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700645 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600646
647 ASSERT_NO_FATAL_FAILURE(Init());
648 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
649 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600650 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600651
652 m_errorMonitor->VerifyFound();
653}
654
unknown088160a2019-05-23 17:43:13 -0600655TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
656 ASSERT_NO_FATAL_FAILURE(Init());
657
Mark Lobodzinski20310782020-02-28 14:25:17 -0700658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600659
660 // A pool we can reset in.
661 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
662 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
663
664 secondary.begin();
665 secondary.end();
666
667 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600668 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600669
670 // rerecording of secondary
671 secondary.reset(); // explicit reset here.
672 secondary.begin();
673 secondary.end();
674
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600675 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600676 m_errorMonitor->VerifyFound();
677}
678
679TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
680 ASSERT_NO_FATAL_FAILURE(Init());
681
Mark Lobodzinski20310782020-02-28 14:25:17 -0700682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600683
684 // A pool we can reset in.
685 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
686 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
687
688 secondary.begin();
689 secondary.end();
690
691 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600692 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600693
694 // rerecording of secondary
695 secondary.begin(); // implicit reset in begin
696 secondary.end();
697
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600698 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600699 m_errorMonitor->VerifyFound();
700}
701
702TEST_F(VkLayerTest, CascadedInvalidation) {
703 ASSERT_NO_FATAL_FAILURE(Init());
704
sfricke-samsung1c61f192021-12-31 01:53:03 -0600705 VkEventCreateInfo eci = LvlInitStruct<VkEventCreateInfo>();
706 eci.flags = 0;
unknown088160a2019-05-23 17:43:13 -0600707 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600708 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600709
710 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
711 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600712 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600713 secondary.end();
714
715 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600716 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600717 m_commandBuffer->end();
718
719 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600720 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600721
Mark Lobodzinski20310782020-02-28 14:25:17 -0700722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600723 m_commandBuffer->QueueCommandBuffer(false);
724 m_errorMonitor->VerifyFound();
725}
726
727TEST_F(VkLayerTest, CommandBufferResetErrors) {
728 // Cause error due to Begin while recording CB
729 // Then cause 2 errors for attempting to reset CB w/o having
730 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
731 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600733
734 ASSERT_NO_FATAL_FAILURE(Init());
735
736 // Calls AllocateCommandBuffers
737 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
738
739 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
sfricke-samsung1c61f192021-12-31 01:53:03 -0600740 VkCommandBufferInheritanceInfo cmd_buf_hinfo = LvlInitStruct<VkCommandBufferInheritanceInfo>();
741 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -0600742 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
743 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
744
745 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600746 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600747 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600748 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600749 m_errorMonitor->VerifyFound();
750
Mark Lobodzinski20310782020-02-28 14:25:17 -0700751 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600752 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
753 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600754 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600755 m_errorMonitor->VerifyFound();
756
Mark Lobodzinski20310782020-02-28 14:25:17 -0700757 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600758 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600759 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600760 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600761 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600762 m_errorMonitor->VerifyFound();
763}
764
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700765TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
766 ASSERT_NO_FATAL_FAILURE(Init());
767
768 // Calls AllocateCommandBuffers
769 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
770
sfricke-samsung1c61f192021-12-31 01:53:03 -0600771 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700772 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
773
774 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
775 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
776 m_errorMonitor->VerifyFound();
777}
778
unknown088160a2019-05-23 17:43:13 -0600779TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
780 // Call CmdClearAttachmentss outside of an active RenderPass
781
sfricke-samsung85584a72021-09-30 21:43:38 -0700782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearAttachments: This call must be issued inside an active render pass");
unknown088160a2019-05-23 17:43:13 -0600783
784 ASSERT_NO_FATAL_FAILURE(Init());
785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
786
787 // Start no RenderPass
788 m_commandBuffer->begin();
789
790 VkClearAttachment color_attachment;
791 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
792 color_attachment.clearValue.color.float32[0] = 0;
793 color_attachment.clearValue.color.float32[1] = 0;
794 color_attachment.clearValue.color.float32[2] = 0;
795 color_attachment.clearValue.color.float32[3] = 0;
796 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600797 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600798 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600799
800 m_errorMonitor->VerifyFound();
801}
802
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600803TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
804 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
805
Mark Lobodzinski20310782020-02-28 14:25:17 -0700806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600807
808 ASSERT_NO_FATAL_FAILURE(Init());
809 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
810
811 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600812 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600813
814 VkClearAttachment color_attachment;
815 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
816 color_attachment.clearValue.color.float32[0] = 0;
817 color_attachment.clearValue.color.float32[1] = 0;
818 color_attachment.clearValue.color.float32[2] = 0;
819 color_attachment.clearValue.color.float32[3] = 0;
820 color_attachment.colorAttachment = 0;
821 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600822 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600823
824 m_errorMonitor->VerifyFound();
825}
826
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700827TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
828 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
829
830 ASSERT_NO_FATAL_FAILURE(Init());
831 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
832
833 m_commandBuffer->begin();
834 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
835
836 VkClearAttachment color_attachment;
837 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
838 color_attachment.clearValue.color.float32[0] = 0;
839 color_attachment.clearValue.color.float32[1] = 0;
840 color_attachment.clearValue.color.float32[2] = 0;
841 color_attachment.clearValue.color.float32[3] = 0;
842 color_attachment.colorAttachment = 0;
843 VkClearRect clear_rect = {};
844 clear_rect.rect.offset = {0, 0};
845 clear_rect.baseArrayLayer = 0;
846 clear_rect.layerCount = 1;
847
848 clear_rect.rect.extent = {0, 1};
849 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
850 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
851 m_errorMonitor->VerifyFound();
852
853 clear_rect.rect.extent = {1, 0};
854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
855 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
856 m_errorMonitor->VerifyFound();
857}
858
sfricke-samsung6141db32020-10-26 03:31:38 -0700859TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
860 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
861
862 ASSERT_NO_FATAL_FAILURE(Init());
863 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
864
865 m_commandBuffer->begin();
866 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
867
868 VkClearAttachment attachment;
869 attachment.clearValue.color.float32[0] = 0;
870 attachment.clearValue.color.float32[1] = 0;
871 attachment.clearValue.color.float32[2] = 0;
872 attachment.clearValue.color.float32[3] = 0;
873 attachment.colorAttachment = 0;
874 VkClearRect clear_rect = {};
875 clear_rect.rect.offset = {0, 0};
876 clear_rect.rect.extent = {1, 1};
877 clear_rect.baseArrayLayer = 0;
878 clear_rect.layerCount = 1;
879
880 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
882 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
883 m_errorMonitor->VerifyFound();
884
885 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
887 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
888 m_errorMonitor->VerifyFound();
889
890 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
892 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
893 m_errorMonitor->VerifyFound();
894
895 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
897 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
898 m_errorMonitor->VerifyFound();
899}
900
sfricke-samsung91f4a542020-10-21 00:29:17 -0700901TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
902 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
903
904 ASSERT_NO_FATAL_FAILURE(Init());
905 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
906
907 m_commandBuffer->begin();
908 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
909
910 VkClearAttachment color_attachment;
911 color_attachment.clearValue.color.float32[0] = 0;
912 color_attachment.clearValue.color.float32[1] = 0;
913 color_attachment.clearValue.color.float32[2] = 0;
914 color_attachment.clearValue.color.float32[3] = 0;
915 color_attachment.colorAttachment = 0;
916 VkClearRect clear_rect = {};
917 clear_rect.rect.offset = {0, 0};
918 clear_rect.rect.extent = {1, 1};
919 clear_rect.baseArrayLayer = 0;
920 clear_rect.layerCount = 1;
921
922 color_attachment.aspectMask = 0;
923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
924 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
925 m_errorMonitor->VerifyFound();
926
927 color_attachment.aspectMask = 0xffffffff;
928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
929 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
930 m_errorMonitor->VerifyFound();
931}
932
sfricke-samsung87b09512020-10-26 03:35:42 -0700933TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
934 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
935
936 ASSERT_NO_FATAL_FAILURE(Init());
937 // Creates a color attachment
938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
939
940 m_commandBuffer->begin();
941 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
942
943 VkClearAttachment attachment;
944 attachment.clearValue.color.float32[0] = 0;
945 attachment.clearValue.color.float32[1] = 0;
946 attachment.clearValue.color.float32[2] = 0;
947 attachment.clearValue.color.float32[3] = 0;
948 attachment.colorAttachment = 0;
949 VkClearRect clear_rect = {};
950 clear_rect.rect.offset = {0, 0};
951 clear_rect.rect.extent = {1, 1};
952 clear_rect.baseArrayLayer = 0;
953 clear_rect.layerCount = 1;
954
sfricke-samsung87b09512020-10-26 03:35:42 -0700955 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
956 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
sfricke-samsung87b09512020-10-26 03:35:42 -0700957
958 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
959 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
960 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
961 m_errorMonitor->VerifyFound();
962
963 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
964 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
965 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
966 m_errorMonitor->VerifyFound();
967}
968
unknown088160a2019-05-23 17:43:13 -0600969TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
970 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
971
972 ASSERT_NO_FATAL_FAILURE(Init());
973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
974
975 // An empty primary command buffer
976 VkCommandBufferObj cb(m_device, m_commandPool);
977 cb.begin();
978 cb.end();
979
980 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600981 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600982 VkCommandBuffer handle = cb.handle();
983
Mark Lobodzinski20310782020-02-28 14:25:17 -0700984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600985 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -0600986 m_errorMonitor->VerifyFound();
987
988 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
989
990 m_commandBuffer->EndRenderPass();
991 m_commandBuffer->end();
992}
993
Petr Kraus8e53cf02020-01-03 05:30:04 +0100994TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
995 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
996
997 ASSERT_NO_FATAL_FAILURE(Init());
998
999 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1000 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1001 secondary_cb.begin();
1002 secondary_cb.end();
1003
1004 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001006 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1007 m_errorMonitor->VerifyFound();
1008}
1009
unknown088160a2019-05-23 17:43:13 -06001010TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1011 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1012
1013 ASSERT_NO_FATAL_FAILURE(Init());
1014 ASSERT_NO_FATAL_FAILURE(InitViewport());
1015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1016
1017 const VkPipelineLayoutObj pipeline_layout(m_device);
1018
1019 struct VboEntry {
1020 uint16_t input0[2];
1021 uint32_t input1;
1022 float input2[4];
1023 };
1024
1025 const unsigned vbo_entry_count = 3;
1026 const VboEntry vbo_data[vbo_entry_count] = {};
1027
1028 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1029 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1030
1031 VkVertexInputBindingDescription input_binding;
1032 input_binding.binding = 0;
1033 input_binding.stride = sizeof(VboEntry);
1034 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1035
1036 VkVertexInputAttributeDescription input_attribs[3];
1037
1038 input_attribs[0].binding = 0;
1039 // Location switch between attrib[0] and attrib[1] is intentional
1040 input_attribs[0].location = 1;
1041 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1042 input_attribs[0].offset = offsetof(VboEntry, input1);
1043
1044 input_attribs[1].binding = 0;
1045 input_attribs[1].location = 0;
1046 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1047 input_attribs[1].offset = offsetof(VboEntry, input0);
1048
1049 input_attribs[2].binding = 0;
1050 input_attribs[2].location = 2;
1051 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1052 input_attribs[2].offset = offsetof(VboEntry, input2);
1053
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001054 char const *vsSource = R"glsl(
1055 #version 450
1056 layout(location = 0) in vec2 input0;
1057 layout(location = 1) in vec4 input1;
1058 layout(location = 2) in vec4 input2;
1059 void main(){
1060 gl_Position = input1 + input2;
1061 gl_Position.xy += input0;
1062 }
1063 )glsl";
unknown088160a2019-05-23 17:43:13 -06001064
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001065 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
1066 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001067
1068 VkPipelineObj pipe1(m_device);
1069 pipe1.AddDefaultColorAttachment();
1070 pipe1.AddShader(&vs);
1071 pipe1.AddShader(&fs);
1072 pipe1.AddVertexInputBindings(&input_binding, 1);
1073 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1074 pipe1.SetViewport(m_viewports);
1075 pipe1.SetScissor(m_scissors);
1076 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1077
1078 input_binding.stride = 6;
1079
1080 VkPipelineObj pipe2(m_device);
1081 pipe2.AddDefaultColorAttachment();
1082 pipe2.AddShader(&vs);
1083 pipe2.AddShader(&fs);
1084 pipe2.AddVertexInputBindings(&input_binding, 1);
1085 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1086 pipe2.SetViewport(m_viewports);
1087 pipe2.SetScissor(m_scissors);
1088 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1089
1090 m_commandBuffer->begin();
1091 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1092
1093 // Test with invalid buffer offset
1094 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001095 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1096 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001097 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
1098 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 1
1099 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001100 m_commandBuffer->Draw(1, 0, 0, 0);
1101 m_errorMonitor->VerifyFound();
1102
1103 // Test with invalid buffer stride
1104 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001105 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1106 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001107 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
unknown088160a2019-05-23 17:43:13 -06001108 // Attribute[1] is aligned properly even with a wrong stride
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001110 m_commandBuffer->Draw(1, 0, 0, 0);
1111 m_errorMonitor->VerifyFound();
1112
1113 m_commandBuffer->EndRenderPass();
1114 m_commandBuffer->end();
1115}
1116
1117TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1118 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001119 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001120
1121 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1122
1123 secondary.begin();
1124 secondary.end();
1125
1126 VkCommandBufferBeginInfo cbbi = {
1127 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1128 nullptr,
1129 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1130 nullptr,
1131 };
1132
1133 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001134 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001135 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001136 m_errorMonitor->VerifyFound();
1137 m_commandBuffer->end();
1138}
1139
1140TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1141 ASSERT_NO_FATAL_FAILURE(Init());
1142
John Zulauff1640d12019-08-13 15:39:58 -06001143 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001144
1145 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1146
sfricke-samsung1c61f192021-12-31 01:53:03 -06001147 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001148 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1149
1150 secondary.begin(&cbbi);
1151 secondary.end();
1152
1153 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001154 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001155 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001156 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001157 m_errorMonitor->VerifyFound();
1158 m_commandBuffer->end();
1159}
1160
1161TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1162 ASSERT_NO_FATAL_FAILURE(Init());
1163
1164 // variation on previous test executing the same CB twice in the same
1165 // CmdExecuteCommands call
1166
John Zulauff1640d12019-08-13 15:39:58 -06001167 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001168
1169 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1170
sfricke-samsung1c61f192021-12-31 01:53:03 -06001171 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001172 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1173
1174 secondary.begin(&cbbi);
1175 secondary.end();
1176
1177 m_commandBuffer->begin();
1178 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001180 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001181 m_errorMonitor->VerifyFound();
1182 m_commandBuffer->end();
1183}
1184
1185TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1186 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1187 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1188 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1189 ASSERT_NO_FATAL_FAILURE(Init());
1190
1191 VkCommandBuffer cmd_bufs[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06001192 VkCommandBufferAllocateInfo alloc_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06001193 alloc_info.commandBufferCount = 2;
1194 alloc_info.commandPool = m_commandPool->handle();
1195 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001196 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001197
sfricke-samsung1c61f192021-12-31 01:53:03 -06001198 VkCommandBufferBeginInfo cb_binfo = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -06001199 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1200 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001201 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001202 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001203 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1204 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001205 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1206
sfricke-samsung1c61f192021-12-31 01:53:03 -06001207 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06001208 submit_info.commandBufferCount = 2;
1209 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001210 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001211 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001212 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001213 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001214
1215 // Set one time use and now look for one time submit
1216 duplicates[0] = duplicates[1] = cmd_bufs[1];
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06001217 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001218 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1219 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1220 vk::EndCommandBuffer(cmd_bufs[1]);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06001221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-pCommandBuffers-00071");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001222 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001223 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001224 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001225 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001226}
1227
1228TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1229 TEST_DESCRIPTION(
1230 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1231
Mark Lobodzinski20310782020-02-28 14:25:17 -07001232 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001233
1234 ASSERT_NO_FATAL_FAILURE(Init());
1235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1236
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001237 char const *fsSource = R"glsl(
1238 #version 450
1239 layout(set=0, binding=0) uniform sampler3D s;
1240 layout(location=0) out vec4 color;
1241 void main() {
1242 color = texture(s, vec3(0));
1243 }
1244 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001245 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1246 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001247
1248 VkPipelineObj pipe(m_device);
1249 pipe.AddShader(&vs);
1250 pipe.AddShader(&fs);
1251 pipe.AddDefaultColorAttachment();
1252
1253 VkTextureObj texture(m_device, nullptr);
1254 VkSamplerObj sampler(m_device);
1255
1256 VkDescriptorSetObj descriptorSet(m_device);
1257 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1258 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1259
1260 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1261 ASSERT_VK_SUCCESS(err);
1262
1263 m_commandBuffer->begin();
1264 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1265
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001266 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001267 m_commandBuffer->BindDescriptorSet(descriptorSet);
1268
1269 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001270 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001271 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001272 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001273
1274 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001275 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001276
1277 m_errorMonitor->VerifyFound();
1278
1279 m_commandBuffer->EndRenderPass();
1280 m_commandBuffer->end();
1281}
1282
1283TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1284 TEST_DESCRIPTION(
1285 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1286 "vice versa.");
1287
Mark Lobodzinski20310782020-02-28 14:25:17 -07001288 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001289
1290 ASSERT_NO_FATAL_FAILURE(Init());
1291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1292
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001293 char const *fsSource = R"glsl(
1294 #version 450
1295 layout(set=0, binding=0) uniform sampler2DMS s;
1296 layout(location=0) out vec4 color;
1297 void main() {
1298 color = texelFetch(s, ivec2(0), 0);
1299 }
1300 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001301 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1302 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001303
1304 VkPipelineObj pipe(m_device);
1305 pipe.AddShader(&vs);
1306 pipe.AddShader(&fs);
1307 pipe.AddDefaultColorAttachment();
1308
1309 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1310 VkSamplerObj sampler(m_device);
1311
1312 VkDescriptorSetObj descriptorSet(m_device);
1313 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1314 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1315
1316 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1317 ASSERT_VK_SUCCESS(err);
1318
1319 m_commandBuffer->begin();
1320 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1321
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001322 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001323 m_commandBuffer->BindDescriptorSet(descriptorSet);
1324
1325 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001326 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001327 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001328 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001329
1330 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001331 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001332
1333 m_errorMonitor->VerifyFound();
1334
1335 m_commandBuffer->EndRenderPass();
1336 m_commandBuffer->end();
1337}
1338
1339TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1340 TEST_DESCRIPTION(
1341 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1342
Mark Lobodzinski20310782020-02-28 14:25:17 -07001343 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001344
1345 ASSERT_NO_FATAL_FAILURE(Init());
1346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1347
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001348 char const *fsSource = R"glsl(
1349 #version 450
1350 layout(set=0, binding=0) uniform isampler2D s;
1351 layout(location=0) out vec4 color;
1352 void main() {
1353 color = texelFetch(s, ivec2(0), 0);
1354 }
1355 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001356 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1357 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001358
1359 VkPipelineObj pipe(m_device);
1360 pipe.AddShader(&vs);
1361 pipe.AddShader(&fs);
1362 pipe.AddDefaultColorAttachment();
1363
1364 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1365 VkSamplerObj sampler(m_device);
1366
1367 VkDescriptorSetObj descriptorSet(m_device);
1368 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1369 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1370
1371 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1372 ASSERT_VK_SUCCESS(err);
1373
1374 m_commandBuffer->begin();
1375 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1376
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001377 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001378 m_commandBuffer->BindDescriptorSet(descriptorSet);
1379
1380 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001381 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001382 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001383 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001384
1385 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001386 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001387
1388 m_errorMonitor->VerifyFound();
1389
1390 m_commandBuffer->EndRenderPass();
1391 m_commandBuffer->end();
1392}
1393
unknown088160a2019-05-23 17:43:13 -06001394TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1395 TEST_DESCRIPTION(
1396 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001397 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1398 bool maintenance1 = false;
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001399 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
1400 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung30b094c2020-05-30 11:42:11 -07001401 maintenance1 = true;
1402 }
1403 ASSERT_NO_FATAL_FAILURE(InitState());
1404
1405 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1406 VkFormatProperties format_props;
1407 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1408 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1409 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1410 return;
1411 }
unknown088160a2019-05-23 17:43:13 -06001412
1413 // Create two images to copy between
1414 VkImageObj src_image_obj(m_device);
1415 VkImageObj dst_image_obj(m_device);
1416
sfricke-samsung1c61f192021-12-31 01:53:03 -06001417 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001418 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001419 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001420 image_create_info.extent.width = 32;
1421 image_create_info.extent.height = 32;
1422 image_create_info.extent.depth = 1;
1423 image_create_info.mipLevels = 1;
1424 image_create_info.arrayLayers = 4;
1425 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1426 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1427 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1428 image_create_info.flags = 0;
1429
1430 src_image_obj.init(&image_create_info);
1431 ASSERT_TRUE(src_image_obj.initialized());
1432
1433 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1434 dst_image_obj.init(&image_create_info);
1435 ASSERT_TRUE(dst_image_obj.initialized());
1436
1437 m_commandBuffer->begin();
1438 VkImageCopy copyRegion;
1439 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1440 copyRegion.srcSubresource.mipLevel = 0;
1441 copyRegion.srcSubresource.baseArrayLayer = 0;
1442 copyRegion.srcSubresource.layerCount = 1;
1443 copyRegion.srcOffset.x = 0;
1444 copyRegion.srcOffset.y = 0;
1445 copyRegion.srcOffset.z = 0;
1446 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1447 copyRegion.dstSubresource.mipLevel = 0;
1448 copyRegion.dstSubresource.baseArrayLayer = 0;
1449 // Introduce failure by forcing the dst layerCount to differ from src
1450 copyRegion.dstSubresource.layerCount = 3;
1451 copyRegion.dstOffset.x = 0;
1452 copyRegion.dstOffset.y = 0;
1453 copyRegion.dstOffset.z = 0;
1454 copyRegion.extent.width = 1;
1455 copyRegion.extent.height = 1;
1456 copyRegion.extent.depth = 1;
1457
sfricke-samsung30b094c2020-05-30 11:42:11 -07001458 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1459 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001460 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1461 &copyRegion);
1462 m_errorMonitor->VerifyFound();
1463}
1464
1465TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1466 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1467
Jeff Leger465acf52020-10-12 18:07:16 -04001468 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1469
1470 bool copy_commands2 = false;
1471 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1472 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1473 copy_commands2 = true;
1474 }
1475 ASSERT_NO_FATAL_FAILURE(InitState());
1476
1477 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001478 if (copy_commands2) {
1479 vkCmdCopyBufferToImage2Function =
1480 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001481 }
unknown088160a2019-05-23 17:43:13 -06001482
1483 VkPhysicalDeviceFeatures device_features = {};
1484 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1485 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1486 if (device_features.textureCompressionBC) {
1487 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1488 } else if (device_features.textureCompressionETC2) {
1489 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1490 } else if (device_features.textureCompressionASTC_LDR) {
1491 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1492 } else {
1493 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1494 return;
1495 }
1496
sfricke-samsung1c61f192021-12-31 01:53:03 -06001497 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001498 ci.flags = 0;
1499 ci.imageType = VK_IMAGE_TYPE_2D;
1500 ci.format = compressed_format;
1501 ci.extent = {32, 32, 1};
1502 ci.mipLevels = 6;
1503 ci.arrayLayers = 1;
1504 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1505 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1506 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1507 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1508 ci.queueFamilyIndexCount = 0;
1509 ci.pQueueFamilyIndices = NULL;
1510 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1511
1512 VkImageObj image(m_device);
1513 image.init(&ci);
1514 ASSERT_TRUE(image.initialized());
1515
1516 VkImageObj odd_image(m_device);
1517 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1518 odd_image.init(&ci);
1519 ASSERT_TRUE(odd_image.initialized());
1520
1521 // Allocate buffers
1522 VkMemoryPropertyFlags reqs = 0;
1523 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1524 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1525 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1526 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1527 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1528
1529 VkBufferImageCopy region = {};
1530 region.bufferRowLength = 0;
1531 region.bufferImageHeight = 0;
1532 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1533 region.imageSubresource.layerCount = 1;
1534 region.imageOffset = {0, 0, 0};
1535 region.bufferOffset = 0;
1536
1537 // start recording
1538 m_commandBuffer->begin();
1539
locke-lunargdf00db02020-03-04 19:00:57 -07001540 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001541 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001542 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1543 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001544 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001545 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1546 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001547 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001548 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1549 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1550
unknown088160a2019-05-23 17:43:13 -06001551 // Mip level copies that work - 5 levels
unknown088160a2019-05-23 17:43:13 -06001552
1553 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1554 region.imageExtent = {32, 32, 1};
1555 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001556 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001557
1558 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1559 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001560 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001561
1562 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1563 region.imageExtent = {8, 8, 1};
1564 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001565 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001566
1567 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1568 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001569 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001570
1571 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1572 region.imageExtent = {4, 4, 1};
1573 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001574 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001575
1576 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1577 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001578 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001579
1580 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1581 region.imageExtent = {2, 2, 1};
1582 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001583
1584 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1585 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001586 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001587
1588 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1589 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001590 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001591
1592 region.imageExtent = {1, 1, 1};
1593 region.imageSubresource.mipLevel = 5;
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, 1,
1596 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001597 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001598
1599 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1600 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001601 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001602
1603 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001605 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001606 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001607 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001608 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001609 m_errorMonitor->VerifyFound();
1610
1611 // Copy width < compressed block size, but not the full mip width
1612 region.imageExtent = {1, 2, 1};
1613 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001614 // width not a multiple of compressed block width
1615 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001616 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001617 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001618 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001619 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001620
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001621 m_errorMonitor->SetDesiredFailureMsg(
1622 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001623 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001624 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001625 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001626 m_errorMonitor->VerifyFound();
1627
1628 // Copy height < compressed block size but not the full mip height
1629 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001630 m_errorMonitor->SetDesiredFailureMsg(
1631 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001632 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001633 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001634 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001635 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001636
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001637 m_errorMonitor->SetDesiredFailureMsg(
1638 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001639 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001640 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001641 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001642 m_errorMonitor->VerifyFound();
1643
1644 // Offsets must be multiple of compressed block size
1645 region.imageOffset = {1, 1, 0};
1646 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001647 // imageOffset not a multiple of block size
1648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001650 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001651 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001652 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001653
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001654 m_errorMonitor->SetDesiredFailureMsg(
1655 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001656 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001657 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001658 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001659 m_errorMonitor->VerifyFound();
1660
Jeff Leger465acf52020-10-12 18:07:16 -04001661 // Equivalent test using KHR_copy_commands2
1662 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1663 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1664 NULL,
1665 region.bufferOffset,
1666 region.bufferRowLength,
1667 region.bufferImageHeight,
1668 region.imageSubresource,
1669 region.imageOffset,
1670 region.imageExtent};
1671 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1672 NULL,
1673 buffer_16.handle(),
1674 image.handle(),
1675 VK_IMAGE_LAYOUT_GENERAL,
1676 1,
1677 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001678 m_errorMonitor->SetDesiredFailureMsg(
Tony-LunarG953d55a2021-11-11 14:20:25 -07001679 kErrorBit, "VUID-VkCopyBufferToImageInfo2-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Tony-LunarG953d55a2021-11-11 14:20:25 -07001681 "VUID-VkCopyBufferToImageInfo2-imageOffset-01793"); // image transfer granularity
Jeff Leger465acf52020-10-12 18:07:16 -04001682 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1683 m_errorMonitor->VerifyFound();
1684 }
1685
unknown088160a2019-05-23 17:43:13 -06001686 // Offset + extent width = mip width - should succeed
1687 region.imageOffset = {4, 4, 0};
1688 region.imageExtent = {3, 4, 1};
1689 region.imageSubresource.mipLevel = 2;
locke-lunargdf00db02020-03-04 19:00:57 -07001690
1691 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1692 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001693 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1694 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001695
1696 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1697 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001698 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1699 &region);
unknown088160a2019-05-23 17:43:13 -06001700
unknown088160a2019-05-23 17:43:13 -06001701 // Offset + extent width < mip width and not a multiple of block width - should fail
1702 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001703 m_errorMonitor->SetDesiredFailureMsg(
1704 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001706 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001707 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1708 &region);
unknown088160a2019-05-23 17:43:13 -06001709 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001710 m_errorMonitor->SetDesiredFailureMsg(
1711 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001713 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001714 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1715 &region);
unknown088160a2019-05-23 17:43:13 -06001716 m_errorMonitor->VerifyFound();
1717}
1718
1719TEST_F(VkLayerTest, ImageBufferCopyTests) {
1720 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001721
1722 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1723 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1724 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1725 if (mp_extensions) {
1726 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1727 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001728 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001729 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001730 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1731 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1732 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1733 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001734 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001735 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1736 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1737 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1738 }
1739 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001740
1741 // Bail if any dimension of transfer granularity is 0.
1742 auto index = m_device->graphics_queue_node_index_;
1743 auto queue_family_properties = m_device->phy().queue_properties();
1744 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1745 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1746 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1747 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1748 return;
1749 }
1750
sfricke-samsung6d97e562020-01-07 22:01:00 -08001751 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1752 // 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 -07001753 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1754 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001755 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001756 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1757 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1758 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1759 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1760 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001761 // compression
1762 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1763 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1764 // multi-planar
1765 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 -06001766
sfricke-samsung6d97e562020-01-07 22:01:00 -08001767 // Verify R8G8B8A8_UINT format is supported for transfer
1768 bool missing_rgba_support = false;
1769 VkFormatProperties props = {0, 0, 0};
1770 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1771 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1772 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1773 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1774
1775 if (!missing_rgba_support) {
1776 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1777 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1778 VK_IMAGE_TILING_OPTIMAL, 0);
1779 ASSERT_TRUE(image_64k.initialized());
1780
1781 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1782 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1783 VK_IMAGE_TILING_OPTIMAL, 0);
1784 ASSERT_TRUE(image_16k.initialized());
1785 }
unknown088160a2019-05-23 17:43:13 -06001786
1787 // Verify all needed Depth/Stencil formats are supported
1788 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001789 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001790 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1791 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1792 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001793 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001794 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1795 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1796 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001797 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001798 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1799 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1800 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001801 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001802 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1803 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1804 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1805
1806 if (!missing_ds_support) {
1807 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1808 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1809 ASSERT_TRUE(image_16k_depth.initialized());
1810
1811 ds_image_4D_1S.Init(
1812 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1813 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1814 VK_IMAGE_TILING_OPTIMAL, 0);
1815 ASSERT_TRUE(ds_image_4D_1S.initialized());
1816
1817 ds_image_3D_1S.Init(
1818 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1819 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1820 VK_IMAGE_TILING_OPTIMAL, 0);
1821 ASSERT_TRUE(ds_image_3D_1S.initialized());
1822
1823 ds_image_2D.Init(
1824 256, 256, 1, VK_FORMAT_D16_UNORM,
1825 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1826 VK_IMAGE_TILING_OPTIMAL, 0);
1827 ASSERT_TRUE(ds_image_2D.initialized());
1828
1829 ds_image_1S.Init(
1830 256, 256, 1, VK_FORMAT_S8_UINT,
1831 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1832 VK_IMAGE_TILING_OPTIMAL, 0);
1833 ASSERT_TRUE(ds_image_1S.initialized());
1834 }
1835
1836 // Allocate buffers
1837 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1838 VkMemoryPropertyFlags reqs = 0;
1839 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1840 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1841 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1842 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1843
1844 VkBufferImageCopy region = {};
1845 region.bufferRowLength = 0;
1846 region.bufferImageHeight = 0;
1847 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1848 region.imageSubresource.layerCount = 1;
1849 region.imageOffset = {0, 0, 0};
1850 region.imageExtent = {64, 64, 1};
1851 region.bufferOffset = 0;
1852
locke-lunargdf00db02020-03-04 19:00:57 -07001853 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001854 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001855 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1856 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001857 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001858 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1859 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001860 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001861 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1862 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1863
sfricke-samsung6d97e562020-01-07 22:01:00 -08001864 if (missing_rgba_support) {
1865 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001866
sfricke-samsung6d97e562020-01-07 22:01:00 -08001867 // start recording for future tests
1868 m_commandBuffer->begin();
1869 } else {
1870 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001872 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1873 &region);
unknown088160a2019-05-23 17:43:13 -06001874 m_errorMonitor->VerifyFound();
1875
Mark Lobodzinski20310782020-02-28 14:25:17 -07001876 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001877 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1878 &region);
1879 m_errorMonitor->VerifyFound();
1880
1881 // start recording
1882 m_commandBuffer->begin();
1883
1884 // successful copies
sfricke-samsung6d97e562020-01-07 22:01:00 -08001885 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1886 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001887
1888 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1889 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001890 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1891 &region);
1892 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001893
1894 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1895 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001896 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1897 &region);
1898 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001899
1900 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1901 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001902 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1903 &region);
1904 region.imageOffset.x = 0;
1905 region.imageExtent.height = 64;
1906 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001907
1908 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1909 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001910 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1911 &region);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001912
1913 // image/buffer too small (extent too large) on copy to image
1914 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001916 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1917 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1918 &region);
1919 m_errorMonitor->VerifyFound();
1920
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001921 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001922 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001923 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001924 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1925 &region);
1926 m_errorMonitor->VerifyFound();
1927
1928 // image/buffer too small (offset) on copy to image
1929 region.imageExtent = {64, 64, 1};
1930 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001931 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001932 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1933 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1934 &region);
1935 m_errorMonitor->VerifyFound();
1936
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001937 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
1938 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001940 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001941 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1942 &region);
1943 m_errorMonitor->VerifyFound();
1944
1945 // image/buffer too small on copy to buffer
1946 region.imageExtent = {64, 64, 1};
1947 region.imageOffset = {0, 0, 0};
1948 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001949 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001950 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
1951 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1952 &region);
1953 m_errorMonitor->VerifyFound();
1954
1955 region.imageExtent = {64, 65, 1};
1956 region.bufferOffset = 0;
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001957 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001958 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001959 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001960 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1961 &region);
1962 m_errorMonitor->VerifyFound();
1963
1964 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07001965 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001966 region.imageExtent = {64, 64, 1};
1967 region.bufferRowLength = 68;
1968 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1969 &region);
1970 m_errorMonitor->VerifyFound();
1971
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05001972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06659");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001973 region.imageExtent.width = 0;
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05001974 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001975 &region);
1976 m_errorMonitor->VerifyFound();
1977
1978 // aspect bits
1979 region.imageExtent = {64, 64, 1};
1980 region.bufferRowLength = 0;
1981 region.bufferImageHeight = 0;
1982 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07001983 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001984 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
1985 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
1986 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
1987 buffer_16k.handle(), 1, &region);
1988 m_errorMonitor->VerifyFound();
1989
Mark Lobodzinski20310782020-02-28 14:25:17 -07001990 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001991 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08001992 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1993 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
1994 buffer_16k.handle(), 1, &region);
1995 m_errorMonitor->VerifyFound();
1996 }
1997
Mark Lobodzinski20310782020-02-28 14:25:17 -07001998 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001999 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002000 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2001 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2002 &region);
2003 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002004 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002005
2006 // Out-of-range mip levels should fail
2007 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002008 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002009 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06221");
2010 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002011 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002012 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002013 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002014 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002015 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2016 &region);
2017 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002019 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2020 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002021 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002022 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002023 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002024 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002025 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2026 &region);
2027 m_errorMonitor->VerifyFound();
2028 region.imageSubresource.mipLevel = 0;
2029
2030 // Out-of-range array layers should fail
2031 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2032 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002034 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2035 &region);
2036 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002037 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002038 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2039 &region);
2040 m_errorMonitor->VerifyFound();
2041 region.imageSubresource.baseArrayLayer = 0;
2042
2043 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002045 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2046 buffer_16k.handle(), 1, &region);
2047 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002049 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2050 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002051 m_errorMonitor->VerifyFound();
2052 }
2053
unknown088160a2019-05-23 17:43:13 -06002054 // Test Depth/Stencil copies
2055 if (missing_ds_support) {
2056 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2057 } else {
2058 VkBufferImageCopy ds_region = {};
2059 ds_region.bufferOffset = 0;
2060 ds_region.bufferRowLength = 0;
2061 ds_region.bufferImageHeight = 0;
2062 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2063 ds_region.imageSubresource.mipLevel = 0;
2064 ds_region.imageSubresource.baseArrayLayer = 0;
2065 ds_region.imageSubresource.layerCount = 1;
2066 ds_region.imageOffset = {0, 0, 0};
2067 ds_region.imageExtent = {256, 256, 1};
2068
2069 // Depth copies that should succeed
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002070 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2071 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002072
locke-lunargdf00db02020-03-04 19:00:57 -07002073 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2074 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002075 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2076 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002077
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002078 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2079 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002080
2081 // Depth copies that should fail
2082 ds_region.bufferOffset = 4;
2083 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002084 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002085 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002086 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2087 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002088 m_errorMonitor->VerifyFound();
2089
2090 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002091 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002092 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002093 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002094 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002095 m_errorMonitor->VerifyFound();
2096
2097 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002098 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002099 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002100 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2101 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002102 m_errorMonitor->VerifyFound();
2103
sfricke-samsung5a019492021-01-25 10:32:08 -08002104 ds_region.bufferOffset = 5;
2105 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2106 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2107 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2108 buffer_128k.handle(), 1, &ds_region);
2109 m_errorMonitor->VerifyFound();
2110 ds_region.imageExtent = {256, 256, 1};
2111
unknown088160a2019-05-23 17:43:13 -06002112 // Stencil copies that should succeed
2113 ds_region.bufferOffset = 0;
2114 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002115 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2116 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002117 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2118 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002119
locke-lunargdf00db02020-03-04 19:00:57 -07002120 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2121 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002122 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2123 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002124
locke-lunargdf00db02020-03-04 19:00:57 -07002125 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2126 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002127 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2128 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002129
2130 // Stencil copies that should fail
2131 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002132 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002133 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002134 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2135 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002136 m_errorMonitor->VerifyFound();
2137
2138 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002139 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002140 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2141 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002142 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2143 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002144 m_errorMonitor->VerifyFound();
2145
2146 ds_region.bufferRowLength = 0;
2147 ds_region.bufferOffset = 4;
2148 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002149 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002150 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002151 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2152 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002153 m_errorMonitor->VerifyFound();
2154 }
2155
2156 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002157 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002158 VkPhysicalDeviceFeatures device_features = {};
2159 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2160 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2161 device_features.textureCompressionASTC_LDR)) {
2162 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2163 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002164 // Verify transfer support for each compression format used blow
2165 bool missing_bc_support = false;
2166 bool missing_etc_support = false;
2167 bool missing_astc_support = false;
2168 bool missing_compression_support = false;
2169
2170 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2171 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2172 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2173 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2174
2175 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2176 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2177 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2178 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2179
2180 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2181 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2182 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2183 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2184
2185 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002186 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2187 0);
2188 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2189 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002190 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002191 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2192 VK_IMAGE_TILING_OPTIMAL, 0);
2193 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2194 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002195 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002196 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2197 VK_IMAGE_TILING_OPTIMAL, 0);
2198 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2199 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002200 } else {
2201 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002202 }
unknown088160a2019-05-23 17:43:13 -06002203
sfricke-samsung6d97e562020-01-07 22:01:00 -08002204 if (missing_compression_support) {
2205 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2206 } else {
2207 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002208 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002209 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002210 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2211 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002212 region.imageExtent = {128, 128, 1};
2213 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2214 buffer_16k.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06002215
sfricke-samsung6d97e562020-01-07 22:01:00 -08002216 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002218 region.bufferOffset = 16;
2219 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2220 buffer_16k.handle(), 1, &region);
2221 m_errorMonitor->VerifyFound();
2222 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002223
sfricke-samsung6d97e562020-01-07 22:01:00 -08002224 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002225 m_errorMonitor->SetDesiredFailureMsg(
2226 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002227 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002228 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2229 region.imageExtent.width = 66;
2230 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2231 buffer_16k.handle(), 1, &region);
2232 m_errorMonitor->VerifyFound();
2233 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002234
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002235 m_errorMonitor->SetDesiredFailureMsg(
2236 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002237 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002238 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2239 region.imageExtent.height = 2;
2240 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2241 buffer_16k.handle(), 1, &region);
2242 m_errorMonitor->VerifyFound();
2243 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002244
sfricke-samsung6d97e562020-01-07 22:01:00 -08002245 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002246
sfricke-samsung6d97e562020-01-07 22:01:00 -08002247 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
sfricke-samsung6d97e562020-01-07 22:01:00 -08002248 region.imageExtent.width = 66;
2249 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002250 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2251 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002252 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2253 buffer_16k.handle(), 1, &region);
2254 region.imageExtent.width = 16;
2255 region.imageOffset.x = 0;
2256 region.imageExtent.height = 2;
2257 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002258 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2259 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002260 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2261 buffer_16k.handle(), 1, &region);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002262 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002263
sfricke-samsung6d97e562020-01-07 22:01:00 -08002264 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002265 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002266 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002267 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002269 region.imageExtent = {64, 64, 1};
2270 region.bufferOffset = 24;
2271 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2272 buffer_16k.handle(), 1, &region);
2273 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002274
sfricke-samsung6d97e562020-01-07 22:01:00 -08002275 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002276 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002277 region.bufferOffset = 0;
2278 region.bufferRowLength = 130;
2279 region.bufferImageHeight = 0;
2280 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2281 buffer_64k.handle(), 1, &region);
2282 m_errorMonitor->VerifyFound();
2283
2284 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002286 region.bufferRowLength = 0;
2287 region.bufferImageHeight = 130;
2288 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2289 buffer_64k.handle(), 1, &region);
2290 m_errorMonitor->VerifyFound();
2291 }
2292 }
2293
2294 // Test multi-planar formats, if supported
2295 if (!mp_extensions) {
2296 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2297 } else {
2298 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2299 // being required with samplerYcbcrConversion feature
2300 bool missing_mp_support = false;
2301 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2302 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2303 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2304 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2305
2306 if (missing_mp_support) {
2307 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2308 } else {
2309 VkBufferImageCopy mp_region = {};
2310 mp_region.bufferOffset = 0;
2311 mp_region.bufferRowLength = 0;
2312 mp_region.bufferImageHeight = 0;
2313 mp_region.imageSubresource.mipLevel = 0;
2314 mp_region.imageSubresource.baseArrayLayer = 0;
2315 mp_region.imageSubresource.layerCount = 1;
2316 mp_region.imageOffset = {0, 0, 0};
2317 mp_region.imageExtent = {128, 128, 1};
2318
2319 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2320 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2321 VK_IMAGE_TILING_OPTIMAL, 0);
2322 ASSERT_TRUE(image_multi_planar.initialized());
2323
2324 // Copies into a mutli-planar image aspect properly
sfricke-samsung6d97e562020-01-07 22:01:00 -08002325 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002326 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2327 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002328 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2329 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002330
2331 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002332 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002333 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2334 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2335 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2336 m_errorMonitor->VerifyFound();
2337
2338 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002340 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2341 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2342 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2343 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002344
2345 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002347 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2348 mp_region.bufferOffset = 5;
2349 mp_region.imageExtent = {8, 8, 1};
2350 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2351 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2352 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002353 }
unknown088160a2019-05-23 17:43:13 -06002354 }
2355}
2356
2357TEST_F(VkLayerTest, MiscImageLayerTests) {
2358 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2359
2360 ASSERT_NO_FATAL_FAILURE(Init());
2361
2362 // TODO: Ideally we should check if a format is supported, before using it.
2363 VkImageObj image(m_device);
2364 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2365 ASSERT_TRUE(image.initialized());
2366 VkBufferObj buffer;
2367 VkMemoryPropertyFlags reqs = 0;
2368 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2369 VkBufferImageCopy region = {};
2370 region.bufferRowLength = 128;
2371 region.bufferImageHeight = 128;
2372 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2373 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2374 region.imageSubresource.layerCount = 1;
2375 region.imageExtent.height = 4;
2376 region.imageExtent.width = 4;
2377 region.imageExtent.depth = 1;
2378
2379 VkImageObj image2(m_device);
2380 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2381 ASSERT_TRUE(image2.initialized());
2382 VkBufferObj buffer2;
2383 VkMemoryPropertyFlags reqs2 = 0;
2384 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002385 m_commandBuffer->begin();
2386
2387 // Image must have offset.z of 0 and extent.depth of 1
2388 // Introduce failure by setting imageExtent.depth to 0
2389 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002390 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05002391 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002392 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2393 &region);
unknown088160a2019-05-23 17:43:13 -06002394 m_errorMonitor->VerifyFound();
2395
2396 region.imageExtent.depth = 1;
2397
2398 // Image must have offset.z of 0 and extent.depth of 1
2399 // Introduce failure by setting imageOffset.z to 4
2400 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2401 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2403 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-06217");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002405 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2406 &region);
unknown088160a2019-05-23 17:43:13 -06002407 m_errorMonitor->VerifyFound();
2408
2409 region.imageOffset.z = 0;
2410 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2411 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2412 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002414 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2415 &region);
unknown088160a2019-05-23 17:43:13 -06002416 m_errorMonitor->VerifyFound();
2417
unknown088160a2019-05-23 17:43:13 -06002418 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2419 region.bufferOffset = 0;
2420 region.imageExtent.height = 128;
2421 region.imageExtent.width = 128;
2422 // Introduce failure by setting bufferRowLength > 0 but less than width
2423 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002424 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002425 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2426 &region);
unknown088160a2019-05-23 17:43:13 -06002427 m_errorMonitor->VerifyFound();
2428
2429 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2430 region.bufferRowLength = 128;
2431 // Introduce failure by setting bufferRowHeight > 0 but less than height
2432 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002433 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
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.bufferImageHeight = 128;
2439 VkImageObj intImage1(m_device);
2440 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2441 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2442 VkImageObj intImage2(m_device);
2443 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2444 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2445 VkImageBlit blitRegion = {};
2446 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2447 blitRegion.srcSubresource.baseArrayLayer = 0;
2448 blitRegion.srcSubresource.layerCount = 1;
2449 blitRegion.srcSubresource.mipLevel = 0;
2450 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2451 blitRegion.dstSubresource.baseArrayLayer = 0;
2452 blitRegion.dstSubresource.layerCount = 1;
2453 blitRegion.dstSubresource.mipLevel = 0;
2454 blitRegion.srcOffsets[0] = {128, 0, 0};
2455 blitRegion.srcOffsets[1] = {128, 128, 1};
2456 blitRegion.dstOffsets[0] = {0, 128, 0};
2457 blitRegion.dstOffsets[1] = {128, 128, 1};
2458
2459 // Look for NULL-blit warning
sfricke-samsung85584a72021-09-30 21:43:38 -07002460 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
2461 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002462 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2463 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002464 m_errorMonitor->VerifyFound();
2465}
2466
2467TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2468 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002469 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2470
2471 bool copy_commands2 = false;
2472 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2473 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2474 copy_commands2 = true;
2475 }
2476 ASSERT_NO_FATAL_FAILURE(InitState());
2477
2478 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2479 if (copy_commands2) {
2480 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2481 }
unknown088160a2019-05-23 17:43:13 -06002482
sfricke-samsung30b094c2020-05-30 11:42:11 -07002483 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2484 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
sjfricke50955f32022-06-05 10:12:52 +09002485 GTEST_SKIP() << "Tests for 1.0 only";
sfricke-samsung30b094c2020-05-30 11:42:11 -07002486 }
2487
sfricke-samsung1c61f192021-12-31 01:53:03 -06002488 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002489 ci.flags = 0;
2490 ci.imageType = VK_IMAGE_TYPE_1D;
2491 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2492 ci.extent = {32, 1, 1};
2493 ci.mipLevels = 1;
2494 ci.arrayLayers = 1;
2495 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2496 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2497 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2498 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2499 ci.queueFamilyIndexCount = 0;
2500 ci.pQueueFamilyIndices = NULL;
2501 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2502
2503 // Create 1D image
2504 VkImageObj image_1D(m_device);
2505 image_1D.init(&ci);
2506 ASSERT_TRUE(image_1D.initialized());
2507
2508 // 2D image
2509 ci.imageType = VK_IMAGE_TYPE_2D;
2510 ci.extent = {32, 32, 1};
2511 VkImageObj image_2D(m_device);
2512 image_2D.init(&ci);
2513 ASSERT_TRUE(image_2D.initialized());
2514
2515 // 3D image
2516 ci.imageType = VK_IMAGE_TYPE_3D;
2517 ci.extent = {32, 32, 8};
2518 VkImageObj image_3D(m_device);
2519 image_3D.init(&ci);
2520 ASSERT_TRUE(image_3D.initialized());
2521
2522 // 2D image array
2523 ci.imageType = VK_IMAGE_TYPE_2D;
2524 ci.extent = {32, 32, 1};
2525 ci.arrayLayers = 8;
2526 VkImageObj image_2D_array(m_device);
2527 image_2D_array.init(&ci);
2528 ASSERT_TRUE(image_2D_array.initialized());
2529
2530 m_commandBuffer->begin();
2531
2532 VkImageCopy copy_region;
2533 copy_region.extent = {32, 1, 1};
2534 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2535 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2536 copy_region.srcSubresource.mipLevel = 0;
2537 copy_region.dstSubresource.mipLevel = 0;
2538 copy_region.srcSubresource.baseArrayLayer = 0;
2539 copy_region.dstSubresource.baseArrayLayer = 0;
2540 copy_region.srcSubresource.layerCount = 1;
2541 copy_region.dstSubresource.layerCount = 1;
2542 copy_region.srcOffset = {0, 0, 0};
2543 copy_region.dstOffset = {0, 0, 0};
2544
2545 // Sanity check
unknown088160a2019-05-23 17:43:13 -06002546 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2547 &copy_region);
unknown088160a2019-05-23 17:43:13 -06002548
Jeff Leger465acf52020-10-12 18:07:16 -04002549 // Equivalent sanity check using KHR_copy_commands2
2550 if (copy_commands2 && vkCmdCopyImage2Function) {
2551 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2552 NULL,
2553 copy_region.srcSubresource,
2554 copy_region.srcOffset,
2555 copy_region.dstSubresource,
2556 copy_region.dstOffset,
2557 copy_region.extent};
2558 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2559 NULL,
2560 image_1D.image(),
2561 VK_IMAGE_LAYOUT_GENERAL,
2562 image_2D.image(),
2563 VK_IMAGE_LAYOUT_GENERAL,
2564 1,
2565 &region2};
Jeff Leger465acf52020-10-12 18:07:16 -04002566 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
Jeff Leger465acf52020-10-12 18:07:16 -04002567 }
2568
unknown088160a2019-05-23 17:43:13 -06002569 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2570 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002571 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2572 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002573 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2574 &copy_region);
2575 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002576
2577 // Equivalent test using KHR_copy_commands2
2578 if (copy_commands2 && vkCmdCopyImage2Function) {
2579 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2580 NULL,
2581 copy_region.srcSubresource,
2582 copy_region.srcOffset,
2583 copy_region.dstSubresource,
2584 copy_region.dstOffset,
2585 copy_region.extent};
2586 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2587 NULL,
2588 image_1D.image(),
2589 VK_IMAGE_LAYOUT_GENERAL,
2590 image_2D.image(),
2591 VK_IMAGE_LAYOUT_GENERAL,
2592 1,
2593 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002594 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2595 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002596 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2597 m_errorMonitor->VerifyFound();
2598 }
2599
unknown088160a2019-05-23 17:43:13 -06002600 copy_region.srcOffset.y = 0;
2601 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002602 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2603 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002604 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2605 &copy_region);
2606 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002607
2608 // Equivalent test using KHR_copy_commands2
2609 if (copy_commands2 && vkCmdCopyImage2Function) {
2610 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2611 NULL,
2612 copy_region.srcSubresource,
2613 copy_region.srcOffset,
2614 copy_region.dstSubresource,
2615 copy_region.dstOffset,
2616 copy_region.extent};
2617 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2618 NULL,
2619 image_2D.image(),
2620 VK_IMAGE_LAYOUT_GENERAL,
2621 image_1D.image(),
2622 VK_IMAGE_LAYOUT_GENERAL,
2623 1,
2624 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2626 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002627 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2628 m_errorMonitor->VerifyFound();
2629 }
2630
unknown088160a2019-05-23 17:43:13 -06002631 copy_region.dstOffset.y = 0;
2632
2633 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2634 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002637 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2638 &copy_region);
2639 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002640
2641 // Equivalent test using KHR_copy_commands2
2642 if (copy_commands2 && vkCmdCopyImage2Function) {
2643 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2644 NULL,
2645 copy_region.srcSubresource,
2646 copy_region.srcOffset,
2647 copy_region.dstSubresource,
2648 copy_region.dstOffset,
2649 copy_region.extent};
2650 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2651 NULL,
2652 image_1D.image(),
2653 VK_IMAGE_LAYOUT_GENERAL,
2654 image_2D.image(),
2655 VK_IMAGE_LAYOUT_GENERAL,
2656 1,
2657 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2659 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002660 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2661 m_errorMonitor->VerifyFound();
2662 }
2663
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2665 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002666 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2667 &copy_region);
2668 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002669
2670 // Equivalent test using KHR_copy_commands2
2671 if (copy_commands2 && vkCmdCopyImage2Function) {
2672 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2673 NULL,
2674 copy_region.srcSubresource,
2675 copy_region.srcOffset,
2676 copy_region.dstSubresource,
2677 copy_region.dstOffset,
2678 copy_region.extent};
2679 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2680 NULL,
2681 image_2D.image(),
2682 VK_IMAGE_LAYOUT_GENERAL,
2683 image_1D.image(),
2684 VK_IMAGE_LAYOUT_GENERAL,
2685 1,
2686 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2688 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002689 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2690 m_errorMonitor->VerifyFound();
2691 }
2692
unknown088160a2019-05-23 17:43:13 -06002693 copy_region.extent.height = 1;
2694
2695 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2696 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002697 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002699 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2700 &copy_region);
2701 m_errorMonitor->VerifyFound();
2702 copy_region.srcOffset.z = 0;
2703 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002706 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2707 &copy_region);
2708 m_errorMonitor->VerifyFound();
2709 copy_region.dstOffset.z = 0;
2710
2711 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2712 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002713 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002715 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002717 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002719 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002720 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2721 &copy_region);
2722 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002724 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002725 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002727 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002729 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002730 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2731 &copy_region);
2732 m_errorMonitor->VerifyFound();
2733 copy_region.extent.depth = 1;
2734
2735 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2736 copy_region.extent = {16, 16, 1};
2737 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002740 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002741 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2742 &copy_region);
2743 m_errorMonitor->VerifyFound();
2744 copy_region.srcOffset.z = 0;
2745 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002748 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002749 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2750 &copy_region);
2751 m_errorMonitor->VerifyFound();
2752 copy_region.dstOffset.z = 0;
2753
2754 // 3D texture accessing an array layer other than 0. VU 09c0011a
2755 copy_region.extent = {4, 4, 1};
2756 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002757 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002758 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002759 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2760 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2761 &copy_region);
2762 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002763 copy_region.srcSubresource.baseArrayLayer = 0;
2764
unknown088160a2019-05-23 17:43:13 -06002765 m_commandBuffer->end();
2766}
2767
2768TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2769 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002770 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07002771 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
2772 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06002773 } else {
2774 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2775 return;
2776 }
2777 ASSERT_NO_FATAL_FAILURE(InitState());
2778
2779 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2780 VkFormatProperties format_props;
2781 // TODO: Remove this check if or when devsim handles extensions.
2782 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2783 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002784 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002785 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2786 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2787 return;
2788 }
2789
sfricke-samsung1c61f192021-12-31 01:53:03 -06002790 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002791 ci.flags = 0;
2792 ci.imageType = VK_IMAGE_TYPE_1D;
2793 ci.format = image_format;
2794 ci.extent = {32, 1, 1};
2795 ci.mipLevels = 1;
2796 ci.arrayLayers = 1;
2797 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2798 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2799 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2800 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2801 ci.queueFamilyIndexCount = 0;
2802 ci.pQueueFamilyIndices = NULL;
2803 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2804
2805 // Create 1D image
2806 VkImageObj image_1D(m_device);
2807 image_1D.init(&ci);
2808 ASSERT_TRUE(image_1D.initialized());
2809
2810 // 2D image
2811 ci.imageType = VK_IMAGE_TYPE_2D;
2812 ci.extent = {32, 32, 1};
2813 VkImageObj image_2D(m_device);
2814 image_2D.init(&ci);
2815 ASSERT_TRUE(image_2D.initialized());
2816
2817 // 3D image
2818 ci.imageType = VK_IMAGE_TYPE_3D;
2819 ci.extent = {32, 32, 8};
2820 VkImageObj image_3D(m_device);
2821 image_3D.init(&ci);
2822 ASSERT_TRUE(image_3D.initialized());
2823
2824 // 2D image array
2825 ci.imageType = VK_IMAGE_TYPE_2D;
2826 ci.extent = {32, 32, 1};
2827 ci.arrayLayers = 8;
2828 VkImageObj image_2D_array(m_device);
2829 image_2D_array.init(&ci);
2830 ASSERT_TRUE(image_2D_array.initialized());
2831
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002832 // second 2D image array
2833 ci.imageType = VK_IMAGE_TYPE_2D;
2834 ci.extent = {32, 32, 1};
2835 ci.arrayLayers = 8;
2836 VkImageObj image_2D_array_2(m_device);
2837 image_2D_array_2.init(&ci);
2838 ASSERT_TRUE(image_2D_array_2.initialized());
2839
unknown088160a2019-05-23 17:43:13 -06002840 m_commandBuffer->begin();
2841
2842 VkImageCopy copy_region;
2843 copy_region.extent = {32, 1, 1};
2844 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2845 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2846 copy_region.srcSubresource.mipLevel = 0;
2847 copy_region.dstSubresource.mipLevel = 0;
2848 copy_region.srcSubresource.baseArrayLayer = 0;
2849 copy_region.dstSubresource.baseArrayLayer = 0;
2850 copy_region.srcSubresource.layerCount = 1;
2851 copy_region.dstSubresource.layerCount = 1;
2852 copy_region.srcOffset = {0, 0, 0};
2853 copy_region.dstOffset = {0, 0, 0};
2854
2855 // Copy from layer not present
2856 copy_region.srcSubresource.baseArrayLayer = 4;
2857 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002859 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2860 &copy_region);
2861 m_errorMonitor->VerifyFound();
2862 copy_region.srcSubresource.baseArrayLayer = 0;
2863 copy_region.srcSubresource.layerCount = 1;
2864
2865 // Copy to layer not present
2866 copy_region.dstSubresource.baseArrayLayer = 1;
2867 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002868 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002869 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2870 &copy_region);
2871 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002872 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002873 copy_region.dstSubresource.layerCount = 1;
2874
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002875 // both 2D and extent.depth not 1
2876 // Need two 2D array images to prevent other errors
2877 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002878 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002879 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2880 1, &copy_region);
2881 m_errorMonitor->VerifyFound();
2882 copy_region.extent = {32, 1, 1};
2883
2884 // 2D src / 3D dst and depth not equal to src layerCount
2885 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002887 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002888 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2889 &copy_region);
2890 m_errorMonitor->VerifyFound();
2891 copy_region.extent = {32, 1, 1};
2892
2893 // 3D src / 2D dst and depth not equal to dst layerCount
2894 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002897 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2898 &copy_region);
2899 m_errorMonitor->VerifyFound();
2900 copy_region.extent = {32, 1, 1};
2901
unknown088160a2019-05-23 17:43:13 -06002902 m_commandBuffer->end();
2903}
2904
2905TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2906 // Image copy tests on compressed images with block alignment errors
2907 SetTargetApiVersion(VK_API_VERSION_1_1);
2908 ASSERT_NO_FATAL_FAILURE(Init());
2909
2910 // Select a compressed format and verify support
2911 VkPhysicalDeviceFeatures device_features = {};
2912 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2913 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2914 if (device_features.textureCompressionBC) {
2915 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2916 } else if (device_features.textureCompressionETC2) {
2917 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2918 } else if (device_features.textureCompressionASTC_LDR) {
2919 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2920 }
2921
sfricke-samsung1c61f192021-12-31 01:53:03 -06002922 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002923 ci.flags = 0;
2924 ci.imageType = VK_IMAGE_TYPE_2D;
2925 ci.format = compressed_format;
2926 ci.extent = {64, 64, 1};
2927 ci.mipLevels = 1;
2928 ci.arrayLayers = 1;
2929 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2930 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2931 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2932 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2933 ci.queueFamilyIndexCount = 0;
2934 ci.pQueueFamilyIndices = NULL;
2935 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2936
2937 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002938 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2939 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002940 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2941 return;
2942 }
2943
2944 // Create images
2945 VkImageObj image_1(m_device);
2946 image_1.init(&ci);
2947 ASSERT_TRUE(image_1.initialized());
2948
2949 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
2950 VkImageObj image_2(m_device);
2951 image_2.init(&ci);
2952 ASSERT_TRUE(image_2.initialized());
2953
2954 m_commandBuffer->begin();
2955
2956 VkImageCopy copy_region;
2957 copy_region.extent = {48, 48, 1};
2958 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2959 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2960 copy_region.srcSubresource.mipLevel = 0;
2961 copy_region.dstSubresource.mipLevel = 0;
2962 copy_region.srcSubresource.baseArrayLayer = 0;
2963 copy_region.dstSubresource.baseArrayLayer = 0;
2964 copy_region.srcSubresource.layerCount = 1;
2965 copy_region.dstSubresource.layerCount = 1;
2966 copy_region.srcOffset = {0, 0, 0};
2967 copy_region.dstOffset = {0, 0, 0};
2968
2969 // Sanity check
unknown088160a2019-05-23 17:43:13 -06002970 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
unknown088160a2019-05-23 17:43:13 -06002971
2972 std::string vuid;
2973 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
2974 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
2975
2976 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
2977 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002978 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06002979 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07002980 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2981 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002982 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
2983 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2984 m_errorMonitor->VerifyFound();
2985 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07002986 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002988 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
2989 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2990 m_errorMonitor->VerifyFound();
2991 copy_region.srcOffset = {0, 0, 0};
2992
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002993 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06002994 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07002995 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2996 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002997 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
2998 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2999 m_errorMonitor->VerifyFound();
3000 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003001 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3002 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003003 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3004 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3005 m_errorMonitor->VerifyFound();
3006 copy_region.dstOffset = {0, 0, 0};
3007
3008 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003009 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003010 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3012 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003013 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3014 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3015 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003016 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003017 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003020 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3021 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3022 m_errorMonitor->VerifyFound();
3023
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003024 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003025 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3027 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003028 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3029 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3030 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003031 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003032 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003035 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3036 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3037 m_errorMonitor->VerifyFound();
3038
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003039 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3040 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003041 // There are currently no supported compressed formats with a block depth other than 1,
3042 // so impossible to create a 'not a multiple' condition for depth.
3043 m_commandBuffer->end();
3044}
3045
3046TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3047 // Image copy tests on single-plane _422 formats with block alignment errors
3048
3049 // Enable KHR multiplane req'd extensions
3050 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3051 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3052 if (mp_extensions) {
3053 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3054 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003055 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003056 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003057 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3058 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3059 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3060 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003061 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003062 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3063 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3064 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3065 } else {
3066 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3067 return;
3068 }
3069 ASSERT_NO_FATAL_FAILURE(InitState());
3070
3071 // Select a _422 format and verify support
sfricke-samsung1c61f192021-12-31 01:53:03 -06003072 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003073 ci.flags = 0;
3074 ci.imageType = VK_IMAGE_TYPE_2D;
3075 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3076 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3077 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3078 ci.mipLevels = 1;
3079 ci.arrayLayers = 1;
3080 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3081 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3082 ci.queueFamilyIndexCount = 0;
3083 ci.pQueueFamilyIndices = NULL;
3084 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3085
3086 // Verify formats
3087 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3088 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3089 if (!supported) {
3090 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3091 return; // Assume there's low ROI on searching for different mp formats
3092 }
3093
3094 // Create images
3095 ci.extent = {64, 64, 1};
3096 VkImageObj image_422(m_device);
3097 image_422.init(&ci);
3098 ASSERT_TRUE(image_422.initialized());
3099
3100 ci.extent = {64, 64, 1};
3101 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3102 VkImageObj image_ucmp(m_device);
3103 image_ucmp.init(&ci);
3104 ASSERT_TRUE(image_ucmp.initialized());
3105
3106 m_commandBuffer->begin();
3107
3108 VkImageCopy copy_region;
3109 copy_region.extent = {48, 48, 1};
3110 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3111 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3112 copy_region.srcSubresource.mipLevel = 0;
3113 copy_region.dstSubresource.mipLevel = 0;
3114 copy_region.srcSubresource.baseArrayLayer = 0;
3115 copy_region.dstSubresource.baseArrayLayer = 0;
3116 copy_region.srcSubresource.layerCount = 1;
3117 copy_region.dstSubresource.layerCount = 1;
3118 copy_region.srcOffset = {0, 0, 0};
3119 copy_region.dstOffset = {0, 0, 0};
3120
3121 // Src offsets must be multiples of compressed block sizes
3122 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003123 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003125 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3126 &copy_region);
3127 m_errorMonitor->VerifyFound();
3128 copy_region.srcOffset = {0, 0, 0};
3129
3130 // Dst offsets must be multiples of compressed block sizes
3131 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003135 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3136 &copy_region);
3137 m_errorMonitor->VerifyFound();
3138 copy_region.dstOffset = {0, 0, 0};
3139
3140 // Copy extent must be multiples of compressed block sizes if not full width/height
3141 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003144 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3145 &copy_region);
3146 m_errorMonitor->VerifyFound();
3147
unknown357e1782019-09-25 17:57:40 -06003148 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003149 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3150 &copy_region);
unknown088160a2019-05-23 17:43:13 -06003151 copy_region.dstOffset = {0, 0, 0};
3152
3153 m_commandBuffer->end();
3154}
3155
3156TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3157 // Image copy tests on multiplane images with aspect errors
3158
3159 // Enable KHR multiplane req'd extensions
3160 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3161 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3162 if (mp_extensions) {
3163 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3164 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003165 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003166 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003167 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3168 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3169 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3170 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003171 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003172 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3173 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3174 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3175 } else {
3176 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3177 return;
3178 }
3179 ASSERT_NO_FATAL_FAILURE(InitState());
3180
3181 // Select multi-plane formats and verify support
3182 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3183 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3184
sfricke-samsung1c61f192021-12-31 01:53:03 -06003185 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003186 ci.flags = 0;
3187 ci.imageType = VK_IMAGE_TYPE_2D;
3188 ci.format = mp2_format;
3189 ci.extent = {256, 256, 1};
3190 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3191 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3192 ci.mipLevels = 1;
3193 ci.arrayLayers = 1;
3194 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3195 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3196 ci.queueFamilyIndexCount = 0;
3197 ci.pQueueFamilyIndices = NULL;
3198 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3199
3200 // Verify formats
3201 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3202 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3203 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3204 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3205 ci.format = mp3_format;
3206 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3207 if (!supported) {
3208 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3209 kSkipPrefix);
3210 return; // Assume there's low ROI on searching for different mp formats
3211 }
3212
3213 // Create images
3214 VkImageObj mp3_image(m_device);
3215 mp3_image.init(&ci);
3216 ASSERT_TRUE(mp3_image.initialized());
3217
3218 ci.format = mp2_format;
3219 VkImageObj mp2_image(m_device);
3220 mp2_image.init(&ci);
3221 ASSERT_TRUE(mp2_image.initialized());
3222
3223 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3224 VkImageObj sp_image(m_device);
3225 sp_image.init(&ci);
3226 ASSERT_TRUE(sp_image.initialized());
3227
3228 m_commandBuffer->begin();
3229
3230 VkImageCopy copy_region;
3231 copy_region.extent = {128, 128, 1};
3232 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3233 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3234 copy_region.srcSubresource.mipLevel = 0;
3235 copy_region.dstSubresource.mipLevel = 0;
3236 copy_region.srcSubresource.baseArrayLayer = 0;
3237 copy_region.dstSubresource.baseArrayLayer = 0;
3238 copy_region.srcSubresource.layerCount = 1;
3239 copy_region.dstSubresource.layerCount = 1;
3240 copy_region.srcOffset = {0, 0, 0};
3241 copy_region.dstOffset = {0, 0, 0};
3242
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003244 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3245 &copy_region);
3246 m_errorMonitor->VerifyFound();
3247
unknown088160a2019-05-23 17:43:13 -06003248 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3249 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003251 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3252 &copy_region);
3253 m_errorMonitor->VerifyFound();
3254
3255 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3256 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003257 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003258 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3259 &copy_region);
3260 m_errorMonitor->VerifyFound();
3261
3262 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003264 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3265 &copy_region);
3266 m_errorMonitor->VerifyFound();
3267
3268 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003269 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003271 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3272 &copy_region);
3273 m_errorMonitor->VerifyFound();
3274
3275 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3276 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003277 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003278 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003279 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3280 &copy_region);
3281 m_errorMonitor->VerifyFound();
3282
3283 m_commandBuffer->end();
3284}
3285
3286TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3287 // Image copy with source region specified greater than src image size
3288 ASSERT_NO_FATAL_FAILURE(Init());
3289
3290 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003291 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003292 ci.flags = 0;
3293 ci.imageType = VK_IMAGE_TYPE_3D;
3294 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3295 ci.extent = {32, 32, 8};
3296 ci.mipLevels = 6;
3297 ci.arrayLayers = 1;
3298 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3299 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3300 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3301 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3302 ci.queueFamilyIndexCount = 0;
3303 ci.pQueueFamilyIndices = NULL;
3304 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3305
3306 VkImageObj src_image(m_device);
3307 src_image.init(&ci);
3308 ASSERT_TRUE(src_image.initialized());
3309
3310 // Dest image with one more mip level
3311 ci.extent = {64, 64, 16};
3312 ci.mipLevels = 7;
3313 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3314 VkImageObj dst_image(m_device);
3315 dst_image.init(&ci);
3316 ASSERT_TRUE(dst_image.initialized());
3317
3318 m_commandBuffer->begin();
3319
3320 VkImageCopy copy_region;
3321 copy_region.extent = {32, 32, 8};
3322 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3323 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3324 copy_region.srcSubresource.mipLevel = 0;
3325 copy_region.dstSubresource.mipLevel = 0;
3326 copy_region.srcSubresource.baseArrayLayer = 0;
3327 copy_region.dstSubresource.baseArrayLayer = 0;
3328 copy_region.srcSubresource.layerCount = 1;
3329 copy_region.dstSubresource.layerCount = 1;
3330 copy_region.srcOffset = {0, 0, 0};
3331 copy_region.dstOffset = {0, 0, 0};
3332
unknown088160a2019-05-23 17:43:13 -06003333 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3334 &copy_region);
unknown088160a2019-05-23 17:43:13 -06003335
sfricke-samsung066e0c72022-03-15 23:35:23 -05003336 // Source exceeded in x-dim
unknown088160a2019-05-23 17:43:13 -06003337 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003338 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003339 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3340 &copy_region);
3341 m_errorMonitor->VerifyFound();
3342
sfricke-samsung066e0c72022-03-15 23:35:23 -05003343 // Dest exceeded in x-dim in negative direction (since offset is a signed in)
3344 copy_region.extent.width = 4;
3345 copy_region.srcOffset.x = -8;
3346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
3347 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3348 &copy_region);
3349 m_errorMonitor->VerifyFound();
3350 copy_region.extent.width = 32;
3351
3352 // Source exceeded in y-dim
unknown088160a2019-05-23 17:43:13 -06003353 copy_region.srcOffset.x = 0;
3354 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003355 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003356 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3357 &copy_region);
3358 m_errorMonitor->VerifyFound();
3359
sfricke-samsung066e0c72022-03-15 23:35:23 -05003360 // Source exceeded in z-dim
unknown088160a2019-05-23 17:43:13 -06003361 copy_region.extent = {4, 4, 4};
3362 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003363 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003364 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3365 &copy_region);
3366 m_errorMonitor->VerifyFound();
3367
3368 m_commandBuffer->end();
3369}
3370
3371TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3372 // Image copy with dest region specified greater than dest image size
3373 ASSERT_NO_FATAL_FAILURE(Init());
3374
3375 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003376 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003377 ci.flags = 0;
3378 ci.imageType = VK_IMAGE_TYPE_3D;
3379 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3380 ci.extent = {32, 32, 8};
3381 ci.mipLevels = 6;
3382 ci.arrayLayers = 1;
3383 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3384 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3385 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3386 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3387 ci.queueFamilyIndexCount = 0;
3388 ci.pQueueFamilyIndices = NULL;
3389 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3390
3391 VkImageObj dst_image(m_device);
3392 dst_image.init(&ci);
3393 ASSERT_TRUE(dst_image.initialized());
3394
3395 // Src image with one more mip level
3396 ci.extent = {64, 64, 16};
3397 ci.mipLevels = 7;
3398 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3399 VkImageObj src_image(m_device);
3400 src_image.init(&ci);
3401 ASSERT_TRUE(src_image.initialized());
3402
3403 m_commandBuffer->begin();
3404
3405 VkImageCopy copy_region;
3406 copy_region.extent = {32, 32, 8};
3407 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3408 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3409 copy_region.srcSubresource.mipLevel = 0;
3410 copy_region.dstSubresource.mipLevel = 0;
3411 copy_region.srcSubresource.baseArrayLayer = 0;
3412 copy_region.dstSubresource.baseArrayLayer = 0;
3413 copy_region.srcSubresource.layerCount = 1;
3414 copy_region.dstSubresource.layerCount = 1;
3415 copy_region.srcOffset = {0, 0, 0};
3416 copy_region.dstOffset = {0, 0, 0};
3417
unknown088160a2019-05-23 17:43:13 -06003418 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3419 &copy_region);
unknown088160a2019-05-23 17:43:13 -06003420
sfricke-samsung066e0c72022-03-15 23:35:23 -05003421 // Dest exceeded in x-dim
unknown088160a2019-05-23 17:43:13 -06003422 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003424 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3425 &copy_region);
3426 m_errorMonitor->VerifyFound();
3427
sfricke-samsung066e0c72022-03-15 23:35:23 -05003428 // Dest exceeded in x-dim in negative direction (since offset is a signed in)
3429 copy_region.extent.width = 4;
3430 copy_region.dstOffset.x = -8;
3431 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
3432 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3433 &copy_region);
3434 m_errorMonitor->VerifyFound();
3435 copy_region.extent.width = 32;
3436
unknown088160a2019-05-23 17:43:13 -06003437 copy_region.dstOffset.x = 0;
3438 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003439 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003440 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3441 &copy_region);
3442 m_errorMonitor->VerifyFound();
3443
sfricke-samsung066e0c72022-03-15 23:35:23 -05003444 // Dest exceeded in z-dim
unknown088160a2019-05-23 17:43:13 -06003445 copy_region.extent = {4, 4, 4};
3446 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003447 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003448 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3449 &copy_region);
3450 m_errorMonitor->VerifyFound();
3451
3452 m_commandBuffer->end();
3453}
3454
sfricke-samsungea1154b2022-03-31 22:29:34 -05003455TEST_F(VkLayerTest, CopyImageZeroSize) {
3456 TEST_DESCRIPTION("Image Copy with empty regions");
3457 ASSERT_NO_FATAL_FAILURE(Init());
3458
3459 // Create images with full mip chain
3460 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
3461 ci.flags = 0;
3462 ci.imageType = VK_IMAGE_TYPE_3D;
3463 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3464 ci.extent = {32, 32, 8};
3465 ci.mipLevels = 6;
3466 ci.arrayLayers = 1;
3467 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3468 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3469 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3470 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3471 ci.queueFamilyIndexCount = 0;
3472 ci.pQueueFamilyIndices = NULL;
3473 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3474
3475 VkImageObj src_image(m_device);
3476 src_image.init(&ci);
3477 ASSERT_TRUE(src_image.initialized());
3478
3479 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3480 VkImageObj dst_image(m_device);
3481 dst_image.init(&ci);
3482 ASSERT_TRUE(dst_image.initialized());
3483
3484 VkBufferObj buffer;
3485 VkMemoryPropertyFlags reqs = 0;
3486 buffer.init_as_src_and_dst(*m_device, 16384, reqs); // large enough for image
3487
3488 m_commandBuffer->begin();
3489
3490 VkImageCopy copy_region;
3491 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3492 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3493 copy_region.srcSubresource.mipLevel = 0;
3494 copy_region.dstSubresource.mipLevel = 0;
3495 copy_region.srcSubresource.baseArrayLayer = 0;
3496 copy_region.dstSubresource.baseArrayLayer = 0;
3497 copy_region.srcSubresource.layerCount = 1;
3498 copy_region.dstSubresource.layerCount = 1;
3499 copy_region.srcOffset = {0, 0, 0};
3500 copy_region.dstOffset = {0, 0, 0};
3501
3502 copy_region.extent = {4, 4, 0};
3503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06670");
3504 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3505 &copy_region);
3506 m_errorMonitor->VerifyFound();
3507
3508 copy_region.extent = {0, 0, 4};
3509 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06668"); // width
3510 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06669"); // height
3511 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3512 &copy_region);
3513 m_errorMonitor->VerifyFound();
3514
3515 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
3516 VkBufferImageCopy buffer_image_copy;
3517 buffer_image_copy.bufferRowLength = 0;
3518 buffer_image_copy.bufferImageHeight = 0;
3519 buffer_image_copy.imageSubresource = image_subresource;
3520 buffer_image_copy.imageOffset = {0, 0, 0};
3521 buffer_image_copy.bufferOffset = 0;
3522
3523 buffer_image_copy.imageExtent = {4, 0, 1};
3524 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06660");
3525 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer.handle(), 1,
3526 &buffer_image_copy);
3527 m_errorMonitor->VerifyFound();
3528
3529 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06660");
3530 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3531 &buffer_image_copy);
3532 m_errorMonitor->VerifyFound();
3533
3534 // depth is now zero
3535 buffer_image_copy.imageExtent = {4, 1, 0};
3536 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
3537 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer.handle(), 1,
3538 &buffer_image_copy);
3539 m_errorMonitor->VerifyFound();
3540
3541 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
3542 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3543 &buffer_image_copy);
3544 m_errorMonitor->VerifyFound();
3545
3546 m_commandBuffer->end();
3547}
3548
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003549TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3550 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3551
3552 // Enable KHR multiplane req'd extensions
3553 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3554 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3555 if (mp_extensions == true) {
3556 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3557 }
3558 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003559 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003560 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3561 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3562 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3563 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003564 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003565 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3566 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3567 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3568 } else {
3569 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3570 return;
3571 }
3572 ASSERT_NO_FATAL_FAILURE(InitState());
3573
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003574 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3575 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003576 VkFormatProperties props = {0, 0, 0};
3577 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003578 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003579 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3580 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3581 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3582
3583 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003584 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003585 return;
3586 }
3587
3588 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3589 VkImageObj src_image(m_device);
3590 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003591 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 -08003592 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003593 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 -08003594 ASSERT_TRUE(dst_image.initialized());
3595
3596 VkImageCopy copy_region = {};
3597 copy_region.extent = {64, 64, 1}; // Size of plane 1
3598 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3599 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3600 copy_region.srcSubresource.mipLevel = 0;
3601 copy_region.dstSubresource.mipLevel = 0;
3602 copy_region.srcSubresource.baseArrayLayer = 0;
3603 copy_region.dstSubresource.baseArrayLayer = 0;
3604 copy_region.srcSubresource.layerCount = 1;
3605 copy_region.dstSubresource.layerCount = 1;
3606 copy_region.srcOffset = {0, 0, 0};
3607 copy_region.dstOffset = {0, 0, 0};
3608 VkImageCopy original_region = copy_region;
3609
3610 m_commandBuffer->begin();
3611
3612 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003613 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3614 &copy_region);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003615
3616 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3617 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3618 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003619 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3620 &copy_region);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003621
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003622 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003623 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3624 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3625
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003626 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3627 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3628 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07003629 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3630 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003631 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3632 &copy_region);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003633
3634 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3635 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3636 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07003637 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3638 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003639 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3640 &copy_region);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003641
3642 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3643 copy_region.extent = {128, 64, 1};
3644 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3645 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07003646 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3647 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003648 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3649 &copy_region);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003650
3651 // 128x64 copy from plane 0 -> Plane 1
3652 copy_region.extent = {128, 64, 1};
3653 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3654 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003656 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3657 &copy_region);
3658 m_errorMonitor->VerifyFound();
3659
3660 // 128x64 copy from plane 1 -> Plane 0
3661 copy_region.extent = {128, 64, 1};
3662 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3663 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003665 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3666 &copy_region);
3667 m_errorMonitor->VerifyFound();
3668
3669 // src exceeded in y-dim from offset
3670 copy_region = original_region;
3671 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003673 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3674 &copy_region);
3675 m_errorMonitor->VerifyFound();
3676
3677 // dst exceeded in y-dim from offset
3678 copy_region = original_region;
3679 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003681 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3682 &copy_region);
3683 m_errorMonitor->VerifyFound();
3684
3685 m_commandBuffer->end();
3686}
3687
unknown088160a2019-05-23 17:43:13 -06003688TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sjfricke3a10ae82022-08-02 18:48:57 +09003689 if (!OverrideDevsimForDeviceProfileLayer()) {
3690 GTEST_SKIP() << "Failed to override devsim for device profile layer.";
sfricke-samsung51067b22020-04-30 21:41:17 -07003691 }
unknown088160a2019-05-23 17:43:13 -06003692
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003693 // Enable KHR multiplane req'd extensions
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003694 AddRequiredExtensions(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3695 ASSERT_NO_FATAL_FAILURE(InitFramework());
3696 if (!AreRequiredExtensionsEnabled()) {
3697 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003698 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003699 auto mp_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR>();
3700 auto features2 = GetPhysicalDeviceFeatures2(mp_features);
3701
3702 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
unknown088160a2019-05-23 17:43:13 -06003703
sfricke-samsung51067b22020-04-30 21:41:17 -07003704 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3705 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsung51067b22020-04-30 21:41:17 -07003706 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
sjfricke3a10ae82022-08-02 18:48:57 +09003707 GTEST_SKIP() << "Failed to load device profile layer.";
sfricke-samsung51067b22020-04-30 21:41:17 -07003708 }
3709
3710 // Set transfer for all potential used formats
3711 VkFormatProperties format_props;
3712 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3713 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3714 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3715
3716 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3717 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3718 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003719
sfricke-samsung1c61f192021-12-31 01:53:03 -06003720 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003721 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003722 image_create_info.extent.width = 32;
3723 image_create_info.extent.height = 32;
3724 image_create_info.extent.depth = 1;
3725 image_create_info.mipLevels = 1;
3726 image_create_info.arrayLayers = 1;
3727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003728 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3729 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003730 image_create_info.flags = 0;
3731
sfricke-samsung51067b22020-04-30 21:41:17 -07003732 image_create_info.format = VK_FORMAT_R8_UNORM;
3733 VkImageObj image_8b_unorm(m_device);
3734 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003735
sfricke-samsung51067b22020-04-30 21:41:17 -07003736 image_create_info.format = VK_FORMAT_R8_UINT;
3737 VkImageObj image_8b_uint(m_device);
3738 image_8b_uint.init(&image_create_info);
3739
3740 // First try to test two single plane mismatch
3741 {
3742 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3743 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3744 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3745
3746 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3747 VkImageObj image_32b_unorm(m_device);
3748 image_32b_unorm.init(&image_create_info);
3749
3750 m_commandBuffer->begin();
3751 VkImageCopy copyRegion;
3752 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3753 copyRegion.srcSubresource.mipLevel = 0;
3754 copyRegion.srcSubresource.baseArrayLayer = 0;
3755 copyRegion.srcSubresource.layerCount = 1;
3756 copyRegion.srcOffset.x = 0;
3757 copyRegion.srcOffset.y = 0;
3758 copyRegion.srcOffset.z = 0;
3759 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3760 copyRegion.dstSubresource.mipLevel = 0;
3761 copyRegion.dstSubresource.baseArrayLayer = 0;
3762 copyRegion.dstSubresource.layerCount = 1;
3763 copyRegion.dstOffset.x = 0;
3764 copyRegion.dstOffset.y = 0;
3765 copyRegion.dstOffset.z = 0;
3766 copyRegion.extent.width = 1;
3767 copyRegion.extent.height = 1;
3768 copyRegion.extent.depth = 1;
3769
3770 // Sanity check between two 8bit formats
sfricke-samsung51067b22020-04-30 21:41:17 -07003771 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3772 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
sfricke-samsung51067b22020-04-30 21:41:17 -07003773
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003774 const char *vuid = (IsExtensionsEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME))
3775 ? "VUID-vkCmdCopyImage-srcImage-01548"
3776 : "VUID-vkCmdCopyImage-srcImage-00135";
sfricke-samsung51067b22020-04-30 21:41:17 -07003777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3778 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3779 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3780 m_errorMonitor->VerifyFound();
3781
3782 // Swap src and dst
3783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3784 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3785 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3786 m_errorMonitor->VerifyFound();
3787
3788 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003789 }
3790
sfricke-samsung51067b22020-04-30 21:41:17 -07003791 // DstImage is a mismatched plane of a multi-planar format
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06003792 if (!mp_features.samplerYcbcrConversion) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003793 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3794 } else {
3795 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3796 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3797 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003798
sfricke-samsung51067b22020-04-30 21:41:17 -07003799 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3800 VkImageObj image_8b_16b_420_unorm(m_device);
3801 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003802
sfricke-samsung51067b22020-04-30 21:41:17 -07003803 m_commandBuffer->begin();
3804 VkImageCopy copyRegion;
3805 copyRegion.srcSubresource.mipLevel = 0;
3806 copyRegion.srcSubresource.baseArrayLayer = 0;
3807 copyRegion.srcSubresource.layerCount = 1;
3808 copyRegion.srcOffset.x = 0;
3809 copyRegion.srcOffset.y = 0;
3810 copyRegion.srcOffset.z = 0;
3811 copyRegion.dstSubresource.mipLevel = 0;
3812 copyRegion.dstSubresource.baseArrayLayer = 0;
3813 copyRegion.dstSubresource.layerCount = 1;
3814 copyRegion.dstOffset.x = 0;
3815 copyRegion.dstOffset.y = 0;
3816 copyRegion.dstOffset.z = 0;
3817 copyRegion.extent.width = 1;
3818 copyRegion.extent.height = 1;
3819 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003820
sfricke-samsung51067b22020-04-30 21:41:17 -07003821 // First test single-plane -> multi-plan
3822 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3823 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003824
sfricke-samsung51067b22020-04-30 21:41:17 -07003825 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
sfricke-samsung51067b22020-04-30 21:41:17 -07003826 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3827 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003828
locke-lunargdf00db02020-03-04 19:00:57 -07003829 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3830 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3831
sfricke-samsung51067b22020-04-30 21:41:17 -07003832 // Make sure no false postiives if Compatible format
sfricke-samsung51067b22020-04-30 21:41:17 -07003833 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3834 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003835
sfricke-samsung51067b22020-04-30 21:41:17 -07003836 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3837 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3838 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3839 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3840 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3841 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003842
sfricke-samsung51067b22020-04-30 21:41:17 -07003843 // Same tests but swap src and dst
3844 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3845 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003846
locke-lunargdf00db02020-03-04 19:00:57 -07003847 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3848 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3849 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3850 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3851
sfricke-samsung51067b22020-04-30 21:41:17 -07003852 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3853 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
sfricke-samsung51067b22020-04-30 21:41:17 -07003854
locke-lunargdf00db02020-03-04 19:00:57 -07003855 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3856 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3857
sfricke-samsung51067b22020-04-30 21:41:17 -07003858 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3859 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
sfricke-samsung51067b22020-04-30 21:41:17 -07003860
3861 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3862 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3863 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3864 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3865 m_errorMonitor->VerifyFound();
3866
3867 m_commandBuffer->end();
3868 }
unknown088160a2019-05-23 17:43:13 -06003869}
3870
3871TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3872 ASSERT_NO_FATAL_FAILURE(Init());
3873 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3874 if (!depth_format) {
3875 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3876 return;
3877 }
3878
3879 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003880 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003881 if (properties.optimalTilingFeatures == 0) {
3882 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3883 return;
3884 }
3885
3886 VkImageObj srcImage(m_device);
3887 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3888 ASSERT_TRUE(srcImage.initialized());
3889 VkImageObj dstImage(m_device);
3890 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3891 ASSERT_TRUE(dstImage.initialized());
3892
3893 // Create two images of different types and try to copy between them
3894
3895 m_commandBuffer->begin();
3896 VkImageCopy copyRegion;
3897 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3898 copyRegion.srcSubresource.mipLevel = 0;
3899 copyRegion.srcSubresource.baseArrayLayer = 0;
3900 copyRegion.srcSubresource.layerCount = 1;
3901 copyRegion.srcOffset.x = 0;
3902 copyRegion.srcOffset.y = 0;
3903 copyRegion.srcOffset.z = 0;
3904 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3905 copyRegion.dstSubresource.mipLevel = 0;
3906 copyRegion.dstSubresource.baseArrayLayer = 0;
3907 copyRegion.dstSubresource.layerCount = 1;
3908 copyRegion.dstOffset.x = 0;
3909 copyRegion.dstOffset.y = 0;
3910 copyRegion.dstOffset.z = 0;
3911 copyRegion.extent.width = 1;
3912 copyRegion.extent.height = 1;
3913 copyRegion.extent.depth = 1;
3914
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003916 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3917 &copyRegion);
3918 m_commandBuffer->end();
3919
3920 m_errorMonitor->VerifyFound();
3921}
3922
3923TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3924 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3925
3926 ASSERT_NO_FATAL_FAILURE(Init());
3927
3928 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003929 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3930 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3931 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003932
3933 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3934 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3935 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3936 return;
3937 }
3938
sfricke-samsung1c61f192021-12-31 01:53:03 -06003939 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003940 ci.flags = 0;
3941 ci.imageType = VK_IMAGE_TYPE_2D;
3942 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3943 ci.extent = {128, 128, 1};
3944 ci.mipLevels = 1;
3945 ci.arrayLayers = 1;
3946 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3947 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3948 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3949 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3950 ci.queueFamilyIndexCount = 0;
3951 ci.pQueueFamilyIndices = NULL;
3952 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3953
3954 VkImageObj image1(m_device);
3955 image1.init(&ci);
3956 ASSERT_TRUE(image1.initialized());
3957
3958 ci.samples = VK_SAMPLE_COUNT_2_BIT;
3959 VkImageObj image2(m_device);
3960 image2.init(&ci);
3961 ASSERT_TRUE(image2.initialized());
3962
3963 ci.samples = VK_SAMPLE_COUNT_4_BIT;
3964 VkImageObj image4(m_device);
3965 image4.init(&ci);
3966 ASSERT_TRUE(image4.initialized());
3967
3968 m_commandBuffer->begin();
3969
3970 VkImageCopy copyRegion;
3971 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3972 copyRegion.srcSubresource.mipLevel = 0;
3973 copyRegion.srcSubresource.baseArrayLayer = 0;
3974 copyRegion.srcSubresource.layerCount = 1;
3975 copyRegion.srcOffset = {0, 0, 0};
3976 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3977 copyRegion.dstSubresource.mipLevel = 0;
3978 copyRegion.dstSubresource.baseArrayLayer = 0;
3979 copyRegion.dstSubresource.layerCount = 1;
3980 copyRegion.dstOffset = {0, 0, 0};
3981 copyRegion.extent = {128, 128, 1};
3982
3983 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07003984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003985 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3986 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003987 m_errorMonitor->VerifyFound();
3988
Mark Lobodzinski20310782020-02-28 14:25:17 -07003989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003990 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
3991 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003992 m_errorMonitor->VerifyFound();
3993
3994 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07003995 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003996 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3997 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003998 m_errorMonitor->VerifyFound();
3999
Mark Lobodzinski20310782020-02-28 14:25:17 -07004000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004001 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4002 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004003 m_errorMonitor->VerifyFound();
4004
4005 m_commandBuffer->end();
4006}
4007
4008TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4009 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004010
sjfricke3a10ae82022-08-02 18:48:57 +09004011 if (!OverrideDevsimForDeviceProfileLayer()) {
4012 GTEST_SKIP() << "Failed to override devsim for device profile layer.";
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004013 }
4014
4015 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4016 if (mp_extensions) {
4017 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4018 }
4019
4020 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004021 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004022 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4023 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4024 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4025 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004026 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004027 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4028 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4029 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4030 }
4031 ASSERT_NO_FATAL_FAILURE(InitState());
4032
4033 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4034 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004035 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
sjfricke3a10ae82022-08-02 18:48:57 +09004036 GTEST_SKIP() << "Failed to load device profile layer.";
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004037 }
4038
unknown088160a2019-05-23 17:43:13 -06004039 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4040 if (!ds_format) {
4041 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4042 return;
4043 }
4044
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004045 // Add Transfer support for all used formats
4046 VkFormatProperties formatProps;
4047 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4048 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4049 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4050 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4051 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4052 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4053 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4054 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4055 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4056
unknown088160a2019-05-23 17:43:13 -06004057 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4058 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4059 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4060 VK_IMAGE_TILING_OPTIMAL, 0);
4061 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4062 VK_IMAGE_TILING_OPTIMAL, 0);
4063 ASSERT_TRUE(color_image.initialized());
4064 ASSERT_TRUE(depth_image.initialized());
4065 ASSERT_TRUE(ds_image.initialized());
4066
4067 VkImageCopy copyRegion;
4068 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4069 copyRegion.srcSubresource.mipLevel = 0;
4070 copyRegion.srcSubresource.baseArrayLayer = 0;
4071 copyRegion.srcSubresource.layerCount = 1;
4072 copyRegion.srcOffset = {0, 0, 0};
4073 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4074 copyRegion.dstSubresource.mipLevel = 0;
4075 copyRegion.dstSubresource.baseArrayLayer = 0;
4076 copyRegion.dstSubresource.layerCount = 1;
4077 copyRegion.dstOffset = {64, 0, 0};
4078 copyRegion.extent = {64, 128, 1};
4079
4080 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004082 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004083 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4084 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004085 m_errorMonitor->VerifyFound();
4086
4087 m_commandBuffer->begin();
4088
4089 // Src and dest aspect masks don't match
4090 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004091 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004093 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4094 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004095 m_errorMonitor->VerifyFound();
4096 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4097
4098 // Illegal combinations of aspect bits
4099 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4100 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004102 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004104 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004105 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4106 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004107 m_errorMonitor->VerifyFound();
4108 // same test for dstSubresource
4109 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4110 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004111 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004112 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004113 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004114 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004115 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4116 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004117 m_errorMonitor->VerifyFound();
4118
4119 // Metadata aspect is illegal
4120 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4121 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004123 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004125 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4126 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004127 m_errorMonitor->VerifyFound();
4128 // same test for dstSubresource
4129 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4130 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004132 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004134 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4135 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004136 m_errorMonitor->VerifyFound();
4137
sfricke-samsung6141db32020-10-26 03:31:38 -07004138 // Aspect Memory Plane mask is illegal
4139 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4140 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4142 // These aspect/format mismatches are redundant but unavoidable here
4143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4144 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4145 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4146 m_errorMonitor->VerifyFound();
4147
unknown088160a2019-05-23 17:43:13 -06004148 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4149 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004150 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004151
4152 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004153 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004154 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004155 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004156 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4157 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004158 m_errorMonitor->VerifyFound();
4159
4160 // Aspect mask doesn't match dest image format
4161 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4162 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004164 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004166 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4167 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004168 m_errorMonitor->VerifyFound();
4169
aitor-lunarg54c295b2022-01-28 17:02:32 +01004170 // Check no performance warnings regarding layout are thrown when copying from and to the same image
4171 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4172 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
aitor-lunarg54c295b2022-01-28 17:02:32 +01004173 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4174 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
aitor-lunarg54c295b2022-01-28 17:02:32 +01004175
unknown088160a2019-05-23 17:43:13 -06004176 m_commandBuffer->end();
4177}
4178
4179TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004180 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004181
4182 ASSERT_NO_FATAL_FAILURE(Init());
4183
4184 // Create two images of sample count 1 and try to Resolve between them
4185
sfricke-samsung1c61f192021-12-31 01:53:03 -06004186 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004187 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4188 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4189 image_create_info.extent.width = 32;
4190 image_create_info.extent.height = 1;
4191 image_create_info.extent.depth = 1;
4192 image_create_info.mipLevels = 1;
4193 image_create_info.arrayLayers = 1;
4194 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4195 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4196 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4197 image_create_info.flags = 0;
4198
4199 VkImageObj srcImage(m_device);
4200 srcImage.init(&image_create_info);
4201 ASSERT_TRUE(srcImage.initialized());
4202
4203 VkImageObj dstImage(m_device);
4204 dstImage.init(&image_create_info);
4205 ASSERT_TRUE(dstImage.initialized());
4206
4207 m_commandBuffer->begin();
4208 VkImageResolve resolveRegion;
4209 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4210 resolveRegion.srcSubresource.mipLevel = 0;
4211 resolveRegion.srcSubresource.baseArrayLayer = 0;
4212 resolveRegion.srcSubresource.layerCount = 1;
4213 resolveRegion.srcOffset.x = 0;
4214 resolveRegion.srcOffset.y = 0;
4215 resolveRegion.srcOffset.z = 0;
4216 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4217 resolveRegion.dstSubresource.mipLevel = 0;
4218 resolveRegion.dstSubresource.baseArrayLayer = 0;
4219 resolveRegion.dstSubresource.layerCount = 1;
4220 resolveRegion.dstOffset.x = 0;
4221 resolveRegion.dstOffset.y = 0;
4222 resolveRegion.dstOffset.z = 0;
4223 resolveRegion.extent.width = 1;
4224 resolveRegion.extent.height = 1;
4225 resolveRegion.extent.depth = 1;
4226 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4227 &resolveRegion);
4228 m_commandBuffer->end();
4229
4230 m_errorMonitor->VerifyFound();
4231}
4232
4233TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004234 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004235
4236 ASSERT_NO_FATAL_FAILURE(Init());
4237
4238 // Create two images of sample count 4 and try to Resolve between them
4239
sfricke-samsung1c61f192021-12-31 01:53:03 -06004240 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004241 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4242 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4243 image_create_info.extent.width = 32;
4244 image_create_info.extent.height = 1;
4245 image_create_info.extent.depth = 1;
4246 image_create_info.mipLevels = 1;
4247 image_create_info.arrayLayers = 1;
4248 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4249 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4250 // Note: Some implementations expect color attachment usage for any
4251 // multisample surface
4252 image_create_info.usage =
4253 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4254 image_create_info.flags = 0;
4255
4256 VkImageObj srcImage(m_device);
4257 srcImage.init(&image_create_info);
4258 ASSERT_TRUE(srcImage.initialized());
4259
4260 VkImageObj dstImage(m_device);
4261 dstImage.init(&image_create_info);
4262 ASSERT_TRUE(dstImage.initialized());
4263
4264 m_commandBuffer->begin();
4265 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4266 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4267 // VK_IMAGE_LAYOUT_GENERAL = 1,
4268 VkImageResolve resolveRegion;
4269 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4270 resolveRegion.srcSubresource.mipLevel = 0;
4271 resolveRegion.srcSubresource.baseArrayLayer = 0;
4272 resolveRegion.srcSubresource.layerCount = 1;
4273 resolveRegion.srcOffset.x = 0;
4274 resolveRegion.srcOffset.y = 0;
4275 resolveRegion.srcOffset.z = 0;
4276 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4277 resolveRegion.dstSubresource.mipLevel = 0;
4278 resolveRegion.dstSubresource.baseArrayLayer = 0;
4279 resolveRegion.dstSubresource.layerCount = 1;
4280 resolveRegion.dstOffset.x = 0;
4281 resolveRegion.dstOffset.y = 0;
4282 resolveRegion.dstOffset.z = 0;
4283 resolveRegion.extent.width = 1;
4284 resolveRegion.extent.height = 1;
4285 resolveRegion.extent.depth = 1;
4286 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4287 &resolveRegion);
4288 m_commandBuffer->end();
4289
4290 m_errorMonitor->VerifyFound();
4291}
4292
4293TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004294 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004295
4296 ASSERT_NO_FATAL_FAILURE(Init());
4297
4298 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004299 VkImageObj srcImage(m_device);
4300 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004301
sfricke-samsung1c61f192021-12-31 01:53:03 -06004302 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004303 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4304 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4305 image_create_info.extent.width = 32;
4306 image_create_info.extent.height = 1;
4307 image_create_info.extent.depth = 1;
4308 image_create_info.mipLevels = 1;
4309 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004310 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004311 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4312 // Note: Some implementations expect color attachment usage for any
4313 // multisample surface
4314 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4315 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004316 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004317
4318 // Set format to something other than source image
4319 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4320 // Note: Some implementations expect color attachment usage for any
4321 // multisample surface
4322 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004324 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004325
4326 m_commandBuffer->begin();
4327 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4328 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4329 // VK_IMAGE_LAYOUT_GENERAL = 1,
4330 VkImageResolve resolveRegion;
4331 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4332 resolveRegion.srcSubresource.mipLevel = 0;
4333 resolveRegion.srcSubresource.baseArrayLayer = 0;
4334 resolveRegion.srcSubresource.layerCount = 1;
4335 resolveRegion.srcOffset.x = 0;
4336 resolveRegion.srcOffset.y = 0;
4337 resolveRegion.srcOffset.z = 0;
4338 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4339 resolveRegion.dstSubresource.mipLevel = 0;
4340 resolveRegion.dstSubresource.baseArrayLayer = 0;
4341 resolveRegion.dstSubresource.layerCount = 1;
4342 resolveRegion.dstOffset.x = 0;
4343 resolveRegion.dstOffset.y = 0;
4344 resolveRegion.dstOffset.z = 0;
4345 resolveRegion.extent.width = 1;
4346 resolveRegion.extent.height = 1;
4347 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004348 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4349 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004350 m_commandBuffer->end();
4351
4352 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004353}
4354
4355TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004356 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004357
4358 ASSERT_NO_FATAL_FAILURE(Init());
4359
4360 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004361 VkImageObj srcImage(m_device);
4362 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004363
sfricke-samsung1c61f192021-12-31 01:53:03 -06004364 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004365 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4366 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4367 image_create_info.extent.width = 32;
4368 image_create_info.extent.height = 1;
4369 image_create_info.extent.depth = 1;
4370 image_create_info.mipLevels = 1;
4371 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004372 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004373 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4374 // Note: Some implementations expect color attachment usage for any
4375 // multisample surface
4376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4377 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004378 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004379
4380 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4381 // Note: Some implementations expect color attachment usage for any
4382 // multisample surface
4383 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4384 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004385 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004386
4387 m_commandBuffer->begin();
4388 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4389 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4390 // VK_IMAGE_LAYOUT_GENERAL = 1,
4391 VkImageResolve resolveRegion;
4392 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4393 resolveRegion.srcSubresource.mipLevel = 0;
4394 resolveRegion.srcSubresource.baseArrayLayer = 0;
4395 resolveRegion.srcSubresource.layerCount = 1;
4396 resolveRegion.srcOffset.x = 0;
4397 resolveRegion.srcOffset.y = 0;
4398 resolveRegion.srcOffset.z = 0;
4399 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4400 resolveRegion.dstSubresource.mipLevel = 0;
4401 resolveRegion.dstSubresource.baseArrayLayer = 0;
4402 resolveRegion.dstSubresource.layerCount = 1;
4403 resolveRegion.dstOffset.x = 0;
4404 resolveRegion.dstOffset.y = 0;
4405 resolveRegion.dstOffset.z = 0;
4406 resolveRegion.extent.width = 1;
4407 resolveRegion.extent.height = 1;
4408 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004409 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4410 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004411 m_commandBuffer->end();
4412
4413 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004414}
4415
4416TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4417 ASSERT_NO_FATAL_FAILURE(Init());
4418
4419 // Create two images of different types and try to copy between them
4420 VkImageObj srcImage(m_device);
4421 VkImageObj dstImage(m_device);
4422
sfricke-samsung1c61f192021-12-31 01:53:03 -06004423 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004424 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4425 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4426 image_create_info.extent.width = 32;
4427 image_create_info.extent.height = 32;
4428 image_create_info.extent.depth = 1;
4429 image_create_info.mipLevels = 1;
4430 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004431 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004432 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4433 image_create_info.usage =
4434 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4435 // Note: Some implementations expect color attachment usage for any
4436 // multisample surface
4437 image_create_info.flags = 0;
4438 srcImage.init(&image_create_info);
4439 ASSERT_TRUE(srcImage.initialized());
4440
4441 // Note: Some implementations expect color attachment usage for any
4442 // multisample surface
4443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4444 dstImage.init(&image_create_info);
4445 ASSERT_TRUE(dstImage.initialized());
4446
4447 m_commandBuffer->begin();
4448 // source image must have valid contents before resolve
4449 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4450 VkImageSubresourceRange subresource = {};
4451 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4452 subresource.layerCount = 1;
4453 subresource.levelCount = 1;
4454 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4455 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4456 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4457 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4458
4459 VkImageResolve resolveRegion;
4460 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4461 resolveRegion.srcSubresource.mipLevel = 0;
4462 resolveRegion.srcSubresource.baseArrayLayer = 0;
4463 resolveRegion.srcSubresource.layerCount = 1;
4464 resolveRegion.srcOffset.x = 0;
4465 resolveRegion.srcOffset.y = 0;
4466 resolveRegion.srcOffset.z = 0;
4467 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4468 resolveRegion.dstSubresource.mipLevel = 0;
4469 resolveRegion.dstSubresource.baseArrayLayer = 0;
4470 resolveRegion.dstSubresource.layerCount = 1;
4471 resolveRegion.dstOffset.x = 0;
4472 resolveRegion.dstOffset.y = 0;
4473 resolveRegion.dstOffset.z = 0;
4474 resolveRegion.extent.width = 1;
4475 resolveRegion.extent.height = 1;
4476 resolveRegion.extent.depth = 1;
4477 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004478 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004479 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4480 1, &resolveRegion);
4481 m_errorMonitor->VerifyFound();
4482 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004483 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004484 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4485 1, &resolveRegion);
4486 m_errorMonitor->VerifyFound();
4487 m_commandBuffer->end();
4488}
4489
4490TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004491 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4492
4493 bool copy_commands2 = false;
4494 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4495 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4496 copy_commands2 = true;
4497 }
4498 ASSERT_NO_FATAL_FAILURE(InitState());
4499
4500 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4501 if (copy_commands2) {
4502 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4503 }
unknown088160a2019-05-23 17:43:13 -06004504
4505 // Create two images of different types and try to copy between them
4506 VkImageObj srcImage(m_device);
4507 VkImageObj dstImage(m_device);
4508
sfricke-samsung1c61f192021-12-31 01:53:03 -06004509 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004510 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4511 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4512 image_create_info.extent.width = 32;
4513 image_create_info.extent.height = 32;
4514 image_create_info.extent.depth = 1;
4515 image_create_info.mipLevels = 1;
4516 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004517 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004518 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4519 image_create_info.usage =
4520 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4521 // Note: Some implementations expect color attachment usage for any
4522 // multisample surface
4523 image_create_info.flags = 0;
4524 srcImage.init(&image_create_info);
4525 ASSERT_TRUE(srcImage.initialized());
4526
4527 // Note: Some implementations expect color attachment usage for any
4528 // multisample surface
4529 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4530 dstImage.init(&image_create_info);
4531 ASSERT_TRUE(dstImage.initialized());
4532
4533 m_commandBuffer->begin();
4534 // source image must have valid contents before resolve
4535 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4536 VkImageSubresourceRange subresource = {};
4537 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4538 subresource.layerCount = 1;
4539 subresource.levelCount = 1;
4540 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4541 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4542 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4543 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4544
4545 VkImageResolve resolveRegion;
4546 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4547 resolveRegion.srcSubresource.mipLevel = 0;
4548 resolveRegion.srcSubresource.baseArrayLayer = 0;
4549 resolveRegion.srcSubresource.layerCount = 1;
4550 resolveRegion.srcOffset.x = 0;
4551 resolveRegion.srcOffset.y = 0;
4552 resolveRegion.srcOffset.z = 0;
4553 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4554 resolveRegion.dstSubresource.mipLevel = 0;
4555 resolveRegion.dstSubresource.baseArrayLayer = 0;
4556 resolveRegion.dstSubresource.layerCount = 1;
4557 resolveRegion.dstOffset.x = 0;
4558 resolveRegion.dstOffset.y = 0;
4559 resolveRegion.dstOffset.z = 0;
4560 resolveRegion.extent.width = 1;
4561 resolveRegion.extent.height = 1;
4562 resolveRegion.extent.depth = 1;
4563 // invalid source mip level
4564 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004566 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4567 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4568 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004569
4570 // Equivalent test using KHR_copy_commands2
4571 if (copy_commands2 && vkCmdResolveImage2Function) {
4572 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4573 NULL,
4574 resolveRegion.srcSubresource,
4575 resolveRegion.srcOffset,
4576 resolveRegion.dstSubresource,
4577 resolveRegion.dstOffset,
4578 resolveRegion.extent};
4579 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4580 NULL,
4581 srcImage.image(),
4582 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4583 dstImage.image(),
4584 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4585 1,
4586 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004587 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01709");
Jeff Leger465acf52020-10-12 18:07:16 -04004588 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4589 m_errorMonitor->VerifyFound();
4590 }
4591
unknown088160a2019-05-23 17:43:13 -06004592 resolveRegion.srcSubresource.mipLevel = 0;
4593 // invalid dest mip level
4594 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004595 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004596 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4597 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4598 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004599
4600 // Equivalent test using KHR_copy_commands2
4601 if (copy_commands2 && vkCmdResolveImage2Function) {
4602 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4603 NULL,
4604 resolveRegion.srcSubresource,
4605 resolveRegion.srcOffset,
4606 resolveRegion.dstSubresource,
4607 resolveRegion.dstOffset,
4608 resolveRegion.extent};
4609 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4610 NULL,
4611 srcImage.image(),
4612 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4613 dstImage.image(),
4614 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4615 1,
4616 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004617 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01710");
Jeff Leger465acf52020-10-12 18:07:16 -04004618 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4619 m_errorMonitor->VerifyFound();
4620 }
4621
unknown088160a2019-05-23 17:43:13 -06004622 resolveRegion.dstSubresource.mipLevel = 0;
4623 // invalid source array layer range
4624 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004626 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4627 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4628 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004629
4630 // Equivalent test using KHR_copy_commands2
4631 if (copy_commands2 && vkCmdResolveImage2Function) {
4632 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4633 NULL,
4634 resolveRegion.srcSubresource,
4635 resolveRegion.srcOffset,
4636 resolveRegion.dstSubresource,
4637 resolveRegion.dstOffset,
4638 resolveRegion.extent};
4639 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4640 NULL,
4641 srcImage.image(),
4642 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4643 dstImage.image(),
4644 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4645 1,
4646 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01711");
Jeff Leger465acf52020-10-12 18:07:16 -04004648 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4649 m_errorMonitor->VerifyFound();
4650 }
4651
unknown088160a2019-05-23 17:43:13 -06004652 resolveRegion.srcSubresource.baseArrayLayer = 0;
4653 // invalid dest array layer range
4654 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004656 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4657 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4658 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004659
4660 // Equivalent test using KHR_copy_commands2
4661 if (copy_commands2 && vkCmdResolveImage2Function) {
4662 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4663 NULL,
4664 resolveRegion.srcSubresource,
4665 resolveRegion.srcOffset,
4666 resolveRegion.dstSubresource,
4667 resolveRegion.dstOffset,
4668 resolveRegion.extent};
4669 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4670 NULL,
4671 srcImage.image(),
4672 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4673 dstImage.image(),
4674 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4675 1,
4676 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01712");
Jeff Leger465acf52020-10-12 18:07:16 -04004678 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4679 m_errorMonitor->VerifyFound();
4680 }
4681
unknown088160a2019-05-23 17:43:13 -06004682 resolveRegion.dstSubresource.baseArrayLayer = 0;
4683
4684 m_commandBuffer->end();
4685}
4686
sfricke-samsungf78d0592020-06-11 21:34:44 -07004687TEST_F(VkLayerTest, ResolveImageImageType) {
4688 ASSERT_NO_FATAL_FAILURE(Init());
4689 // Create images of different types and try to resolve between them
4690 VkImageObj srcImage2D(m_device);
4691 VkImageObj dstImage1D(m_device);
4692 VkImageObj dstImage3D(m_device);
4693
sfricke-samsung1c61f192021-12-31 01:53:03 -06004694 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungf78d0592020-06-11 21:34:44 -07004695 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4696 image_create_info.extent.width = 32;
4697 image_create_info.extent.height = 1;
4698 image_create_info.extent.depth = 1;
4699 image_create_info.mipLevels = 1;
4700 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004701 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004702 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4703 image_create_info.usage =
4704 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4705 // Note: Some implementations expect color attachment usage for any
4706 // multisample surface
4707 image_create_info.flags = 0;
4708
4709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4710 srcImage2D.init(&image_create_info);
4711 ASSERT_TRUE(srcImage2D.initialized());
4712
4713 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4714 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4715 dstImage1D.init(&image_create_info);
4716 ASSERT_TRUE(dstImage1D.initialized());
4717
4718 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4719 image_create_info.extent.height = 16;
4720 image_create_info.extent.depth = 16;
4721 image_create_info.arrayLayers = 1;
4722 dstImage3D.init(&image_create_info);
4723 ASSERT_TRUE(dstImage3D.initialized());
4724
4725 m_commandBuffer->begin();
4726
4727 VkImageResolve resolveRegion;
4728 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4729 resolveRegion.srcSubresource.mipLevel = 0;
4730 resolveRegion.srcSubresource.baseArrayLayer = 0;
4731 resolveRegion.srcSubresource.layerCount = 1;
4732 resolveRegion.srcOffset.x = 0;
4733 resolveRegion.srcOffset.y = 0;
4734 resolveRegion.srcOffset.z = 0;
4735 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4736 resolveRegion.dstSubresource.mipLevel = 0;
4737 resolveRegion.dstSubresource.baseArrayLayer = 0;
4738 resolveRegion.dstSubresource.layerCount = 1;
4739 resolveRegion.dstOffset.x = 0;
4740 resolveRegion.dstOffset.y = 0;
4741 resolveRegion.dstOffset.z = 0;
4742 resolveRegion.extent.width = 1;
4743 resolveRegion.extent.height = 1;
4744 resolveRegion.extent.depth = 1;
4745
4746 // non-zero value baseArrayLayer
4747 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004749 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4750 &resolveRegion);
4751 m_errorMonitor->VerifyFound();
4752 resolveRegion.srcSubresource.baseArrayLayer = 0;
4753
4754 // Set height with 1D dstImage
4755 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004756 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004757 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004758 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004760 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4761 &resolveRegion);
4762 m_errorMonitor->VerifyFound();
4763 resolveRegion.extent.height = 1;
4764
4765 // Set depth with 1D dstImage and 2D srcImage
4766 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004769 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4770 &resolveRegion);
4771 m_errorMonitor->VerifyFound();
4772 resolveRegion.extent.depth = 1;
4773
4774 m_commandBuffer->end();
4775}
4776
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004777TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4778 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4779 ASSERT_NO_FATAL_FAILURE(Init());
4780
4781 VkImageObj srcImage2D(m_device);
4782 VkImageObj dstImage2D(m_device);
4783
sfricke-samsung1c61f192021-12-31 01:53:03 -06004784 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004785 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4786 image_create_info.extent.width = 32;
4787 image_create_info.extent.height = 32;
4788 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004789 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004790 image_create_info.arrayLayers = 1;
4791 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4792 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4793 image_create_info.usage =
4794 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4795 // Note: Some implementations expect color attachment usage for any
4796 // multisample surface
4797 image_create_info.flags = 0;
4798
4799 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4800 srcImage2D.init(&image_create_info);
4801 ASSERT_TRUE(srcImage2D.initialized());
4802
4803 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4804 dstImage2D.init(&image_create_info);
4805 ASSERT_TRUE(dstImage2D.initialized());
4806
4807 m_commandBuffer->begin();
4808
4809 VkImageResolve resolveRegion = {};
4810 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4811 resolveRegion.srcSubresource.mipLevel = 0;
4812 resolveRegion.srcSubresource.baseArrayLayer = 0;
4813 resolveRegion.srcSubresource.layerCount = 1;
4814 resolveRegion.srcOffset.x = 0;
4815 resolveRegion.srcOffset.y = 0;
4816 resolveRegion.srcOffset.z = 0;
4817 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4818 resolveRegion.dstSubresource.mipLevel = 0;
4819 resolveRegion.dstSubresource.baseArrayLayer = 0;
4820 resolveRegion.dstSubresource.layerCount = 1;
4821 resolveRegion.dstOffset.x = 0;
4822 resolveRegion.dstOffset.y = 0;
4823 resolveRegion.dstOffset.z = 0;
4824 resolveRegion.extent.width = 32;
4825 resolveRegion.extent.height = 32;
4826 resolveRegion.extent.depth = 1;
4827
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004828 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4829 &resolveRegion);
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004830
4831 // srcImage exceeded in x-dim
4832 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004834 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4835 &resolveRegion);
4836 m_errorMonitor->VerifyFound();
4837 resolveRegion.srcOffset.x = 0;
4838
4839 // dstImage exceeded in x-dim
4840 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004842 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4843 &resolveRegion);
4844 m_errorMonitor->VerifyFound();
4845 resolveRegion.dstOffset.x = 0;
4846
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004847 // both image exceeded in y-dim
4848 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004849 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004850 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4851 &resolveRegion);
4852 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004853 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004854
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004855 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004857 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4858 &resolveRegion);
4859 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004860 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004861
4862 // srcImage exceeded in z-dim
4863 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004864 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004866 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4867 &resolveRegion);
4868 m_errorMonitor->VerifyFound();
4869 resolveRegion.srcOffset.z = 0;
4870
4871 // dstImage exceeded in z-dim
4872 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004873 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4874 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004875 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4876 &resolveRegion);
4877 m_errorMonitor->VerifyFound();
4878 resolveRegion.dstOffset.z = 0;
4879
4880 m_commandBuffer->end();
4881}
4882
unknown088160a2019-05-23 17:43:13 -06004883TEST_F(VkLayerTest, ClearImageErrors) {
4884 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4885
4886 ASSERT_NO_FATAL_FAILURE(Init());
4887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4888
4889 m_commandBuffer->begin();
4890
4891 // Color image
4892 VkClearColorValue clear_color;
4893 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4894 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4895 const int32_t img_width = 32;
4896 const int32_t img_height = 32;
sfricke-samsung1c61f192021-12-31 01:53:03 -06004897 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004898 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4899 image_create_info.format = color_format;
4900 image_create_info.extent.width = img_width;
4901 image_create_info.extent.height = img_height;
4902 image_create_info.extent.depth = 1;
4903 image_create_info.mipLevels = 1;
4904 image_create_info.arrayLayers = 1;
4905 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4906 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4907
4908 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4909 vk_testing::Image color_image_no_transfer;
4910 color_image_no_transfer.init(*m_device, image_create_info);
4911
4912 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4913 vk_testing::Image color_image;
4914 color_image.init(*m_device, image_create_info);
4915
4916 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4917
4918 // Depth/Stencil image
4919 VkClearDepthStencilValue clear_value = {0};
4920 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4921 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4922 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4923 ds_image_create_info.extent.width = 64;
4924 ds_image_create_info.extent.height = 64;
4925 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4926 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4927
4928 vk_testing::Image ds_image;
4929 ds_image.init(*m_device, ds_image_create_info);
4930
4931 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4932
sfricke-samsungcd924d92020-05-20 23:51:17 -07004933 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06004934
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004935 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06004936
4937 m_errorMonitor->VerifyFound();
4938
sfricke-samsungcd924d92020-05-20 23:51:17 -07004939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06004940
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004941 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
4942 &color_range);
unknown088160a2019-05-23 17:43:13 -06004943
4944 m_errorMonitor->VerifyFound();
4945
4946 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07004947 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07004948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06004949
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004950 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4951 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06004952
4953 m_errorMonitor->VerifyFound();
4954}
4955
4956TEST_F(VkLayerTest, CommandQueueFlags) {
4957 TEST_DESCRIPTION(
4958 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
4959
4960 ASSERT_NO_FATAL_FAILURE(Init());
4961
4962 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4963 if (queueFamilyIndex == UINT32_MAX) {
4964 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4965 return;
4966 } else {
4967 // Create command pool on a non-graphics queue
4968 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4969
4970 // Setup command buffer on pool
4971 VkCommandBufferObj command_buffer(m_device, &command_pool);
4972 command_buffer.begin();
4973
4974 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07004975 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06004976 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4977 command_buffer.SetViewport(0, 1, &viewport);
4978 m_errorMonitor->VerifyFound();
4979 }
4980}
4981
sfricke-samsung674ba102020-08-18 22:38:49 -07004982TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
4983 TEST_DESCRIPTION(
4984 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
4985 "buffer");
4986
4987 ASSERT_NO_FATAL_FAILURE(Init());
4988
4989 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4990 if (queueFamilyIndex == UINT32_MAX) {
4991 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4992 return;
4993 } else {
4994 // Create Depth image
4995 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
4996 if (ds_format == VK_FORMAT_UNDEFINED) {
4997 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
4998 return;
4999 }
5000
5001 VkImageObj ds_image(m_device);
5002 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5003 VK_IMAGE_TILING_OPTIMAL, 0);
5004 ASSERT_TRUE(ds_image.initialized());
5005
5006 // Allocate buffers
5007 VkBufferObj buffer;
5008 VkMemoryPropertyFlags reqs = 0;
5009 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5010
5011 VkBufferImageCopy region = {};
5012 region.bufferRowLength = 0;
5013 region.bufferImageHeight = 0;
5014 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5015 region.imageSubresource.layerCount = 1;
5016 region.imageOffset = {0, 0, 0};
5017 region.imageExtent = {64, 64, 1};
5018 region.bufferOffset = 0;
5019
5020 // Create command pool on a non-graphics queue
5021 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5022
5023 // Setup command buffer on pool
5024 VkCommandBufferObj command_buffer(m_device, &command_pool);
5025 command_buffer.begin();
5026
sfricke-samsungea4fd142020-10-17 23:51:59 -07005027 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005028 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5029 1, &region);
5030 m_errorMonitor->VerifyFound();
5031 }
5032}
5033
sfricke-samsung5a019492021-01-25 10:32:08 -08005034TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5035 TEST_DESCRIPTION(
5036 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5037 "buffer");
5038
5039 ASSERT_NO_FATAL_FAILURE(Init());
5040
5041 // Should be left with a tranfser queue
5042 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5043 if (queueFamilyIndex == UINT32_MAX) {
5044 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5045 return;
5046 }
5047
5048 VkImageObj image(m_device);
5049 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5050 VK_IMAGE_TILING_OPTIMAL, 0);
5051 ASSERT_TRUE(image.initialized());
5052
5053 // Allocate buffers
5054 VkBufferObj buffer;
5055 VkMemoryPropertyFlags reqs = 0;
5056 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5057
5058 VkBufferImageCopy region = {};
5059 region.bufferRowLength = 0;
5060 region.bufferImageHeight = 0;
5061 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5062 region.imageSubresource.layerCount = 1;
5063 region.imageOffset = {0, 0, 0};
5064 region.imageExtent = {16, 16, 1};
5065 region.bufferOffset = 5;
5066
5067 // Create command pool on a non-graphics queue
5068 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5069
5070 // Setup command buffer on pool
5071 VkCommandBufferObj command_buffer(m_device, &command_pool);
5072 command_buffer.begin();
5073
5074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5076 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5077 &region);
5078 m_errorMonitor->VerifyFound();
5079}
5080
sfricke-samsungcb467672020-11-25 00:09:28 -08005081TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5082 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5083
5084 ASSERT_NO_FATAL_FAILURE(Init());
5085
5086 if (m_device->queue_props.size() < 2) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005087 GTEST_SKIP() << "Need 2 different queues for testing skipping.";
sfricke-samsungcb467672020-11-25 00:09:28 -08005088 }
5089
5090 // First two queue families
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005091 uint32_t queue_index_a = 0;
5092 uint32_t queue_index_b = 1;
sfricke-samsungcb467672020-11-25 00:09:28 -08005093
sfricke-samsung1c61f192021-12-31 01:53:03 -06005094 VkCommandPoolCreateInfo pool_create_info = LvlInitStruct<VkCommandPoolCreateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005095 pool_create_info.flags = 0;
5096
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005097 pool_create_info.queueFamilyIndex = queue_index_a;
5098 vk_testing::CommandPool command_pool_a(*m_device, pool_create_info);
5099 ASSERT_TRUE(command_pool_a.initialized());
sfricke-samsungcb467672020-11-25 00:09:28 -08005100
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005101 pool_create_info.queueFamilyIndex = queue_index_b;
5102 vk_testing::CommandPool command_pool_b(*m_device, pool_create_info);
5103 ASSERT_TRUE(command_pool_b.initialized());
sfricke-samsungcb467672020-11-25 00:09:28 -08005104
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005105 auto command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005106 command_buffer_allocate_info.commandBufferCount = 1;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005107 command_buffer_allocate_info.commandPool = command_pool_a.handle();
sfricke-samsungcb467672020-11-25 00:09:28 -08005108 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005109 vk_testing::CommandBuffer command_buffer_primary(*m_device, command_buffer_allocate_info);
5110 ASSERT_TRUE(command_buffer_primary.initialized());
sfricke-samsungcb467672020-11-25 00:09:28 -08005111
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005112 command_buffer_allocate_info.commandPool = command_pool_b.handle();
sfricke-samsungcb467672020-11-25 00:09:28 -08005113 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005114 vk_testing::CommandBuffer command_buffer_secondary(*m_device, command_buffer_allocate_info);
sfricke-samsungcb467672020-11-25 00:09:28 -08005115
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005116 auto cmdbuff_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
5117 cmdbuff_ii.renderPass = m_renderPass;
5118 cmdbuff_ii.subpass = 0;
5119 cmdbuff_ii.framebuffer = m_framebuffer;
5120
5121 auto begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5122 begin_info.pInheritanceInfo = &cmdbuff_ii;
sfricke-samsungcb467672020-11-25 00:09:28 -08005123
5124 // secondary
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005125 command_buffer_secondary.begin(&begin_info);
5126 command_buffer_secondary.end();
sfricke-samsungcb467672020-11-25 00:09:28 -08005127
5128 // Try using different pool's command buffer as secondary
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005129 command_buffer_primary.begin(&begin_info);
sfricke-samsungcb467672020-11-25 00:09:28 -08005130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005131 vk::CmdExecuteCommands(command_buffer_primary.handle(), 1, &command_buffer_secondary.handle());
sfricke-samsungcb467672020-11-25 00:09:28 -08005132 m_errorMonitor->VerifyFound();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06005133 command_buffer_primary.end();
sfricke-samsungcb467672020-11-25 00:09:28 -08005134}
5135
unknown088160a2019-05-23 17:43:13 -06005136TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5137 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5138 ASSERT_NO_FATAL_FAILURE(Init());
5139 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5140 // never record secondary
5141
Mark Lobodzinski20310782020-02-28 14:25:17 -07005142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005143 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005144 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005145 m_errorMonitor->VerifyFound();
5146 m_commandBuffer->end();
5147}
5148
5149TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5150 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5151
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005152 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005153 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5154
sfricke-samsung1c61f192021-12-31 01:53:03 -06005155 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005156 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5157 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5158 image_create_info.extent.width = 32;
5159 image_create_info.extent.height = 1;
5160 image_create_info.extent.depth = 1;
5161 image_create_info.mipLevels = 1;
5162 image_create_info.arrayLayers = 1;
5163 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5164 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5165 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5166 image_create_info.flags = 0;
5167
5168 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5169 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5170
5171 VkImageObj image(m_device);
5172 image.init(&image_create_info);
5173 ASSERT_TRUE(image.initialized());
5174 VkImageMemoryBarrier image_barrier =
5175 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5176
5177 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5178 image_barrier.oldLayout = old_layout;
5179 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005180 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5181 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005182 };
5183
5184 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5185 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5186 secondary.begin();
5187 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5188 secondary.end();
5189
Mark Lobodzinski20310782020-02-28 14:25:17 -07005190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005191 m_commandBuffer->begin();
5192 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005193 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005194 m_errorMonitor->VerifyFound();
5195
unknown088160a2019-05-23 17:43:13 -06005196 m_commandBuffer->reset();
5197 secondary.reset();
5198
5199 // Validate that UNDEFINED doesn't false positive on us
5200 secondary.begin();
5201 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5202 secondary.end();
5203 m_commandBuffer->begin();
5204 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005205 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005206 m_commandBuffer->end();
5207}
5208
5209TEST_F(VkLayerTest, SetDynViewportParamTests) {
5210 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5211
5212 SetTargetApiVersion(VK_API_VERSION_1_1);
5213 VkPhysicalDeviceFeatures features{};
5214 ASSERT_NO_FATAL_FAILURE(Init(&features));
5215
5216 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5217 const VkViewport viewports[] = {vp, vp};
5218
5219 m_commandBuffer->begin();
5220
5221 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005222 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005223 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005224 m_errorMonitor->VerifyFound();
5225
Mark Lobodzinski20310782020-02-28 14:25:17 -07005226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005227 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005228 m_errorMonitor->VerifyFound();
5229
Mark Lobodzinski20310782020-02-28 14:25:17 -07005230 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005231 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005232 m_errorMonitor->VerifyFound();
5233
Mark Lobodzinski20310782020-02-28 14:25:17 -07005234 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5235 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005236 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005237 m_errorMonitor->VerifyFound();
5238
Mark Lobodzinski20310782020-02-28 14:25:17 -07005239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005240 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005241 m_errorMonitor->VerifyFound();
5242
5243 // core viewport tests
5244 using std::vector;
5245 struct TestCase {
5246 VkViewport vp;
5247 std::string veid;
5248 };
5249
5250 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5251 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5252 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5253
5254 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5255 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5256 const auto one_before_min_bounds = NearestSmaller(min_bound);
5257 const auto one_past_max_bounds = NearestGreater(max_bound);
5258
5259 const auto below_zero = NearestSmaller(0.0f);
5260 const auto past_one = NearestGreater(1.0f);
5261
5262 vector<TestCase> test_cases = {
5263 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5264 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5265 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5266 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5267 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5268 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5269 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5270 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5271 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5272 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5273 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5274 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5275 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5276 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5277 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5278 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5279 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5280 };
5281
5282 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5283 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5284 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5285 } else {
5286 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5287 }
5288
5289 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005291 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005292 m_errorMonitor->VerifyFound();
5293 }
5294}
5295
5296TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5297 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5298
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005299 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005300
Mike Schuchardt7cc57842021-09-15 10:49:59 -07005301 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
5302 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005303 } else {
5304 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5305 return;
5306 }
5307 ASSERT_NO_FATAL_FAILURE(InitState());
5308
5309 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5310}
5311
5312TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5313 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5314
5315 ASSERT_NO_FATAL_FAILURE(Init());
5316
5317 if (!m_device->phy().features().multiViewport) {
5318 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5319 return;
5320 }
5321
unknown088160a2019-05-23 17:43:13 -06005322 m_commandBuffer->begin();
5323
Mark Lobodzinski20310782020-02-28 14:25:17 -07005324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005325 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005326 m_errorMonitor->VerifyFound();
5327
Petr Kraus14e49492019-09-09 20:13:29 +02005328 const auto max_viewports = m_device->props.limits.maxViewports;
5329
Mark Lobodzinski20310782020-02-28 14:25:17 -07005330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005331 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005332 m_errorMonitor->VerifyFound();
5333
Petr Kraus14e49492019-09-09 20:13:29 +02005334 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5335 if (max_viewports >= too_big_max_viewports) {
5336 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5337 kSkipPrefix);
5338 } else {
5339 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5340 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5341
Mark Lobodzinski20310782020-02-28 14:25:17 -07005342 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005343 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005344 m_errorMonitor->VerifyFound();
5345
Mark Lobodzinski20310782020-02-28 14:25:17 -07005346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005347 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005348 m_errorMonitor->VerifyFound();
5349
Mark Lobodzinski20310782020-02-28 14:25:17 -07005350 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005351 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005352 m_errorMonitor->VerifyFound();
5353
Mark Lobodzinski20310782020-02-28 14:25:17 -07005354 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005355 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005356 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005357 }
unknown088160a2019-05-23 17:43:13 -06005358}
5359
5360TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5361 TEST_DESCRIPTION(
5362 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5363
5364 ASSERT_NO_FATAL_FAILURE(Init());
5365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5366
5367 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5368 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5369
5370 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5371 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5372 nullptr, // pNext
5373 m_renderPass,
5374 0, // subpass
5375 m_framebuffer,
5376 };
5377 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5378 nullptr, // pNext
5379 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5380
5381 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5382 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5383 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5384 sec_cmdbuff_inside_rp.end();
5385
5386 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5387 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5388 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5389 sec_cmdbuff_outside_rp.end();
5390
5391 m_commandBuffer->begin();
5392
Mark Lobodzinski20310782020-02-28 14:25:17 -07005393 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005394 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005395 m_errorMonitor->VerifyFound();
5396
5397 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5398 nullptr, // pNext
5399 m_renderPass,
5400 m_framebuffer,
5401 {{0, 0}, {32, 32}},
5402 static_cast<uint32_t>(m_renderPassClearValues.size()),
5403 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005404 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005405
Mark Lobodzinski20310782020-02-28 14:25:17 -07005406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005407 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005408 m_errorMonitor->VerifyFound();
5409}
5410
5411TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5412 TEST_DESCRIPTION(
5413 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5414 ASSERT_NO_FATAL_FAILURE(Init());
5415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5416
sfricke-samsung1c61f192021-12-31 01:53:03 -06005417 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06005418 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5419 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5420 command_buffer_allocate_info.commandBufferCount = 1;
5421
5422 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005423 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
sfricke-samsung1c61f192021-12-31 01:53:03 -06005424 VkCommandBufferBeginInfo command_buffer_begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5425 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06005426 command_buffer_inheritance_info.renderPass = m_renderPass;
5427 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5428
unknown088160a2019-05-23 17:43:13 -06005429 command_buffer_begin_info.flags =
5430 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5431 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5432
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005433 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005434 VkClearAttachment color_attachment;
5435 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5436 color_attachment.clearValue.color.float32[0] = 0;
5437 color_attachment.clearValue.color.float32[1] = 0;
5438 color_attachment.clearValue.color.float32[2] = 0;
5439 color_attachment.clearValue.color.float32[3] = 0;
5440 color_attachment.colorAttachment = 0;
5441 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005442 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005443 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5444 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005445 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005446 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005447
Mark Lobodzinski20310782020-02-28 14:25:17 -07005448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005449 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005450 m_errorMonitor->VerifyFound();
5451
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005452 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005453 m_commandBuffer->end();
5454}
5455
5456TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5457 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
sjfricked8e01c52022-07-06 14:09:04 +09005458 AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005459
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005460 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09005461 if (!AreRequiredExtensionsEnabled()) {
5462 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
unknown088160a2019-05-23 17:43:13 -06005463 }
5464 ASSERT_NO_FATAL_FAILURE(InitState());
5465
sjfricke74a1aad2022-08-17 14:41:33 +09005466 VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor_prop = LvlInitStruct<VkPhysicalDevicePushDescriptorPropertiesKHR>();
5467 GetPhysicalDeviceProperties2(push_descriptor_prop);
unknown088160a2019-05-23 17:43:13 -06005468 if (push_descriptor_prop.maxPushDescriptors < 1) {
5469 // Some implementations report an invalid maxPushDescriptors of 0
5470 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5471 return;
5472 }
5473
5474 // Create ordinary and push descriptor set layout
5475 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5476 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5477 ASSERT_TRUE(ds_layout.initialized());
5478 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5479 ASSERT_TRUE(push_ds_layout.initialized());
5480
5481 // Now use the descriptor set layouts to create a pipeline layout
5482 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5483 ASSERT_TRUE(pipeline_layout.initialized());
5484
5485 // Create a descriptor to push
5486 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5487 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5488 ASSERT_TRUE(buffer_obj.initialized());
5489
5490 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5491 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5492 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5493
5494 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5495 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5496
5497 // Find address of extension call and make the call
5498 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005499 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005500 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5501
5502 // Section 1: Queue family matching/capabilities.
5503 // Create command pool on a non-graphics queue
5504 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5505 const uint32_t transfer_only_qfi =
5506 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5507 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005508 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005509 } else {
5510 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5511
5512 VkCommandPoolObj command_pool(m_device, err_qfi);
5513 ASSERT_TRUE(command_pool.initialized());
5514 VkCommandBufferObj command_buffer(m_device, &command_pool);
5515 ASSERT_TRUE(command_buffer.initialized());
5516 command_buffer.begin();
5517
Mark Lobodzinski20310782020-02-28 14:25:17 -07005518 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005520 if (err_qfi == transfer_only_qfi) {
5521 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005522 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005523 }
5524 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5525 &descriptor_write);
5526 m_errorMonitor->VerifyFound();
5527 command_buffer.end();
5528
5529 // If we succeed in testing only one condition above, we need to test the other below.
5530 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5531 // Need to test the neither compute/gfx supported case separately.
5532 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5533 ASSERT_TRUE(tran_command_pool.initialized());
5534 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5535 ASSERT_TRUE(tran_command_buffer.initialized());
5536 tran_command_buffer.begin();
5537
5538 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5540 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5541 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005542 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5543 &descriptor_write);
5544 m_errorMonitor->VerifyFound();
5545 tran_command_buffer.end();
5546 }
5547 }
5548
5549 // Push to the non-push binding
5550 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005551 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005552 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5553 &descriptor_write);
5554 m_errorMonitor->VerifyFound();
5555
5556 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005557 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005558 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5559 &descriptor_write);
5560 m_errorMonitor->VerifyFound();
5561 m_commandBuffer->end();
5562
5563 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5564 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung85584a72021-09-30 21:43:38 -07005566 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005567 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005568 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5569 &descriptor_write);
5570 m_errorMonitor->VerifyFound();
5571}
5572
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005573TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5574 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
sjfricked8e01c52022-07-06 14:09:04 +09005575 AddRequiredExtensions(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005576
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005577 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09005578 if (!AreRequiredExtensionsEnabled()) {
5579 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005580 }
5581 ASSERT_NO_FATAL_FAILURE(InitState());
5582
sjfricke74a1aad2022-08-17 14:41:33 +09005583 VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor_prop = LvlInitStruct<VkPhysicalDevicePushDescriptorPropertiesKHR>();
5584 GetPhysicalDeviceProperties2(push_descriptor_prop);
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005585 if (push_descriptor_prop.maxPushDescriptors < 1) {
5586 // Some implementations report an invalid maxPushDescriptors of 0.
5587 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5588 return;
5589 }
5590
5591 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5592 if (min_alignment == 0) {
5593 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5594 return;
5595 }
5596
5597 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5598 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5599 ASSERT_TRUE(push_ds_layout.initialized());
5600
5601 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5602 ASSERT_TRUE(pipeline_layout.initialized());
5603
5604 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5605 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5606 ASSERT_TRUE(buffer_obj.initialized());
5607
5608 // Use an invalid alignment.
5609 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5610 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5611 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5612
5613 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5614 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5615 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5616
5617 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005619 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5620 &descriptor_write);
5621 m_errorMonitor->VerifyFound();
5622
5623 m_commandBuffer->end();
5624}
5625
unknown088160a2019-05-23 17:43:13 -06005626TEST_F(VkLayerTest, SetDynScissorParamTests) {
5627 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5628
5629 VkPhysicalDeviceFeatures features{};
5630 ASSERT_NO_FATAL_FAILURE(Init(&features));
5631
5632 const VkRect2D scissor = {{0, 0}, {16, 16}};
5633 const VkRect2D scissors[] = {scissor, scissor};
5634
5635 m_commandBuffer->begin();
5636
5637 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005638 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005639 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005640 m_errorMonitor->VerifyFound();
5641
Mark Lobodzinski20310782020-02-28 14:25:17 -07005642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005643 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005644 m_errorMonitor->VerifyFound();
5645
Mark Lobodzinski20310782020-02-28 14:25:17 -07005646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005647 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005648 m_errorMonitor->VerifyFound();
5649
Mark Lobodzinski20310782020-02-28 14:25:17 -07005650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005652 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005653 m_errorMonitor->VerifyFound();
5654
Mark Lobodzinski20310782020-02-28 14:25:17 -07005655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005656 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005657 m_errorMonitor->VerifyFound();
5658
5659 struct TestCase {
5660 VkRect2D scissor;
5661 std::string vuid;
5662 };
5663
5664 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5665 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5666 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5667 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5668 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5669 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5670 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5671 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5672
5673 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005674 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005675 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005676 m_errorMonitor->VerifyFound();
5677 }
5678
5679 m_commandBuffer->end();
5680}
5681
5682TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5683 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5684
5685 ASSERT_NO_FATAL_FAILURE(Init());
5686
5687 if (!m_device->phy().features().multiViewport) {
5688 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5689 return;
5690 }
5691
unknown088160a2019-05-23 17:43:13 -06005692 m_commandBuffer->begin();
5693
Mark Lobodzinski20310782020-02-28 14:25:17 -07005694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005695 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005696 m_errorMonitor->VerifyFound();
5697
Petr Kraus14e49492019-09-09 20:13:29 +02005698 const auto max_scissors = m_device->props.limits.maxViewports;
5699
Mark Lobodzinski20310782020-02-28 14:25:17 -07005700 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005701 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005702 m_errorMonitor->VerifyFound();
5703
Petr Kraus14e49492019-09-09 20:13:29 +02005704 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5705 if (max_scissors >= too_big_max_scissors) {
5706 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5707 kSkipPrefix);
5708 } else {
5709 const VkRect2D scissor = {{0, 0}, {16, 16}};
5710 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5711
Mark Lobodzinski20310782020-02-28 14:25:17 -07005712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005713 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005714 m_errorMonitor->VerifyFound();
5715
Mark Lobodzinski20310782020-02-28 14:25:17 -07005716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005717 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005718 m_errorMonitor->VerifyFound();
5719
Mark Lobodzinski20310782020-02-28 14:25:17 -07005720 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005721 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005722 m_errorMonitor->VerifyFound();
5723
Mark Lobodzinski20310782020-02-28 14:25:17 -07005724 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005725 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005726 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005727 }
unknown088160a2019-05-23 17:43:13 -06005728}
5729
Tony-LunarG667cc022021-06-25 10:11:17 -06005730TEST_F(VkLayerTest, MultiDrawTests) {
5731 TEST_DESCRIPTION("Test validation of multi_draw extension");
5732 SetTargetApiVersion(VK_API_VERSION_1_2);
5733 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5734 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09005735 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
Tony-LunarG667cc022021-06-25 10:11:17 -06005736 }
5737
5738 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
sjfricke11db0c72022-08-18 13:23:11 +09005739 auto features2 = GetPhysicalDeviceFeatures2(multi_draw_features);
Tony-LunarG667cc022021-06-25 10:11:17 -06005740 if (!multi_draw_features.multiDraw) {
5741 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5742 return;
5743 }
5744 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5745 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5746 } else {
5747 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5748 return;
5749 }
5750 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5751 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
sjfricke74a1aad2022-08-17 14:41:33 +09005752 GetPhysicalDeviceProperties2(properties2);
Tony-LunarG667cc022021-06-25 10:11:17 -06005753
5754 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5756
5757 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5758 auto vkCmdDrawMultiIndexedEXT =
5759 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5760 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5761
5762 VkMultiDrawInfoEXT multi_draws[3] = {};
5763 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5764
5765 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5766 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5767
5768 CreatePipelineHelper pipe(*this);
5769 pipe.InitInfo();
5770 pipe.InitState();
5771 pipe.CreateGraphicsPipeline();
5772
5773 // Try existing VUID checks
5774 m_commandBuffer->begin();
5775 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5776
5777 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5778 &pipe.descriptor_set_->set_, 0, NULL);
5779 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5780 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5781 m_errorMonitor->VerifyFound();
5782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5783 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5784 m_errorMonitor->VerifyFound();
5785
5786 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5787
5788 // New VUIDs added with multi_draw (also see GPU-AV)
5789 VkBufferObj buffer;
5790 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5791 multi_draw_indices[2].indexCount = 513;
5792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5793 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5794 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5795 m_errorMonitor->VerifyFound();
5796 multi_draw_indices[2].indexCount = 1;
5797
5798 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5799 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5800 m_errorMonitor->VerifyFound();
5801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5802 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5803 m_errorMonitor->VerifyFound();
5804
5805 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5806 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5807 m_errorMonitor->VerifyFound();
5808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5809 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5810 m_errorMonitor->VerifyFound();
5811
5812 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5813 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5814 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5815 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5817 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5818 m_errorMonitor->VerifyFound();
5819 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5820 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5821 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5822 m_errorMonitor->VerifyFound();
5823 }
5824}
5825
5826TEST_F(VkLayerTest, MultiDrawFeatures) {
5827 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5828 SetTargetApiVersion(VK_API_VERSION_1_2);
5829 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5830 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09005831 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
Tony-LunarG667cc022021-06-25 10:11:17 -06005832 }
5833 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5834 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5835 } else {
5836 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5837 return;
5838 }
5839 ASSERT_NO_FATAL_FAILURE(InitState());
5840 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5841
sfricke-samsungca162082022-02-10 08:53:41 -08005842 auto multi_draw_props = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5843 auto pd_props2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_props);
sjfricke74a1aad2022-08-17 14:41:33 +09005844 GetPhysicalDeviceProperties2(pd_props2);
sfricke-samsungca162082022-02-10 08:53:41 -08005845 if (multi_draw_props.maxMultiDrawCount == 0) {
5846 // If using MockICD and devsim the value might be zero'ed and cause false errors
5847 return;
5848 }
5849
Tony-LunarG667cc022021-06-25 10:11:17 -06005850 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5851 auto vkCmdDrawMultiIndexedEXT =
5852 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5853 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5854
5855 VkMultiDrawInfoEXT multi_draws[3] = {};
5856 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5857
5858 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5859 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5860
5861 CreatePipelineHelper pipe(*this);
5862 pipe.InitInfo();
5863 pipe.InitState();
5864 pipe.CreateGraphicsPipeline();
5865
5866 m_commandBuffer->begin();
5867 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5868 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5869 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5870 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5871 m_errorMonitor->VerifyFound();
5872 VkBufferObj buffer;
5873 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5874 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5875 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5876 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5877 m_errorMonitor->VerifyFound();
5878}
5879
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005880TEST_F(VkLayerTest, IndirectDrawTests) {
5881 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005882
sjfricked8e01c52022-07-06 14:09:04 +09005883 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005884 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5885
5886 if (IsPlatform(kMockICD) || DeviceSimulation()) {
sjfricke11b24692022-06-21 20:49:53 +09005887 GTEST_SKIP() << "Test not supported by MockICD";
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005888 }
sjfricked8e01c52022-07-06 14:09:04 +09005889 if (!AreRequiredExtensionsEnabled()) {
5890 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
5891 }
paul-lunargb8d86fd2022-08-01 22:39:52 +02005892
5893 VkPhysicalDeviceFeatures features;
5894 vk::GetPhysicalDeviceFeatures(gpu(), &features);
5895 if (features.multiDrawIndirect == VK_FALSE) {
5896 GTEST_SKIP() << "multiDrawIndirect not supported";
5897 }
5898
5899 VkPhysicalDeviceFeatures requiredFeatures{};
5900 requiredFeatures.multiDrawIndirect = VK_TRUE;
5901 ASSERT_NO_FATAL_FAILURE(InitState(&requiredFeatures));
unknown088160a2019-05-23 17:43:13 -06005902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5903
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005904 CreatePipelineHelper pipe(*this);
5905 pipe.InitInfo();
5906 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06005907 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005908 dyn_state_ci.dynamicStateCount = size(dyn_states);
5909 dyn_state_ci.pDynamicStates = dyn_states;
5910 pipe.dyn_state_ci_ = dyn_state_ci;
5911 pipe.InitState();
5912 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005913
5914 m_commandBuffer->begin();
5915 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5916
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005917 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5918 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5919 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005920
5921 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005922 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005923 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005924 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005925
sfricke-samsung1c61f192021-12-31 01:53:03 -06005926 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005927 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5928 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005929 VkBufferObj draw_buffer;
5930 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005931
Aaron Hagand1a61212021-12-22 11:53:49 -05005932 VkBufferObj draw_buffer_correct;
5933 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5934 draw_buffer_correct.init(*m_device, buffer_create_info);
5935
unknown088160a2019-05-23 17:43:13 -06005936 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005938 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005939 m_errorMonitor->VerifyFound();
5940
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005941 // VUID-vkCmdDrawIndirect-drawCount-02718
Aaron Hagand1a61212021-12-22 11:53:49 -05005942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-00488");
5943 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005944 m_errorMonitor->VerifyFound();
5945
Aaron Hagand1a61212021-12-22 11:53:49 -05005946 // VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701
5947 // VUID-vkCmdDrawIndexedIndirect-drawCount-00540
5948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
5949 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
5950 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005951 m_errorMonitor->VerifyFound();
5952
unknown088160a2019-05-23 17:43:13 -06005953 m_commandBuffer->EndRenderPass();
5954 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005955}
5956
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005957TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5958 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5959
sjfricked8e01c52022-07-06 14:09:04 +09005960 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5961
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005962 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005963
sjfricked8e01c52022-07-06 14:09:04 +09005964 if (!AreRequiredExtensionsEnabled()) {
5965 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005966 }
5967
5968 ASSERT_NO_FATAL_FAILURE(InitState());
5969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5970
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005971 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
5972 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sjfricke74a1aad2022-08-17 14:41:33 +09005973 GetPhysicalDeviceProperties2(pd_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005974
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005975 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5976 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5977
5978 m_commandBuffer->begin();
5979 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
sfricke-samsung1c61f192021-12-31 01:53:03 -06005980 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005981 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5982 buffer_create_info.size = 1024;
5983 VkBufferObj counter_buffer;
5984 counter_buffer.init(*m_device, buffer_create_info);
5985
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005986 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07005987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005988 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005989 m_errorMonitor->VerifyFound();
5990
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005991 // some mock ICD json files are missing a valid stride value
5992 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
5993 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08005994 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005995 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
5996 m_errorMonitor->VerifyFound();
5997 }
5998
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005999 m_commandBuffer->EndRenderPass();
6000 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006001
6002 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006003 GTEST_SKIP() << "maxTransformFeedbackBufferDataStride is zero, skipping subtests";
Tony-LunarG983bbc52020-11-06 11:04:59 -07006004 }
6005
6006 std::vector<const char *> device_extension_names;
6007 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6008 VkDeviceObj test_device(0, gpu(), device_extension_names);
6009 VkCommandPoolObj commandPool(&test_device, 0);
6010 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6011 VkBufferObj counter_buffer2;
6012 counter_buffer2.init(test_device, buffer_create_info);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006013
Tony-LunarG983bbc52020-11-06 11:04:59 -07006014 VkPipelineLayoutObj pipelineLayout(&test_device);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006015
sfricke-samsung1c61f192021-12-31 01:53:03 -06006016 VkRenderPassCreateInfo rp_info = LvlInitStruct<VkRenderPassCreateInfo>();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006017 VkSubpassDescription subpass = {};
Tony-LunarG983bbc52020-11-06 11:04:59 -07006018 rp_info.pSubpasses = &subpass;
6019 rp_info.subpassCount = 1;
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006020 vk_testing::RenderPass renderpass(test_device, rp_info);
6021 ASSERT_TRUE(renderpass.handle());
6022
Tony-LunarG983bbc52020-11-06 11:04:59 -07006023 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006024 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 -06006025 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
sjfricke394227a2022-06-20 16:47:38 +09006026 vs.InitFromGLSLTry(false, &test_device);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006027 fs.InitFromGLSLTry(false, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006028 pipeline.AddShader(&vs);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006029 pipeline.AddShader(&fs);
6030 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass.handle());
6031 m_renderPassBeginInfo.renderPass = renderpass.handle();
6032 VkFramebufferCreateInfo fbci = {
6033 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass.handle(), 0, nullptr, 256, 256, 1};
6034 vk_testing::Framebuffer fb(test_device, fbci);
6035 ASSERT_TRUE(fb.initialized());
6036 m_renderPassBeginInfo.framebuffer = fb.handle();
6037 m_renderPassBeginInfo.renderPass = renderpass.handle();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006038 commandBuffer.begin();
6039 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6040 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6041 VkRect2D scissor = {{0, 0}, {16, 16}};
6042 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6043 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6044 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6045 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006047 }
6048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6049 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6050 m_errorMonitor->VerifyFound();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006051}
6052
unknown088160a2019-05-23 17:43:13 -06006053TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6054 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6055
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006056 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6057 ASSERT_NO_FATAL_FAILURE(InitFramework());
6058 if (!AreRequiredExtensionsEnabled()) {
6059 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006060 }
6061 ASSERT_NO_FATAL_FAILURE(InitState());
6062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6063
unknown088160a2019-05-23 17:43:13 -06006064 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006065 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006066
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006067 CreatePipelineHelper pipe(*this);
6068 pipe.InitInfo();
6069 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006070 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006071 dyn_state_ci.dynamicStateCount = size(dyn_states);
6072 dyn_state_ci.pDynamicStates = dyn_states;
6073 pipe.dyn_state_ci_ = dyn_state_ci;
6074 pipe.InitState();
6075 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006076
6077 m_commandBuffer->begin();
6078 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6079
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006080 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6081 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6082 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006083
6084 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006085 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006086 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006087 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006088
sfricke-samsung1c61f192021-12-31 01:53:03 -06006089 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006090 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6091 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006092 vk_testing::Buffer draw_buffer;
6093 draw_buffer.init_no_mem(*m_device, buffer_create_info);
6094 ASSERT_TRUE(draw_buffer.initialized());
unknown088160a2019-05-23 17:43:13 -06006095
sjfrickeedd669c2022-06-02 17:37:19 +09006096 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006097 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006098 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006099 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006100 VkBufferObj count_buffer;
6101 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006102
Mark Lobodzinski20310782020-02-28 14:25:17 -07006103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006104 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006105 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006106 m_errorMonitor->VerifyFound();
6107
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006108 draw_buffer.bind_memory(*m_device, 0, 0);
unknown088160a2019-05-23 17:43:13 -06006109
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006110 vk_testing::Buffer count_buffer_unbound;
6111 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6112 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006113
sjfrickeedd669c2022-06-02 17:37:19 +09006114 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006115 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006116 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6117
Mark Lobodzinski20310782020-02-28 14:25:17 -07006118 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006119 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
6120 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006121 m_errorMonitor->VerifyFound();
6122
sjfrickeedd669c2022-06-02 17:37:19 +09006123 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, " VUID-vkCmdDrawIndirectCount-countBuffer-02715");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006124 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006125 sizeof(VkDrawIndirectCommand));
6126 m_errorMonitor->VerifyFound();
6127
Mark Lobodzinski20310782020-02-28 14:25:17 -07006128 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006129 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006130 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006131 m_errorMonitor->VerifyFound();
6132
Mark Lobodzinski20310782020-02-28 14:25:17 -07006133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006134 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006135 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006136 m_errorMonitor->VerifyFound();
6137
sjfrickeedd669c2022-06-02 17:37:19 +09006138 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-04129");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006139 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size, 1,
sjfrickeedd669c2022-06-02 17:37:19 +09006140 sizeof(VkDrawIndirectCommand));
6141 m_errorMonitor->VerifyFound();
6142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006144 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006145 m_errorMonitor->VerifyFound();
6146
unknown088160a2019-05-23 17:43:13 -06006147 m_commandBuffer->EndRenderPass();
6148 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006149}
6150
6151TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6152 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6153
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006154 AddRequiredExtensions(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006155 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006156 if (!AreRequiredExtensionsEnabled()) {
6157 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
unknown088160a2019-05-23 17:43:13 -06006158 }
6159 ASSERT_NO_FATAL_FAILURE(InitState());
6160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6161
unknown088160a2019-05-23 17:43:13 -06006162 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006163 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006164
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006165 CreatePipelineHelper pipe(*this);
6166 pipe.InitInfo();
6167 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006168 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006169 dyn_state_ci.dynamicStateCount = size(dyn_states);
6170 dyn_state_ci.pDynamicStates = dyn_states;
6171 pipe.dyn_state_ci_ = dyn_state_ci;
6172 pipe.InitState();
6173 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006174
6175 m_commandBuffer->begin();
6176 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6177
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006178 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6179 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6180 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006181
6182 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006183 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006184 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006185 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006186
sfricke-samsung1c61f192021-12-31 01:53:03 -06006187 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006188 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6189 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006190 VkBufferObj draw_buffer;
6191 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006192
sjfrickeedd669c2022-06-02 17:37:19 +09006193 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006194 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006195 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006196 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006197 VkBufferObj count_buffer;
6198 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006199
sfricke-samsung1c61f192021-12-31 01:53:03 -06006200 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006201 index_buffer_create_info.size = sizeof(uint32_t);
6202 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006203 VkBufferObj index_buffer;
6204 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006205
Mark Lobodzinski20310782020-02-28 14:25:17 -07006206 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006207 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006208 sizeof(VkDrawIndexedIndirectCommand));
6209 m_errorMonitor->VerifyFound();
6210
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006211 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006212
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006213 vk_testing::Buffer draw_buffer_unbound;
6214 draw_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6215 ASSERT_TRUE(draw_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006216
Mark Lobodzinski20310782020-02-28 14:25:17 -07006217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006218 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006219 sizeof(VkDrawIndexedIndirectCommand));
6220 m_errorMonitor->VerifyFound();
6221
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006222 vk_testing::Buffer count_buffer_unbound;
6223 count_buffer_unbound.init_no_mem(*m_device, count_buffer_create_info);
6224 ASSERT_TRUE(count_buffer_unbound.initialized());
unknown088160a2019-05-23 17:43:13 -06006225
sjfrickeedd669c2022-06-02 17:37:19 +09006226 VkBufferObj count_buffer_wrong;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006227 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
sjfrickeedd669c2022-06-02 17:37:19 +09006228 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6229
Mark Lobodzinski20310782020-02-28 14:25:17 -07006230 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006231 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006232 sizeof(VkDrawIndexedIndirectCommand));
6233 m_errorMonitor->VerifyFound();
6234
sjfrickeedd669c2022-06-02 17:37:19 +09006235 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715");
6236 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
6237 sizeof(VkDrawIndexedIndirectCommand));
6238 m_errorMonitor->VerifyFound();
6239
Mark Lobodzinski20310782020-02-28 14:25:17 -07006240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006241 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006242 sizeof(VkDrawIndexedIndirectCommand));
6243 m_errorMonitor->VerifyFound();
6244
Mark Lobodzinski20310782020-02-28 14:25:17 -07006245 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006246 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006247 sizeof(VkDrawIndexedIndirectCommand));
6248 m_errorMonitor->VerifyFound();
6249
sjfrickeedd669c2022-06-02 17:37:19 +09006250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-04129");
6251 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size,
6252 1, sizeof(VkDrawIndexedIndirectCommand));
6253 m_errorMonitor->VerifyFound();
6254
Mark Lobodzinski20310782020-02-28 14:25:17 -07006255 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006256 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006257 m_errorMonitor->VerifyFound();
6258
unknown088160a2019-05-23 17:43:13 -06006259 m_commandBuffer->EndRenderPass();
6260 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006261}
6262
sfricke-samsung860d3b22020-05-04 21:08:29 -07006263TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6264 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6265
6266 SetTargetApiVersion(VK_API_VERSION_1_2);
6267 ASSERT_NO_FATAL_FAILURE(Init());
6268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6269 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09006270 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
sfricke-samsung860d3b22020-05-04 21:08:29 -07006271 }
6272
6273 VkBufferObj indirect_buffer;
6274 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6275 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6276
6277 VkBufferObj indexed_indirect_buffer;
6278 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6279 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6280
6281 VkBufferObj count_buffer;
6282 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6283
6284 VkBufferObj index_buffer;
6285 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6286
6287 CreatePipelineHelper pipe(*this);
6288 pipe.InitInfo();
6289 pipe.InitState();
6290 pipe.CreateGraphicsPipeline();
6291
6292 // Make calls to valid commands but without the drawIndirectCount feature set
6293 m_commandBuffer->begin();
6294 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6295
6296 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6297
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006298 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006299 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6300 sizeof(VkDrawIndirectCommand));
6301 m_errorMonitor->VerifyFound();
6302
6303 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6304
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006306 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6307 sizeof(VkDrawIndexedIndirectCommand));
6308 m_errorMonitor->VerifyFound();
6309
6310 m_commandBuffer->EndRenderPass();
6311 m_commandBuffer->end();
6312}
6313
unknown088160a2019-05-23 17:43:13 -06006314TEST_F(VkLayerTest, ExclusiveScissorNV) {
6315 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6316
6317 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6318 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6319 } else {
6320 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6321 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6322 return;
6323 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006324 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006325 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6326 for (auto device_extension : required_device_extensions) {
6327 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6328 m_device_extension_names.push_back(device_extension);
6329 } else {
6330 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6331 return;
6332 }
6333 }
6334
unknown088160a2019-05-23 17:43:13 -06006335 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006336 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
sjfricke11db0c72022-08-18 13:23:11 +09006337 auto features2 = GetPhysicalDeviceFeatures2(exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006338 features2.features.multiViewport = VK_FALSE;
6339
6340 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6342
6343 if (m_device->phy().properties().limits.maxViewports) {
6344 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6345 return;
6346 }
6347
6348 // Based on PSOViewportStateTests
6349 {
6350 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6351 VkViewport viewports[] = {viewport, viewport};
6352 VkRect2D scissor = {{0, 0}, {64, 64}};
6353 VkRect2D scissors[100] = {scissor, scissor};
6354
6355 using std::vector;
6356 struct TestCase {
6357 uint32_t viewport_count;
6358 VkViewport *viewports;
6359 uint32_t scissor_count;
6360 VkRect2D *scissors;
6361 uint32_t exclusive_scissor_count;
6362 VkRect2D *exclusive_scissors;
6363
6364 vector<std::string> vuids;
6365 };
6366
6367 vector<TestCase> test_cases = {
6368 {1,
6369 viewports,
6370 1,
6371 scissors,
6372 2,
6373 scissors,
6374 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6375 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6376 {1,
6377 viewports,
6378 1,
6379 scissors,
6380 100,
6381 scissors,
6382 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6383 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6384 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006385 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006386 };
6387
6388 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006389 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6390 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006391
6392 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6393 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6394 helper.vp_state_ci_.pViewports = test_case.viewports;
6395 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6396 helper.vp_state_ci_.pScissors = test_case.scissors;
6397 helper.vp_state_ci_.pNext = &exc;
6398
6399 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6400 exc.pExclusiveScissors = test_case.exclusive_scissors;
6401 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006402 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006403 }
6404 }
6405
6406 // Based on SetDynScissorParamTests
6407 {
6408 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006409 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006410
6411 const VkRect2D scissor = {{0, 0}, {16, 16}};
6412 const VkRect2D scissors[] = {scissor, scissor};
6413
6414 m_commandBuffer->begin();
6415
Mark Lobodzinski20310782020-02-28 14:25:17 -07006416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006417 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6418 m_errorMonitor->VerifyFound();
6419
Mark Lobodzinski20310782020-02-28 14:25:17 -07006420 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006421 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6422 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6423 m_errorMonitor->VerifyFound();
6424
Mark Lobodzinski20310782020-02-28 14:25:17 -07006425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006426 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6427 m_errorMonitor->VerifyFound();
6428
Mark Lobodzinski20310782020-02-28 14:25:17 -07006429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006430 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006431 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006432 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6433 m_errorMonitor->VerifyFound();
6434
Mark Lobodzinski20310782020-02-28 14:25:17 -07006435 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6436 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006437 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6438 m_errorMonitor->VerifyFound();
6439
Mark Lobodzinski20310782020-02-28 14:25:17 -07006440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006441 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6442 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6443 m_errorMonitor->VerifyFound();
6444
6445 struct TestCase {
6446 VkRect2D scissor;
6447 std::string vuid;
6448 };
6449
6450 std::vector<TestCase> test_cases = {
6451 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6452 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6453 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6454 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6455 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6456 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6457 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6458 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6459
6460 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006462 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6463 m_errorMonitor->VerifyFound();
6464 }
6465
6466 m_commandBuffer->end();
6467 }
6468}
6469
6470TEST_F(VkLayerTest, MeshShaderNV) {
6471 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6472
sjfricked8e01c52022-07-06 14:09:04 +09006473 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6474 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006475 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked8e01c52022-07-06 14:09:04 +09006476 if (!AreRequiredExtensionsEnabled()) {
6477 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
unknown088160a2019-05-23 17:43:13 -06006478 }
6479
Tony-LunarG048f5012020-04-29 16:55:11 -06006480 if (IsPlatform(kMockICD) || DeviceSimulation()) {
sjfricke11b24692022-06-21 20:49:53 +09006481 GTEST_SKIP() << "Test not supported by MockICD";
unknown088160a2019-05-23 17:43:13 -06006482 }
6483
unknown088160a2019-05-23 17:43:13 -06006484 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006485 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
sjfricke11db0c72022-08-18 13:23:11 +09006486 auto features2 = GetPhysicalDeviceFeatures2(mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006487 features2.features.multiDrawIndirect = VK_FALSE;
6488
6489 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6491
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006492 static const char vertShaderText[] = R"glsl(
6493 #version 450
6494 vec2 vertices[3];
6495 void main() {
6496 vertices[0] = vec2(-1.0, -1.0);
6497 vertices[1] = vec2( 1.0, -1.0);
6498 vertices[2] = vec2( 0.0, 1.0);
6499 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6500 gl_PointSize = 1.0f;
6501 }
6502 )glsl";
unknown088160a2019-05-23 17:43:13 -06006503
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006504 static const char meshShaderText[] = R"glsl(
6505 #version 450
6506 #extension GL_NV_mesh_shader : require
6507 layout(local_size_x = 1) in;
6508 layout(max_vertices = 3) out;
6509 layout(max_primitives = 1) out;
6510 layout(triangles) out;
6511 void main() {
6512 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6513 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6514 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6515 gl_PrimitiveIndicesNV[0] = 0;
6516 gl_PrimitiveIndicesNV[1] = 1;
6517 gl_PrimitiveIndicesNV[2] = 2;
6518 gl_PrimitiveCountNV = 1;
6519 }
6520 )glsl";
unknown088160a2019-05-23 17:43:13 -06006521
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006522 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6523 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6524 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006525
6526 // Test pipeline creation
6527 {
6528 // can't mix mesh with vertex
6529 const auto break_vp = [&](CreatePipelineHelper &helper) {
6530 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6531 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006532 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006533 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6534
6535 // vertex or mesh must be present
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006536 // 02096 overlaps with 06896
unknown088160a2019-05-23 17:43:13 -06006537 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006538 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006539 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096",
6540 "VUID-VkGraphicsPipelineCreateInfo-pStages-06896"}));
unknown088160a2019-05-23 17:43:13 -06006541
6542 // vertexinput and inputassembly must be valid when vertex stage is present
6543 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6544 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6545 helper.gp_ci_.pVertexInputState = nullptr;
6546 helper.gp_ci_.pInputAssemblyState = nullptr;
6547 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006548 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006549 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6550 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6551 }
6552
6553 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006554 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006555
sfricke-samsung1c61f192021-12-31 01:53:03 -06006556 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006557 buffer_create_info.size = sizeof(uint32_t);
6558 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6559 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006560 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006561 ASSERT_VK_SUCCESS(result);
6562
6563 m_commandBuffer->begin();
6564
Mark Lobodzinski20310782020-02-28 14:25:17 -07006565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006567 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6568 m_errorMonitor->VerifyFound();
6569
6570 m_commandBuffer->end();
6571
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006572 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006573}
6574
6575TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6576 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006577
sjfricked700bc02022-05-30 16:35:06 +09006578 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006579 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +09006580 if (!AreRequiredExtensionsEnabled()) {
6581 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006582 }
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006583
6584 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006585 GetPhysicalDeviceFeatures2(mesh_shader_features);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006586 if (mesh_shader_features.meshShader != VK_TRUE) {
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006587 GTEST_SKIP() << "Mesh shader feature not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006588 }
6589
6590 mesh_shader_features.meshShader = VK_FALSE;
6591 mesh_shader_features.taskShader = VK_FALSE;
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006592 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &mesh_shader_features));
unknown088160a2019-05-23 17:43:13 -06006593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006595 vk_testing::Event event_obj(*m_device);
6596 const auto event = event_obj.handle();
6597 ASSERT_TRUE(event_obj.initialized());
unknown088160a2019-05-23 17:43:13 -06006598
6599 m_commandBuffer->begin();
6600
Shannon McPherson93970b12020-06-12 14:34:35 -06006601 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006602 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006603 m_errorMonitor->VerifyFound();
6604
Shannon McPherson93970b12020-06-12 14:34:35 -06006605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006606 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006607 m_errorMonitor->VerifyFound();
6608
Shannon McPherson93970b12020-06-12 14:34:35 -06006609 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006610 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006611 m_errorMonitor->VerifyFound();
6612
Shannon McPherson93970b12020-06-12 14:34:35 -06006613 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006614 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006615 m_errorMonitor->VerifyFound();
6616
Shannon McPherson93970b12020-06-12 14:34:35 -06006617 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006619 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6620 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006621 m_errorMonitor->VerifyFound();
6622
Shannon McPherson93970b12020-06-12 14:34:35 -06006623 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006625 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6626 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006627 m_errorMonitor->VerifyFound();
6628
Shannon McPherson93970b12020-06-12 14:34:35 -06006629 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006631 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6632 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006633 m_errorMonitor->VerifyFound();
6634
Shannon McPherson93970b12020-06-12 14:34:35 -06006635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006637 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6638 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006639 m_errorMonitor->VerifyFound();
6640
6641 m_commandBuffer->end();
6642
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006643 vk_testing::Semaphore semaphore_obj(*m_device);
6644 const auto semaphore = semaphore_obj.handle();
6645 ASSERT_TRUE(semaphore_obj.initialized());
unknown088160a2019-05-23 17:43:13 -06006646
6647 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006648 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006649
6650 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006651 submit_info.signalSemaphoreCount = 1;
6652 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006653 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006654
unknown088160a2019-05-23 17:43:13 -06006655 submit_info.signalSemaphoreCount = 0;
6656 submit_info.pSignalSemaphores = nullptr;
6657 submit_info.waitSemaphoreCount = 1;
6658 submit_info.pWaitSemaphores = &semaphore;
6659 submit_info.pWaitDstStageMask = &stage_flags;
6660
sfricke-samsung1ac64842021-09-23 14:11:17 -07006661 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6662 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006663 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006664 m_errorMonitor->VerifyFound();
6665
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006666 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006667
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006668 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006669
6670 static const char task_src[] = R"glsl(
6671 #version 450
6672
6673 #extension GL_NV_mesh_shader : require
6674
6675 layout(local_size_x = 32) in;
6676
6677 taskNV out Task {
6678 uint baseID;
6679 } OUT;
6680
6681 void main() {
6682 OUT.baseID = 1;
6683 }
6684 )glsl";
6685
6686 static const char mesh_src[] = R"glsl(
6687 #version 450
6688
6689 #extension GL_NV_mesh_shader : require
6690
6691 layout(local_size_x = 1) in;
6692 layout(max_vertices = 3) out;
6693 layout(max_primitives = 1) out;
6694 layout(triangles) out;
6695
6696 taskNV in Task {
6697 uint baseID;
6698 } IN;
6699
6700 void main() {
6701 }
6702 )glsl";
6703
6704 VkShaderObj task_shader(this, task_src, VK_SHADER_STAGE_TASK_BIT_NV);
6705 VkShaderObj mesh_shader(this, mesh_src, VK_SHADER_STAGE_MESH_BIT_NV);
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006706 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006707
6708 // mesh and task shaders not supported
6709 const auto break_vp = [&](CreatePipelineHelper &helper) {
Nathaniel Cesario13da77b2022-07-15 14:51:12 -06006710 helper.shader_stages_ = {task_shader.GetStageCreateInfo(), mesh_shader.GetStageCreateInfo(), fs.GetStageCreateInfo()};
unknown088160a2019-05-23 17:43:13 -06006711 };
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006712 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
6713 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6714 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
unknown088160a2019-05-23 17:43:13 -06006715}
Chris Mayerc93536f2019-09-19 16:34:49 +02006716
6717TEST_F(VkLayerTest, ViewportWScalingNV) {
6718 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6719
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006720 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006721
6722 VkPhysicalDeviceFeatures device_features = {};
6723 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6724
6725 if (!device_features.multiViewport) {
6726 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6727 return;
6728 }
6729
6730 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6731 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6732 } else {
6733 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6734 return;
6735 }
6736
6737 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6738 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6739
6740 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006741 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006742
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006743 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006744 #version 450
6745 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6746 vec2( 1.0f, 1.0f),
6747 vec2(-1.0f, -1.0f),
6748 vec2( 1.0f, -1.0f) };
6749 out gl_PerVertex {
6750 vec4 gl_Position;
6751 };
6752
6753 void main() {
6754 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006755 }
6756 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006757
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006758 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006759 #version 450
6760 layout(location = 0) out vec4 outColor;
6761
6762 void main() {
6763 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006764 }
6765 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006766
6767 const std::vector<VkViewport> vp = {
6768 {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}};
6769 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6770 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6771
6772 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6773
sfricke-samsung1c61f192021-12-31 01:53:03 -06006774 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006775 vpsi.viewportWScalingEnable = VK_TRUE;
6776 vpsi.viewportCount = vp_count;
6777 vpsi.pViewportWScalings = scale.data();
6778
sfricke-samsung1c61f192021-12-31 01:53:03 -06006779 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006780 vpci.viewportCount = vp_count;
6781 vpci.pViewports = vp.data();
6782 vpci.scissorCount = vp_count;
6783 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006784
6785 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6786
6787 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Nathaniel Cesariocabaf442022-07-21 14:57:41 -06006788 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit);
Chris Mayerc93536f2019-09-19 16:34:49 +02006789
6790 // Create pipeline with w-scaling enabled but without a valid scaling array
6791 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006792 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006793 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6794
6795 vpsi.pViewportWScalings = scale.data();
6796
6797 // Create pipeline with w-scaling enabled but without matching viewport counts
6798 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006799 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006800 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6801
6802 const VkPipelineLayoutObj pl(m_device);
6803
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006804 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6805 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006806
6807 VkPipelineObj pipe(m_device);
6808 pipe.AddDefaultColorAttachment();
6809 pipe.AddShader(&vs);
6810 pipe.AddShader(&fs);
6811 pipe.SetViewport(vp);
6812 pipe.SetScissor(sc);
6813 pipe.CreateVKPipeline(pl.handle(), renderPass());
6814
6815 VkPipelineObj pipeDynWScale(m_device);
6816 pipeDynWScale.AddDefaultColorAttachment();
6817 pipeDynWScale.AddShader(&vs);
6818 pipeDynWScale.AddShader(&fs);
6819 pipeDynWScale.SetViewport(vp);
6820 pipeDynWScale.SetScissor(sc);
6821 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6822 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6823
6824 m_commandBuffer->begin();
6825
6826 // Bind pipeline without dynamic w scaling enabled
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006827 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006828
Chris Mayerc93536f2019-09-19 16:34:49 +02006829 // Bind pipeline that has dynamic w-scaling enabled
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006830 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006831
6832 const auto max_vps = m_device->props.limits.maxViewports;
6833
Mark Lobodzinski20310782020-02-28 14:25:17 -07006834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006835 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6836 m_errorMonitor->VerifyFound();
6837
Chris Mayerc93536f2019-09-19 16:34:49 +02006838 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
Chris Mayerc93536f2019-09-19 16:34:49 +02006839
6840 m_commandBuffer->end();
6841}
sfricke-samsung914e8002020-01-07 22:26:18 -08006842
6843TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6844 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6845
6846 // Enable Sampler YCbCr Conversion req'd extensions
6847 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6848 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6849 if (mp_extensions) {
6850 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6851 }
6852 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006853 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006854 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006855 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6856 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6857 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6858 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006859 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006860 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6861 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6862 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6863 } else {
6864 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6865 return;
6866 }
6867
6868 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06006869 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08006870 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6871 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6872
6873 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6874 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6875 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6876 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6877 return;
6878 }
6879
6880 // Create Ycbcr conversion
6881 VkSamplerYcbcrConversion conversions;
6882 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6883 NULL,
6884 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6885 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6886 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6887 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6888 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6889 VK_CHROMA_LOCATION_COSITED_EVEN,
6890 VK_CHROMA_LOCATION_COSITED_EVEN,
6891 VK_FILTER_NEAREST,
6892 false};
6893
Mark Lobodzinski20310782020-02-28 14:25:17 -07006894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006895 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6896 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006897}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006898
6899TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6900 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6901
sjfricked8e01c52022-07-06 14:09:04 +09006902 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006903
6904 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6905
sjfricked8e01c52022-07-06 14:09:04 +09006906 if (!AreRequiredExtensionsEnabled()) {
6907 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006908 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006909
6910 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006911 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
sjfricke11db0c72022-08-18 13:23:11 +09006912 GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006913 if (!tf_features.transformFeedback) {
6914 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6915 return;
6916 }
6917 }
6918
6919 ASSERT_NO_FATAL_FAILURE(InitState());
6920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6921
6922 {
6923 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6924 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6925 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6926
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006927 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006928 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6929 info.size = 4;
6930 VkBufferObj buffer;
6931 buffer.init(*m_device, info);
6932 VkDeviceSize offsets[1]{};
6933
6934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6935 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6936 m_errorMonitor->VerifyFound();
6937 }
6938
6939 {
6940 auto vkCmdBeginTransformFeedbackEXT =
6941 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6942 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6943
6944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6945 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6946 m_errorMonitor->VerifyFound();
6947 }
6948
6949 {
6950 auto vkCmdEndTransformFeedbackEXT =
6951 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6952 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6953
6954 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6955 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6956 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6957 m_errorMonitor->VerifyFound();
6958 }
6959}
6960
6961TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6962 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6963
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006964 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6965 ASSERT_NO_FATAL_FAILURE(InitFramework());
6966 if (!AreRequiredExtensionsEnabled()) {
6967 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006968 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006969
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06006970 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006971 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06006972 }
6973
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006974 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006975 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006976 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006977
6978 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006979 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006980 }
6981
6982 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6983 }
6984
6985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6986
6987 auto vkCmdBindTransformFeedbackBuffersEXT =
6988 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6989 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6990
6991 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006992 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06006993 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006994
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006995 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006996 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6997 info.size = 8;
6998 VkBufferObj const buffer_obj(*m_device, info);
6999
7000 // Request a firstBinding that is too large.
7001 {
7002 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7003 VkDeviceSize const offsets[1]{};
7004
7005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7006 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7007 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7008 nullptr);
7009 m_errorMonitor->VerifyFound();
7010 }
7011
7012 // Request too many bindings.
7013 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7014 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7015 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7016
7017 std::vector<VkDeviceSize> offsets(bindingCount);
7018
7019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7020 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7021 nullptr);
7022 m_errorMonitor->VerifyFound();
7023 }
7024
7025 // Request a size that is larger than the maximum size.
7026 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7027 VkDeviceSize const offsets[1]{};
7028 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7029
7030 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7031 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7032 m_errorMonitor->VerifyFound();
7033 }
7034 }
7035
7036 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007037 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007038 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7039 info.size = 8;
7040 VkBufferObj const buffer_obj(*m_device, info);
7041
7042 // Request an offset that is too large.
7043 {
7044 VkDeviceSize const offsets[1]{info.size + 4};
7045
7046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7047 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7048 m_errorMonitor->VerifyFound();
7049 }
7050
7051 // Request an offset that is not a multiple of 4.
7052 {
7053 VkDeviceSize const offsets[1]{1};
7054
7055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7056 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7057 m_errorMonitor->VerifyFound();
7058 }
7059
7060 // Request a size that is larger than the buffer's size.
7061 {
7062 VkDeviceSize const offsets[1]{};
7063 VkDeviceSize const sizes[1]{info.size + 1};
7064
7065 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007066 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7067 m_errorMonitor->VerifyFound();
7068 }
7069
7070 // Request an offset and size whose sum is larger than the buffer's size.
7071 {
7072 VkDeviceSize const offsets[1]{4};
7073 VkDeviceSize const sizes[1]{info.size - 3};
7074
7075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7076 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7077 m_errorMonitor->VerifyFound();
7078 }
7079
7080 // Bind while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007081 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007082 auto vkCmdBeginTransformFeedbackEXT =
7083 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7084 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7085 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7086
7087 VkDeviceSize const offsets[1]{};
7088
7089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7090 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7091 m_errorMonitor->VerifyFound();
7092
7093 auto vkCmdEndTransformFeedbackEXT =
7094 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7095 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7096 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7097 }
7098 }
7099
7100 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7101 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007102 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007103 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7104 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007105 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007106 VkBufferObj const buffer_obj(*m_device, info);
7107
7108 VkDeviceSize const offsets[1]{};
7109
7110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7111 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7112 m_errorMonitor->VerifyFound();
7113 }
7114
7115 // Don't bind memory.
7116 {
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007117 vk_testing::Buffer buffer;
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007118 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007119 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007120 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7121 info.size = 4;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007122 buffer.init_no_mem(*m_device, info);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007123 }
7124
7125 VkDeviceSize const offsets[1]{};
7126
7127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06007128 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007129 m_errorMonitor->VerifyFound();
7130 }
7131}
7132
7133TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7134 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7135
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007136 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7137 ASSERT_NO_FATAL_FAILURE(InitFramework());
7138 if (!AreRequiredExtensionsEnabled()) {
7139 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007140 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007141
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007142 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007143 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007144 }
7145
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007146 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007147 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007148 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007149
7150 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007151 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007152 }
7153
7154 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7155 }
7156
7157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7158
7159 auto vkCmdBeginTransformFeedbackEXT =
7160 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7161 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7162
7163 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007164 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007165 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007166
7167 // Request a firstCounterBuffer that is too large.
7168 {
7169 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7170
7171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7172 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7173 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7174 m_errorMonitor->VerifyFound();
7175 }
7176
7177 // Request too many buffers.
7178 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7179 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7180
7181 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7182 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7183 m_errorMonitor->VerifyFound();
7184 }
7185 }
7186
7187 // Request an out-of-bounds location.
7188 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007189 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007190 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7191 info.size = 4;
7192 VkBufferObj const buffer_obj(*m_device, info);
7193
7194 VkDeviceSize const offsets[1]{1};
7195
7196 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7197 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7198 m_errorMonitor->VerifyFound();
7199 }
7200
7201 // Request specific offsets without specifying buffers.
7202 {
7203 VkDeviceSize const offsets[1]{};
7204
7205 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7206 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7207 m_errorMonitor->VerifyFound();
7208 }
7209
7210 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7211 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007212 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007213 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7214 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007215 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007216 VkBufferObj const buffer_obj(*m_device, info);
7217
7218 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7219 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7220 m_errorMonitor->VerifyFound();
7221 }
7222
7223 // Begin while transform feedback is active.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007224 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007225 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7226
7227 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7228 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7229 m_errorMonitor->VerifyFound();
7230
7231 auto vkCmdEndTransformFeedbackEXT =
7232 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7233 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7234
7235 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7236 }
7237}
7238
7239TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7240 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7241
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007242 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007243 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007244 if (!AreRequiredExtensionsEnabled()) {
7245 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
7246 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007247
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007248 if (IsPlatform(kGalaxyS10)) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007249 GTEST_SKIP() << "Test temporarily disabled on S10 device";
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007250 }
7251
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007252 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007253 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007254 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007255
7256 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007257 GTEST_SKIP() << "transformFeedback not supported; skipped.";
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007258 }
7259
7260 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7261 }
7262
7263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7264
7265 auto vkCmdEndTransformFeedbackEXT =
7266 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7267 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7268
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007269 if (!IsDriver(VK_DRIVER_ID_MESA_RADV)) {
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007270 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007271 // Activate transform feedback.
7272 auto vkCmdBeginTransformFeedbackEXT =
7273 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7274 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7275 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007276
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007277 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007278 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7279 GetPhysicalDeviceProperties2(tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007280
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007281 // Request a firstCounterBuffer that is too large.
7282 {
7283 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7284
7285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7286 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7287 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7288 m_errorMonitor->VerifyFound();
7289 }
7290
7291 // Request too many buffers.
7292 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7293 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7294
7295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7296 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7297 m_errorMonitor->VerifyFound();
7298 }
7299 }
7300
7301 // Request an out-of-bounds location.
7302 {
7303 auto info = LvlInitStruct<VkBufferCreateInfo>();
7304 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7305 info.size = 4;
7306 VkBufferObj const buffer_obj(*m_device, info);
7307
7308 VkDeviceSize const offsets[1]{1};
7309
7310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7311 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007312 m_errorMonitor->VerifyFound();
7313 }
7314
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007315 // Request specific offsets without specifying buffers.
7316 {
7317 VkDeviceSize const offsets[1]{};
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007318
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7320 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7321 m_errorMonitor->VerifyFound();
7322 }
7323
7324 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7325 {
7326 auto info = LvlInitStruct<VkBufferCreateInfo>();
7327 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7328 info.size = 4;
paul-lunargabe3b302022-07-08 15:23:08 -06007329 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-requiredbitmask");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007330 VkBufferObj const buffer_obj(*m_device, info);
7331
7332 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7333 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007334 m_errorMonitor->VerifyFound();
7335 }
7336 }
7337
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007338 // End while transform feedback is inactive.
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007339 {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007340 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007341
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06007342 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7343 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007344 m_errorMonitor->VerifyFound();
7345 }
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007346 }
7347}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007348
sfricke-samsung39ee2442020-07-22 21:21:15 -07007349TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7350 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007351
7352 // protect memory added in VK 1.1
7353 SetTargetApiVersion(VK_API_VERSION_1_1);
7354
sjfricked8e01c52022-07-06 14:09:04 +09007355 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7356
sfricke-samsung071af2d2020-07-02 10:37:22 -07007357 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7358
sjfricked8e01c52022-07-06 14:09:04 +09007359 if (!AreRequiredExtensionsEnabled()) {
7360 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7361 }
7362
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007363 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
sjfricke11db0c72022-08-18 13:23:11 +09007364 auto features2 = GetPhysicalDeviceFeatures2(protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007365
7366 if (protected_memory_features.protectedMemory == VK_FALSE) {
7367 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7368 return;
7369 };
7370
7371 // Turns m_commandBuffer into a protected command buffer
7372 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7373
7374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7375 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007376 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung071af2d2020-07-02 10:37:22 -07007377 }
7378
7379 VkBufferObj indirect_buffer;
7380 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7381 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7382
7383 VkBufferObj indexed_indirect_buffer;
7384 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7385 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7386
7387 VkBufferObj index_buffer;
7388 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7389
7390 CreatePipelineHelper pipe(*this);
7391 pipe.InitInfo();
7392 pipe.InitState();
7393 pipe.CreateGraphicsPipeline();
7394
sfricke-samsung39ee2442020-07-22 21:21:15 -07007395 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007396 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007397 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7398 query_pool_create_info.queryCount = 1;
7399 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7400
sfricke-samsung071af2d2020-07-02 10:37:22 -07007401 m_commandBuffer->begin();
7402 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7403
7404 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7405
7406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7407 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7408 m_errorMonitor->VerifyFound();
7409
7410 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7411
7412 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7413 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7414 sizeof(VkDrawIndexedIndirectCommand));
7415 m_errorMonitor->VerifyFound();
7416
7417 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007418
7419 // Query should be outside renderpass
7420 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7421
7422 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7423 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7424 m_errorMonitor->VerifyFound();
7425
7426 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7427 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7428 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7429 m_errorMonitor->VerifyFound();
7430
sfricke-samsung071af2d2020-07-02 10:37:22 -07007431 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007432
7433 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007434}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007435
7436TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7437 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7438
7439 SetTargetApiVersion(VK_API_VERSION_1_1);
sjfricked8e01c52022-07-06 14:09:04 +09007440 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007441
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007442 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7443
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007444 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7445 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7446 return;
7447 }
sjfricked8e01c52022-07-06 14:09:04 +09007448 if (!AreRequiredExtensionsEnabled()) {
7449 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7450 }
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007451
sfricke-samsung21286f82021-11-16 08:21:46 -08007452 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7453 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7454 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007455
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007456 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
sjfricke11db0c72022-08-18 13:23:11 +09007457 auto features2 = GetPhysicalDeviceFeatures2(protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007458
7459 if (protected_memory_features.protectedMemory == VK_FALSE) {
7460 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7461 return;
7462 };
7463
sfricke-samsung21286f82021-11-16 08:21:46 -08007464 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7465 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7466 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7467 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7468
7469 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
sjfricke8ab00c12022-07-08 17:33:48 +09007470 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007471
7472 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7473 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7474
7475 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007476 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007477 }
7478
7479 // Create actual protected and unprotected buffers
7480 VkBuffer buffer_protected = VK_NULL_HANDLE;
7481 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007482 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007483 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007484 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7485 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7486 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007487 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7488
7489 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7490 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7491 buffer_create_info.flags = 0;
7492 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7493
7494 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007495 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007496 VkImageObj image_protected(m_device);
7497 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007498 VkImageObj image_protected_descriptor(m_device);
7499 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007500 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007501 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007502 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007503 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007504 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007505 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7506 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007507 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7508 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007509 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7510 image_create_info.arrayLayers = 1;
7511 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007512 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7513 image_protected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007514 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007515
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007516 image_create_info.flags = 0;
7517 image_unprotected.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007518 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
locke-lunarg0de02522020-10-27 22:55:17 -06007519
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007520 // Create protected and unproteced memory
7521 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7522 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7523
sfricke-samsung1c61f192021-12-31 01:53:03 -06007524 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007525 alloc_info.allocationSize = 0;
7526
7527 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7528 VkMemoryRequirements mem_reqs_protected;
7529 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7530 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7531 VkMemoryRequirements mem_reqs_unprotected;
7532 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7533 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7534
7535 // Get memory index for a protected and unprotected memory
7536 VkPhysicalDeviceMemoryProperties phys_mem_props;
7537 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7538 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7539 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7540 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7541 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7542 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7543 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7544 memory_type_unprotected = i;
7545 }
7546 // Check just protected bit is in type at all
7547 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7548 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7549 memory_type_protected = i;
7550 }
7551 }
7552 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7553 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7554 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7555 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7556 return;
7557 }
7558
7559 alloc_info.memoryTypeIndex = memory_type_protected;
7560 alloc_info.allocationSize = mem_reqs_protected.size;
7561 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7562
7563 alloc_info.allocationSize = mem_reqs_unprotected.size;
7564 alloc_info.memoryTypeIndex = memory_type_unprotected;
7565 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7566
7567 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7568 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7569 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7570 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007571 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7572 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7573
Aitor Camacho6ba32ff2022-06-16 19:11:12 +02007574 // Change layout once memory is bound
7575 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7576 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7577 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7578 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7579
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007580 // need memory bound at image view creation time
7581 image_views[0] = image_protected.targetView(image_format);
7582 image_views[1] = image_unprotected.targetView(image_format);
7583 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7584 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007585
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007586 // A renderpass and framebuffer that contains a protected and unprotected image view
7587 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007588 {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 -07007589 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7590 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007591 {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 -07007592 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7593 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7594 };
7595 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7596 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7597 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7598 VkSubpassDependency dependency = {0,
7599 0,
7600 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7601 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7602 VK_ACCESS_SHADER_WRITE_BIT,
7603 VK_ACCESS_SHADER_WRITE_BIT,
7604 VK_DEPENDENCY_BY_REGION_BIT};
7605 VkRenderPassCreateInfo render_pass_create_info = {
7606 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7607 VkRenderPass render_pass;
7608 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7609 VkFramebufferCreateInfo framebuffer_create_info = {
7610 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7611 VkFramebuffer framebuffer;
7612 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7613
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007614 // Various structs used for commands
7615 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7616 VkImageBlit blit_region = {};
7617 blit_region.srcSubresource = image_subresource;
7618 blit_region.dstSubresource = image_subresource;
7619 blit_region.srcOffsets[0] = {0, 0, 0};
7620 blit_region.srcOffsets[1] = {8, 8, 1};
7621 blit_region.dstOffsets[0] = {0, 8, 0};
7622 blit_region.dstOffsets[1] = {8, 8, 1};
7623 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7624 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7625 VkBufferCopy buffer_copy = {0, 0, 64};
7626 VkBufferImageCopy buffer_image_copy = {};
7627 buffer_image_copy.bufferRowLength = 0;
7628 buffer_image_copy.bufferImageHeight = 0;
7629 buffer_image_copy.imageSubresource = image_subresource;
7630 buffer_image_copy.imageOffset = {0, 0, 0};
7631 buffer_image_copy.imageExtent = {1, 1, 1};
7632 buffer_image_copy.bufferOffset = 0;
7633 VkImageCopy image_copy = {};
7634 image_copy.srcSubresource = image_subresource;
7635 image_copy.srcOffset = {0, 0, 0};
7636 image_copy.dstSubresource = image_subresource;
7637 image_copy.dstOffset = {0, 0, 0};
7638 image_copy.extent = {1, 1, 1};
7639 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007640 VkRect2D render_area = {{0, 0}, {8, 8}};
7641 VkRenderPassBeginInfo render_pass_begin = {
7642 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7643 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7644 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7645 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007646
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007647 const char fsSource[] = R"glsl(
7648 #version 450
7649 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7650 layout(set=0, binding=1, rgba8) uniform image2D si1;
7651 layout(location=0) out vec4 x;
7652 void main(){
7653 x = vec4(bar.y);
7654 imageStore(si1, ivec2(0), vec4(0));
7655 }
7656 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007657 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007658
aitor-lunargf15acd52022-03-09 22:13:25 +01007659 CreatePipelineHelper g_pipe(*this, 2u);
locke-lunarg0de02522020-10-27 22:55:17 -06007660 g_pipe.InitInfo();
7661 g_pipe.gp_ci_.renderPass = render_pass;
7662 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7663 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7664 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg0de02522020-10-27 22:55:17 -06007665 g_pipe.InitState();
7666 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7667
7668 VkSampler sampler;
7669 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7670 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7671 ASSERT_VK_SUCCESS(err);
7672
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007673 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007674 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007675 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7676 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7677 g_pipe.descriptor_set_->UpdateDescriptorSets();
7678
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007679 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007680 // will get undefined values, but not invalid if protectedNoFault is supported
7681 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7682 if (!protected_memory_properties.protectedNoFault) {
7683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7684 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7685 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7686 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007687
sfricke-samsung21286f82021-11-16 08:21:46 -08007688 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7689 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7690 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7691 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007692
sfricke-samsung21286f82021-11-16 08:21:46 -08007693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7694 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7695 &subresource_range);
7696 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007697
sfricke-samsung21286f82021-11-16 08:21:46 -08007698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7699 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7700 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007701
sfricke-samsung21286f82021-11-16 08:21:46 -08007702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7703 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7704 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007705
sfricke-samsung21286f82021-11-16 08:21:46 -08007706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7707 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7708 1, &buffer_image_copy);
7709 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007710
sfricke-samsung21286f82021-11-16 08:21:46 -08007711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7712 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7713 1, &buffer_image_copy);
7714 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007715
sfricke-samsung21286f82021-11-16 08:21:46 -08007716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7717 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7718 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7719 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007720
sfricke-samsung21286f82021-11-16 08:21:46 -08007721 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7722 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7723 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7724 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007725
sfricke-samsung21286f82021-11-16 08:21:46 -08007726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7727 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7728 1, &buffer_image_copy);
7729 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007730
sfricke-samsung21286f82021-11-16 08:21:46 -08007731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7732 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7733 1, &buffer_image_copy);
7734 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007735
sfricke-samsung21286f82021-11-16 08:21:46 -08007736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7737 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7738 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007739
sfricke-samsung21286f82021-11-16 08:21:46 -08007740 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7741 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7742 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007743
sfricke-samsung21286f82021-11-16 08:21:46 -08007744 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007745
sfricke-samsung21286f82021-11-16 08:21:46 -08007746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7747 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7748 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007749
sfricke-samsung21286f82021-11-16 08:21:46 -08007750 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7751 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7752 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7753 VkDeviceSize offset = 0;
7754 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7755 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007756
sfricke-samsung21286f82021-11-16 08:21:46 -08007757 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7758 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007762
sfricke-samsung21286f82021-11-16 08:21:46 -08007763 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7764 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007765
sfricke-samsung21286f82021-11-16 08:21:46 -08007766 vk::CmdEndRenderPass(m_commandBuffer->handle());
7767 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007768 m_commandBuffer->end();
7769
7770 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007771 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007772 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7773 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007774 g_pipe.descriptor_set_->UpdateDescriptorSets();
7775
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007776 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007777 if (!protected_memory_properties.protectedNoFault) {
7778 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7779 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7780 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7781 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007782
sfricke-samsung21286f82021-11-16 08:21:46 -08007783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7784 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7785 1, &subresource_range);
7786 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007787
sfricke-samsung21286f82021-11-16 08:21:46 -08007788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7789 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7790 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007791
sfricke-samsung21286f82021-11-16 08:21:46 -08007792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7793 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7794 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
7795 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007796
sfricke-samsung21286f82021-11-16 08:21:46 -08007797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7798 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7799 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7800 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007801
sfricke-samsung21286f82021-11-16 08:21:46 -08007802 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7803 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7804 buffer_unprotected, 1, &buffer_image_copy);
7805 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007806
sfricke-samsung21286f82021-11-16 08:21:46 -08007807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7808 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7809 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007810
sfricke-samsung21286f82021-11-16 08:21:46 -08007811 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7812 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7813 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007814
sfricke-samsung21286f82021-11-16 08:21:46 -08007815 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007816
sfricke-samsung21286f82021-11-16 08:21:46 -08007817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7818 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7819 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007820
sfricke-samsung21286f82021-11-16 08:21:46 -08007821 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7822 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7823 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7824 VkDeviceSize offset = 0;
7825 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7826 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007827
sfricke-samsung21286f82021-11-16 08:21:46 -08007828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7830 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7831 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007832
sfricke-samsung21286f82021-11-16 08:21:46 -08007833 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
7834 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007835 protectedCommandBuffer.end();
7836
sfricke-samsung96cd9932020-08-23 20:57:11 -07007837 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7838 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7839
sfricke-samsung1c61f192021-12-31 01:53:03 -06007840 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
7841 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07007842 submit_info.commandBufferCount = 2;
7843 submit_info.pCommandBuffers = comman_buffers;
7844
7845 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08007846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007848 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7849 m_errorMonitor->VerifyFound();
7850
7851 protected_submit_info.protectedSubmit = VK_FALSE;
7852 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7853 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7854 m_errorMonitor->VerifyFound();
7855
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007856 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7857 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7858 vk::FreeMemory(device(), memory_protected, nullptr);
7859 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007860 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7861 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007862}
locke-lunarg6b0de702020-08-07 17:42:13 -06007863
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007864TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007865 TEST_DESCRIPTION(
7866 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7867 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7868
sjfricked8e01c52022-07-06 14:09:04 +09007869 AddRequiredExtensions(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007870
sjfricked8e01c52022-07-06 14:09:04 +09007871 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7872 if (!AreRequiredExtensionsEnabled()) {
7873 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
7874 }
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007875
7876 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
sjfricke11db0c72022-08-18 13:23:11 +09007877 auto features2 = GetPhysicalDeviceFeatures2(atomic_float_features);
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007878 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7879
7880 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
7881 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
7882 return;
7883 }
locke-lunarg6b0de702020-08-07 17:42:13 -06007884
7885 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7886 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7887 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7888 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7889
7890 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7891 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7892 return;
7893 }
7894
7895 VkFormat buffer_view_format =
7896 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7897 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7898 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7899 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7900 return;
7901 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06007902 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06007903 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7904
7905 VkPhysicalDeviceFeatures device_features = {};
7906 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7907 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7908 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7909 return;
7910 }
7911
7912 VkImageObj image(m_device);
7913 image.Init(image_ci);
7914 VkImageView image_view = image.targetView(image_format);
7915
7916 VkSampler sampler = VK_NULL_HANDLE;
7917 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7918 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7919
7920 VkBufferObj buffer;
7921 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7922
sfricke-samsung1c61f192021-12-31 01:53:03 -06007923 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06007924 bvci.buffer = buffer.handle();
7925 bvci.format = buffer_view_format;
7926 bvci.range = VK_WHOLE_SIZE;
7927 VkBufferView buffer_view;
7928 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7929
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007930 char const *fsSource = R"glsl(
7931 #version 450
7932 layout(set=0, binding=3, r32f) uniform image2D si0;
7933 layout(set=0, binding=2, r32f) uniform image2D si1[2];
7934 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
7935 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
7936 void main() {
7937 imageAtomicExchange(si0, ivec2(0), 1);
7938 imageAtomicExchange(si1[0], ivec2(0), 1);
7939 imageAtomicExchange(si1[1], ivec2(0), 1);
7940 imageAtomicExchange(stb2, 0, 1);
7941 imageAtomicExchange(stb3[0], 0, 1);
7942 imageAtomicExchange(stb3[1], 0, 1);
7943 }
7944 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06007945
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007946 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
7947 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06007948
7949 CreatePipelineHelper g_pipe(*this);
7950 g_pipe.InitInfo();
7951 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007952 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7953 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7954 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7955 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007956 g_pipe.InitState();
7957 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7958
locke-lunarg76e8dee2020-08-21 13:20:02 -06007959 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007960 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007961 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08007962 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007963 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08007964 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007965 g_pipe.descriptor_set_->UpdateDescriptorSets();
7966
7967 m_commandBuffer->begin();
7968 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7969 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7970 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7971 &g_pipe.descriptor_set_->set_, 0, nullptr);
7972
7973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7977 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7978 m_errorMonitor->VerifyFound();
7979
7980 m_commandBuffer->EndRenderPass();
7981 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007982 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
7983 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06007984}
locke-lunargae1bbab2020-09-10 11:55:56 -06007985
7986TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
7987 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
7988
7989 ASSERT_NO_FATAL_FAILURE(Init());
7990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7991
7992 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007993 char const *const vsSource = R"glsl(
7994 #version 450
7995 layout(push_constant, std430) uniform foo {
7996 bool b;
7997 float f2[3];
7998 vec3 v;
7999 vec4 v2[2];
8000 mat3 m;
8001 } constants;
8002 void func1( float f ){
8003 // use the whole v2[1]. byte: 48-63.
8004 vec2 v2 = constants.v2[1].yz;
8005 }
8006 void main(){
8007 // use only v2[0].z. byte: 40-43.
8008 func1( constants.v2[0].z);
8009 // index of m is variable. The all m is used. byte: 64-99.
8010 for(int i=1;i<2;++i) {
8011 vec3 v3 = constants.m[i];
8012 }
8013 }
8014 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008015
8016 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008017 char const *const fsSource = R"glsl(
8018 #version 450
8019 struct foo1{
8020 int i[4];
8021 }f;
8022 layout(push_constant, std430) uniform foo {
8023 float x[2][2][2];
8024 foo1 s;
8025 foo1 ss[3];
8026 } constants;
8027 void main(){
8028 // use s. byte: 32-47.
8029 f = constants.s;
8030 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8031 for(int i=1;i<2;++i) {
8032 int ii = constants.ss[i].i[3];
8033 }
8034 }
8035 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008036
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008037 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8038 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008039
8040 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8041 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8042
Aitor Camacho2933a0a2022-06-13 20:46:34 +02008043 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
8044 pipeline_layout_info.pushConstantRangeCount = 1;
8045 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
locke-lunargae1bbab2020-09-10 11:55:56 -06008046
8047 VkPipelineLayout pipeline_layout;
8048 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8049
8050 CreatePipelineHelper g_pipe(*this);
8051 g_pipe.InitInfo();
8052 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8053 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8054 g_pipe.InitState();
8055 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8056
8057 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8058 VkPipelineLayout pipeline_layout_small;
8059 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8060
8061 CreatePipelineHelper g_pipe_small_range(*this);
8062 g_pipe_small_range.InitInfo();
8063 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8064 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8065 g_pipe_small_range.InitState();
8066
sfricke-samsung7699b912021-04-12 23:01:51 -07008067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008069 g_pipe_small_range.CreateGraphicsPipeline();
8070 m_errorMonitor->VerifyFound();
8071
8072 m_commandBuffer->begin();
8073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8074
Piers Daniella7f93b62021-11-20 12:32:04 -07008075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008076 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8077 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8078 &g_pipe.descriptor_set_->set_, 0, nullptr);
8079 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8080 m_errorMonitor->VerifyFound();
8081
locke-lunargae1bbab2020-09-10 11:55:56 -06008082 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008083
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008084 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8085 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8086 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8087 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008088 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008089 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8090 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8091 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8092 // m_errorMonitor->VerifyFound();
8093
Piers Daniella7f93b62021-11-20 12:32:04 -07008094 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008095 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8096 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8097 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008098
locke-lunargae1bbab2020-09-10 11:55:56 -06008099 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8100 68, dummy_values);
8101 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
paul-lunarg6b0b1f62022-07-11 14:00:48 -06008102
8103 m_commandBuffer->EndRenderPass();
8104 m_commandBuffer->end();
8105
8106 vk::DestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
8107 vk::DestroyPipelineLayout(m_device->handle(), pipeline_layout_small, nullptr);
locke-lunarg41b8c362020-10-16 23:30:12 -06008108}
8109
8110TEST_F(VkLayerTest, VerifyVertextBinding) {
8111 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8112
8113 ASSERT_NO_FATAL_FAILURE(Init());
8114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8115
8116 VkBufferObj vtx_buf;
8117 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8118 vtx_buf.init(*m_device, info);
8119
8120 CreatePipelineHelper pipe(*this);
8121 pipe.InitInfo();
8122 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8123 VkVertexInputBindingDescription vtx_binding_des[3] = {
8124 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8125
8126 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8127 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8128 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8129 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8130 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8131 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8132 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8133 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8134 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8135 pipe.InitState();
8136 pipe.CreateGraphicsPipeline();
8137
8138 m_commandBuffer->begin();
8139 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8140 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8141 VkDeviceSize offset = 0;
8142 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8143
8144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8149 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8150 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008151
8152 m_commandBuffer->EndRenderPass();
8153 m_commandBuffer->end();
8154}
locke-lunargd7a08e92020-10-21 00:24:00 -06008155
8156TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8157 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8158 ASSERT_NO_FATAL_FAILURE(Init());
8159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8160
8161 CreatePipelineHelper pipe(*this);
8162 pipe.InitInfo();
8163
8164 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8165
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008166 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008167 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8168 dyn_state_ci.pDynamicStates = dyn_states.data();
8169 pipe.dyn_state_ci_ = dyn_state_ci;
8170 pipe.InitState();
8171 pipe.CreateGraphicsPipeline();
8172
8173 m_commandBuffer->begin();
8174 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8175 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8176
8177 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8178 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8179 VkRect2D scissor = {{0, 0}, {16, 16}};
8180 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8181 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8182
8183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8184 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8185 m_errorMonitor->VerifyFound();
8186
8187 m_commandBuffer->EndRenderPass();
8188 m_commandBuffer->end();
8189}
locke-lunarg0de02522020-10-27 22:55:17 -06008190
8191TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8192 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008193 SetTargetApiVersion(VK_API_VERSION_1_1);
8194 AddRequiredExtensions(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8195 AddRequiredExtensions(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
8196 ASSERT_NO_FATAL_FAILURE(InitFramework());
8197 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8198 GTEST_SKIP() << "Test requires at least Vulkan 1.1";
locke-lunarg0de02522020-10-27 22:55:17 -06008199 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008200 if (!AreRequiredExtensionsEnabled()) {
8201 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
locke-lunarg0de02522020-10-27 22:55:17 -06008202 }
8203
8204 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8206
8207 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8208 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008209
8210 VkFormatProperties format_props;
8211 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8212 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008213 GTEST_SKIP() << "SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.";
sfricke-samsung715e3d12020-12-01 22:45:49 -08008214 }
8215
locke-lunarg0de02522020-10-27 22:55:17 -06008216 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8217 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8218
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008219 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008220 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008221 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008222 image_format_info.type = image_ci.imageType;
8223 image_format_info.format = image_ci.format;
8224 image_format_info.tiling = image_ci.tiling;
8225 image_format_info.usage = image_ci.usage;
8226 image_format_info.flags = image_ci.flags;
8227
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008228 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8229 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008230
8231 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8232
8233 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008234 GTEST_SKIP() << "Image and ImageView supports filter cubic ; skipped.";
locke-lunarg0de02522020-10-27 22:55:17 -06008235 }
8236
8237 VkImageObj image(m_device);
8238 image.Init(image_ci);
8239 VkImageView imageView = image.targetView(format, imageViewType);
8240
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008241 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008242 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8243 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008244 vk_testing::Sampler sampler(*m_device, sampler_ci);
8245 ASSERT_TRUE(sampler.initialized());
locke-lunarg0de02522020-10-27 22:55:17 -06008246
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008247 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008248 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8249 sampler_ci.pNext = &reduction_mode_ci;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008250 vk_testing::Sampler sampler_reduction(*m_device, sampler_ci);
locke-lunarg0de02522020-10-27 22:55:17 -06008251
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008252 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008253
8254 CreatePipelineHelper g_pipe(*this);
8255 g_pipe.InitInfo();
8256 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8257 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8258 g_pipe.InitState();
8259 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8260
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008261 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_reduction.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008262 g_pipe.descriptor_set_->UpdateDescriptorSets();
8263
8264 m_commandBuffer->begin();
8265 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8266 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8267 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8268 &g_pipe.descriptor_set_->set_, 0, nullptr);
8269
8270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8271 m_commandBuffer->Draw(1, 0, 0, 0);
8272 m_errorMonitor->VerifyFound();
8273
8274 m_commandBuffer->EndRenderPass();
8275 m_commandBuffer->end();
8276 m_commandBuffer->reset();
8277
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008278 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
locke-lunarg0de02522020-10-27 22:55:17 -06008279 g_pipe.descriptor_set_->UpdateDescriptorSets();
8280
8281 m_commandBuffer->begin();
8282 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8283 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8284 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8285 &g_pipe.descriptor_set_->set_, 0, nullptr);
8286
8287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8288 m_commandBuffer->Draw(1, 0, 0, 0);
8289 m_errorMonitor->VerifyFound();
8290
8291 m_commandBuffer->EndRenderPass();
8292 m_commandBuffer->end();
8293}
8294
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008295TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008296 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 -07008297
Clemens Kern5a42ea62021-09-29 16:30:23 +02008298 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8299 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked700bc02022-05-30 16:35:06 +09008300 if (!AreRequiredExtensionsEnabled()) {
8301 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008302 }
8303
8304 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8306
8307 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8308 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008309 auto image_ci = vk_testing::Image::create_info();
8310 image_ci.imageType = VK_IMAGE_TYPE_3D;
8311 image_ci.format = format;
8312 image_ci.extent.width = 128;
8313 image_ci.extent.height = 128;
8314 image_ci.mipLevels = 1;
8315 image_ci.arrayLayers = 1;
8316 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8317 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8318 image_ci.usage = usage;
8319 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008320
8321 VkImageObj image(m_device);
8322 image.Init(image_ci);
8323 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8324 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8325
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008326 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008327 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8328 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008329 vk_testing::Sampler sampler(*m_device, sampler_ci);
8330 ASSERT_TRUE(sampler.initialized());
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008331
Clemens Kern5a42ea62021-09-29 16:30:23 +02008332 static const char fs_src[] = R"glsl(
8333 #version 450
8334 layout(set=0, binding=0) uniform sampler3D s;
8335 layout(location=0) out vec4 x;
8336 void main(){
8337 x = texture(s, vec3(1));
8338 }
8339 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008340 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008341
8342 CreatePipelineHelper g_pipe(*this);
8343 g_pipe.InitInfo();
8344 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8345 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8346 g_pipe.InitState();
8347 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8348
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008349 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler.handle());
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008350 g_pipe.descriptor_set_->UpdateDescriptorSets();
8351
8352 m_commandBuffer->begin();
8353 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8354 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8355 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8356 &g_pipe.descriptor_set_->set_, 0, nullptr);
8357
8358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8359 m_commandBuffer->Draw(1, 0, 0, 0);
8360 m_errorMonitor->VerifyFound();
8361
8362 m_commandBuffer->EndRenderPass();
8363 m_commandBuffer->end();
8364}
8365
locke-lunarg0de02522020-10-27 22:55:17 -06008366TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8367 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
sjfricked8e01c52022-07-06 14:09:04 +09008368 SetTargetApiVersion(VK_API_VERSION_1_1);
8369 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
locke-lunarg0de02522020-10-27 22:55:17 -06008370 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8371
sjfricked8e01c52022-07-06 14:09:04 +09008372 if (!AreRequiredExtensionsEnabled()) {
8373 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
8374 }
8375 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
8376 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
locke-lunarg0de02522020-10-27 22:55:17 -06008377 }
8378
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008379 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008380 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008381 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008382
8383 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8385
8386 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8387 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8388 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008389 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8390 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008391 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8392 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8393 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8394 return;
8395 }
8396 CreatePipelineHelper pipe(*this);
8397 pipe.InitInfo();
8398 pipe.InitState();
8399 pipe.CreateGraphicsPipeline();
8400
8401 m_commandBuffer->begin();
8402 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8403 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8404
8405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8406 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8407 m_errorMonitor->VerifyFound();
8408
8409 m_commandBuffer->EndRenderPass();
8410 m_commandBuffer->end();
8411}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008412
8413TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8414 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8415
8416 // Enable KHR_fragment_shading_rate and all of its required extensions
8417 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8418 if (fsr_extensions) {
8419 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8420 }
8421 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8422
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008423 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8424 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008425 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8426 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8427 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8428 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008429 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8430 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008431 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8432 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8433 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8434 } else {
8435 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8436 return;
8437 }
8438
sfricke-samsung1c61f192021-12-31 01:53:03 -06008439 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008440 fsr_features.pipelineFragmentShadingRate = true;
8441
sfricke-samsung1c61f192021-12-31 01:53:03 -06008442 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008443
8444 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8445
8446 // Find address of extension call and make the call
8447 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8448 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8449 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8450
8451 VkExtent2D fragmentSize = {1, 1};
8452 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8453 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8454
8455 m_commandBuffer->begin();
8456 fragmentSize.width = 0;
8457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8458 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8459 m_errorMonitor->VerifyFound();
8460 fragmentSize.width = 1;
8461
8462 fragmentSize.height = 0;
8463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8464 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8465 m_errorMonitor->VerifyFound();
8466 fragmentSize.height = 1;
8467
8468 fragmentSize.width = 3;
8469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8470 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8471 m_errorMonitor->VerifyFound();
8472 fragmentSize.width = 1;
8473
8474 fragmentSize.height = 3;
8475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8476 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8477 m_errorMonitor->VerifyFound();
8478 fragmentSize.height = 1;
8479
8480 fragmentSize.width = 8;
8481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8482 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8483 m_errorMonitor->VerifyFound();
8484 fragmentSize.width = 1;
8485
8486 fragmentSize.height = 8;
8487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8488 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8489 m_errorMonitor->VerifyFound();
8490 fragmentSize.height = 1;
8491 m_commandBuffer->end();
8492}
8493
8494TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8495 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8496
8497 // Enable KHR_fragment_shading_rate and all of its required extensions
8498 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8499 if (fsr_extensions) {
8500 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8501 }
8502 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8503
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008504 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8505 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008506 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8507 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8508 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8509 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008510 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8511 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008512 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8513 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8514 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8515 } else {
8516 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8517 return;
8518 }
8519
8520 ASSERT_NO_FATAL_FAILURE(InitState());
8521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8522
8523 // Find address of extension call and make the call
8524 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8525 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8526 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8527
8528 VkExtent2D fragmentSize = {1, 1};
8529 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8530 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8531
8532 m_commandBuffer->begin();
8533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8534 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8535 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8536 m_errorMonitor->VerifyFound();
8537 m_commandBuffer->end();
8538}
8539
8540TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8541 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8542
8543 // Enable KHR_fragment_shading_rate and all of its required extensions
8544 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8545 if (fsr_extensions) {
8546 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8547 }
8548 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8549
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008550 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8551 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008552 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8553 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8554 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8555 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008556 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8557 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008558 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8559 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8560 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8561 } else {
8562 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8563 return;
8564 }
8565
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008566 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09008567 VkPhysicalDeviceFeatures2KHR features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008568
8569 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8570 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8571 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8572
8573 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8575
8576 // Find address of extension call and make the call
8577 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8578 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8579 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8580
8581 VkExtent2D fragmentSize = {1, 1};
8582 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8583 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8584
8585 m_commandBuffer->begin();
8586
8587 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8589 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8590 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8591 m_errorMonitor->VerifyFound();
8592 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8593
8594 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8596 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8597 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8598 m_errorMonitor->VerifyFound();
8599 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8600
8601 m_commandBuffer->end();
8602}
8603
8604TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8605 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8606
8607 // Enable KHR_fragment_shading_rate and all of its required extensions
8608 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8609 if (fsr_extensions) {
8610 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8611 }
8612 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8613
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008614 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8615 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008616 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8617 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8618 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8619 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008620 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8621 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008622 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8623 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8624 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8625 } else {
8626 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8627 return;
8628 }
8629
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008630 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09008631 VkPhysicalDeviceFeatures2KHR features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008632
8633 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8634 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8635 return;
8636 }
8637
8638 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8639
8640 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8642
8643 // Find address of extension call and make the call
8644 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8645 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8646 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8647
8648 VkExtent2D fragmentSize = {1, 1};
8649 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8650 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8651
8652 m_commandBuffer->begin();
8653 fragmentSize.width = 2;
8654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8655 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8656 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8657 m_errorMonitor->VerifyFound();
8658 fragmentSize.width = 1;
8659
8660 fragmentSize.height = 2;
8661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8662 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8663 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8664 m_errorMonitor->VerifyFound();
8665 fragmentSize.height = 1;
8666}
8667
8668TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8669 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8670
8671 // Enable KHR_fragment_shading_rate and all of its required extensions
8672 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8673 if (fsr_extensions) {
8674 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8675 }
8676 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8677
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008678 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8679 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008680 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8681 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8682 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8683 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008684 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8685 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008686 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8687 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8688 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8689 } else {
8690 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8691 return;
8692 }
8693
8694 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8695 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8696 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8697 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008698 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8699 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008700 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8701
8702 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8703 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8704 return;
8705 }
8706
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008707 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09008708 VkPhysicalDeviceFeatures2KHR features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008709
8710 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8711 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8712 return;
8713 }
8714
8715 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8717
8718 // Find address of extension call and make the call
8719 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8720 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8721 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8722
8723 VkExtent2D fragmentSize = {1, 1};
8724 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8725 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8726
8727 m_commandBuffer->begin();
8728 if (fsr_features.primitiveFragmentShadingRate) {
8729 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8731 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8732 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8733 m_errorMonitor->VerifyFound();
8734 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8735 }
8736
8737 if (fsr_features.attachmentFragmentShadingRate) {
8738 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8740 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8741 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8742 m_errorMonitor->VerifyFound();
8743 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8744 }
8745 m_commandBuffer->end();
8746}
8747
8748TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8749 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8750
8751 // Enable KHR_fragment_shading_rate and all of its required extensions
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008752 AddRequiredExtensions(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8753 AddRequiredExtensions(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8754 ASSERT_NO_FATAL_FAILURE(InitFramework());
8755 if (!AreRequiredExtensionsEnabled()) {
8756 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008757 }
8758
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008759 auto fsr_properties = LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8760 GetPhysicalDeviceProperties2(fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008761
8762 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008763 GTEST_SKIP() << "Test requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008764 }
8765
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008766 auto eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
8767 auto fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8768 auto features2 = GetPhysicalDeviceFeatures2(fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008769
8770 if (!fsr_features.primitiveFragmentShadingRate) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008771 GTEST_SKIP() << "Test requires primitiveFragmentShadingRate to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008772 }
8773
8774 if (!features2.features.multiViewport) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008775 GTEST_SKIP() << "%s requires multiViewport to be supported.";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008776 }
8777
8778 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8780
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008781 char const *vsSource = R"glsl(
8782 #version 450
8783 #extension GL_EXT_fragment_shading_rate : enable
8784 void main() {
8785 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8786 }
8787 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008788
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008789 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008790
8791 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008792 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8793 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008794 pipe.AddShader(&fs);
8795 pipe.AddDefaultColorAttachment();
8796 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008797 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008798 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008799 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008800 pipe.AddShader(&vs);
8801 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8802 ASSERT_VK_SUCCESS(err);
8803 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008804 m_commandBuffer->begin();
8805 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8806
8807 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8808
8809 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8810 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8811 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8812 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8813
8814 // error produced here.
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-primitiveFragmentShadingRateWithMultipleViewports-04552");
Tobias Hector04f2ab22020-12-01 10:59:33 +00008816 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008817 m_errorMonitor->VerifyFound();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008818}
ziga-lunargdada63d2021-07-13 22:10:11 +02008819
8820TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
8821 TEST_DESCRIPTION("Update buffer with invalid dataSize");
8822
8823 ASSERT_NO_FATAL_FAILURE(Init());
8824
8825 uint32_t update_data[4] = {0, 0, 0, 0};
8826 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8827 VkMemoryPropertyFlags reqs = 0;
8828 VkBufferObj buffer;
8829 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8830
8831 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
8832 m_commandBuffer->begin();
8833 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
8834 m_commandBuffer->end();
8835 m_errorMonitor->VerifyFound();
8836}
ziga-lunargc08456d2021-07-16 21:40:13 +02008837
8838TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
8839 TEST_DESCRIPTION("Update buffer with invalid dst offset");
8840
8841 ASSERT_NO_FATAL_FAILURE(Init());
8842
8843 uint32_t update_data[4] = {0, 0, 0, 0};
8844 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8845 VkMemoryPropertyFlags reqs = 0;
8846 VkBufferObj buffer;
8847 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8848
8849 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
8850 m_commandBuffer->begin();
8851 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
8852 m_commandBuffer->end();
8853 m_errorMonitor->VerifyFound();
8854}
ziga-lunarg4e31a752021-07-22 14:35:03 +02008855
8856TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
8857 TEST_DESCRIPTION(
8858 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
8859
8860 ASSERT_NO_FATAL_FAILURE(Init());
8861
8862 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
8863 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
8864 if (INVALID_QUEUE == no_gfx_qfi) {
8865 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
8866 return;
8867 }
8868
8869 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
8870 ASSERT_TRUE(command_pool.initialized());
8871 VkCommandBufferObj command_buffer(m_device, &command_pool);
8872
8873 VkDescriptorPoolSize ds_type_count = {};
8874 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8875 ds_type_count.descriptorCount = 1;
8876
8877 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
8878 ds_pool_ci.maxSets = 1;
8879 ds_pool_ci.poolSizeCount = 1;
8880 ds_pool_ci.flags = 0;
8881 ds_pool_ci.pPoolSizes = &ds_type_count;
8882
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008883 vk_testing::DescriptorPool ds_pool(*m_device, ds_pool_ci);
8884 ASSERT_TRUE(ds_pool.initialized());
ziga-lunarg4e31a752021-07-22 14:35:03 +02008885
8886 VkDescriptorSetLayoutBinding dsl_binding = {};
8887 dsl_binding.binding = 0;
8888 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8889 dsl_binding.descriptorCount = 1;
8890 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8891 dsl_binding.pImmutableSamplers = nullptr;
8892
8893 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
8894
8895 VkDescriptorSet descriptorSet;
8896 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
8897 alloc_info.descriptorSetCount = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06008898 alloc_info.descriptorPool = ds_pool.handle();
ziga-lunarg4e31a752021-07-22 14:35:03 +02008899 alloc_info.pSetLayouts = &ds_layout.handle();
8900 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
8901
8902 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
8903 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
8904
8905 command_buffer.begin();
8906 // Set invalid set
8907 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
8908 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
8909 &descriptorSet, 0, nullptr);
8910 m_errorMonitor->VerifyFound();
8911 command_buffer.end();
8912}
ziga-lunarg4d86a252021-07-23 00:31:07 +02008913
8914TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
8915 TEST_DESCRIPTION(
8916 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
8917 "occlusion query is active.");
8918 ASSERT_NO_FATAL_FAILURE(Init());
8919 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8920
8921 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
8922 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
8923 qpci.queryCount = 1;
8924
8925 VkQueryPool query_pool;
8926 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
8927
8928 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
8929
8930 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
8931 cbii.renderPass = m_renderPass;
8932 cbii.framebuffer = m_framebuffer;
8933 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
8934
8935 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
8936 cbbi.pInheritanceInfo = &cbii;
8937
8938 VkCommandBuffer secondary_handle = secondary.handle();
8939 vk::BeginCommandBuffer(secondary_handle, &cbbi);
8940 vk::EndCommandBuffer(secondary_handle);
8941
8942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
8943 m_commandBuffer->begin();
8944 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
8945 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
8946 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
8947 m_commandBuffer->end();
8948 m_errorMonitor->VerifyFound();
8949
8950 vk::DestroyQueryPool(device(), query_pool, nullptr);
8951}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06008952
8953TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
8954 TEST_DESCRIPTION("Test invalid null entries for clear color");
8955
8956 ASSERT_NO_FATAL_FAILURE(InitFramework());
8957 ASSERT_NO_FATAL_FAILURE(InitState());
8958
8959 VkImageObj image(m_device);
8960 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
8961
8962 VkImageSubresourceRange isr = {};
8963 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8964 isr.baseArrayLayer = 0;
8965 isr.baseMipLevel = 0;
8966 isr.layerCount = 1;
8967 isr.levelCount = 1;
8968
8969 m_commandBuffer->begin();
8970 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
8971 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
8972 m_errorMonitor->VerifyFound();
8973 m_commandBuffer->end();
8974}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02008975
8976TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
8977 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
8978
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008979 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02008980 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008981 if (!AreRequiredExtensionsEnabled()) {
8982 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunargad4f0fe2021-08-05 17:01:07 +02008983 }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008984
8985 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
8986 auto features2 = GetPhysicalDeviceFeatures2(multiview_features);
8987 if (!multiview_features.multiview) {
8988 GTEST_SKIP() << "VkPhysicalDeviceMultiviewFeatures::multiview not supported";
8989 }
8990 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunargad4f0fe2021-08-05 17:01:07 +02008991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8992
8993 VkAttachmentDescription attachmentDescription = {};
8994 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
8995 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06008996 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunargad4f0fe2021-08-05 17:01:07 +02008997 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
8998
8999 VkAttachmentReference colorAttachmentReference = {};
9000 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9001 colorAttachmentReference.attachment = 0;
9002
9003 VkSubpassDescription subpassDescription = {};
9004 subpassDescription.colorAttachmentCount = 1;
9005 subpassDescription.pColorAttachments = &colorAttachmentReference;
9006
9007 uint32_t viewMask = 0x1u;
9008 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9009 renderPassMultiviewCreateInfo.subpassCount = 1;
9010 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9011
9012 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9013 renderPassCreateInfo.attachmentCount = 1;
9014 renderPassCreateInfo.pAttachments = &attachmentDescription;
9015 renderPassCreateInfo.subpassCount = 1;
9016 renderPassCreateInfo.pSubpasses = &subpassDescription;
9017
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009018 vk_testing::RenderPass renderPass(*m_device, renderPassCreateInfo);
9019 ASSERT_TRUE(renderPass.initialized());
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009020
9021 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9022 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9023 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9024 image_create_info.extent.width = 32;
9025 image_create_info.extent.height = 32;
9026 image_create_info.extent.depth = 1;
9027 image_create_info.mipLevels = 1;
9028 image_create_info.arrayLayers = 4;
9029 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9030 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9031 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9032 image_create_info.flags = 0;
9033
9034 VkImageObj image(m_device);
9035 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009036 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9037 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009038
9039 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9040 framebufferCreateInfo.width = 32;
9041 framebufferCreateInfo.height = 32;
9042 framebufferCreateInfo.layers = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009043 framebufferCreateInfo.renderPass = renderPass.handle();
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009044 framebufferCreateInfo.attachmentCount = 1;
9045 framebufferCreateInfo.pAttachments = &imageView;
9046
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009047 vk_testing::Framebuffer framebuffer(*m_device, framebufferCreateInfo);
9048 ASSERT_TRUE(framebuffer.initialized());
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009049
9050 // Start no RenderPass
9051 m_commandBuffer->begin();
9052
9053 VkClearAttachment color_attachment;
9054 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9055 color_attachment.clearValue.color.float32[0] = 0;
9056 color_attachment.clearValue.color.float32[1] = 0;
9057 color_attachment.clearValue.color.float32[2] = 0;
9058 color_attachment.clearValue.color.float32[3] = 0;
9059 color_attachment.colorAttachment = 0;
9060
9061 VkClearRect clear_rect = {};
9062 clear_rect.rect.extent.width = 32;
9063 clear_rect.rect.extent.height = 32;
9064
9065 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009066 render_pass_begin_info.renderPass = renderPass.handle();
9067 render_pass_begin_info.framebuffer = framebuffer.handle();
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009068 render_pass_begin_info.renderArea.extent.width = 32;
9069 render_pass_begin_info.renderArea.extent.height = 32;
9070
9071 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9072 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9073 clear_rect.layerCount = 2;
9074 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9075 m_errorMonitor->VerifyFound();
9076
9077 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9078 clear_rect.baseArrayLayer = 1;
9079 clear_rect.layerCount = 1;
9080 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9081 m_errorMonitor->VerifyFound();
9082}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009083
9084TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9085 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9086
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009087 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009088 ASSERT_NO_FATAL_FAILURE(InitFramework());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009089 if (!AreRequiredExtensionsEnabled()) {
9090 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunargdaff74b2021-08-14 23:16:25 +02009091 }
9092 ASSERT_NO_FATAL_FAILURE(InitState());
9093
9094 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9095 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9096
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009097 auto buffer_ci =
9098 vk_testing::Buffer::create_info(32, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT);
9099 vk_testing::Buffer buffer(*m_device, buffer_ci);
ziga-lunargdaff74b2021-08-14 23:16:25 +02009100
9101 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9102 conditional_rendering_begin.buffer = buffer.handle();
9103
9104 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9105
9106 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9107 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9108 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9109 vk::EndCommandBuffer(m_commandBuffer->handle());
9110 m_errorMonitor->VerifyFound();
9111}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009112
9113TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9114 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9115
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009116 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9117 ASSERT_NO_FATAL_FAILURE(InitFramework());
9118 if (!AreRequiredExtensionsEnabled()) {
9119 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009120 }
9121
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009122 auto xfb_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9123 auto features2 = GetPhysicalDeviceFeatures2(xfb_features);
9124 if (!xfb_features.transformFeedback) {
9125 GTEST_SKIP() << "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback not supported.";
9126 }
9127 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9129
9130 CreatePipelineHelper pipe_one(*this);
9131 pipe_one.InitInfo();
9132 pipe_one.InitState();
9133 pipe_one.CreateGraphicsPipeline();
9134
9135 CreatePipelineHelper pipe_two(*this);
9136 pipe_two.InitInfo();
9137 pipe_two.InitState();
9138 pipe_two.CreateGraphicsPipeline();
9139
9140 auto vkCmdBeginTransformFeedbackEXT =
9141 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9142 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9143 auto vkCmdEndTransformFeedbackEXT =
9144 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9145 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9146
9147 m_commandBuffer->begin();
9148 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9149 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9151 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9152 m_errorMonitor->VerifyFound();
9153 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9154 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009155}
9156
9157TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9158 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9159
9160 ASSERT_NO_FATAL_FAILURE(Init());
9161
9162 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9163 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009164 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
sjfricke3a10ae82022-08-02 18:48:57 +09009165 GTEST_SKIP() << "Failed to load device profile layer.";
ziga-lunargdeeb8252021-08-30 16:48:46 +02009166 }
9167
9168 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9169
9170 // Set format features from being found
9171 VkFormatProperties formatProps;
9172 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9173 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9174 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9175 return;
9176 }
9177 // Gets pass pipeline creation but not the actual tiling used
9178 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9179 // will be caught at draw time that feature for optimal image is not set
9180 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9181 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9182 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9183
9184 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9185
9186 CreatePipelineHelper pipe(*this);
9187 pipe.InitInfo();
9188 pipe.InitState();
aitor-lunargf15acd52022-03-09 22:13:25 +01009189 pipe.cb_attachments_[0].blendEnable = VK_TRUE;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009190 pipe.CreateGraphicsPipeline();
9191
9192 m_commandBuffer->begin();
9193 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9194 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9195
9196 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9197 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9198 m_errorMonitor->VerifyFound();
9199
9200 m_commandBuffer->EndRenderPass();
9201 m_commandBuffer->end();
9202}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009203
9204TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9205 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9206
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009207 AddRequiredExtensions(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009208 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009209 if (!AreRequiredExtensionsEnabled()) {
9210 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg88c0e392021-09-03 19:14:13 +02009211 }
ziga-lunarg88c0e392021-09-03 19:14:13 +02009212 ASSERT_NO_FATAL_FAILURE(InitState());
9213
9214 VkAttachmentDescription attach[] = {
9215 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9216 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9217 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9218 };
9219 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9220 VkSubpassDescription subpasses[] = {
9221 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9222 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9223 };
9224
9225 VkSubpassDependency dep = {0,
9226 1,
9227 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9228 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9229 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9230 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9231 VK_DEPENDENCY_BY_REGION_BIT};
9232
9233 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9234 rpci.attachmentCount = 1;
9235 rpci.pAttachments = attach;
9236 rpci.subpassCount = 2;
9237 rpci.pSubpasses = subpasses;
9238 rpci.dependencyCount = 1;
9239 rpci.pDependencies = &dep;
9240
9241 vk_testing::RenderPass render_pass;
9242 render_pass.init(*m_device, rpci);
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009243 ASSERT_TRUE(render_pass.initialized());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009244
9245 VkImageObj image(m_device);
9246 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9247 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9248
9249 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9250 fbci.renderPass = render_pass.handle();
9251 fbci.attachmentCount = 1;
9252 fbci.pAttachments = &imageView;
9253 fbci.width = 32;
9254 fbci.height = 32;
9255 fbci.layers = 1;
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009256 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9257 ASSERT_TRUE(framebuffer.initialized());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009258
9259 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9260 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9261 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9262 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9263
9264 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9265 buffer_create_info.size = 32;
9266 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9267 VkBufferObj buffer;
9268 buffer.init(*m_device, buffer_create_info);
9269
9270 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9271 conditional_rendering_begin.buffer = buffer.handle();
9272
9273 VkClearValue clear_value;
9274 clear_value.color = m_clear_color;
9275
9276 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9277 rpbi.renderPass = render_pass.handle();
Nathaniel Cesario079b1b92022-07-06 15:56:26 -06009278 rpbi.framebuffer = framebuffer.handle();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009279 rpbi.renderArea = {{0, 0}, {32, 32}};
9280 rpbi.clearValueCount = 1;
9281 rpbi.pClearValues = &clear_value;
9282
9283 m_commandBuffer->begin();
9284
9285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9286 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9287 m_errorMonitor->VerifyFound();
9288
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009289 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9290 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009291 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009292 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009293 m_errorMonitor->VerifyFound();
ziga-lunarg88c0e392021-09-03 19:14:13 +02009294 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9295 vk::CmdEndRenderPass(m_commandBuffer->handle());
9296 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009297
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009298 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9299 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9300 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
ziga-lunarg88c0e392021-09-03 19:14:13 +02009301 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
ziga-lunarg88c0e392021-09-03 19:14:13 +02009302 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009303 m_errorMonitor->VerifyFound();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009304 vk::CmdEndRenderPass(m_commandBuffer->handle());
ziga-lunarg88c0e392021-09-03 19:14:13 +02009305}
ziga-lunarg58255142021-09-12 13:25:17 +02009306
9307TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9308 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9309
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009310 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9311 AddRequiredExtensions(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
ziga-lunarg58255142021-09-12 13:25:17 +02009312 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009313 if (!AreRequiredExtensionsEnabled()) {
9314 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009315 }
ziga-lunarg58255142021-09-12 13:25:17 +02009316
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009317 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
9318 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(&mv_features);
9319 auto pd_features = GetPhysicalDeviceFeatures2(tf_features);
ziga-lunarg58255142021-09-12 13:25:17 +02009320
9321 if (!tf_features.transformFeedback) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009322 GTEST_SKIP() << "transformFeedback not supported; skipped.";
9323 }
9324 if (!mv_features.multiview) {
9325 GTEST_SKIP() << "multiview not supported.";
ziga-lunarg58255142021-09-12 13:25:17 +02009326 }
9327
9328 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9330
9331 VkAttachmentDescription attachmentDescription = {};
9332 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9333 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009334 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
ziga-lunarg58255142021-09-12 13:25:17 +02009335 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9336
9337 VkAttachmentReference colorAttachmentReference = {};
9338 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9339 colorAttachmentReference.attachment = 0;
9340
9341 VkSubpassDescription subpassDescription = {};
9342 subpassDescription.colorAttachmentCount = 1;
9343 subpassDescription.pColorAttachments = &colorAttachmentReference;
9344
9345 uint32_t viewMask = 0x1u;
9346 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9347 renderPassMultiviewCreateInfo.subpassCount = 1;
9348 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9349
9350 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9351 renderPassCreateInfo.attachmentCount = 1;
9352 renderPassCreateInfo.pAttachments = &attachmentDescription;
9353 renderPassCreateInfo.subpassCount = 1;
9354 renderPassCreateInfo.pSubpasses = &subpassDescription;
9355
9356 vk_testing::RenderPass render_pass;
9357 render_pass.init(*m_device, renderPassCreateInfo);
9358
9359 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9360 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9361 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9362 image_create_info.extent.width = 32;
9363 image_create_info.extent.height = 32;
9364 image_create_info.extent.depth = 1;
9365 image_create_info.mipLevels = 1;
9366 image_create_info.arrayLayers = 4;
9367 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9368 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9369 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9370 image_create_info.flags = 0;
9371
9372 VkImageObj image(m_device);
9373 image.Init(image_create_info);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009374 auto image_view_ci = image.TargetViewCI(VK_FORMAT_R8G8B8A8_UNORM);
9375 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
9376 VkImageView imageView = image.targetView(image_view_ci);
ziga-lunarg58255142021-09-12 13:25:17 +02009377
9378 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9379 framebufferCreateInfo.width = 32;
9380 framebufferCreateInfo.height = 32;
9381 framebufferCreateInfo.layers = 1;
9382 framebufferCreateInfo.renderPass = render_pass.handle();
9383 framebufferCreateInfo.attachmentCount = 1;
9384 framebufferCreateInfo.pAttachments = &imageView;
9385
9386 vk_testing::Framebuffer framebuffer;
9387 framebuffer.init(*m_device, framebufferCreateInfo);
9388
9389 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9390 render_pass_begin_info.renderPass = render_pass.handle();
9391 render_pass_begin_info.framebuffer = framebuffer.handle();
9392 render_pass_begin_info.renderArea.extent.width = 32;
9393 render_pass_begin_info.renderArea.extent.height = 32;
9394
9395 auto vkCmdBeginTransformFeedbackEXT =
9396 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9397 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9398
9399 m_commandBuffer->begin();
9400 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9401
9402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9403 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9404 m_errorMonitor->VerifyFound();
9405
9406 m_commandBuffer->EndRenderPass();
9407 m_commandBuffer->end();
9408}
stusmithd2f36832021-11-26 11:44:11 +00009409
9410TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9411 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9412
9413 SetTargetApiVersion(VK_API_VERSION_1_1);
9414
stusmithab8e2a22021-12-17 11:20:03 +00009415 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9416
stusmithd2f36832021-11-26 11:44:11 +00009417 ASSERT_NO_FATAL_FAILURE(InitFramework());
9418
sjfricked700bc02022-05-30 16:35:06 +09009419 if (!AreRequiredExtensionsEnabled()) {
9420 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009421 }
9422
9423 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009424 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009425 }
9426
9427 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09009428 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +00009429 if (!dynamic_rendering_features.dynamicRendering) {
9430 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9431 return;
9432 }
9433
9434 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9435
sfricke-samsung1c61f192021-12-31 01:53:03 -06009436 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009437 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9438
sfricke-samsung1c61f192021-12-31 01:53:03 -06009439 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009440 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
ziga-lunargaa97cbb2022-03-18 19:06:35 +01009441 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009442 begin_rendering_info.colorAttachmentCount = 1;
9443 begin_rendering_info.pColorAttachments = &color_attachment;
9444
9445 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9446
9447 secondary.begin();
9448
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009450 secondary.BeginRendering(begin_rendering_info);
9451 m_errorMonitor->VerifyFound();
9452
9453 secondary.end();
9454}
9455
9456TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9457 TEST_DESCRIPTION(
9458 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9459 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9460
9461 ASSERT_NO_FATAL_FAILURE(Init());
9462 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9463
9464 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9465
9466 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9467 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9468 nullptr, // pNext
9469 m_renderPass,
9470 0, // subpass
9471 m_framebuffer,
9472 };
9473
9474 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9475 nullptr, // pNext
9476 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9477 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9478 secondary.begin(&cmdbuff__bi);
9479 secondary.end();
9480
9481 m_commandBuffer->begin();
9482
9483 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9484 nullptr, // pNext
9485 m_renderPass,
9486 m_framebuffer,
9487 {{0, 0}, {32, 32}},
9488 static_cast<uint32_t>(m_renderPassClearValues.size()),
9489 m_renderPassClearValues.data()};
9490
9491 m_commandBuffer->BeginRenderPass(rp_bi);
9492
9493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009494 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-00095");
stusmithd2f36832021-11-26 11:44:11 +00009495 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9496 m_errorMonitor->VerifyFound();
9497
9498 m_commandBuffer->EndRenderPass();
9499 m_commandBuffer->end();
9500}
9501
9502TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9503 TEST_DESCRIPTION(
9504 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9505 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9506
9507 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009508
stusmithab8e2a22021-12-17 11:20:03 +00009509 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9510
stusmithd2f36832021-11-26 11:44:11 +00009511 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009512
sjfricked700bc02022-05-30 16:35:06 +09009513 if (!AreRequiredExtensionsEnabled()) {
9514 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009515 }
stusmithab8e2a22021-12-17 11:20:03 +00009516
9517 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009518 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009519 }
9520
stusmithd2f36832021-11-26 11:44:11 +00009521 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09009522 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +00009523 if (!dynamic_rendering_features.dynamicRendering) {
9524 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9525 return;
9526 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009527
stusmithd2f36832021-11-26 11:44:11 +00009528 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9529
9530 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009531
9532 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009533 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9534
sfricke-samsung1c61f192021-12-31 01:53:03 -06009535 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9536 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009537 inheritance_rendering_info.colorAttachmentCount = 1;
9538 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009539 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009540
sfricke-samsung1c61f192021-12-31 01:53:03 -06009541 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009542 begin_rendering_info.colorAttachmentCount = 1;
9543 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009544 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009545
9546 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9547
9548 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9549 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9550 &inheritance_rendering_info, // pNext
9551 VK_NULL_HANDLE,
9552 0, // subpass
9553 VK_NULL_HANDLE,
9554 };
9555
9556 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9557 nullptr, // pNext
9558 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9559 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9560 secondary.begin(&cmdbuff__bi);
9561 secondary.end();
9562
9563 m_commandBuffer->begin();
9564
9565 m_commandBuffer->BeginRendering(begin_rendering_info);
9566
9567 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9568 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9569 m_errorMonitor->VerifyFound();
9570
9571 m_commandBuffer->EndRendering();
9572 m_commandBuffer->end();
9573}
9574
9575TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9576 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9577
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009578 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithd2f36832021-11-26 11:44:11 +00009579 ASSERT_NO_FATAL_FAILURE(InitState());
9580
9581 // A renderpass with two subpasses, both writing the same attachment.
9582 VkAttachmentDescription attach[] = {
9583 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9584 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9585 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9586 };
9587 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9588 VkSubpassDescription subpasses[] = {
9589 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9590 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9591 };
9592
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009593 VkSubpassDependency dependencies = {
9594 0, // srcSubpass
9595 1, // dstSubpass
9596 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // srcStageMask
9597 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // dstStageMask
9598 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
9599 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
9600 0, // dependencyFlags
9601 };
9602
9603 auto rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9604 rpci.attachmentCount = 1;
9605 rpci.pAttachments = attach;
9606 rpci.subpassCount = 2;
9607 rpci.pSubpasses = subpasses;
9608 rpci.dependencyCount = 1;
9609 rpci.pDependencies = &dependencies;
9610 vk_testing::RenderPass render_pass(*m_device, rpci);
9611 ASSERT_TRUE(render_pass.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009612
9613 VkImageObj image(m_device);
9614 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9615 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9616
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009617 VkFramebufferCreateInfo fbci = {
9618 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass.handle(), 1, &imageView, 32, 32, 1};
9619 vk_testing::Framebuffer framebuffer(*m_device, fbci);
9620 ASSERT_TRUE(framebuffer.initialized());
stusmithd2f36832021-11-26 11:44:11 +00009621
9622 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9623
9624 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9625 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9626 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009627 render_pass.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009628 1, // subpass
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009629 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009630 };
9631
9632 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9633 nullptr, // pNext
9634 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9635 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9636 secondary.begin(&cmdbuff__bi);
9637 secondary.end();
9638
9639 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9640 nullptr, // pNext
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009641 render_pass.handle(),
9642 framebuffer.handle(),
stusmithd2f36832021-11-26 11:44:11 +00009643 {{0, 0}, {32, 32}},
9644 0,
9645 nullptr};
9646
9647 m_commandBuffer->begin();
9648 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9649
9650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00097");
stusmithd2f36832021-11-26 11:44:11 +00009652 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9653 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +00009654}
9655
9656TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9657 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9658
9659 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9660 ASSERT_NO_FATAL_FAILURE(InitState());
9661
9662 // A renderpass with two subpasses, both writing the same attachment.
9663 VkAttachmentDescription attach[] = {
9664 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9665 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9666 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9667 };
9668 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9669 VkSubpassDescription subpasses[] = {
9670 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9671 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9672 };
9673
9674 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9675 VkRenderPass render_pass_1;
9676 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9677 ASSERT_VK_SUCCESS(err);
9678
9679 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9680 VkRenderPass render_pass_2;
9681 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9682 ASSERT_VK_SUCCESS(err);
9683
9684 VkImageObj image(m_device);
9685 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9686 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9687
9688 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9689 VkFramebuffer framebuffer;
9690 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9691 ASSERT_VK_SUCCESS(err);
9692
9693 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9694
9695 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9696 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9697 nullptr, // pNext
9698 render_pass_2,
9699 0, // subpass
9700 VK_NULL_HANDLE,
9701 };
9702
9703 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9704 nullptr, // pNext
9705 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9706 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9707 secondary.begin(&cmdbuff__bi);
9708 secondary.end();
9709
9710 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9711 nullptr, // pNext
9712 render_pass_1,
9713 framebuffer,
9714 {{0, 0}, {32, 32}},
9715 0,
9716 nullptr};
9717
9718 m_commandBuffer->begin();
9719 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9720
9721 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
stusmithd2f36832021-11-26 11:44:11 +00009723 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9724 m_errorMonitor->VerifyFound();
9725
9726 m_commandBuffer->EndRenderPass();
9727 m_commandBuffer->end();
9728
9729 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9730 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
9731 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
9732}
9733
9734TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
9735 TEST_DESCRIPTION(
9736 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9737 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
9738
9739 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009740
stusmithab8e2a22021-12-17 11:20:03 +00009741 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9742
stusmithd2f36832021-11-26 11:44:11 +00009743 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009744
sjfricked700bc02022-05-30 16:35:06 +09009745 if (!AreRequiredExtensionsEnabled()) {
9746 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009747 }
stusmithab8e2a22021-12-17 11:20:03 +00009748
9749 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009750 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009751 }
9752
stusmithd2f36832021-11-26 11:44:11 +00009753 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09009754 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +00009755 if (!dynamic_rendering_features.dynamicRendering) {
9756 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9757 return;
9758 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009759
stusmithd2f36832021-11-26 11:44:11 +00009760 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9761
9762 VkAttachmentDescription attach[] = {
9763 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9764 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9765 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9766 };
9767 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9768 VkSubpassDescription subpasses[] = {
9769 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9770 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9771 };
9772
9773 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9774 VkRenderPass render_pass;
9775 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9776 ASSERT_VK_SUCCESS(err);
9777
9778 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009779
9780 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009781 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9782
sfricke-samsung1c61f192021-12-31 01:53:03 -06009783 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9784 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009785 inheritance_rendering_info.colorAttachmentCount = 1;
9786 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009787 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009788
sfricke-samsung1c61f192021-12-31 01:53:03 -06009789 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009790 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9791 begin_rendering_info.colorAttachmentCount = 1;
9792 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009793 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009794
9795 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9796
9797 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9798 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9799 &inheritance_rendering_info, // pNext
9800 render_pass,
9801 0, // subpass
9802 VK_NULL_HANDLE,
9803 };
9804
9805 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9806 nullptr, // pNext
9807 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9808 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9809 secondary.begin(&cmdbuff__bi);
9810 secondary.end();
9811
9812 m_commandBuffer->begin();
9813
9814 m_commandBuffer->BeginRendering(begin_rendering_info);
9815
9816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
9817 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9818 m_errorMonitor->VerifyFound();
9819
9820 m_commandBuffer->EndRendering();
9821 m_commandBuffer->end();
9822
9823 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9824}
9825
9826TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
9827 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
9828
9829 SetTargetApiVersion(VK_API_VERSION_1_1);
9830
stusmithab8e2a22021-12-17 11:20:03 +00009831 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9832
stusmithd2f36832021-11-26 11:44:11 +00009833 ASSERT_NO_FATAL_FAILURE(InitFramework());
9834
sjfricked700bc02022-05-30 16:35:06 +09009835 if (!AreRequiredExtensionsEnabled()) {
9836 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009837 }
9838
9839 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009840 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009841 }
9842
9843 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09009844 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +00009845 if (!dynamic_rendering_features.dynamicRendering) {
9846 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9847 return;
9848 }
9849
9850 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9851
9852 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
9853
sfricke-samsung1c61f192021-12-31 01:53:03 -06009854 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009855 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9856
sfricke-samsung1c61f192021-12-31 01:53:03 -06009857 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9858 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009859 inheritance_rendering_info.colorAttachmentCount = 1;
9860 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009861 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009862
sfricke-samsung1c61f192021-12-31 01:53:03 -06009863 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009864 begin_rendering_info.flags =
9865 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
9866 begin_rendering_info.colorAttachmentCount = 1;
9867 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009868 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009869
9870 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9871
9872 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9873 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9874 &inheritance_rendering_info, // pNext
9875 VK_NULL_HANDLE,
9876 0, // subpass
9877 VK_NULL_HANDLE,
9878 };
9879
9880 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9881 nullptr, // pNext
9882 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9883 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9884 secondary.begin(&cmdbuff__bi);
9885 secondary.end();
9886
9887 m_commandBuffer->begin();
9888
9889 m_commandBuffer->BeginRendering(begin_rendering_info);
9890
9891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
9892 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9893 m_errorMonitor->VerifyFound();
9894
9895 m_commandBuffer->EndRendering();
9896 m_commandBuffer->end();
9897}
9898
9899TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
9900 TEST_DESCRIPTION(
9901 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
9902
9903 SetTargetApiVersion(VK_API_VERSION_1_1);
9904
stusmithab8e2a22021-12-17 11:20:03 +00009905 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9906
stusmithd2f36832021-11-26 11:44:11 +00009907 ASSERT_NO_FATAL_FAILURE(InitFramework());
9908
sjfricked700bc02022-05-30 16:35:06 +09009909 if (!AreRequiredExtensionsEnabled()) {
9910 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009911 }
9912
9913 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009914 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009915 }
9916
9917 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09009918 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +00009919 if (!dynamic_rendering_features.dynamicRendering) {
9920 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9921 return;
9922 }
9923
9924 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9925
9926 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
9927
sfricke-samsung1c61f192021-12-31 01:53:03 -06009928 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009929 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9930
sfricke-samsung1c61f192021-12-31 01:53:03 -06009931 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9932 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009933 inheritance_rendering_info.colorAttachmentCount = 0;
9934 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009935 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009936
sfricke-samsung1c61f192021-12-31 01:53:03 -06009937 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009938 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9939 begin_rendering_info.colorAttachmentCount = 1;
9940 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -06009941 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009942
9943 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9944
9945 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9946 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9947 &inheritance_rendering_info, // pNext
9948 VK_NULL_HANDLE,
9949 0, // subpass
9950 VK_NULL_HANDLE,
9951 };
9952
9953 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9954 nullptr, // pNext
9955 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9956 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9957 secondary.begin(&cmdbuff__bi);
9958 secondary.end();
9959
9960 m_commandBuffer->begin();
9961
9962 m_commandBuffer->BeginRendering(begin_rendering_info);
9963
9964 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
9965 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9966 m_errorMonitor->VerifyFound();
9967
9968 m_commandBuffer->EndRendering();
9969 m_commandBuffer->end();
9970}
9971
9972TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
9973 TEST_DESCRIPTION(
9974 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
9975
9976 SetTargetApiVersion(VK_API_VERSION_1_1);
9977
stusmithab8e2a22021-12-17 11:20:03 +00009978 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9979
stusmithd2f36832021-11-26 11:44:11 +00009980 ASSERT_NO_FATAL_FAILURE(InitFramework());
9981
sjfricked700bc02022-05-30 16:35:06 +09009982 if (!AreRequiredExtensionsEnabled()) {
9983 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009984 }
9985
9986 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009987 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009988 }
9989
9990 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +09009991 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +00009992 if (!dynamic_rendering_features.dynamicRendering) {
9993 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9994 return;
9995 }
9996
9997 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9998
9999 VkImageObj image(m_device);
10000 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10001 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10002
sfricke-samsung1c61f192021-12-31 01:53:03 -060010003 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010004 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10005 color_attachment.imageView = imageView;
10006
10007 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10008
sfricke-samsung1c61f192021-12-31 01:53:03 -060010009 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10010 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010011 inheritance_rendering_info.colorAttachmentCount = 1;
10012 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010013 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010014
sfricke-samsung1c61f192021-12-31 01:53:03 -060010015 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010016 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10017 begin_rendering_info.colorAttachmentCount = 1;
10018 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010019 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010020
10021 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10022
10023 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10024 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10025 &inheritance_rendering_info, // pNext
10026 VK_NULL_HANDLE,
10027 0, // subpass
10028 VK_NULL_HANDLE,
10029 };
10030
10031 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10032 nullptr, // pNext
10033 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10034 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10035 secondary.begin(&cmdbuff__bi);
10036 secondary.end();
10037
10038 m_commandBuffer->begin();
10039
10040 m_commandBuffer->BeginRendering(begin_rendering_info);
10041
10042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10043 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10044 m_errorMonitor->VerifyFound();
10045
10046 m_commandBuffer->EndRendering();
10047 m_commandBuffer->end();
10048}
10049
10050TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10051 TEST_DESCRIPTION(
10052 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10053 "format");
10054
10055 SetTargetApiVersion(VK_API_VERSION_1_1);
10056
stusmithab8e2a22021-12-17 11:20:03 +000010057 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10058
stusmithd2f36832021-11-26 11:44:11 +000010059 ASSERT_NO_FATAL_FAILURE(InitFramework());
10060
sjfricked700bc02022-05-30 16:35:06 +090010061 if (!AreRequiredExtensionsEnabled()) {
10062 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010063 }
10064
10065 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010066 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010067 }
10068
10069 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +090010070 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +000010071 if (!dynamic_rendering_features.dynamicRendering) {
10072 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10073 return;
10074 }
10075
10076 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10077
10078 VkImageObj image(m_device);
10079 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10080 if (!depth_stencil_format) {
10081 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10082 return;
10083 }
10084 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10085 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10086
sfricke-samsung1c61f192021-12-31 01:53:03 -060010087 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010088 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10089 depth_stencil_attachment.imageView = imageView;
10090
sfricke-samsung1c61f192021-12-31 01:53:03 -060010091 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10092 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010093 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
10094 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010095 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010096
sfricke-samsung1c61f192021-12-31 01:53:03 -060010097 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010098 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10099 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10100 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010101 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +000010102
10103 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10104
10105 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10106 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10107 &inheritance_rendering_info, // pNext
10108 VK_NULL_HANDLE,
10109 0, // subpass
10110 VK_NULL_HANDLE,
10111 };
10112
10113 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10114 nullptr, // pNext
10115 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10116 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10117 secondary.begin(&cmdbuff__bi);
10118 secondary.end();
10119
10120 m_commandBuffer->begin();
10121
10122 m_commandBuffer->BeginRendering(begin_rendering_info);
10123
10124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10126 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10127 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010128}
10129
10130TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10131 TEST_DESCRIPTION(
10132 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10133
10134 SetTargetApiVersion(VK_API_VERSION_1_1);
10135
stusmithab8e2a22021-12-17 11:20:03 +000010136 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10137
stusmithd2f36832021-11-26 11:44:11 +000010138 ASSERT_NO_FATAL_FAILURE(InitFramework());
10139
sjfricked700bc02022-05-30 16:35:06 +090010140 if (!AreRequiredExtensionsEnabled()) {
10141 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010142 }
10143
10144 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010145 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010146 }
10147
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010148 auto mv_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeaturesKHR>();
10149 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(&mv_features);
10150 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithd2f36832021-11-26 11:44:11 +000010151 if (!dynamic_rendering_features.dynamicRendering) {
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010152 GTEST_SKIP() << "Test requires (unsupported) dynamicRendering , skipping.";
10153 }
10154 if (!mv_features.multiview) {
10155 GTEST_SKIP() << "multiview feature not supported.";
stusmithd2f36832021-11-26 11:44:11 +000010156 }
10157
10158 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10159
sfricke-samsung1c61f192021-12-31 01:53:03 -060010160 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010161 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10162
10163 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10164
sfricke-samsung1c61f192021-12-31 01:53:03 -060010165 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10166 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010167 inheritance_rendering_info.viewMask = 0;
10168 inheritance_rendering_info.colorAttachmentCount = 1;
10169 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010170 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010171
sfricke-samsung1c61f192021-12-31 01:53:03 -060010172 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010173 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10174 begin_rendering_info.viewMask = 1;
10175 begin_rendering_info.colorAttachmentCount = 1;
10176 begin_rendering_info.pColorAttachments = &color_attachment;
10177
10178 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10179
10180 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10181 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10182 &inheritance_rendering_info, // pNext
10183 VK_NULL_HANDLE,
10184 0, // subpass
10185 VK_NULL_HANDLE,
10186 };
10187
10188 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10189 nullptr, // pNext
10190 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10191 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10192 secondary.begin(&cmdbuff__bi);
10193 secondary.end();
10194
10195 m_commandBuffer->begin();
10196
10197 m_commandBuffer->BeginRendering(begin_rendering_info);
10198
10199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10200 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10201 m_errorMonitor->VerifyFound();
stusmithd2f36832021-11-26 11:44:11 +000010202}
stusmithcba0c502021-12-21 17:16:28 +000010203
10204TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10205 TEST_DESCRIPTION(
10206 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10207
10208 SetTargetApiVersion(VK_API_VERSION_1_1);
10209
10210 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10211
10212 ASSERT_NO_FATAL_FAILURE(InitFramework());
10213
sjfricked700bc02022-05-30 16:35:06 +090010214 if (!AreRequiredExtensionsEnabled()) {
10215 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010216 }
10217
10218 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010219 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010220 }
10221
10222 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +090010223 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithcba0c502021-12-21 17:16:28 +000010224 if (!dynamic_rendering_features.dynamicRendering) {
10225 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10226 return;
10227 }
10228
10229 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10230
10231 VkImageObj image(m_device);
10232 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10233 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10234
sfricke-samsung1c61f192021-12-31 01:53:03 -060010235 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010236 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10237 color_attachment.imageView = imageView;
10238
10239 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10240
sfricke-samsung1c61f192021-12-31 01:53:03 -060010241 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10242 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010243 inheritance_rendering_info.colorAttachmentCount = 1;
10244 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10245 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10246
sfricke-samsung1c61f192021-12-31 01:53:03 -060010247 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010248 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10249 begin_rendering_info.colorAttachmentCount = 1;
10250 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010251 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010252
10253 // A pool we can reset in.
10254 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10255 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10256
10257 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10258 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10259 &inheritance_rendering_info, // pNext
10260 VK_NULL_HANDLE,
10261 0, // subpass
10262 VK_NULL_HANDLE,
10263 };
10264
10265 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10266 nullptr, // pNext
10267 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10268 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10269 secondary.begin(&cmdbuff__bi);
10270 secondary.end();
10271
10272 m_commandBuffer->begin();
10273
10274 // color samples mismatch
10275 m_commandBuffer->BeginRendering(begin_rendering_info);
10276 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10277 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10278 m_errorMonitor->VerifyFound();
10279 m_commandBuffer->EndRendering();
10280
10281 VkImageObj depthStencilImage(m_device);
10282 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10283 if (!depth_stencil_format) {
10284 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10285 return;
10286 }
10287 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10288 0);
10289 VkImageView depthStencilImageView =
10290 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10291
sfricke-samsung1c61f192021-12-31 01:53:03 -060010292 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010293 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10294 depth_stencil_attachment.imageView = depthStencilImageView;
10295
10296 begin_rendering_info.colorAttachmentCount = 0;
10297 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10298 inheritance_rendering_info.colorAttachmentCount = 0;
10299 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10300
10301 secondary.begin(&cmdbuff__bi);
10302 secondary.end();
10303
10304 // depth samples mismatch
10305 m_commandBuffer->BeginRendering(begin_rendering_info);
10306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10307 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10308 m_errorMonitor->VerifyFound();
10309 m_commandBuffer->EndRendering();
10310
10311 begin_rendering_info.pDepthAttachment = nullptr;
10312 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10313 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10314 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10315
10316 secondary.begin(&cmdbuff__bi);
10317 secondary.end();
10318
10319 // stencil samples mismatch
10320 m_commandBuffer->BeginRendering(begin_rendering_info);
10321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10322 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10323 m_errorMonitor->VerifyFound();
10324 m_commandBuffer->EndRendering();
10325
10326 m_commandBuffer->end();
10327}
10328
10329TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10330 TEST_DESCRIPTION(
10331 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10332 "attachment samples");
10333
10334 SetTargetApiVersion(VK_API_VERSION_1_1);
10335
10336 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10337
10338 ASSERT_NO_FATAL_FAILURE(InitFramework());
10339
sjfricked700bc02022-05-30 16:35:06 +090010340 if (!AreRequiredExtensionsEnabled()) {
10341 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010342 }
10343
10344 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010345 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010346 }
10347
10348 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +090010349 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
stusmithcba0c502021-12-21 17:16:28 +000010350 if (!dynamic_rendering_features.dynamicRendering) {
10351 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10352 return;
10353 }
10354
10355 bool amd_samples = false;
10356 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10357 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10358 amd_samples = true;
10359 }
10360
10361 bool nv_samples = false;
10362 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10363 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10364 nv_samples = true;
10365 }
10366
10367 if (!amd_samples && !nv_samples) {
10368 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10369 kSkipPrefix);
10370 return;
10371 }
10372
10373 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10374
10375 VkImageObj image(m_device);
10376 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10377 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10378
sfricke-samsung1c61f192021-12-31 01:53:03 -060010379 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010380 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10381 color_attachment.imageView = imageView;
10382
10383 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10384
10385 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10386 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10387 samples_info.colorAttachmentCount = 1;
10388 samples_info.pColorAttachmentSamples = &counts;
10389
10390 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010391 inheritance_rendering_info.colorAttachmentCount = 1;
10392 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10393 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10394
sfricke-samsung1c61f192021-12-31 01:53:03 -060010395 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010396 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10397 begin_rendering_info.colorAttachmentCount = 1;
10398 begin_rendering_info.pColorAttachments = &color_attachment;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010399 begin_rendering_info.layerCount = 1;
stusmithcba0c502021-12-21 17:16:28 +000010400
10401 // A pool we can reset in.
10402 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10403 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10404
10405 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10406 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10407 &inheritance_rendering_info, // pNext
10408 VK_NULL_HANDLE,
10409 0, // subpass
10410 VK_NULL_HANDLE,
10411 };
10412
10413 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10414 nullptr, // pNext
10415 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10416 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10417 secondary.begin(&cmdbuff__bi);
10418 secondary.end();
10419
10420 m_commandBuffer->begin();
10421
10422 // color samples mismatch
10423 m_commandBuffer->BeginRendering(begin_rendering_info);
10424 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10425 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10426 m_errorMonitor->VerifyFound();
10427 m_commandBuffer->EndRendering();
10428
10429 VkImageObj depthStencilImage(m_device);
10430 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10431 if (!depth_stencil_format) {
10432 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10433 return;
10434 }
10435 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10436 0);
10437 VkImageView depthStencilImageView =
10438 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10439
sfricke-samsung1c61f192021-12-31 01:53:03 -060010440 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010441 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10442 depth_stencil_attachment.imageView = depthStencilImageView;
10443
10444 samples_info.colorAttachmentCount = 0;
10445 samples_info.pColorAttachmentSamples = nullptr;
10446 begin_rendering_info.colorAttachmentCount = 0;
10447 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10448 inheritance_rendering_info.colorAttachmentCount = 0;
10449 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10450 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10451
10452 secondary.begin(&cmdbuff__bi);
10453 secondary.end();
10454
10455 // depth samples mismatch
10456 m_commandBuffer->BeginRendering(begin_rendering_info);
10457 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10458 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10459 m_errorMonitor->VerifyFound();
10460 m_commandBuffer->EndRendering();
10461
10462 begin_rendering_info.pDepthAttachment = nullptr;
10463 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10464 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10465 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10466
10467 secondary.begin(&cmdbuff__bi);
10468 secondary.end();
10469
10470 // stencil samples mismatch
10471 m_commandBuffer->BeginRendering(begin_rendering_info);
10472 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10473 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10474 m_errorMonitor->VerifyFound();
10475 m_commandBuffer->EndRendering();
10476
10477 m_commandBuffer->end();
10478}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010479
10480TEST_F(VkLayerTest, CopyCommands2V13) {
10481 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10482
10483 SetTargetApiVersion(VK_API_VERSION_1_3);
10484 ASSERT_NO_FATAL_FAILURE(Init());
10485 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010486 GTEST_SKIP() << "At least Vulkan version 1.3 is required";
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010487 }
10488 VkImageObj image(m_device);
10489 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 +020010490 VkImageObj image2(m_device);
10491 image2.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10492 VK_IMAGE_TILING_OPTIMAL, 0);
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010493 ASSERT_TRUE(image.initialized());
10494 VkBufferObj dst_buffer;
10495 VkMemoryPropertyFlags reqs = 0;
10496 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10497 VkBufferObj src_buffer;
10498 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10499 auto copy_region = LvlInitStruct<VkImageCopy2>();
10500 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10501 copy_region.srcSubresource.layerCount = 1;
10502 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10503 copy_region.dstSubresource.layerCount = 1;
10504 copy_region.dstOffset = {4, 4, 0};
10505 copy_region.extent.width = 1;
10506 copy_region.extent.height = 1;
10507 copy_region.extent.depth = 1;
10508 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10509 copy_image_info.srcImage = image.handle();
10510 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10511 copy_image_info.dstImage = image.handle();
10512 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10513 copy_image_info.regionCount = 1;
10514 copy_image_info.pRegions = &copy_region;
10515 m_commandBuffer->begin();
10516 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10517 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10518 m_errorMonitor->VerifyFound();
10519 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
ziga-lunarg852187f2022-03-16 21:21:33 +010010520 copy_buffer.dstOffset = 4;
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010521 copy_buffer.size = 4;
10522 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10523 copy_buffer_info.srcBuffer = dst_buffer.handle();
10524 copy_buffer_info.dstBuffer = dst_buffer.handle();
10525 copy_buffer_info.regionCount = 1;
10526 copy_buffer_info.pRegions = &copy_buffer;
10527 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10528 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10529 m_errorMonitor->VerifyFound();
10530 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10531 bic_region.bufferRowLength = 128;
10532 bic_region.bufferImageHeight = 128;
10533 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10534 bic_region.imageSubresource.layerCount = 1;
10535 bic_region.imageExtent.height = 4;
10536 bic_region.imageExtent.width = 4;
10537 bic_region.imageExtent.depth = 1;
10538 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10539 buffer_image_info.srcBuffer = src_buffer.handle();
10540 buffer_image_info.dstImage = image.handle();
10541 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10542 buffer_image_info.regionCount = 1;
10543 buffer_image_info.pRegions = &bic_region;
10544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10545 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10546 m_errorMonitor->VerifyFound();
10547 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10548 image_buffer_info.dstBuffer = src_buffer.handle();
10549 image_buffer_info.srcImage = image.handle();
10550 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10551 image_buffer_info.regionCount = 1;
10552 image_buffer_info.pRegions = &bic_region;
10553 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10554 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10555 m_errorMonitor->VerifyFound();
10556 auto blit_region = LvlInitStruct<VkImageBlit2>();
10557 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10558 blit_region.srcSubresource.baseArrayLayer = 0;
10559 blit_region.srcSubresource.layerCount = 1;
10560 blit_region.srcSubresource.mipLevel = 0;
10561 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10562 blit_region.dstSubresource.baseArrayLayer = 0;
10563 blit_region.dstSubresource.layerCount = 1;
10564 blit_region.dstSubresource.mipLevel = 0;
10565 blit_region.srcOffsets[0] = {0, 0, 0};
aitor-lunarg3ad811f2022-03-31 22:00:39 +020010566 blit_region.srcOffsets[1] = {31, 31, 1};
10567 blit_region.dstOffsets[0] = {32, 32, 0};
10568 blit_region.dstOffsets[1] = {64, 64, 1};
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010569 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10570 blit_image_info.srcImage = image.handle();
10571 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10572 blit_image_info.dstImage = image.handle();
10573 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10574 blit_image_info.regionCount = 1;
10575 blit_image_info.pRegions = &blit_region;
10576 blit_image_info.filter = VK_FILTER_NEAREST;
10577 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10578 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10579 m_errorMonitor->VerifyFound();
10580 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10581 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10582 resolve_region.srcSubresource.mipLevel = 0;
10583 resolve_region.srcSubresource.baseArrayLayer = 0;
10584 resolve_region.srcSubresource.layerCount = 1;
10585 resolve_region.srcOffset.x = 0;
10586 resolve_region.srcOffset.y = 0;
10587 resolve_region.srcOffset.z = 0;
10588 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10589 resolve_region.dstSubresource.mipLevel = 0;
10590 resolve_region.dstSubresource.baseArrayLayer = 0;
10591 resolve_region.dstSubresource.layerCount = 1;
10592 resolve_region.dstOffset.x = 0;
10593 resolve_region.dstOffset.y = 0;
10594 resolve_region.dstOffset.z = 0;
10595 resolve_region.extent.width = 1;
10596 resolve_region.extent.height = 1;
10597 resolve_region.extent.depth = 1;
10598 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10599 resolve_image_info.srcImage = image.handle();
10600 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
ziga-lunarg0ce51882022-05-18 14:36:48 +020010601 resolve_image_info.dstImage = image2.handle();
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010602 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10603 resolve_image_info.regionCount = 1;
10604 resolve_image_info.pRegions = &resolve_region;
10605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10606 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10607 m_errorMonitor->VerifyFound();
10608}
aitor-lunarga131fca2022-02-17 22:55:55 +010010609
10610TEST_F(VkLayerTest, ValidateMultiviewUnboundResourcesAfterBeginRenderPassAndNextSubpass) {
10611 TEST_DESCRIPTION(
10612 "Validate all required resources are bound if multiview is enabled after vkCmdBeginRenderPass and vkCmdNextSubpass");
10613
Aitor Camacho768bbc92022-06-10 16:57:44 +020010614 constexpr unsigned multiview_count = 2u;
10615 constexpr unsigned extra_subpass_count = multiview_count - 1u;
10616
sjfricked700bc02022-05-30 16:35:06 +090010617 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
aitor-lunarga131fca2022-02-17 22:55:55 +010010618 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +090010619 if (!AreRequiredExtensionsEnabled()) {
10620 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
aitor-lunarga131fca2022-02-17 22:55:55 +010010621 }
10622
10623 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
sjfricke11db0c72022-08-18 13:23:11 +090010624 auto features2 = GetPhysicalDeviceFeatures2(multiview_features);
Aitor Camacho768bbc92022-06-10 16:57:44 +020010625 if (multiview_features.multiview == VK_FALSE) {
10626 GTEST_SKIP() << "Device does not support multiview.";
10627 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010628
Aitor Camacho768bbc92022-06-10 16:57:44 +020010629 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
aitor-lunarga131fca2022-02-17 22:55:55 +010010630
10631 VkAttachmentDescription attachmentDescription = {};
10632 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
10633 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -060010634 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
aitor-lunarga131fca2022-02-17 22:55:55 +010010635 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
10636
10637 VkAttachmentReference colorAttachmentReference = {};
10638 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
10639 colorAttachmentReference.attachment = 0;
10640
Aitor Camacho768bbc92022-06-10 16:57:44 +020010641 m_renderPass_subpasses.resize(multiview_count);
10642 for (unsigned i = 0; i < multiview_count; ++i) {
10643 m_renderPass_subpasses[i].colorAttachmentCount = 1;
10644 m_renderPass_subpasses[i].pColorAttachments = &colorAttachmentReference;
10645 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010646
Aitor Camacho768bbc92022-06-10 16:57:44 +020010647 uint32_t viewMasks[multiview_count] = {};
10648 for (unsigned i = 0; i < multiview_count; ++i) {
10649 viewMasks[i] = 1u << i;
10650 }
10651 auto renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
10652 renderPassMultiviewCreateInfo.subpassCount = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010653 renderPassMultiviewCreateInfo.pViewMasks = viewMasks;
10654
10655 m_renderPass_info = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
10656 m_renderPass_info.attachmentCount = 1;
10657 m_renderPass_info.pAttachments = &attachmentDescription;
10658 m_renderPass_info.subpassCount = m_renderPass_subpasses.size();
10659 m_renderPass_info.pSubpasses = m_renderPass_subpasses.data();
10660
Aitor Camacho768bbc92022-06-10 16:57:44 +020010661 m_renderPass_dependencies.resize(extra_subpass_count);
10662 for (unsigned i = 0; i < m_renderPass_dependencies.size(); ++i) {
10663 auto &subpass_dep = m_renderPass_dependencies[i];
10664 subpass_dep.srcSubpass = i;
10665 subpass_dep.dstSubpass = i + 1;
10666
10667 subpass_dep.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10668 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10669 subpass_dep.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10670 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10671
10672 subpass_dep.srcAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10673 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10674 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10675 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10676 subpass_dep.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10677 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10678 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10679 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10680
10681 subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
10682 }
aitor-lunarga131fca2022-02-17 22:55:55 +010010683
10684 m_renderPass_info.dependencyCount = static_cast<uint32_t>(m_renderPass_dependencies.size());
10685 m_renderPass_info.pDependencies = m_renderPass_dependencies.data();
10686
10687 vk::CreateRenderPass(m_device->handle(), &m_renderPass_info, nullptr, &m_renderPass);
10688
Aitor Camacho768bbc92022-06-10 16:57:44 +020010689 auto image_create_info = LvlInitStruct<VkImageCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010690 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10691 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
10692 image_create_info.extent.width = static_cast<uint32_t>(m_width);
10693 image_create_info.extent.height = static_cast<uint32_t>(m_height);
10694 image_create_info.extent.depth = 1;
10695 image_create_info.mipLevels = 1;
Aitor Camacho768bbc92022-06-10 16:57:44 +020010696 image_create_info.arrayLayers = multiview_count;
aitor-lunarga131fca2022-02-17 22:55:55 +010010697 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10698 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10699 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10700 image_create_info.flags = 0;
10701
10702 VkImageObj image(m_device);
10703 image.Init(image_create_info);
Aitor Camacho768bbc92022-06-10 16:57:44 +020010704 image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
aitor-lunarga131fca2022-02-17 22:55:55 +010010705 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
10706 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
10707
Aitor Camacho768bbc92022-06-10 16:57:44 +020010708 auto framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
aitor-lunarga131fca2022-02-17 22:55:55 +010010709 framebufferCreateInfo.width = static_cast<uint32_t>(m_width);
10710 framebufferCreateInfo.height = static_cast<uint32_t>(m_height);
10711 framebufferCreateInfo.layers = 1;
10712 framebufferCreateInfo.renderPass = m_renderPass;
10713 framebufferCreateInfo.attachmentCount = 1;
10714 framebufferCreateInfo.pAttachments = &imageView;
10715
10716 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &m_framebuffer);
10717
10718 VkClearValue clear{};
10719 clear.color = m_clear_color;
10720 m_renderPassClearValues.emplace_back(clear);
10721 m_renderPassBeginInfo.renderPass = m_renderPass;
10722 m_renderPassBeginInfo.framebuffer = m_framebuffer;
10723 m_renderPassBeginInfo.renderArea.extent.width = static_cast<uint32_t>(m_width);
10724 m_renderPassBeginInfo.renderArea.extent.height = static_cast<uint32_t>(m_height);
10725 m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size();
10726 m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data();
10727
Aitor Camacho768bbc92022-06-10 16:57:44 +020010728 // Pipeline not bound test
10729 {
10730 // No need to create individual pipelines for each subpass since we are checking no bound pipeline
10731 CreatePipelineHelper pipe(*this);
10732 pipe.InitInfo();
10733 pipe.InitState();
10734 pipe.CreateGraphicsPipeline();
aitor-lunarga131fca2022-02-17 22:55:55 +010010735
Aitor Camacho768bbc92022-06-10 16:57:44 +020010736 m_commandBuffer->begin();
10737 // This bind should not be valid after we begin the renderpass
10738 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10739 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
aitor-lunarga131fca2022-02-17 22:55:55 +010010740
Aitor Camacho768bbc92022-06-10 16:57:44 +020010741 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10742 m_commandBuffer->Draw(1, 0, 0, 0);
10743 m_errorMonitor->VerifyFound();
aitor-lunarga131fca2022-02-17 22:55:55 +010010744
Aitor Camacho768bbc92022-06-10 16:57:44 +020010745 for (unsigned i = 0; i < extra_subpass_count; ++i) {
Aitor Camacho768bbc92022-06-10 16:57:44 +020010746 // This bind should not be valid for next subpass
10747 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10748 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
aitor-lunarga131fca2022-02-17 22:55:55 +010010749
Aitor Camacho768bbc92022-06-10 16:57:44 +020010750 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10751 m_commandBuffer->Draw(1, 0, 0, 0);
10752 m_errorMonitor->VerifyFound();
10753 }
10754
Aitor Camacho768bbc92022-06-10 16:57:44 +020010755 m_commandBuffer->EndRenderPass();
10756 m_commandBuffer->end();
10757 }
10758
10759 m_commandBuffer->reset();
10760
Aitor Camacho131d2192022-06-13 19:15:11 +020010761 // Dynamic state (checking with line width)
10762 {
10763 // Pipeline for subpass 0
10764 CreatePipelineHelper pipe(*this);
10765 pipe.InitInfo();
10766
10767 VkDynamicState dyn_states = VK_DYNAMIC_STATE_LINE_WIDTH;
10768 pipe.ia_ci_.topology = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
10769 pipe.dyn_state_ci_ = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
10770 pipe.dyn_state_ci_.dynamicStateCount = 1;
10771 pipe.dyn_state_ci_.pDynamicStates = &dyn_states;
10772 pipe.InitState();
10773 pipe.CreateGraphicsPipeline();
10774
10775 // Pipelines for all other subpasses
10776 vk_testing::Pipeline pipelines[extra_subpass_count];
10777 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10778 auto pipe_info = pipe.gp_ci_;
10779 pipe_info.subpass = i + 1;
10780 pipelines[i].init(*m_device, pipe_info);
10781 }
10782
10783 m_commandBuffer->begin();
10784 // This line width set should not be valid for next subpass
10785 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10786 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10787 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
Aitor Camacho131d2192022-06-13 19:15:11 +020010788
10789 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10790 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
10791 m_errorMonitor->VerifyFound();
10792
10793 for (unsigned i = 0; i < extra_subpass_count; ++i) {
Aitor Camacho131d2192022-06-13 19:15:11 +020010794 // This line width set should not be valid for next subpass
10795 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1.0f);
10796 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10797 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
Aitor Camacho131d2192022-06-13 19:15:11 +020010798
10799 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-commandBuffer-02701");
10800 m_commandBuffer->Draw(1, 0, 0, 0);
10801 m_errorMonitor->VerifyFound();
10802 }
10803
Aitor Camacho131d2192022-06-13 19:15:11 +020010804 m_commandBuffer->EndRenderPass();
10805 m_commandBuffer->end();
10806 }
10807
10808 m_commandBuffer->reset();
10809
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010810 // Push constants
10811 {
10812 char const *const vsSource = R"glsl(
10813 #version 450
10814 layout(push_constant, std430) uniform foo {
10815 mat3 m;
10816 } constants;
10817 void main(){
10818 vec3 v3 = constants.m[0];
10819 }
10820 )glsl";
10821
10822 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
10823 VkShaderObj const fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
10824
10825 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT, 0, 16};
10826 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
10827 pipeline_layout_info.pushConstantRangeCount = 1;
10828 pipeline_layout_info.pPushConstantRanges = &push_constant_range;
10829
10830 vk_testing::PipelineLayout layout;
10831 layout.init(*m_device, pipeline_layout_info, std::vector<const vk_testing::DescriptorSetLayout *>{});
10832
10833 CreatePipelineHelper pipe(*this);
10834 pipe.InitInfo();
10835 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
10836 pipe.pipeline_layout_ci_ = pipeline_layout_info;
10837 pipe.InitState();
10838 pipe.CreateGraphicsPipeline();
10839
10840 // Pipelines for all other subpasses
10841 vk_testing::Pipeline pipelines[extra_subpass_count];
10842 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10843 auto pipe_info = pipe.gp_ci_;
10844 pipe_info.subpass = i + 1;
10845 pipelines[i].init(*m_device, pipe_info);
10846 }
10847 // Set up complete
10848
10849 const float dummy_values[16] = {};
10850 m_commandBuffer->begin();
10851 // This push constants should not be counted when render pass begins
10852 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
10853 push_constant_range.size, dummy_values);
10854 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10855 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010856
10857 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
10858 m_commandBuffer->Draw(1, 0, 0, 0);
10859 m_errorMonitor->VerifyFound();
10860
10861 for (unsigned i = 0; i < extra_subpass_count; ++i) {
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010862 // This push constants should not be counted when we change subpass
10863 vk::CmdPushConstants(m_commandBuffer->handle(), layout.handle(), VK_SHADER_STAGE_VERTEX_BIT, push_constant_range.offset,
10864 push_constant_range.size, dummy_values);
10865 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10866 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010867
10868 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-maintenance4-06425");
10869 m_commandBuffer->Draw(1, 0, 0, 0);
10870 m_errorMonitor->VerifyFound();
10871 }
10872
Aitor Camacho1f04dea2022-06-13 20:40:44 +020010873 m_commandBuffer->EndRenderPass();
10874 m_commandBuffer->end();
10875 }
10876
10877 m_commandBuffer->reset();
10878
Aitor Camacho097a2322022-06-14 14:08:23 +020010879 // Descriptor sets
10880 {
10881 OneOffDescriptorSet descriptor_set{m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}}};
10882
10883 auto bci = LvlInitStruct<VkBufferCreateInfo>();
10884 bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10885 bci.size = 8;
10886 VkBufferObj buffer;
10887 buffer.init(*m_device, bci);
10888 VkDescriptorBufferInfo buffer_info;
10889 buffer_info.buffer = buffer.handle();
10890 buffer_info.offset = 0;
10891 buffer_info.range = VK_WHOLE_SIZE;
10892 auto descriptor_write = LvlInitStruct<VkWriteDescriptorSet>();
10893 descriptor_write.dstSet = descriptor_set.set_;
10894 descriptor_write.dstBinding = 0;
10895 descriptor_write.descriptorCount = 1;
10896 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10897 descriptor_write.pBufferInfo = &buffer_info;
10898 vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10899
10900 auto pipeline_layout_info = LvlInitStruct<VkPipelineLayoutCreateInfo>();
10901 pipeline_layout_info.setLayoutCount = 1;
10902 pipeline_layout_info.pSetLayouts = &descriptor_set.layout_.handle();
10903
10904 vk_testing::PipelineLayout layout;
10905 layout.init(*m_device, pipeline_layout_info, std::vector<vk_testing::DescriptorSetLayout const *>{});
10906
10907 VkShaderObj const vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
10908 VkShaderObj const fs(this, bindStateFragUniformShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
10909
10910 CreatePipelineHelper pipe(*this);
10911 pipe.InitInfo();
10912 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
10913 pipe.pipeline_layout_ci_ = pipeline_layout_info;
10914 pipe.InitState();
10915 pipe.CreateGraphicsPipeline();
10916
10917 // Pipelines for all other subpasses
10918 vk_testing::Pipeline pipelines[extra_subpass_count];
10919 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10920 auto pipe_info = pipe.gp_ci_;
10921 pipe_info.subpass = i + 1;
10922 pipelines[i].init(*m_device, pipe_info);
10923 }
10924 // Set up complete
10925
10926 m_commandBuffer->begin();
10927 // This descriptor bind should not be counted when render pass begins
10928 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
10929 &descriptor_set.set_, 0, nullptr);
10930 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10931 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
Aitor Camacho097a2322022-06-14 14:08:23 +020010932
10933 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
10934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
10935 m_commandBuffer->Draw(1, 0, 0, 0);
10936 m_errorMonitor->VerifyFound();
10937
10938 for (unsigned i = 0; i < extra_subpass_count; ++i) {
Aitor Camacho097a2322022-06-14 14:08:23 +020010939 // This descriptor bind should not be counted when next subpass begins
10940 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0,
10941 1, &descriptor_set.set_, 0, nullptr);
10942 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10943 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
Aitor Camacho097a2322022-06-14 14:08:23 +020010944
10945 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02697");
10946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
10947 m_commandBuffer->Draw(1, 0, 0, 0);
10948 m_errorMonitor->VerifyFound();
10949 }
10950
Aitor Camacho097a2322022-06-14 14:08:23 +020010951 m_commandBuffer->EndRenderPass();
10952 m_commandBuffer->end();
10953 }
10954
10955 m_commandBuffer->reset();
10956
Aitor Camachob379c4b2022-06-14 14:43:40 +020010957 // Vertex buffer
10958 {
10959 float const vertex_data[] = {1.0f, 0.0f};
10960 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
10961 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
10962
10963 VkVertexInputBindingDescription input_binding{};
10964 input_binding.binding = 0;
10965 input_binding.stride = sizeof(vertex_data);
10966 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
10967
10968 VkVertexInputAttributeDescription input_attribs{};
10969 input_attribs.binding = 0;
10970 input_attribs.location = 0;
10971 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
10972 input_attribs.offset = 0;
10973
10974 char const *const vsSource = R"glsl(
10975 #version 450
10976 layout(location = 0) in vec2 input0;
10977 void main(){
10978 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
10979 }
10980 )glsl";
10981
10982 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
10983 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
10984
10985 CreatePipelineHelper pipe(*this);
10986 pipe.InitInfo();
10987 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
10988 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
10989 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
10990 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
10991 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
10992 pipe.InitState();
10993 pipe.CreateGraphicsPipeline();
10994
10995 // Pipelines for all other subpasses
10996 vk_testing::Pipeline pipelines[extra_subpass_count];
10997 for (unsigned i = 0; i < extra_subpass_count; ++i) {
10998 auto pipe_info = pipe.gp_ci_;
10999 pipe_info.subpass = i + 1;
11000 pipelines[i].init(*m_device, pipe_info);
11001 }
11002 // Set up complete
11003 VkDeviceSize offset = 0;
11004
11005 m_commandBuffer->begin();
11006 // This vertex buffer bind should not be counted when render pass begins
11007 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11008 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11009 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
Aitor Camachob379c4b2022-06-14 14:43:40 +020011010
11011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11012 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11013 m_commandBuffer->Draw(1, 0, 0, 0);
11014 m_errorMonitor->VerifyFound();
11015
11016 for (unsigned i = 0; i < extra_subpass_count; ++i) {
Aitor Camachob379c4b2022-06-14 14:43:40 +020011017 // This vertex buffer bind should not be counted when next subpass begins
11018 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
11019 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11020 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
Aitor Camachob379c4b2022-06-14 14:43:40 +020011021
11022 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-04007");
11023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721");
11024 m_commandBuffer->Draw(1, 0, 0, 0);
11025 m_errorMonitor->VerifyFound();
11026 }
11027
Aitor Camachob379c4b2022-06-14 14:43:40 +020011028 m_commandBuffer->EndRenderPass();
11029 m_commandBuffer->end();
11030 }
11031
11032 m_commandBuffer->reset();
11033
Aitor Camachoea9030a2022-06-14 15:07:25 +020011034 // Index buffer
11035 {
11036 float const vertex_data[] = {1.0f, 0.0f};
11037 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(vertex_data)), reinterpret_cast<const void *>(vertex_data),
11038 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
11039
11040 uint32_t const index_data[] = {0};
11041 VkConstantBufferObj ibo(m_device, static_cast<int>(sizeof(index_data)), reinterpret_cast<const void *>(index_data),
11042 VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
11043
11044 VkVertexInputBindingDescription input_binding{};
11045 input_binding.binding = 0;
11046 input_binding.stride = sizeof(vertex_data);
11047 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
11048
11049 VkVertexInputAttributeDescription input_attribs{};
11050 input_attribs.binding = 0;
11051 input_attribs.location = 0;
11052 input_attribs.format = VK_FORMAT_R32G32_SFLOAT;
11053 input_attribs.offset = 0;
11054
11055 char const *const vsSource = R"glsl(
11056 #version 450
11057 layout(location = 0) in vec2 input0;
11058 void main(){
11059 gl_Position = vec4(input0.x, input0.y, 0.0f, 1.0f);
11060 }
11061 )glsl";
11062
11063 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
11064 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
11065
11066 CreatePipelineHelper pipe(*this);
11067 pipe.InitInfo();
11068 pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
11069 pipe.vi_ci_.vertexBindingDescriptionCount = 1;
11070 pipe.vi_ci_.pVertexBindingDescriptions = &input_binding;
11071 pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
11072 pipe.vi_ci_.pVertexAttributeDescriptions = &input_attribs;
11073 pipe.InitState();
11074 pipe.CreateGraphicsPipeline();
11075
11076 // Pipelines for all other subpasses
11077 vk_testing::Pipeline pipelines[extra_subpass_count];
11078 for (unsigned i = 0; i < extra_subpass_count; ++i) {
11079 auto pipe_info = pipe.gp_ci_;
11080 pipe_info.subpass = i + 1;
11081 pipelines[i].init(*m_device, pipe_info);
11082 }
11083 // Set up complete
11084
11085 VkDeviceSize offset = 0;
11086 m_commandBuffer->begin();
11087 // This index buffer bind should not be counted when render pass begins
11088 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11089 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11090 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11091 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Aitor Camachoea9030a2022-06-14 15:07:25 +020011092
11093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11094 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11095 m_errorMonitor->VerifyFound();
11096
11097 for (unsigned i = 0; i < extra_subpass_count; ++i) {
Aitor Camachoea9030a2022-06-14 15:07:25 +020011098 // This index buffer bind should not be counted when next subpass begins
11099 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT32);
11100 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11101 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[i].handle());
11102 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Aitor Camachoea9030a2022-06-14 15:07:25 +020011103
11104 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02701");
11105 m_commandBuffer->DrawIndexed(0, 1, 0, 0, 0);
11106 m_errorMonitor->VerifyFound();
11107 }
11108
Aitor Camachoea9030a2022-06-14 15:07:25 +020011109 m_commandBuffer->EndRenderPass();
11110 m_commandBuffer->end();
11111 }
aitor-lunarga131fca2022-02-17 22:55:55 +010011112}
ziga-lunarg813fa012022-04-09 14:09:57 +020011113
11114TEST_F(VkLayerTest, TestCommandBufferInheritanceWithInvalidDepthFormat) {
11115 TEST_DESCRIPTION(
11116 "Test VkCommandBufferInheritanceRenderingInfoKHR with depthAttachmentFormat that does not include depth aspect");
11117
11118 SetTargetApiVersion(VK_API_VERSION_1_1);
11119
11120 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
11121
11122 ASSERT_NO_FATAL_FAILURE(InitFramework());
11123
sjfricked700bc02022-05-30 16:35:06 +090011124 if (!AreRequiredExtensionsEnabled()) {
11125 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunarg813fa012022-04-09 14:09:57 +020011126 }
11127
11128 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090011129 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
ziga-lunarg813fa012022-04-09 14:09:57 +020011130 }
11131
11132 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +090011133 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
ziga-lunarg813fa012022-04-09 14:09:57 +020011134 if (!dynamic_rendering_features.dynamicRendering) {
11135 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
11136 return;
11137 }
11138
11139 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
11140
11141 auto stencil_format = FindSupportedStencilOnlyFormat(gpu());
11142 if (!stencil_format) {
11143 printf("%s Couldn't stencil image format.\n", kSkipPrefix);
11144 return;
11145 }
11146
11147 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
11148 inheritance_rendering_info.depthAttachmentFormat = stencil_format;
11149
11150 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11151
11152 auto cmdbuf_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>(&inheritance_rendering_info);
11153 auto cmdbuf_bi = LvlInitStruct<VkCommandBufferBeginInfo>();
11154 cmdbuf_bi.pInheritanceInfo = &cmdbuf_ii;
11155
11156 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferInheritanceRenderingInfo-depthAttachmentFormat-06540");
11157
11158 vk::BeginCommandBuffer(secondary.handle(), &cmdbuf_bi);
11159
11160 m_errorMonitor->VerifyFound();
11161}
ziga-lunarg0ce51882022-05-18 14:36:48 +020011162
11163TEST_F(VkLayerTest, ResolveInvalidUsage) {
11164 TEST_DESCRIPTION("Resolve image with missing usage flags.");
11165
sjfricke3a10ae82022-08-02 18:48:57 +090011166 if (!OverrideDevsimForDeviceProfileLayer()) {
11167 GTEST_SKIP() << "Failed to override devsim for device profile layer.";
ziga-lunarg0ce51882022-05-18 14:36:48 +020011168 }
11169
11170 ASSERT_NO_FATAL_FAILURE(Init());
11171
11172 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
11173 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
ziga-lunarg0ce51882022-05-18 14:36:48 +020011174 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
sjfricke3a10ae82022-08-02 18:48:57 +090011175 GTEST_SKIP() << "Failed to load device profile layer.";
ziga-lunarg0ce51882022-05-18 14:36:48 +020011176 }
11177
11178 VkFormat src_format = VK_FORMAT_R8_UNORM;
11179 VkFormat dst_format = VK_FORMAT_R8_SNORM;
11180
11181 VkFormatProperties formatProps;
11182 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, &formatProps);
11183 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
11184 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, formatProps);
11185 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, &formatProps);
11186 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
11187 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, formatProps);
11188
11189 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
11190 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11191 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11192 image_create_info.extent.width = 32;
11193 image_create_info.extent.height = 1;
11194 image_create_info.extent.depth = 1;
11195 image_create_info.mipLevels = 1;
11196 image_create_info.arrayLayers = 1;
11197 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
11198 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11199 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11200 image_create_info.flags = 0;
11201
11202 VkImageObj srcImage(m_device);
11203 srcImage.init(&image_create_info);
11204 ASSERT_TRUE(srcImage.initialized());
11205
11206 image_create_info.format = dst_format;
11207 VkImageObj srcImage2(m_device);
11208 srcImage2.init(&image_create_info);
11209 ASSERT_TRUE(srcImage2.initialized());
11210
11211 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11212 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11213 VkImageObj invalidSrcImage(m_device);
11214 invalidSrcImage.init(&image_create_info);
11215 ASSERT_TRUE(invalidSrcImage.initialized());
11216
11217 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11218 image_create_info.format = src_format;
11219 VkImageObj invalidSrcImage2(m_device);
11220 invalidSrcImage2.init(&image_create_info);
11221 ASSERT_TRUE(invalidSrcImage2.initialized());
11222
11223 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11224 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11225 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11226 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11227 VkImageObj dstImage(m_device);
11228 dstImage.init(&image_create_info);
11229 ASSERT_TRUE(dstImage.initialized());
11230
11231 image_create_info.format = src_format;
11232 VkImageObj dstImage2(m_device);
11233 dstImage2.init(&image_create_info);
11234 ASSERT_TRUE(dstImage2.initialized());
11235
11236 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11237 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11238 VkImageObj invalidDstImage(m_device);
11239 invalidDstImage.init(&image_create_info);
11240 ASSERT_TRUE(invalidDstImage.initialized());
11241
11242 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11243 image_create_info.format = dst_format;
11244 VkImageObj invalidDstImage2(m_device);
11245 invalidDstImage2.init(&image_create_info);
11246 ASSERT_TRUE(invalidDstImage2.initialized());
11247
11248 m_commandBuffer->begin();
11249 VkImageResolve resolveRegion;
11250 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11251 resolveRegion.srcSubresource.mipLevel = 0;
11252 resolveRegion.srcSubresource.baseArrayLayer = 0;
11253 resolveRegion.srcSubresource.layerCount = 1;
11254 resolveRegion.srcOffset.x = 0;
11255 resolveRegion.srcOffset.y = 0;
11256 resolveRegion.srcOffset.z = 0;
11257 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11258 resolveRegion.dstSubresource.mipLevel = 0;
11259 resolveRegion.dstSubresource.baseArrayLayer = 0;
11260 resolveRegion.dstSubresource.layerCount = 1;
11261 resolveRegion.dstOffset.x = 0;
11262 resolveRegion.dstOffset.y = 0;
11263 resolveRegion.dstOffset.z = 0;
11264 resolveRegion.extent.width = 1;
11265 resolveRegion.extent.height = 1;
11266 resolveRegion.extent.depth = 1;
11267
11268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06762");
11269 m_commandBuffer->ResolveImage(invalidSrcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11270 &resolveRegion);
11271 m_errorMonitor->VerifyFound();
11272
11273 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06764");
11274 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11275 &resolveRegion);
11276 m_errorMonitor->VerifyFound();
11277
11278 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06763");
11279 m_commandBuffer->ResolveImage(invalidSrcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11280 1, &resolveRegion);
11281 m_errorMonitor->VerifyFound();
11282
11283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06765");
11284 m_commandBuffer->ResolveImage(srcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11285 1, &resolveRegion);
11286 m_errorMonitor->VerifyFound();
11287
11288 m_commandBuffer->end();
11289}
ziga-lunarg9cd35db2022-08-05 16:46:30 +020011290
11291TEST_F(VkLayerTest, DynamicRenderingInSecondaryCommandBuffers) {
11292 TEST_DESCRIPTION("Test drawing in secondary command buffers with dynamic rendering");
11293
11294 SetTargetApiVersion(VK_API_VERSION_1_1);
11295
11296 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
11297
11298 ASSERT_NO_FATAL_FAILURE(InitFramework());
11299
11300 if (!AreRequiredExtensionsEnabled()) {
11301 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
11302 }
11303
11304 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
11305 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
11306 }
11307
11308 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
sjfricke11db0c72022-08-18 13:23:11 +090011309 auto features2 = GetPhysicalDeviceFeatures2(dynamic_rendering_features);
ziga-lunarg9cd35db2022-08-05 16:46:30 +020011310 if (!dynamic_rendering_features.dynamicRendering) {
11311 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
11312 return;
11313 }
11314
11315 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
11316
11317 VkFormat format = VK_FORMAT_R32G32B32A32_UINT;
11318
11319 auto pipeline_rendering_info = LvlInitStruct<VkPipelineRenderingCreateInfoKHR>();
11320 pipeline_rendering_info.colorAttachmentCount = 1;
11321 pipeline_rendering_info.pColorAttachmentFormats = &format;
11322
11323 CreatePipelineHelper pipe(*this);
11324 pipe.InitInfo();
11325 pipe.gp_ci_.pNext = &pipeline_rendering_info;
11326 pipe.InitState();
11327 pipe.CreateGraphicsPipeline();
11328
11329 VkCommandBufferInheritanceRenderingInfoKHR inheritanceRenderingInfo =
11330 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
11331 inheritanceRenderingInfo.colorAttachmentCount = 1;
11332 inheritanceRenderingInfo.pColorAttachmentFormats = &format;
11333 inheritanceRenderingInfo.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11334
11335 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>(&inheritanceRenderingInfo);
11336 cbii.renderPass = m_renderPass;
11337 cbii.framebuffer = m_framebuffer;
11338
11339 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
11340 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
11341 cbbi.pInheritanceInfo = &cbii;
11342
11343 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11344 secondary.begin(&cbbi);
11345 vk::CmdBindPipeline(secondary.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11346 secondary.Draw(3, 1, 0, 0);
11347 secondary.end();
11348}
janharaldfredriksen-armf6d6c682022-07-12 11:42:11 +020011349
11350TEST_F(VkLayerTest, IncompatibleFragmentRateShadingAttachmentInExecuteCommands) {
11351 TEST_DESCRIPTION(
11352 "Test incompatible fragment shading rate attachments "
11353 "calling CmdExecuteCommands");
11354
11355 // Enable KHR_fragment_shading_rate
11356 AddRequiredExtensions(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
11357 ASSERT_NO_FATAL_FAILURE(InitFramework());
11358
11359 if (!AreRequiredExtensionsEnabled()) {
11360 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported.";
11361 }
11362
11363 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
11364
11365 auto fsr_properties = LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
11366 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&fsr_properties);
11367 GetPhysicalDeviceProperties2(pd_properties);
11368
11369 // Create a render pass without a Fragment Shading Rate attachment
11370 auto col_attach = LvlInitStruct<VkAttachmentDescription2>();
11371 col_attach.format = VK_FORMAT_R8G8B8A8_UNORM;
11372 col_attach.samples = VK_SAMPLE_COUNT_1_BIT;
11373 col_attach.initialLayout = VK_IMAGE_LAYOUT_GENERAL;
11374 col_attach.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
11375
11376 VkSubpassDescription2 subpass_no_fsr = LvlInitStruct<VkSubpassDescription2>();
11377
11378 VkRenderPassCreateInfo2 rcpi_no_fsr = LvlInitStruct<VkRenderPassCreateInfo2KHR>();
11379 rcpi_no_fsr.attachmentCount = 1;
11380 rcpi_no_fsr.pAttachments = &col_attach;
11381 rcpi_no_fsr.subpassCount = 1;
11382 rcpi_no_fsr.pSubpasses = &subpass_no_fsr;
11383
11384 vk_testing::RenderPass rp_no_fsr(*m_device, rcpi_no_fsr, true);
11385
11386 // Create 2 render passes with fragment shading rate attachments with
11387 // differing shadingRateAttachmentTexelSize values
11388 VkAttachmentReference2 fsr_attach_1 = LvlInitStruct<VkAttachmentReference2>();
11389 fsr_attach_1.layout = VK_IMAGE_LAYOUT_GENERAL;
11390 fsr_attach_1.attachment = 0;
11391
11392 VkExtent2D texel_size_1 = {8, 8};
11393
11394 VkFragmentShadingRateAttachmentInfoKHR fsr_attachment_1 = LvlInitStruct<VkFragmentShadingRateAttachmentInfoKHR>();
11395 fsr_attachment_1.shadingRateAttachmentTexelSize = texel_size_1;
11396 fsr_attachment_1.pFragmentShadingRateAttachment = &fsr_attach_1;
11397 VkSubpassDescription2 fsr_subpass_1 = LvlInitStruct<VkSubpassDescription2>(&fsr_attachment_1);
11398
11399 VkAttachmentReference2 fsr_attach_2 = LvlInitStruct<VkAttachmentReference2>();
11400 fsr_attach_2.layout = VK_IMAGE_LAYOUT_GENERAL;
11401 fsr_attach_2.attachment = 0;
11402
11403 VkExtent2D texel_size_2 = {32, 32};
11404
11405 VkFragmentShadingRateAttachmentInfoKHR fsr_attachment_2 = LvlInitStruct<VkFragmentShadingRateAttachmentInfoKHR>();
11406 fsr_attachment_2.shadingRateAttachmentTexelSize = texel_size_2;
11407 fsr_attachment_2.pFragmentShadingRateAttachment = &fsr_attach_2;
11408
11409 VkSubpassDescription2 fsr_subpass_2 = LvlInitStruct<VkSubpassDescription2>(&fsr_attachment_2);
11410
11411 auto attach_desc = LvlInitStruct<VkAttachmentDescription2>();
11412 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
11413 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11414 attach_desc.initialLayout = VK_IMAGE_LAYOUT_GENERAL;
11415 attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
11416
11417 VkRenderPassCreateInfo2KHR rpci_fsr_1 = LvlInitStruct<VkRenderPassCreateInfo2KHR>();
11418 rpci_fsr_1.subpassCount = 1;
11419 rpci_fsr_1.pSubpasses = &fsr_subpass_1;
11420 rpci_fsr_1.attachmentCount = 1;
11421 rpci_fsr_1.pAttachments = &attach_desc;
11422
11423 vk_testing::RenderPass rp_fsr_1(*m_device, rpci_fsr_1, true);
11424 ASSERT_TRUE(rp_fsr_1.initialized());
11425
11426 VkRenderPassCreateInfo2KHR rpci_fsr_2 = LvlInitStruct<VkRenderPassCreateInfo2KHR>();
11427 rpci_fsr_2.subpassCount = 1;
11428 rpci_fsr_2.pSubpasses = &fsr_subpass_2;
11429 rpci_fsr_2.attachmentCount = 1;
11430 rpci_fsr_2.pAttachments = &attach_desc;
11431
11432 vk_testing::RenderPass rp_fsr_2(*m_device, rpci_fsr_2, true);
11433 ASSERT_TRUE(rp_fsr_2.initialized());
11434
11435 VkImageObj image(m_device);
11436 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
11437 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
11438
11439 // Create a frame buffer with a render pass with FSR attachment
11440 VkFramebufferCreateInfo fb_info = LvlInitStruct<VkFramebufferCreateInfo>();
11441 fb_info.renderPass = rp_fsr_1.handle();
11442 fb_info.attachmentCount = 1;
11443 fb_info.pAttachments = &imageView;
11444 fb_info.width = 32;
11445 fb_info.height = 32;
11446 fb_info.layers = 1;
11447
11448 vk_testing::Framebuffer framebuffer_fsr;
11449 framebuffer_fsr.init(*m_device, fb_info);
11450
11451 // Create a frame buffer with a render pass without FSR attachment
11452 VkFramebufferCreateInfo fb_info_0 = LvlInitStruct<VkFramebufferCreateInfo>();
11453 fb_info_0.renderPass = rp_no_fsr.handle();
11454 fb_info_0.attachmentCount = 1;
11455 fb_info_0.pAttachments = &imageView;
11456 fb_info_0.width = 32;
11457 fb_info_0.height = 32;
11458 fb_info_0.layers = 1;
11459
11460 vk_testing::Framebuffer framebuffer_no_fsr;
11461 framebuffer_no_fsr.init(*m_device, fb_info_0);
11462
11463 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
11464 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11465
11466 // Inheritance info without FSR attachment
11467 const VkCommandBufferInheritanceInfo cmdbuff_ii_no_fsr = {
11468 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
11469 nullptr, // pNext
11470 rp_no_fsr.handle(),
11471 0, // subpass
11472 VK_NULL_HANDLE,
11473 };
11474
11475 VkCommandBufferBeginInfo cmdbuff__bi_no_fsr = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
11476 nullptr, // pNext
11477 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii_no_fsr};
11478 cmdbuff__bi_no_fsr.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
11479
11480 // Render pass begin info for no FSR attachment
11481 const VkRenderPassBeginInfo rp_bi_no_fsr{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
11482 nullptr, // pNext
11483 rp_no_fsr.handle(),
11484 framebuffer_no_fsr.handle(),
11485 {{0, 0}, {32, 32}},
11486 0,
11487 nullptr};
11488
11489 // Inheritance info with FSR attachment
11490 const VkCommandBufferInheritanceInfo cmdbuff_ii_fsr = {
11491 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
11492 nullptr, // pNext
11493 rp_fsr_2.handle(),
11494 0, // subpass
11495 VK_NULL_HANDLE,
11496 };
11497
11498 VkCommandBufferBeginInfo cmdbuff__bi_fsr = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
11499 nullptr, // pNext
11500 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii_fsr};
11501 cmdbuff__bi_fsr.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
11502
11503 // Render pass begin info with FSR attachment
11504 const VkRenderPassBeginInfo rp_bi_fsr{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
11505 nullptr, // pNext
11506 rp_fsr_1.handle(),
11507 framebuffer_fsr.handle(),
11508 {{0, 0}, {32, 32}},
11509 0,
11510 nullptr};
11511
11512 // Test case where primary command buffer does not have an FSR attachment but
11513 // secondary command buffer does.
11514 {
11515 secondary.begin(&cmdbuff__bi_fsr);
11516 secondary.end();
11517
11518 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
11519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
11520
11521 m_commandBuffer->begin();
11522 m_commandBuffer->BeginRenderPass(rp_bi_no_fsr, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11523 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
11524 m_errorMonitor->VerifyFound();
11525 m_commandBuffer->EndRenderPass();
11526 m_commandBuffer->end();
11527 }
11528
11529 m_commandBuffer->reset();
11530 secondary.reset();
11531
11532 // Test case where primary command buffer has FSR attachment but secondary
11533 // command buffer does not.
11534 {
11535 secondary.begin(&cmdbuff__bi_no_fsr);
11536 secondary.end();
11537
11538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
11539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
11540
11541 m_commandBuffer->begin();
11542 m_commandBuffer->BeginRenderPass(rp_bi_fsr, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11543
11544 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
11545 m_errorMonitor->VerifyFound();
11546 m_commandBuffer->EndRenderPass();
11547 m_commandBuffer->end();
11548 }
11549
11550 m_commandBuffer->reset();
11551 secondary.reset();
11552
11553 // Test case where both command buffers have FSR attachments but they are
11554 // incompatible.
11555 {
11556 secondary.begin(&cmdbuff__bi_fsr);
11557 secondary.end();
11558
11559 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
11560 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
11561
11562 m_commandBuffer->begin();
11563 m_commandBuffer->BeginRenderPass(rp_bi_fsr, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11564
11565 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
11566 m_errorMonitor->VerifyFound();
11567
11568 m_commandBuffer->EndRenderPass();
11569 m_commandBuffer->end();
11570 }
11571
11572 m_commandBuffer->reset();
11573 secondary.reset();
11574}
paul-lunarg4d19bc62022-09-02 16:36:49 +020011575
11576TEST_F(VkLayerTest, CopyImageRemainingLayers) {
11577 TEST_DESCRIPTION("Test copying an image with VkImageSubresourceLayers.layerCount = VK_REMAINING_ARRAY_LAYERS");
11578
11579 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
11580 ASSERT_NO_FATAL_FAILURE(InitState());
11581
11582 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
11583
11584 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
11585 ci.flags = 0;
11586 ci.imageType = VK_IMAGE_TYPE_2D;
11587 ci.format = image_format;
11588 ci.extent = {32, 32, 1};
11589 ci.mipLevels = 1;
11590 ci.arrayLayers = 8;
11591 ci.samples = VK_SAMPLE_COUNT_1_BIT;
11592 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
11593 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11594 ci.queueFamilyIndexCount = 0;
11595 ci.pQueueFamilyIndices = NULL;
11596 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11597
11598 // 2D images
11599 VkImageObj image_a(m_device);
11600 VkImageObj image_b(m_device);
11601
11602 // Copy from a to b
11603 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11604 image_a.init(&ci);
11605 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11606 image_b.init(&ci);
11607
11608 ASSERT_TRUE(image_a.initialized());
11609 ASSERT_TRUE(image_b.initialized());
11610
11611 m_commandBuffer->begin();
11612
11613 image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
11614 image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
11615
11616 VkImageCopy copy_region{};
11617 copy_region.extent = ci.extent;
11618 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11619 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11620 copy_region.srcSubresource.baseArrayLayer = 7;
11621 copy_region.dstSubresource.baseArrayLayer = 7;
11622 copy_region.srcSubresource.layerCount = VK_REMAINING_ARRAY_LAYERS; // This value is unsupported by VkImageSubresourceLayers
11623 copy_region.dstSubresource.layerCount = VK_REMAINING_ARRAY_LAYERS;
11624
11625 // These vuids will trigger a special message stating that VK_REMAINING_ARRAY_LAYERS is unsupported
11626 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
11627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
11628 m_commandBuffer->CopyImage(image_a.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image_b.image(),
11629 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
11630 m_errorMonitor->VerifyFound();
11631
11632 VkBufferCreateInfo bci = LvlInitStruct<VkBufferCreateInfo>();
11633 bci.size = 32 * 32 * 4;
11634 bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
11635 VkBufferObj buffer(*m_device, bci);
11636
11637 VkBufferImageCopy buffer_copy{};
11638 buffer_copy.bufferImageHeight = ci.extent.height;
11639 buffer_copy.bufferRowLength = ci.extent.width;
11640 buffer_copy.imageExtent = ci.extent;
11641 buffer_copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11642 buffer_copy.imageSubresource.layerCount = VK_REMAINING_ARRAY_LAYERS; // This value is unsupported by VkImageSubresourceLayers
11643 buffer_copy.imageSubresource.mipLevel = 0;
11644 buffer_copy.imageSubresource.baseArrayLayer = 5;
11645
11646 // This error will trigger first stating that the copy is too big for the buffer, because of VK_REMAINING_ARRAY_LAYERS
11647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
11648 // This error will trigger second stating that VK_REMAINING_ARRAY_LAYERS is unsupported here
11649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
11650 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image_b.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
11651 &buffer_copy);
11652 m_errorMonitor->VerifyFound();
11653
11654 m_commandBuffer->end();
11655}