blob: 4fa5005b20769ce4da4bd316fefaddc3ed433131 [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
185 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
186 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
187 } else {
188 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
189 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
190 return;
191 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -0700192 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500193 std::array<const char *, 1> required_device_extensions = {{VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME}};
194 for (auto device_extension : required_device_extensions) {
195 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
196 m_device_extension_names.push_back(device_extension);
197 } else {
198 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
199 return;
200 }
201 }
202
203 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600204 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500205 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
206
Mark Lobodzinski07d0a612020-12-30 15:42:31 -0700207 auto line_rasterization_features = LvlInitStruct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
208 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&line_rasterization_features);
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500209 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
210
211 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
212 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
213 return;
214 }
215
216 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
217
Mark Lobodzinski20310782020-02-28 14:25:17 -0700218 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500219 VKTriangleTest(BsoFailLineStipple);
220 m_errorMonitor->VerifyFound();
221}
222
unknown088160a2019-05-23 17:43:13 -0600223TEST_F(VkLayerTest, DynamicViewportNotBound) {
224 TEST_DESCRIPTION(
225 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
226
227 ASSERT_NO_FATAL_FAILURE(Init());
228 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700229 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600230 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
231 VKTriangleTest(BsoFailViewport);
232 m_errorMonitor->VerifyFound();
233}
234
235TEST_F(VkLayerTest, DynamicScissorNotBound) {
236 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
237
238 ASSERT_NO_FATAL_FAILURE(Init());
239 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600241 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
242 VKTriangleTest(BsoFailScissor);
243 m_errorMonitor->VerifyFound();
244}
245
246TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
247 TEST_DESCRIPTION(
248 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
249
250 ASSERT_NO_FATAL_FAILURE(Init());
251 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600253 VKTriangleTest(BsoFailBlend);
254 m_errorMonitor->VerifyFound();
255}
256
257TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
258 TEST_DESCRIPTION(
259 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
260
261 ASSERT_NO_FATAL_FAILURE(Init());
262 if (!m_device->phy().features().depthBounds) {
263 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
264 return;
265 }
266 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700267 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600268 VKTriangleTest(BsoFailDepthBounds);
269 m_errorMonitor->VerifyFound();
270}
271
272TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
273 TEST_DESCRIPTION(
274 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
275
276 ASSERT_NO_FATAL_FAILURE(Init());
277 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700278 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600279 VKTriangleTest(BsoFailStencilReadMask);
280 m_errorMonitor->VerifyFound();
281}
282
283TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
284 TEST_DESCRIPTION(
285 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
286
287 ASSERT_NO_FATAL_FAILURE(Init());
288 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700289 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600290 VKTriangleTest(BsoFailStencilWriteMask);
291 m_errorMonitor->VerifyFound();
292}
293
294TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
295 TEST_DESCRIPTION(
296 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
297
298 ASSERT_NO_FATAL_FAILURE(Init());
299 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600301 VKTriangleTest(BsoFailStencilReference);
302 m_errorMonitor->VerifyFound();
303}
304
305TEST_F(VkLayerTest, IndexBufferNotBound) {
306 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
307
308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600310 VKTriangleTest(BsoFailIndexBuffer);
311 m_errorMonitor->VerifyFound();
312}
313
314TEST_F(VkLayerTest, IndexBufferBadSize) {
315 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
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(BsoFailIndexBufferBadSize);
320 m_errorMonitor->VerifyFound();
321}
322
323TEST_F(VkLayerTest, IndexBufferBadOffset) {
324 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
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(BsoFailIndexBufferBadOffset);
329 m_errorMonitor->VerifyFound();
330}
331
332TEST_F(VkLayerTest, IndexBufferBadBindSize) {
333 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
334
335 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600337 VKTriangleTest(BsoFailIndexBufferBadMapSize);
338 m_errorMonitor->VerifyFound();
339}
340
341TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
342 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
343
344 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600345 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600346 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
347 m_errorMonitor->VerifyFound();
348}
349
350TEST_F(VkLayerTest, MissingClearAttachment) {
351 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
352 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700353 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600354
355 VKTriangleTest(BsoFailCmdClearAttachments);
356 m_errorMonitor->VerifyFound();
357}
358
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700359TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
360 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700361 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700362
363 ASSERT_NO_FATAL_FAILURE(Init());
364
365 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
366 secondary.begin();
367 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
368 secondary.end();
369
sfricke-samsung1c61f192021-12-31 01:53:03 -0600370 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700371 submit_info.waitSemaphoreCount = 0;
372 submit_info.pWaitSemaphores = NULL;
373 submit_info.pWaitDstStageMask = NULL;
374 submit_info.commandBufferCount = 1;
375 submit_info.pCommandBuffers = &secondary.handle();
376 submit_info.signalSemaphoreCount = 0;
377 submit_info.pSignalSemaphores = NULL;
378
379 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
380 m_errorMonitor->VerifyFound();
381}
382
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700383TEST_F(VkLayerTest, Sync2SecondaryCommandbufferAsPrimary) {
384 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit2KHR.");
385 SetTargetApiVersion(VK_API_VERSION_1_2);
386 ASSERT_NO_FATAL_FAILURE(InitFramework());
387 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
388 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
389 } else {
390 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
391 return;
392 }
393
394 if (!CheckSynchronization2SupportAndInitState(this)) {
395 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
396 return;
397 }
398 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
Tony-LunarG279601c2021-11-16 10:50:51 -0700399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferSubmitInfo-commandBuffer-03890");
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700400
401 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
402 secondary.begin();
403 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
404 secondary.end();
405
406 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
407 cb_info.commandBuffer = secondary.handle();
408
409 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
410 submit_info.commandBufferInfoCount = 1;
411 submit_info.pCommandBufferInfos = &cb_info;
412
413 fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
414 m_errorMonitor->VerifyFound();
415}
416
unknown088160a2019-05-23 17:43:13 -0600417TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700418 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600419 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
420
421 ASSERT_NO_FATAL_FAILURE(Init());
422 ASSERT_NO_FATAL_FAILURE(InitViewport());
423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
424
425 // We luck out b/c by default the framework creates CB w/ the
426 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
427 m_commandBuffer->begin();
428 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
429 m_commandBuffer->end();
430
431 // Bypass framework since it does the waits automatically
432 VkResult err = VK_SUCCESS;
sfricke-samsung1c61f192021-12-31 01:53:03 -0600433 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -0600434 submit_info.waitSemaphoreCount = 0;
435 submit_info.pWaitSemaphores = NULL;
436 submit_info.pWaitDstStageMask = NULL;
437 submit_info.commandBufferCount = 1;
438 submit_info.pCommandBuffers = &m_commandBuffer->handle();
439 submit_info.signalSemaphoreCount = 0;
440 submit_info.pSignalSemaphores = NULL;
441
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600442 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600443 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600444 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600445
446 // Cause validation error by re-submitting cmd buffer that should only be
447 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600448 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
449 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600450
451 m_errorMonitor->VerifyFound();
452}
453
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700454TEST_F(VkLayerTest, Sync2CommandBufferTwoSubmits) {
455 SetTargetApiVersion(VK_API_VERSION_1_2);
456 ASSERT_NO_FATAL_FAILURE(InitFramework());
457 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
458 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
459 } else {
460 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
461 return;
462 }
463
464 if (!CheckSynchronization2SupportAndInitState(this)) {
465 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
466 return;
467 }
468 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
469
470 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
471 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
472 ASSERT_NO_FATAL_FAILURE(InitViewport());
473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
474
475 // We luck out b/c by default the framework creates CB w/ the
476 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
477 m_commandBuffer->begin();
478 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
479 m_commandBuffer->end();
480
481 // Bypass framework since it does the waits automatically
482 VkResult err = VK_SUCCESS;
483 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
484 cb_info.commandBuffer = m_commandBuffer->handle();
485
486 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
487 submit_info.commandBufferInfoCount = 1;
488 submit_info.pCommandBufferInfos = &cb_info;
489
490 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
491 ASSERT_VK_SUCCESS(err);
492 vk::QueueWaitIdle(m_device->m_queue);
493
494 // Cause validation error by re-submitting cmd buffer that should only be
495 // submitted once
496 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
497 vk::QueueWaitIdle(m_device->m_queue);
498
499 m_errorMonitor->VerifyFound();
500}
501
unknown088160a2019-05-23 17:43:13 -0600502TEST_F(VkLayerTest, InvalidPushConstants) {
503 ASSERT_NO_FATAL_FAILURE(Init());
504 ASSERT_NO_FATAL_FAILURE(InitViewport());
505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
506
507 VkPipelineLayout pipeline_layout;
508 VkPushConstantRange pc_range = {};
sfricke-samsung1c61f192021-12-31 01:53:03 -0600509 VkPipelineLayoutCreateInfo pipeline_layout_ci = LvlInitStruct<VkPipelineLayoutCreateInfo>();
unknown088160a2019-05-23 17:43:13 -0600510 pipeline_layout_ci.pushConstantRangeCount = 1;
511 pipeline_layout_ci.pPushConstantRanges = &pc_range;
512
513 //
514 // Check for invalid push constant ranges in pipeline layouts.
515 //
516 struct PipelineLayoutTestCase {
517 VkPushConstantRange const range;
518 char const *msg;
519 };
520
521 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
522 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700523 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
524 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
525 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
526 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
527 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
528 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
529 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
530 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
531 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
532 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600533 }};
534
535 // Check for invalid offset and size
536 for (const auto &iter : range_tests) {
537 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600539 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600540 m_errorMonitor->VerifyFound();
541 }
542
543 // Check for invalid stage flag
544 pc_range.offset = 0;
545 pc_range.size = 16;
546 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700547 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600548 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600549 m_errorMonitor->VerifyFound();
550
551 // Check for duplicate stage flags in a list of push constant ranges.
552 // A shader can only have one push constant block and that block is mapped
553 // to the push constant range that has that shader's stage flag set.
554 // The shader's stage flag can only appear once in all the ranges, so the
555 // implementation can find the one and only range to map it to.
556 const uint32_t ranges_per_test = 5;
557 struct DuplicateStageFlagsTestCase {
558 VkPushConstantRange const ranges[ranges_per_test];
559 std::vector<char const *> const msg;
560 };
561 // Overlapping ranges are OK, but a stage flag can appear only once.
562 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
563 {
564 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
565 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
566 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
567 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
568 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
569 {
570 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
571 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
572 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
573 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
574 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
575 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
576 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
577 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
578 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
579 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
580 }},
581 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
582 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
583 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
584 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
585 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
586 {
587 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
588 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
589 }},
590 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
591 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
592 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
593 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
594 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
595 {
596 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
597 }},
598 },
599 };
600
601 for (const auto &iter : duplicate_stageFlags_tests) {
602 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
603 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600605 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600606 m_errorMonitor->VerifyFound();
607 }
608
609 //
610 // CmdPushConstants tests
611 //
612
613 // Setup a pipeline layout with ranges: [0,32) [16,80)
614 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
615 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
616 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
617
618 const uint8_t dummy_values[100] = {};
619
620 m_commandBuffer->begin();
621 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
622
623 // Check for invalid stage flag
624 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600626 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600627 m_errorMonitor->VerifyFound();
628
629 // Positive tests for the overlapping ranges
630 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600631 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
632 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600633 m_errorMonitor->VerifyNotFound();
634 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600635 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600636 m_errorMonitor->VerifyNotFound();
637 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600638 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
639 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600640 m_errorMonitor->VerifyNotFound();
641
642 // Wrong cmd stages for extant range
643 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700644 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600645 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600647 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
648 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600649 m_errorMonitor->VerifyFound();
650
651 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600653 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
654 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600655 m_errorMonitor->VerifyFound();
656
657 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600659 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
660 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600661 m_errorMonitor->VerifyFound();
662
663 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600665 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600666 m_errorMonitor->VerifyFound();
667
668 m_commandBuffer->EndRenderPass();
669 m_commandBuffer->end();
670}
671
672TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700673 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600674
675 ASSERT_NO_FATAL_FAILURE(Init());
676 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
677 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600678 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600679
680 m_errorMonitor->VerifyFound();
681}
682
683TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
684 ASSERT_NO_FATAL_FAILURE(Init());
685
686 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
687
688 // Force the failure by not setting the Renderpass and Framebuffer fields
sfricke-samsung1c61f192021-12-31 01:53:03 -0600689 VkCommandBufferInheritanceInfo cmd_buf_hinfo = LvlInitStruct<VkCommandBufferInheritanceInfo>();
690 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -0600691 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
692 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
693
amhagana448ea52021-11-02 14:09:14 -0400694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-06002");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600695 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600696 m_errorMonitor->VerifyFound();
697}
698
699TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
700 ASSERT_NO_FATAL_FAILURE(Init());
701
Mark Lobodzinski20310782020-02-28 14:25:17 -0700702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600703
704 // A pool we can reset in.
705 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
706 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
707
708 secondary.begin();
709 secondary.end();
710
711 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600712 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600713
714 // rerecording of secondary
715 secondary.reset(); // explicit reset here.
716 secondary.begin();
717 secondary.end();
718
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600719 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600720 m_errorMonitor->VerifyFound();
721}
722
723TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
724 ASSERT_NO_FATAL_FAILURE(Init());
725
Mark Lobodzinski20310782020-02-28 14:25:17 -0700726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600727
728 // A pool we can reset in.
729 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
730 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
731
732 secondary.begin();
733 secondary.end();
734
735 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600736 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600737
738 // rerecording of secondary
739 secondary.begin(); // implicit reset in begin
740 secondary.end();
741
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600742 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600743 m_errorMonitor->VerifyFound();
744}
745
746TEST_F(VkLayerTest, CascadedInvalidation) {
747 ASSERT_NO_FATAL_FAILURE(Init());
748
sfricke-samsung1c61f192021-12-31 01:53:03 -0600749 VkEventCreateInfo eci = LvlInitStruct<VkEventCreateInfo>();
750 eci.flags = 0;
unknown088160a2019-05-23 17:43:13 -0600751 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600752 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600753
754 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
755 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600756 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600757 secondary.end();
758
759 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600760 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600761 m_commandBuffer->end();
762
763 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600764 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600765
Mark Lobodzinski20310782020-02-28 14:25:17 -0700766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600767 m_commandBuffer->QueueCommandBuffer(false);
768 m_errorMonitor->VerifyFound();
769}
770
771TEST_F(VkLayerTest, CommandBufferResetErrors) {
772 // Cause error due to Begin while recording CB
773 // Then cause 2 errors for attempting to reset CB w/o having
774 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
775 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700776 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600777
778 ASSERT_NO_FATAL_FAILURE(Init());
779
780 // Calls AllocateCommandBuffers
781 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
782
783 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
sfricke-samsung1c61f192021-12-31 01:53:03 -0600784 VkCommandBufferInheritanceInfo cmd_buf_hinfo = LvlInitStruct<VkCommandBufferInheritanceInfo>();
785 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -0600786 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
787 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
788
789 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600790 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600791 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600792 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600793 m_errorMonitor->VerifyFound();
794
Mark Lobodzinski20310782020-02-28 14:25:17 -0700795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600796 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
797 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600798 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600799 m_errorMonitor->VerifyFound();
800
Mark Lobodzinski20310782020-02-28 14:25:17 -0700801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600802 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600803 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600804 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600805 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600806 m_errorMonitor->VerifyFound();
807}
808
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700809TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
810 ASSERT_NO_FATAL_FAILURE(Init());
811
812 // Calls AllocateCommandBuffers
813 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
814
sfricke-samsung1c61f192021-12-31 01:53:03 -0600815 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700816 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
817
818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
819 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
820 m_errorMonitor->VerifyFound();
821}
822
unknown088160a2019-05-23 17:43:13 -0600823TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
824 // Call CmdClearAttachmentss outside of an active RenderPass
825
sfricke-samsung85584a72021-09-30 21:43:38 -0700826 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearAttachments: This call must be issued inside an active render pass");
unknown088160a2019-05-23 17:43:13 -0600827
828 ASSERT_NO_FATAL_FAILURE(Init());
829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
830
831 // Start no RenderPass
832 m_commandBuffer->begin();
833
834 VkClearAttachment color_attachment;
835 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
836 color_attachment.clearValue.color.float32[0] = 0;
837 color_attachment.clearValue.color.float32[1] = 0;
838 color_attachment.clearValue.color.float32[2] = 0;
839 color_attachment.clearValue.color.float32[3] = 0;
840 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600841 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600842 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600843
844 m_errorMonitor->VerifyFound();
845}
846
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600847TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
848 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
849
Mark Lobodzinski20310782020-02-28 14:25:17 -0700850 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600851
852 ASSERT_NO_FATAL_FAILURE(Init());
853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
854
855 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600856 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600857
858 VkClearAttachment color_attachment;
859 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
860 color_attachment.clearValue.color.float32[0] = 0;
861 color_attachment.clearValue.color.float32[1] = 0;
862 color_attachment.clearValue.color.float32[2] = 0;
863 color_attachment.clearValue.color.float32[3] = 0;
864 color_attachment.colorAttachment = 0;
865 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600866 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600867
868 m_errorMonitor->VerifyFound();
869}
870
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700871TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
872 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
873
874 ASSERT_NO_FATAL_FAILURE(Init());
875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
876
877 m_commandBuffer->begin();
878 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
879
880 VkClearAttachment color_attachment;
881 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
882 color_attachment.clearValue.color.float32[0] = 0;
883 color_attachment.clearValue.color.float32[1] = 0;
884 color_attachment.clearValue.color.float32[2] = 0;
885 color_attachment.clearValue.color.float32[3] = 0;
886 color_attachment.colorAttachment = 0;
887 VkClearRect clear_rect = {};
888 clear_rect.rect.offset = {0, 0};
889 clear_rect.baseArrayLayer = 0;
890 clear_rect.layerCount = 1;
891
892 clear_rect.rect.extent = {0, 1};
893 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
894 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
895 m_errorMonitor->VerifyFound();
896
897 clear_rect.rect.extent = {1, 0};
898 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
899 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
900 m_errorMonitor->VerifyFound();
901}
902
sfricke-samsung6141db32020-10-26 03:31:38 -0700903TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
904 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
905
906 ASSERT_NO_FATAL_FAILURE(Init());
907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
908
909 m_commandBuffer->begin();
910 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
911
912 VkClearAttachment attachment;
913 attachment.clearValue.color.float32[0] = 0;
914 attachment.clearValue.color.float32[1] = 0;
915 attachment.clearValue.color.float32[2] = 0;
916 attachment.clearValue.color.float32[3] = 0;
917 attachment.colorAttachment = 0;
918 VkClearRect clear_rect = {};
919 clear_rect.rect.offset = {0, 0};
920 clear_rect.rect.extent = {1, 1};
921 clear_rect.baseArrayLayer = 0;
922 clear_rect.layerCount = 1;
923
924 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
926 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
927 m_errorMonitor->VerifyFound();
928
929 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
930 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
931 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
932 m_errorMonitor->VerifyFound();
933
934 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
935 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
936 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
937 m_errorMonitor->VerifyFound();
938
939 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
940 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
941 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
942 m_errorMonitor->VerifyFound();
943}
944
sfricke-samsung91f4a542020-10-21 00:29:17 -0700945TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
946 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
947
948 ASSERT_NO_FATAL_FAILURE(Init());
949 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
950
951 m_commandBuffer->begin();
952 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
953
954 VkClearAttachment color_attachment;
955 color_attachment.clearValue.color.float32[0] = 0;
956 color_attachment.clearValue.color.float32[1] = 0;
957 color_attachment.clearValue.color.float32[2] = 0;
958 color_attachment.clearValue.color.float32[3] = 0;
959 color_attachment.colorAttachment = 0;
960 VkClearRect clear_rect = {};
961 clear_rect.rect.offset = {0, 0};
962 clear_rect.rect.extent = {1, 1};
963 clear_rect.baseArrayLayer = 0;
964 clear_rect.layerCount = 1;
965
966 color_attachment.aspectMask = 0;
967 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
968 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
969 m_errorMonitor->VerifyFound();
970
971 color_attachment.aspectMask = 0xffffffff;
972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
973 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
974 m_errorMonitor->VerifyFound();
975}
976
sfricke-samsung87b09512020-10-26 03:35:42 -0700977TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
978 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
979
980 ASSERT_NO_FATAL_FAILURE(Init());
981 // Creates a color attachment
982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
983
984 m_commandBuffer->begin();
985 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
986
987 VkClearAttachment attachment;
988 attachment.clearValue.color.float32[0] = 0;
989 attachment.clearValue.color.float32[1] = 0;
990 attachment.clearValue.color.float32[2] = 0;
991 attachment.clearValue.color.float32[3] = 0;
992 attachment.colorAttachment = 0;
993 VkClearRect clear_rect = {};
994 clear_rect.rect.offset = {0, 0};
995 clear_rect.rect.extent = {1, 1};
996 clear_rect.baseArrayLayer = 0;
997 clear_rect.layerCount = 1;
998
999 m_errorMonitor->ExpectSuccess();
1000 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1001 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1002 m_errorMonitor->VerifyNotFound();
1003
1004 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
1005 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1006 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1007 m_errorMonitor->VerifyFound();
1008
1009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
1010 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1011 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1012 m_errorMonitor->VerifyFound();
1013}
1014
unknown088160a2019-05-23 17:43:13 -06001015TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1016 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1017
1018 ASSERT_NO_FATAL_FAILURE(Init());
1019 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1020
1021 // An empty primary command buffer
1022 VkCommandBufferObj cb(m_device, m_commandPool);
1023 cb.begin();
1024 cb.end();
1025
1026 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001027 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001028 VkCommandBuffer handle = cb.handle();
1029
Mark Lobodzinski20310782020-02-28 14:25:17 -07001030 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001031 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001032 m_errorMonitor->VerifyFound();
1033
1034 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1035
1036 m_commandBuffer->EndRenderPass();
1037 m_commandBuffer->end();
1038}
1039
Petr Kraus8e53cf02020-01-03 05:30:04 +01001040TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1041 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1042
1043 ASSERT_NO_FATAL_FAILURE(Init());
1044
1045 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1046 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1047 secondary_cb.begin();
1048 secondary_cb.end();
1049
1050 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001052 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1053 m_errorMonitor->VerifyFound();
1054}
1055
unknown088160a2019-05-23 17:43:13 -06001056TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1057 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1058
1059 ASSERT_NO_FATAL_FAILURE(Init());
1060 ASSERT_NO_FATAL_FAILURE(InitViewport());
1061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1062
1063 const VkPipelineLayoutObj pipeline_layout(m_device);
1064
1065 struct VboEntry {
1066 uint16_t input0[2];
1067 uint32_t input1;
1068 float input2[4];
1069 };
1070
1071 const unsigned vbo_entry_count = 3;
1072 const VboEntry vbo_data[vbo_entry_count] = {};
1073
1074 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1075 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1076
1077 VkVertexInputBindingDescription input_binding;
1078 input_binding.binding = 0;
1079 input_binding.stride = sizeof(VboEntry);
1080 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1081
1082 VkVertexInputAttributeDescription input_attribs[3];
1083
1084 input_attribs[0].binding = 0;
1085 // Location switch between attrib[0] and attrib[1] is intentional
1086 input_attribs[0].location = 1;
1087 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1088 input_attribs[0].offset = offsetof(VboEntry, input1);
1089
1090 input_attribs[1].binding = 0;
1091 input_attribs[1].location = 0;
1092 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1093 input_attribs[1].offset = offsetof(VboEntry, input0);
1094
1095 input_attribs[2].binding = 0;
1096 input_attribs[2].location = 2;
1097 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1098 input_attribs[2].offset = offsetof(VboEntry, input2);
1099
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001100 char const *vsSource = R"glsl(
1101 #version 450
1102 layout(location = 0) in vec2 input0;
1103 layout(location = 1) in vec4 input1;
1104 layout(location = 2) in vec4 input2;
1105 void main(){
1106 gl_Position = input1 + input2;
1107 gl_Position.xy += input0;
1108 }
1109 )glsl";
unknown088160a2019-05-23 17:43:13 -06001110
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001111 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
1112 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001113
1114 VkPipelineObj pipe1(m_device);
1115 pipe1.AddDefaultColorAttachment();
1116 pipe1.AddShader(&vs);
1117 pipe1.AddShader(&fs);
1118 pipe1.AddVertexInputBindings(&input_binding, 1);
1119 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1120 pipe1.SetViewport(m_viewports);
1121 pipe1.SetScissor(m_scissors);
1122 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1123
1124 input_binding.stride = 6;
1125
1126 VkPipelineObj pipe2(m_device);
1127 pipe2.AddDefaultColorAttachment();
1128 pipe2.AddShader(&vs);
1129 pipe2.AddShader(&fs);
1130 pipe2.AddVertexInputBindings(&input_binding, 1);
1131 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1132 pipe2.SetViewport(m_viewports);
1133 pipe2.SetScissor(m_scissors);
1134 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1135
1136 m_commandBuffer->begin();
1137 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1138
1139 // Test with invalid buffer offset
1140 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001141 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1142 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
1144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 1
1145 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001146 m_commandBuffer->Draw(1, 0, 0, 0);
1147 m_errorMonitor->VerifyFound();
1148
1149 // Test with invalid buffer stride
1150 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001151 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1152 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001153 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
unknown088160a2019-05-23 17:43:13 -06001154 // Attribute[1] is aligned properly even with a wrong stride
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001155 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001156 m_commandBuffer->Draw(1, 0, 0, 0);
1157 m_errorMonitor->VerifyFound();
1158
1159 m_commandBuffer->EndRenderPass();
1160 m_commandBuffer->end();
1161}
1162
1163TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1164 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001165 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001166
1167 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1168
1169 secondary.begin();
1170 secondary.end();
1171
1172 VkCommandBufferBeginInfo cbbi = {
1173 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1174 nullptr,
1175 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1176 nullptr,
1177 };
1178
1179 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001180 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001181 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001182 m_errorMonitor->VerifyFound();
1183 m_commandBuffer->end();
1184}
1185
1186TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1187 ASSERT_NO_FATAL_FAILURE(Init());
1188
John Zulauff1640d12019-08-13 15:39:58 -06001189 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001190
1191 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1192
sfricke-samsung1c61f192021-12-31 01:53:03 -06001193 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001194 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1195
1196 secondary.begin(&cbbi);
1197 secondary.end();
1198
1199 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001200 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001202 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001203 m_errorMonitor->VerifyFound();
1204 m_commandBuffer->end();
1205}
1206
1207TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1208 ASSERT_NO_FATAL_FAILURE(Init());
1209
1210 // variation on previous test executing the same CB twice in the same
1211 // CmdExecuteCommands call
1212
John Zulauff1640d12019-08-13 15:39:58 -06001213 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001214
1215 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1216
sfricke-samsung1c61f192021-12-31 01:53:03 -06001217 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001218 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1219
1220 secondary.begin(&cbbi);
1221 secondary.end();
1222
1223 m_commandBuffer->begin();
1224 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001225 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001226 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001227 m_errorMonitor->VerifyFound();
1228 m_commandBuffer->end();
1229}
1230
1231TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1232 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1233 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1234 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1235 ASSERT_NO_FATAL_FAILURE(Init());
1236
1237 VkCommandBuffer cmd_bufs[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06001238 VkCommandBufferAllocateInfo alloc_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06001239 alloc_info.commandBufferCount = 2;
1240 alloc_info.commandPool = m_commandPool->handle();
1241 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001242 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001243
sfricke-samsung1c61f192021-12-31 01:53:03 -06001244 VkCommandBufferBeginInfo cb_binfo = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -06001245 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1246 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001247 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001248 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001249 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1250 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001251 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1252
sfricke-samsung1c61f192021-12-31 01:53:03 -06001253 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06001254 submit_info.commandBufferCount = 2;
1255 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001256 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001257 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001258 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001259 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001260
1261 // Set one time use and now look for one time submit
1262 duplicates[0] = duplicates[1] = cmd_bufs[1];
1263 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001264 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1265 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1266 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001267 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001268 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001269 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001270 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001271}
1272
1273TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1274 TEST_DESCRIPTION(
1275 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1276
Mark Lobodzinski20310782020-02-28 14:25:17 -07001277 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001278
1279 ASSERT_NO_FATAL_FAILURE(Init());
1280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1281
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001282 char const *fsSource = R"glsl(
1283 #version 450
1284 layout(set=0, binding=0) uniform sampler3D s;
1285 layout(location=0) out vec4 color;
1286 void main() {
1287 color = texture(s, vec3(0));
1288 }
1289 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001290 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1291 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001292
1293 VkPipelineObj pipe(m_device);
1294 pipe.AddShader(&vs);
1295 pipe.AddShader(&fs);
1296 pipe.AddDefaultColorAttachment();
1297
1298 VkTextureObj texture(m_device, nullptr);
1299 VkSamplerObj sampler(m_device);
1300
1301 VkDescriptorSetObj descriptorSet(m_device);
1302 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1303 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1304
1305 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1306 ASSERT_VK_SUCCESS(err);
1307
1308 m_commandBuffer->begin();
1309 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1310
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001311 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001312 m_commandBuffer->BindDescriptorSet(descriptorSet);
1313
1314 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001315 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001316 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001317 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001318
1319 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001320 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001321
1322 m_errorMonitor->VerifyFound();
1323
1324 m_commandBuffer->EndRenderPass();
1325 m_commandBuffer->end();
1326}
1327
1328TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1329 TEST_DESCRIPTION(
1330 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1331 "vice versa.");
1332
Mark Lobodzinski20310782020-02-28 14:25:17 -07001333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001334
1335 ASSERT_NO_FATAL_FAILURE(Init());
1336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1337
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001338 char const *fsSource = R"glsl(
1339 #version 450
1340 layout(set=0, binding=0) uniform sampler2DMS s;
1341 layout(location=0) out vec4 color;
1342 void main() {
1343 color = texelFetch(s, ivec2(0), 0);
1344 }
1345 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001346 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1347 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001348
1349 VkPipelineObj pipe(m_device);
1350 pipe.AddShader(&vs);
1351 pipe.AddShader(&fs);
1352 pipe.AddDefaultColorAttachment();
1353
1354 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1355 VkSamplerObj sampler(m_device);
1356
1357 VkDescriptorSetObj descriptorSet(m_device);
1358 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1359 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1360
1361 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1362 ASSERT_VK_SUCCESS(err);
1363
1364 m_commandBuffer->begin();
1365 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1366
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001367 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001368 m_commandBuffer->BindDescriptorSet(descriptorSet);
1369
1370 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001371 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001372 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001373 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001374
1375 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001376 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001377
1378 m_errorMonitor->VerifyFound();
1379
1380 m_commandBuffer->EndRenderPass();
1381 m_commandBuffer->end();
1382}
1383
1384TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1385 TEST_DESCRIPTION(
1386 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1387
Mark Lobodzinski20310782020-02-28 14:25:17 -07001388 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001389
1390 ASSERT_NO_FATAL_FAILURE(Init());
1391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1392
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001393 char const *fsSource = R"glsl(
1394 #version 450
1395 layout(set=0, binding=0) uniform isampler2D s;
1396 layout(location=0) out vec4 color;
1397 void main() {
1398 color = texelFetch(s, ivec2(0), 0);
1399 }
1400 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001401 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1402 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001403
1404 VkPipelineObj pipe(m_device);
1405 pipe.AddShader(&vs);
1406 pipe.AddShader(&fs);
1407 pipe.AddDefaultColorAttachment();
1408
1409 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1410 VkSamplerObj sampler(m_device);
1411
1412 VkDescriptorSetObj descriptorSet(m_device);
1413 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1414 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1415
1416 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1417 ASSERT_VK_SUCCESS(err);
1418
1419 m_commandBuffer->begin();
1420 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1421
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001422 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001423 m_commandBuffer->BindDescriptorSet(descriptorSet);
1424
1425 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001426 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001427 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001428 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001429
1430 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001431 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001432
1433 m_errorMonitor->VerifyFound();
1434
1435 m_commandBuffer->EndRenderPass();
1436 m_commandBuffer->end();
1437}
1438
unknown088160a2019-05-23 17:43:13 -06001439TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1440 TEST_DESCRIPTION(
1441 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001442 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1443 bool maintenance1 = false;
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001444 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
1445 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung30b094c2020-05-30 11:42:11 -07001446 maintenance1 = true;
1447 }
1448 ASSERT_NO_FATAL_FAILURE(InitState());
1449
1450 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1451 VkFormatProperties format_props;
1452 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1453 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1454 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1455 return;
1456 }
unknown088160a2019-05-23 17:43:13 -06001457
1458 // Create two images to copy between
1459 VkImageObj src_image_obj(m_device);
1460 VkImageObj dst_image_obj(m_device);
1461
sfricke-samsung1c61f192021-12-31 01:53:03 -06001462 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001463 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001464 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001465 image_create_info.extent.width = 32;
1466 image_create_info.extent.height = 32;
1467 image_create_info.extent.depth = 1;
1468 image_create_info.mipLevels = 1;
1469 image_create_info.arrayLayers = 4;
1470 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1471 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1472 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1473 image_create_info.flags = 0;
1474
1475 src_image_obj.init(&image_create_info);
1476 ASSERT_TRUE(src_image_obj.initialized());
1477
1478 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1479 dst_image_obj.init(&image_create_info);
1480 ASSERT_TRUE(dst_image_obj.initialized());
1481
1482 m_commandBuffer->begin();
1483 VkImageCopy copyRegion;
1484 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1485 copyRegion.srcSubresource.mipLevel = 0;
1486 copyRegion.srcSubresource.baseArrayLayer = 0;
1487 copyRegion.srcSubresource.layerCount = 1;
1488 copyRegion.srcOffset.x = 0;
1489 copyRegion.srcOffset.y = 0;
1490 copyRegion.srcOffset.z = 0;
1491 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1492 copyRegion.dstSubresource.mipLevel = 0;
1493 copyRegion.dstSubresource.baseArrayLayer = 0;
1494 // Introduce failure by forcing the dst layerCount to differ from src
1495 copyRegion.dstSubresource.layerCount = 3;
1496 copyRegion.dstOffset.x = 0;
1497 copyRegion.dstOffset.y = 0;
1498 copyRegion.dstOffset.z = 0;
1499 copyRegion.extent.width = 1;
1500 copyRegion.extent.height = 1;
1501 copyRegion.extent.depth = 1;
1502
sfricke-samsung30b094c2020-05-30 11:42:11 -07001503 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1504 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001505 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1506 &copyRegion);
1507 m_errorMonitor->VerifyFound();
1508}
1509
1510TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1511 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1512
Jeff Leger465acf52020-10-12 18:07:16 -04001513 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1514
1515 bool copy_commands2 = false;
1516 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1517 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1518 copy_commands2 = true;
1519 }
1520 ASSERT_NO_FATAL_FAILURE(InitState());
1521
1522 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001523 if (copy_commands2) {
1524 vkCmdCopyBufferToImage2Function =
1525 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001526 }
unknown088160a2019-05-23 17:43:13 -06001527
1528 VkPhysicalDeviceFeatures device_features = {};
1529 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1530 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1531 if (device_features.textureCompressionBC) {
1532 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1533 } else if (device_features.textureCompressionETC2) {
1534 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1535 } else if (device_features.textureCompressionASTC_LDR) {
1536 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1537 } else {
1538 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1539 return;
1540 }
1541
sfricke-samsung1c61f192021-12-31 01:53:03 -06001542 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001543 ci.flags = 0;
1544 ci.imageType = VK_IMAGE_TYPE_2D;
1545 ci.format = compressed_format;
1546 ci.extent = {32, 32, 1};
1547 ci.mipLevels = 6;
1548 ci.arrayLayers = 1;
1549 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1550 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1551 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1552 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1553 ci.queueFamilyIndexCount = 0;
1554 ci.pQueueFamilyIndices = NULL;
1555 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1556
1557 VkImageObj image(m_device);
1558 image.init(&ci);
1559 ASSERT_TRUE(image.initialized());
1560
1561 VkImageObj odd_image(m_device);
1562 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1563 odd_image.init(&ci);
1564 ASSERT_TRUE(odd_image.initialized());
1565
1566 // Allocate buffers
1567 VkMemoryPropertyFlags reqs = 0;
1568 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1569 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1570 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1571 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1572 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1573
1574 VkBufferImageCopy region = {};
1575 region.bufferRowLength = 0;
1576 region.bufferImageHeight = 0;
1577 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1578 region.imageSubresource.layerCount = 1;
1579 region.imageOffset = {0, 0, 0};
1580 region.bufferOffset = 0;
1581
1582 // start recording
1583 m_commandBuffer->begin();
1584
locke-lunargdf00db02020-03-04 19:00:57 -07001585 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001586 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001587 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1588 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001589 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001590 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1591 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001592 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001593 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1594 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1595
unknown088160a2019-05-23 17:43:13 -06001596 // Mip level copies that work - 5 levels
1597 m_errorMonitor->ExpectSuccess();
1598
1599 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1600 region.imageExtent = {32, 32, 1};
1601 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001602 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001603
1604 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1605 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001606 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001607
1608 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1609 region.imageExtent = {8, 8, 1};
1610 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001611 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001612
1613 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1614 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001615 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001616
1617 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1618 region.imageExtent = {4, 4, 1};
1619 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001620 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001621
1622 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1623 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001624 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001625
1626 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1627 region.imageExtent = {2, 2, 1};
1628 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001629
1630 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1631 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001632 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001633
1634 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1635 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001636 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001637
1638 region.imageExtent = {1, 1, 1};
1639 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001640
1641 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1642 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001643 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001644
1645 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1646 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001647 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001648 m_errorMonitor->VerifyNotFound();
1649
1650 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001652 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001653 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001655 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001656 m_errorMonitor->VerifyFound();
1657
1658 // Copy width < compressed block size, but not the full mip width
1659 region.imageExtent = {1, 2, 1};
1660 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001661 // width not a multiple of compressed block width
1662 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001663 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001664 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001665 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001666 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001667
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001668 m_errorMonitor->SetDesiredFailureMsg(
1669 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001670 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001671 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001672 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001673 m_errorMonitor->VerifyFound();
1674
1675 // Copy height < compressed block size but not the full mip height
1676 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001677 m_errorMonitor->SetDesiredFailureMsg(
1678 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001679 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001680 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001681 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001682 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001683
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001684 m_errorMonitor->SetDesiredFailureMsg(
1685 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001686 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001687 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001688 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001689 m_errorMonitor->VerifyFound();
1690
1691 // Offsets must be multiple of compressed block size
1692 region.imageOffset = {1, 1, 0};
1693 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001694 // imageOffset not a multiple of block size
1695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001696 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001697 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001698 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001699 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001700
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001701 m_errorMonitor->SetDesiredFailureMsg(
1702 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001704 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001705 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001706 m_errorMonitor->VerifyFound();
1707
Jeff Leger465acf52020-10-12 18:07:16 -04001708 // Equivalent test using KHR_copy_commands2
1709 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1710 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1711 NULL,
1712 region.bufferOffset,
1713 region.bufferRowLength,
1714 region.bufferImageHeight,
1715 region.imageSubresource,
1716 region.imageOffset,
1717 region.imageExtent};
1718 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1719 NULL,
1720 buffer_16.handle(),
1721 image.handle(),
1722 VK_IMAGE_LAYOUT_GENERAL,
1723 1,
1724 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001725 m_errorMonitor->SetDesiredFailureMsg(
Tony-LunarG953d55a2021-11-11 14:20:25 -07001726 kErrorBit, "VUID-VkCopyBufferToImageInfo2-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Tony-LunarG953d55a2021-11-11 14:20:25 -07001728 "VUID-VkCopyBufferToImageInfo2-imageOffset-01793"); // image transfer granularity
Jeff Leger465acf52020-10-12 18:07:16 -04001729 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1730 m_errorMonitor->VerifyFound();
1731 }
1732
unknown088160a2019-05-23 17:43:13 -06001733 // Offset + extent width = mip width - should succeed
1734 region.imageOffset = {4, 4, 0};
1735 region.imageExtent = {3, 4, 1};
1736 region.imageSubresource.mipLevel = 2;
1737 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001738
1739 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1740 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001741 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1742 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001743
1744 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1745 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001746 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1747 &region);
unknown088160a2019-05-23 17:43:13 -06001748 m_errorMonitor->VerifyNotFound();
1749
unknown088160a2019-05-23 17:43:13 -06001750 // Offset + extent width < mip width and not a multiple of block width - should fail
1751 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001752 m_errorMonitor->SetDesiredFailureMsg(
1753 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001754 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001755 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001756 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1757 &region);
unknown088160a2019-05-23 17:43:13 -06001758 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001759 m_errorMonitor->SetDesiredFailureMsg(
1760 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001762 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001763 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1764 &region);
unknown088160a2019-05-23 17:43:13 -06001765 m_errorMonitor->VerifyFound();
1766}
1767
1768TEST_F(VkLayerTest, ImageBufferCopyTests) {
1769 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001770
1771 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1772 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1773 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1774 if (mp_extensions) {
1775 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1776 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001777 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001778 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001779 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1780 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1781 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1782 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001783 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001784 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1785 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1786 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1787 }
1788 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001789
1790 // Bail if any dimension of transfer granularity is 0.
1791 auto index = m_device->graphics_queue_node_index_;
1792 auto queue_family_properties = m_device->phy().queue_properties();
1793 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1794 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1795 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1796 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1797 return;
1798 }
1799
sfricke-samsung6d97e562020-01-07 22:01:00 -08001800 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1801 // 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 -07001802 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1803 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001804 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001805 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1806 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1807 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1808 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1809 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001810 // compression
1811 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1812 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1813 // multi-planar
1814 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 -06001815
sfricke-samsung6d97e562020-01-07 22:01:00 -08001816 // Verify R8G8B8A8_UINT format is supported for transfer
1817 bool missing_rgba_support = false;
1818 VkFormatProperties props = {0, 0, 0};
1819 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1820 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1821 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1822 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1823
1824 if (!missing_rgba_support) {
1825 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1826 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1827 VK_IMAGE_TILING_OPTIMAL, 0);
1828 ASSERT_TRUE(image_64k.initialized());
1829
1830 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1831 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1832 VK_IMAGE_TILING_OPTIMAL, 0);
1833 ASSERT_TRUE(image_16k.initialized());
1834 }
unknown088160a2019-05-23 17:43:13 -06001835
1836 // Verify all needed Depth/Stencil formats are supported
1837 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001838 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001839 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1840 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1841 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001842 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001843 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1844 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1845 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001846 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001847 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1848 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1849 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001850 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001851 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1852 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1853 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1854
1855 if (!missing_ds_support) {
1856 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1857 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1858 ASSERT_TRUE(image_16k_depth.initialized());
1859
1860 ds_image_4D_1S.Init(
1861 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1862 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1863 VK_IMAGE_TILING_OPTIMAL, 0);
1864 ASSERT_TRUE(ds_image_4D_1S.initialized());
1865
1866 ds_image_3D_1S.Init(
1867 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1868 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1869 VK_IMAGE_TILING_OPTIMAL, 0);
1870 ASSERT_TRUE(ds_image_3D_1S.initialized());
1871
1872 ds_image_2D.Init(
1873 256, 256, 1, VK_FORMAT_D16_UNORM,
1874 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1875 VK_IMAGE_TILING_OPTIMAL, 0);
1876 ASSERT_TRUE(ds_image_2D.initialized());
1877
1878 ds_image_1S.Init(
1879 256, 256, 1, VK_FORMAT_S8_UINT,
1880 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1881 VK_IMAGE_TILING_OPTIMAL, 0);
1882 ASSERT_TRUE(ds_image_1S.initialized());
1883 }
1884
1885 // Allocate buffers
1886 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1887 VkMemoryPropertyFlags reqs = 0;
1888 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1889 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1890 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1891 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1892
1893 VkBufferImageCopy region = {};
1894 region.bufferRowLength = 0;
1895 region.bufferImageHeight = 0;
1896 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1897 region.imageSubresource.layerCount = 1;
1898 region.imageOffset = {0, 0, 0};
1899 region.imageExtent = {64, 64, 1};
1900 region.bufferOffset = 0;
1901
locke-lunargdf00db02020-03-04 19:00:57 -07001902 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001903 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001904 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1905 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001906 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001907 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1908 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001909 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001910 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1911 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1912
sfricke-samsung6d97e562020-01-07 22:01:00 -08001913 if (missing_rgba_support) {
1914 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001915
sfricke-samsung6d97e562020-01-07 22:01:00 -08001916 // start recording for future tests
1917 m_commandBuffer->begin();
1918 } else {
1919 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001921 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1922 &region);
unknown088160a2019-05-23 17:43:13 -06001923 m_errorMonitor->VerifyFound();
1924
Mark Lobodzinski20310782020-02-28 14:25:17 -07001925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001926 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1927 &region);
1928 m_errorMonitor->VerifyFound();
1929
1930 // start recording
1931 m_commandBuffer->begin();
1932
1933 // successful copies
1934 m_errorMonitor->ExpectSuccess();
1935 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1936 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001937
1938 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1939 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001940 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1941 &region);
1942 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001943
1944 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1945 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001946 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1947 &region);
1948 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001949
1950 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1951 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001952 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1953 &region);
1954 region.imageOffset.x = 0;
1955 region.imageExtent.height = 64;
1956 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001957
1958 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1959 &mem_barriers[1], 0, nullptr, 0, nullptr);
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->VerifyNotFound();
1963
1964 // image/buffer too small (extent too large) on copy to image
1965 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001966 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001967 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1968 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1969 &region);
1970 m_errorMonitor->VerifyFound();
1971
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001972 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001973 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001974 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001975 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1976 &region);
1977 m_errorMonitor->VerifyFound();
1978
1979 // image/buffer too small (offset) on copy to image
1980 region.imageExtent = {64, 64, 1};
1981 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001983 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1984 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1985 &region);
1986 m_errorMonitor->VerifyFound();
1987
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001988 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
1989 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001990 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001991 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001992 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1993 &region);
1994 m_errorMonitor->VerifyFound();
1995
1996 // image/buffer too small on copy to buffer
1997 region.imageExtent = {64, 64, 1};
1998 region.imageOffset = {0, 0, 0};
1999 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002001 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
2002 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2003 &region);
2004 m_errorMonitor->VerifyFound();
2005
2006 region.imageExtent = {64, 65, 1};
2007 region.bufferOffset = 0;
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002008 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002010 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08002011 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
2012 &region);
2013 m_errorMonitor->VerifyFound();
2014
2015 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002016 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002017 region.imageExtent = {64, 64, 1};
2018 region.bufferRowLength = 68;
2019 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2020 &region);
2021 m_errorMonitor->VerifyFound();
2022
2023 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002024 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002025 region.imageExtent.width = 0;
2026 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2027 &region);
2028 m_errorMonitor->VerifyFound();
2029
2030 // aspect bits
2031 region.imageExtent = {64, 64, 1};
2032 region.bufferRowLength = 0;
2033 region.bufferImageHeight = 0;
2034 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002036 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2037 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2038 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2039 buffer_16k.handle(), 1, &region);
2040 m_errorMonitor->VerifyFound();
2041
Mark Lobodzinski20310782020-02-28 14:25:17 -07002042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002043 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002044 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2045 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2046 buffer_16k.handle(), 1, &region);
2047 m_errorMonitor->VerifyFound();
2048 }
2049
Mark Lobodzinski20310782020-02-28 14:25:17 -07002050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002051 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002052 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2053 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2054 &region);
2055 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002056 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002057
2058 // Out-of-range mip levels should fail
2059 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002060 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002061 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06221");
2062 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002063 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002064 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002065 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002066 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002067 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2068 &region);
2069 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002071 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2072 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002073 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002074 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002075 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002076 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002077 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2078 &region);
2079 m_errorMonitor->VerifyFound();
2080 region.imageSubresource.mipLevel = 0;
2081
2082 // Out-of-range array layers should fail
2083 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2084 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002085 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002086 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2087 &region);
2088 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002090 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2091 &region);
2092 m_errorMonitor->VerifyFound();
2093 region.imageSubresource.baseArrayLayer = 0;
2094
2095 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002097 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2098 buffer_16k.handle(), 1, &region);
2099 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002101 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2102 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002103 m_errorMonitor->VerifyFound();
2104 }
2105
unknown088160a2019-05-23 17:43:13 -06002106 // Test Depth/Stencil copies
2107 if (missing_ds_support) {
2108 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2109 } else {
2110 VkBufferImageCopy ds_region = {};
2111 ds_region.bufferOffset = 0;
2112 ds_region.bufferRowLength = 0;
2113 ds_region.bufferImageHeight = 0;
2114 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2115 ds_region.imageSubresource.mipLevel = 0;
2116 ds_region.imageSubresource.baseArrayLayer = 0;
2117 ds_region.imageSubresource.layerCount = 1;
2118 ds_region.imageOffset = {0, 0, 0};
2119 ds_region.imageExtent = {256, 256, 1};
2120
2121 // Depth copies that should succeed
2122 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002123 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2124 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002125 m_errorMonitor->VerifyNotFound();
2126
2127 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002128 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2129 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002130 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2131 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002132 m_errorMonitor->VerifyNotFound();
2133
2134 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002135 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2136 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002137 m_errorMonitor->VerifyNotFound();
2138
2139 // Depth copies that should fail
2140 ds_region.bufferOffset = 4;
2141 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002142 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002143 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002144 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2145 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002146 m_errorMonitor->VerifyFound();
2147
2148 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002149 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002150 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002151 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002152 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002153 m_errorMonitor->VerifyFound();
2154
2155 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002156 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002157 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002158 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2159 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002160 m_errorMonitor->VerifyFound();
2161
sfricke-samsung5a019492021-01-25 10:32:08 -08002162 ds_region.bufferOffset = 5;
2163 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2165 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2166 buffer_128k.handle(), 1, &ds_region);
2167 m_errorMonitor->VerifyFound();
2168 ds_region.imageExtent = {256, 256, 1};
2169
unknown088160a2019-05-23 17:43:13 -06002170 // Stencil copies that should succeed
2171 ds_region.bufferOffset = 0;
2172 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2173 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002174 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2175 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002176 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2177 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002178 m_errorMonitor->VerifyNotFound();
2179
2180 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002181 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2182 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002183 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2184 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002185 m_errorMonitor->VerifyNotFound();
2186
2187 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002188 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2189 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002190 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2191 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002192 m_errorMonitor->VerifyNotFound();
2193
2194 // Stencil copies that should fail
2195 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002196 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002197 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002198 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2199 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002200 m_errorMonitor->VerifyFound();
2201
2202 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002203 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002204 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2205 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002206 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2207 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002208 m_errorMonitor->VerifyFound();
2209
2210 ds_region.bufferRowLength = 0;
2211 ds_region.bufferOffset = 4;
2212 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002213 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002214 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002215 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2216 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002217 m_errorMonitor->VerifyFound();
2218 }
2219
2220 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002221 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002222 VkPhysicalDeviceFeatures device_features = {};
2223 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2224 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2225 device_features.textureCompressionASTC_LDR)) {
2226 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2227 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002228 // Verify transfer support for each compression format used blow
2229 bool missing_bc_support = false;
2230 bool missing_etc_support = false;
2231 bool missing_astc_support = false;
2232 bool missing_compression_support = false;
2233
2234 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2235 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2236 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2237 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2238
2239 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2240 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2241 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2242 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2243
2244 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2245 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2246 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2247 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2248
2249 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002250 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2251 0);
2252 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2253 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002254 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002255 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2256 VK_IMAGE_TILING_OPTIMAL, 0);
2257 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2258 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002259 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002260 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2261 VK_IMAGE_TILING_OPTIMAL, 0);
2262 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2263 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002264 } else {
2265 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002266 }
unknown088160a2019-05-23 17:43:13 -06002267
sfricke-samsung6d97e562020-01-07 22:01:00 -08002268 if (missing_compression_support) {
2269 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2270 } else {
2271 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002272 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002273 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002274 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2275 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002276 m_errorMonitor->ExpectSuccess();
2277 region.imageExtent = {128, 128, 1};
2278 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2279 buffer_16k.handle(), 1, &region);
2280 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002281
sfricke-samsung6d97e562020-01-07 22:01:00 -08002282 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002284 region.bufferOffset = 16;
2285 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2286 buffer_16k.handle(), 1, &region);
2287 m_errorMonitor->VerifyFound();
2288 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002289
sfricke-samsung6d97e562020-01-07 22:01:00 -08002290 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002291 m_errorMonitor->SetDesiredFailureMsg(
2292 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002293 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002294 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2295 region.imageExtent.width = 66;
2296 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2297 buffer_16k.handle(), 1, &region);
2298 m_errorMonitor->VerifyFound();
2299 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002300
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002301 m_errorMonitor->SetDesiredFailureMsg(
2302 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002304 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2305 region.imageExtent.height = 2;
2306 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2307 buffer_16k.handle(), 1, &region);
2308 m_errorMonitor->VerifyFound();
2309 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002310
sfricke-samsung6d97e562020-01-07 22:01:00 -08002311 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002312
sfricke-samsung6d97e562020-01-07 22:01:00 -08002313 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2314 m_errorMonitor->ExpectSuccess();
2315 region.imageExtent.width = 66;
2316 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002317 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2318 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002319 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2320 buffer_16k.handle(), 1, &region);
2321 region.imageExtent.width = 16;
2322 region.imageOffset.x = 0;
2323 region.imageExtent.height = 2;
2324 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002325 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2326 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002327 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2328 buffer_16k.handle(), 1, &region);
2329 m_errorMonitor->VerifyNotFound();
2330 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002331
sfricke-samsung6d97e562020-01-07 22:01:00 -08002332 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002334 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002335 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002337 region.imageExtent = {64, 64, 1};
2338 region.bufferOffset = 24;
2339 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2340 buffer_16k.handle(), 1, &region);
2341 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002342
sfricke-samsung6d97e562020-01-07 22:01:00 -08002343 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002344 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002345 region.bufferOffset = 0;
2346 region.bufferRowLength = 130;
2347 region.bufferImageHeight = 0;
2348 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2349 buffer_64k.handle(), 1, &region);
2350 m_errorMonitor->VerifyFound();
2351
2352 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002353 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002354 region.bufferRowLength = 0;
2355 region.bufferImageHeight = 130;
2356 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2357 buffer_64k.handle(), 1, &region);
2358 m_errorMonitor->VerifyFound();
2359 }
2360 }
2361
2362 // Test multi-planar formats, if supported
2363 if (!mp_extensions) {
2364 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2365 } else {
2366 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2367 // being required with samplerYcbcrConversion feature
2368 bool missing_mp_support = false;
2369 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2370 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2371 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2372 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2373
2374 if (missing_mp_support) {
2375 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2376 } else {
2377 VkBufferImageCopy mp_region = {};
2378 mp_region.bufferOffset = 0;
2379 mp_region.bufferRowLength = 0;
2380 mp_region.bufferImageHeight = 0;
2381 mp_region.imageSubresource.mipLevel = 0;
2382 mp_region.imageSubresource.baseArrayLayer = 0;
2383 mp_region.imageSubresource.layerCount = 1;
2384 mp_region.imageOffset = {0, 0, 0};
2385 mp_region.imageExtent = {128, 128, 1};
2386
2387 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2388 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2389 VK_IMAGE_TILING_OPTIMAL, 0);
2390 ASSERT_TRUE(image_multi_planar.initialized());
2391
2392 // Copies into a mutli-planar image aspect properly
2393 m_errorMonitor->ExpectSuccess();
2394 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002395 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2396 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002397 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2398 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2399 m_errorMonitor->VerifyNotFound();
2400
2401 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002403 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2404 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2405 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2406 m_errorMonitor->VerifyFound();
2407
2408 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002409 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002410 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2411 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2412 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2413 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002414
2415 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002417 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2418 mp_region.bufferOffset = 5;
2419 mp_region.imageExtent = {8, 8, 1};
2420 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2421 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2422 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002423 }
unknown088160a2019-05-23 17:43:13 -06002424 }
2425}
2426
2427TEST_F(VkLayerTest, MiscImageLayerTests) {
2428 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2429
2430 ASSERT_NO_FATAL_FAILURE(Init());
2431
2432 // TODO: Ideally we should check if a format is supported, before using it.
2433 VkImageObj image(m_device);
2434 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2435 ASSERT_TRUE(image.initialized());
2436 VkBufferObj buffer;
2437 VkMemoryPropertyFlags reqs = 0;
2438 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2439 VkBufferImageCopy region = {};
2440 region.bufferRowLength = 128;
2441 region.bufferImageHeight = 128;
2442 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2443 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2444 region.imageSubresource.layerCount = 1;
2445 region.imageExtent.height = 4;
2446 region.imageExtent.width = 4;
2447 region.imageExtent.depth = 1;
2448
2449 VkImageObj image2(m_device);
2450 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2451 ASSERT_TRUE(image2.initialized());
2452 VkBufferObj buffer2;
2453 VkMemoryPropertyFlags reqs2 = 0;
2454 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002455 m_commandBuffer->begin();
2456
2457 // Image must have offset.z of 0 and extent.depth of 1
2458 // Introduce failure by setting imageExtent.depth to 0
2459 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002460 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002461 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2462 &region);
unknown088160a2019-05-23 17:43:13 -06002463 m_errorMonitor->VerifyFound();
2464
2465 region.imageExtent.depth = 1;
2466
2467 // Image must have offset.z of 0 and extent.depth of 1
2468 // Introduce failure by setting imageOffset.z to 4
2469 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2470 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002471 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2472 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002473 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-06217");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002474 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2475 &region);
unknown088160a2019-05-23 17:43:13 -06002476 m_errorMonitor->VerifyFound();
2477
2478 region.imageOffset.z = 0;
2479 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2480 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2481 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002482 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002483 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2484 &region);
unknown088160a2019-05-23 17:43:13 -06002485 m_errorMonitor->VerifyFound();
2486
unknown088160a2019-05-23 17:43:13 -06002487 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2488 region.bufferOffset = 0;
2489 region.imageExtent.height = 128;
2490 region.imageExtent.width = 128;
2491 // Introduce failure by setting bufferRowLength > 0 but less than width
2492 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002494 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2495 &region);
unknown088160a2019-05-23 17:43:13 -06002496 m_errorMonitor->VerifyFound();
2497
2498 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2499 region.bufferRowLength = 128;
2500 // Introduce failure by setting bufferRowHeight > 0 but less than height
2501 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002502 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002503 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2504 &region);
unknown088160a2019-05-23 17:43:13 -06002505 m_errorMonitor->VerifyFound();
2506
2507 region.bufferImageHeight = 128;
2508 VkImageObj intImage1(m_device);
2509 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2510 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2511 VkImageObj intImage2(m_device);
2512 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2513 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2514 VkImageBlit blitRegion = {};
2515 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2516 blitRegion.srcSubresource.baseArrayLayer = 0;
2517 blitRegion.srcSubresource.layerCount = 1;
2518 blitRegion.srcSubresource.mipLevel = 0;
2519 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2520 blitRegion.dstSubresource.baseArrayLayer = 0;
2521 blitRegion.dstSubresource.layerCount = 1;
2522 blitRegion.dstSubresource.mipLevel = 0;
2523 blitRegion.srcOffsets[0] = {128, 0, 0};
2524 blitRegion.srcOffsets[1] = {128, 128, 1};
2525 blitRegion.dstOffsets[0] = {0, 128, 0};
2526 blitRegion.dstOffsets[1] = {128, 128, 1};
2527
2528 // Look for NULL-blit warning
sfricke-samsung85584a72021-09-30 21:43:38 -07002529 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
2530 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002531 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2532 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002533 m_errorMonitor->VerifyFound();
2534}
2535
2536TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2537 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002538 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2539
2540 bool copy_commands2 = false;
2541 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2542 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2543 copy_commands2 = true;
2544 }
2545 ASSERT_NO_FATAL_FAILURE(InitState());
2546
2547 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2548 if (copy_commands2) {
2549 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2550 }
unknown088160a2019-05-23 17:43:13 -06002551
sfricke-samsung30b094c2020-05-30 11:42:11 -07002552 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2553 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2554 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2555 return;
2556 }
2557
sfricke-samsung1c61f192021-12-31 01:53:03 -06002558 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002559 ci.flags = 0;
2560 ci.imageType = VK_IMAGE_TYPE_1D;
2561 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2562 ci.extent = {32, 1, 1};
2563 ci.mipLevels = 1;
2564 ci.arrayLayers = 1;
2565 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2566 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2567 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2568 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2569 ci.queueFamilyIndexCount = 0;
2570 ci.pQueueFamilyIndices = NULL;
2571 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2572
2573 // Create 1D image
2574 VkImageObj image_1D(m_device);
2575 image_1D.init(&ci);
2576 ASSERT_TRUE(image_1D.initialized());
2577
2578 // 2D image
2579 ci.imageType = VK_IMAGE_TYPE_2D;
2580 ci.extent = {32, 32, 1};
2581 VkImageObj image_2D(m_device);
2582 image_2D.init(&ci);
2583 ASSERT_TRUE(image_2D.initialized());
2584
2585 // 3D image
2586 ci.imageType = VK_IMAGE_TYPE_3D;
2587 ci.extent = {32, 32, 8};
2588 VkImageObj image_3D(m_device);
2589 image_3D.init(&ci);
2590 ASSERT_TRUE(image_3D.initialized());
2591
2592 // 2D image array
2593 ci.imageType = VK_IMAGE_TYPE_2D;
2594 ci.extent = {32, 32, 1};
2595 ci.arrayLayers = 8;
2596 VkImageObj image_2D_array(m_device);
2597 image_2D_array.init(&ci);
2598 ASSERT_TRUE(image_2D_array.initialized());
2599
2600 m_commandBuffer->begin();
2601
2602 VkImageCopy copy_region;
2603 copy_region.extent = {32, 1, 1};
2604 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2605 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2606 copy_region.srcSubresource.mipLevel = 0;
2607 copy_region.dstSubresource.mipLevel = 0;
2608 copy_region.srcSubresource.baseArrayLayer = 0;
2609 copy_region.dstSubresource.baseArrayLayer = 0;
2610 copy_region.srcSubresource.layerCount = 1;
2611 copy_region.dstSubresource.layerCount = 1;
2612 copy_region.srcOffset = {0, 0, 0};
2613 copy_region.dstOffset = {0, 0, 0};
2614
2615 // Sanity check
2616 m_errorMonitor->ExpectSuccess();
2617 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2618 &copy_region);
2619 m_errorMonitor->VerifyNotFound();
2620
Jeff Leger465acf52020-10-12 18:07:16 -04002621 // Equivalent sanity check using KHR_copy_commands2
2622 if (copy_commands2 && vkCmdCopyImage2Function) {
2623 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2624 NULL,
2625 copy_region.srcSubresource,
2626 copy_region.srcOffset,
2627 copy_region.dstSubresource,
2628 copy_region.dstOffset,
2629 copy_region.extent};
2630 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2631 NULL,
2632 image_1D.image(),
2633 VK_IMAGE_LAYOUT_GENERAL,
2634 image_2D.image(),
2635 VK_IMAGE_LAYOUT_GENERAL,
2636 1,
2637 &region2};
2638 m_errorMonitor->ExpectSuccess();
2639 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2640 m_errorMonitor->VerifyNotFound();
2641 }
2642
unknown088160a2019-05-23 17:43:13 -06002643 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2644 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002645 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002647 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2648 &copy_region);
2649 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002650
2651 // Equivalent test using KHR_copy_commands2
2652 if (copy_commands2 && vkCmdCopyImage2Function) {
2653 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2654 NULL,
2655 copy_region.srcSubresource,
2656 copy_region.srcOffset,
2657 copy_region.dstSubresource,
2658 copy_region.dstOffset,
2659 copy_region.extent};
2660 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2661 NULL,
2662 image_1D.image(),
2663 VK_IMAGE_LAYOUT_GENERAL,
2664 image_2D.image(),
2665 VK_IMAGE_LAYOUT_GENERAL,
2666 1,
2667 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002668 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002670 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2671 m_errorMonitor->VerifyFound();
2672 }
2673
unknown088160a2019-05-23 17:43:13 -06002674 copy_region.srcOffset.y = 0;
2675 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002678 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2679 &copy_region);
2680 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002681
2682 // Equivalent test using KHR_copy_commands2
2683 if (copy_commands2 && vkCmdCopyImage2Function) {
2684 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2685 NULL,
2686 copy_region.srcSubresource,
2687 copy_region.srcOffset,
2688 copy_region.dstSubresource,
2689 copy_region.dstOffset,
2690 copy_region.extent};
2691 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2692 NULL,
2693 image_2D.image(),
2694 VK_IMAGE_LAYOUT_GENERAL,
2695 image_1D.image(),
2696 VK_IMAGE_LAYOUT_GENERAL,
2697 1,
2698 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2700 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002701 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2702 m_errorMonitor->VerifyFound();
2703 }
2704
unknown088160a2019-05-23 17:43:13 -06002705 copy_region.dstOffset.y = 0;
2706
2707 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2708 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002711 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2712 &copy_region);
2713 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002714
2715 // Equivalent test using KHR_copy_commands2
2716 if (copy_commands2 && vkCmdCopyImage2Function) {
2717 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2718 NULL,
2719 copy_region.srcSubresource,
2720 copy_region.srcOffset,
2721 copy_region.dstSubresource,
2722 copy_region.dstOffset,
2723 copy_region.extent};
2724 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2725 NULL,
2726 image_1D.image(),
2727 VK_IMAGE_LAYOUT_GENERAL,
2728 image_2D.image(),
2729 VK_IMAGE_LAYOUT_GENERAL,
2730 1,
2731 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002734 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2735 m_errorMonitor->VerifyFound();
2736 }
2737
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002740 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2741 &copy_region);
2742 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002743
2744 // Equivalent test using KHR_copy_commands2
2745 if (copy_commands2 && vkCmdCopyImage2Function) {
2746 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2747 NULL,
2748 copy_region.srcSubresource,
2749 copy_region.srcOffset,
2750 copy_region.dstSubresource,
2751 copy_region.dstOffset,
2752 copy_region.extent};
2753 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2754 NULL,
2755 image_2D.image(),
2756 VK_IMAGE_LAYOUT_GENERAL,
2757 image_1D.image(),
2758 VK_IMAGE_LAYOUT_GENERAL,
2759 1,
2760 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002763 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2764 m_errorMonitor->VerifyFound();
2765 }
2766
unknown088160a2019-05-23 17:43:13 -06002767 copy_region.extent.height = 1;
2768
2769 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2770 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002773 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2774 &copy_region);
2775 m_errorMonitor->VerifyFound();
2776 copy_region.srcOffset.z = 0;
2777 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002778 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2779 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002780 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2781 &copy_region);
2782 m_errorMonitor->VerifyFound();
2783 copy_region.dstOffset.z = 0;
2784
2785 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2786 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002789 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002790 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002791 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002793 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002794 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2795 &copy_region);
2796 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002798 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002799 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002800 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002801 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002802 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002803 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002804 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2805 &copy_region);
2806 m_errorMonitor->VerifyFound();
2807 copy_region.extent.depth = 1;
2808
2809 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2810 copy_region.extent = {16, 16, 1};
2811 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002814 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002815 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2816 &copy_region);
2817 m_errorMonitor->VerifyFound();
2818 copy_region.srcOffset.z = 0;
2819 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002822 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002823 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2824 &copy_region);
2825 m_errorMonitor->VerifyFound();
2826 copy_region.dstOffset.z = 0;
2827
2828 // 3D texture accessing an array layer other than 0. VU 09c0011a
2829 copy_region.extent = {4, 4, 1};
2830 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002831 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002833 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2834 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2835 &copy_region);
2836 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002837 copy_region.srcSubresource.baseArrayLayer = 0;
2838
unknown088160a2019-05-23 17:43:13 -06002839 m_commandBuffer->end();
2840}
2841
2842TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2843 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002844 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07002845 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
2846 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06002847 } else {
2848 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2849 return;
2850 }
2851 ASSERT_NO_FATAL_FAILURE(InitState());
2852
2853 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2854 VkFormatProperties format_props;
2855 // TODO: Remove this check if or when devsim handles extensions.
2856 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2857 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002858 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002859 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2860 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2861 return;
2862 }
2863
sfricke-samsung1c61f192021-12-31 01:53:03 -06002864 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002865 ci.flags = 0;
2866 ci.imageType = VK_IMAGE_TYPE_1D;
2867 ci.format = image_format;
2868 ci.extent = {32, 1, 1};
2869 ci.mipLevels = 1;
2870 ci.arrayLayers = 1;
2871 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2872 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2873 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2874 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2875 ci.queueFamilyIndexCount = 0;
2876 ci.pQueueFamilyIndices = NULL;
2877 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2878
2879 // Create 1D image
2880 VkImageObj image_1D(m_device);
2881 image_1D.init(&ci);
2882 ASSERT_TRUE(image_1D.initialized());
2883
2884 // 2D image
2885 ci.imageType = VK_IMAGE_TYPE_2D;
2886 ci.extent = {32, 32, 1};
2887 VkImageObj image_2D(m_device);
2888 image_2D.init(&ci);
2889 ASSERT_TRUE(image_2D.initialized());
2890
2891 // 3D image
2892 ci.imageType = VK_IMAGE_TYPE_3D;
2893 ci.extent = {32, 32, 8};
2894 VkImageObj image_3D(m_device);
2895 image_3D.init(&ci);
2896 ASSERT_TRUE(image_3D.initialized());
2897
2898 // 2D image array
2899 ci.imageType = VK_IMAGE_TYPE_2D;
2900 ci.extent = {32, 32, 1};
2901 ci.arrayLayers = 8;
2902 VkImageObj image_2D_array(m_device);
2903 image_2D_array.init(&ci);
2904 ASSERT_TRUE(image_2D_array.initialized());
2905
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002906 // second 2D image array
2907 ci.imageType = VK_IMAGE_TYPE_2D;
2908 ci.extent = {32, 32, 1};
2909 ci.arrayLayers = 8;
2910 VkImageObj image_2D_array_2(m_device);
2911 image_2D_array_2.init(&ci);
2912 ASSERT_TRUE(image_2D_array_2.initialized());
2913
unknown088160a2019-05-23 17:43:13 -06002914 m_commandBuffer->begin();
2915
2916 VkImageCopy copy_region;
2917 copy_region.extent = {32, 1, 1};
2918 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2919 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2920 copy_region.srcSubresource.mipLevel = 0;
2921 copy_region.dstSubresource.mipLevel = 0;
2922 copy_region.srcSubresource.baseArrayLayer = 0;
2923 copy_region.dstSubresource.baseArrayLayer = 0;
2924 copy_region.srcSubresource.layerCount = 1;
2925 copy_region.dstSubresource.layerCount = 1;
2926 copy_region.srcOffset = {0, 0, 0};
2927 copy_region.dstOffset = {0, 0, 0};
2928
2929 // Copy from layer not present
2930 copy_region.srcSubresource.baseArrayLayer = 4;
2931 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002933 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2934 &copy_region);
2935 m_errorMonitor->VerifyFound();
2936 copy_region.srcSubresource.baseArrayLayer = 0;
2937 copy_region.srcSubresource.layerCount = 1;
2938
2939 // Copy to layer not present
2940 copy_region.dstSubresource.baseArrayLayer = 1;
2941 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002943 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2944 &copy_region);
2945 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002946 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002947 copy_region.dstSubresource.layerCount = 1;
2948
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002949 // both 2D and extent.depth not 1
2950 // Need two 2D array images to prevent other errors
2951 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002953 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2954 1, &copy_region);
2955 m_errorMonitor->VerifyFound();
2956 copy_region.extent = {32, 1, 1};
2957
2958 // 2D src / 3D dst and depth not equal to src layerCount
2959 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002960 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002961 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002962 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2963 &copy_region);
2964 m_errorMonitor->VerifyFound();
2965 copy_region.extent = {32, 1, 1};
2966
2967 // 3D src / 2D dst and depth not equal to dst layerCount
2968 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002969 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002970 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002971 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2972 &copy_region);
2973 m_errorMonitor->VerifyFound();
2974 copy_region.extent = {32, 1, 1};
2975
unknown088160a2019-05-23 17:43:13 -06002976 m_commandBuffer->end();
2977}
2978
2979TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2980 // Image copy tests on compressed images with block alignment errors
2981 SetTargetApiVersion(VK_API_VERSION_1_1);
2982 ASSERT_NO_FATAL_FAILURE(Init());
2983
2984 // Select a compressed format and verify support
2985 VkPhysicalDeviceFeatures device_features = {};
2986 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2987 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2988 if (device_features.textureCompressionBC) {
2989 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2990 } else if (device_features.textureCompressionETC2) {
2991 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2992 } else if (device_features.textureCompressionASTC_LDR) {
2993 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2994 }
2995
sfricke-samsung1c61f192021-12-31 01:53:03 -06002996 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002997 ci.flags = 0;
2998 ci.imageType = VK_IMAGE_TYPE_2D;
2999 ci.format = compressed_format;
3000 ci.extent = {64, 64, 1};
3001 ci.mipLevels = 1;
3002 ci.arrayLayers = 1;
3003 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3004 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3005 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3006 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3007 ci.queueFamilyIndexCount = 0;
3008 ci.pQueueFamilyIndices = NULL;
3009 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3010
3011 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003012 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
3013 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06003014 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
3015 return;
3016 }
3017
3018 // Create images
3019 VkImageObj image_1(m_device);
3020 image_1.init(&ci);
3021 ASSERT_TRUE(image_1.initialized());
3022
3023 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3024 VkImageObj image_2(m_device);
3025 image_2.init(&ci);
3026 ASSERT_TRUE(image_2.initialized());
3027
3028 m_commandBuffer->begin();
3029
3030 VkImageCopy copy_region;
3031 copy_region.extent = {48, 48, 1};
3032 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3033 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3034 copy_region.srcSubresource.mipLevel = 0;
3035 copy_region.dstSubresource.mipLevel = 0;
3036 copy_region.srcSubresource.baseArrayLayer = 0;
3037 copy_region.dstSubresource.baseArrayLayer = 0;
3038 copy_region.srcSubresource.layerCount = 1;
3039 copy_region.dstSubresource.layerCount = 1;
3040 copy_region.srcOffset = {0, 0, 0};
3041 copy_region.dstOffset = {0, 0, 0};
3042
3043 // Sanity check
3044 m_errorMonitor->ExpectSuccess();
3045 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3046 m_errorMonitor->VerifyNotFound();
3047
3048 std::string vuid;
3049 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3050 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3051
3052 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3053 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003054 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003055 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3057 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003058 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3059 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3060 m_errorMonitor->VerifyFound();
3061 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3063 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003064 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3065 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3066 m_errorMonitor->VerifyFound();
3067 copy_region.srcOffset = {0, 0, 0};
3068
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003069 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003070 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3072 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003073 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3074 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3075 m_errorMonitor->VerifyFound();
3076 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003077 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003079 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3080 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3081 m_errorMonitor->VerifyFound();
3082 copy_region.dstOffset = {0, 0, 0};
3083
3084 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003085 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003086 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003087 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3088 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003089 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3090 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3091 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003092 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003093 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003096 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3097 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3098 m_errorMonitor->VerifyFound();
3099
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003100 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003101 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003102 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003104 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3105 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3106 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003107 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003108 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003111 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3112 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3113 m_errorMonitor->VerifyFound();
3114
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003115 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3116 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003117 // There are currently no supported compressed formats with a block depth other than 1,
3118 // so impossible to create a 'not a multiple' condition for depth.
3119 m_commandBuffer->end();
3120}
3121
3122TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3123 // Image copy tests on single-plane _422 formats with block alignment errors
3124
3125 // Enable KHR multiplane req'd extensions
3126 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3127 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3128 if (mp_extensions) {
3129 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3130 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003131 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003132 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003133 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3134 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3135 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3136 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003137 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003138 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3139 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3140 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3141 } else {
3142 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3143 return;
3144 }
3145 ASSERT_NO_FATAL_FAILURE(InitState());
3146
3147 // Select a _422 format and verify support
sfricke-samsung1c61f192021-12-31 01:53:03 -06003148 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003149 ci.flags = 0;
3150 ci.imageType = VK_IMAGE_TYPE_2D;
3151 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3152 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3153 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3154 ci.mipLevels = 1;
3155 ci.arrayLayers = 1;
3156 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3157 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3158 ci.queueFamilyIndexCount = 0;
3159 ci.pQueueFamilyIndices = NULL;
3160 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3161
3162 // Verify formats
3163 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3164 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3165 if (!supported) {
3166 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3167 return; // Assume there's low ROI on searching for different mp formats
3168 }
3169
3170 // Create images
3171 ci.extent = {64, 64, 1};
3172 VkImageObj image_422(m_device);
3173 image_422.init(&ci);
3174 ASSERT_TRUE(image_422.initialized());
3175
3176 ci.extent = {64, 64, 1};
3177 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3178 VkImageObj image_ucmp(m_device);
3179 image_ucmp.init(&ci);
3180 ASSERT_TRUE(image_ucmp.initialized());
3181
3182 m_commandBuffer->begin();
3183
3184 VkImageCopy copy_region;
3185 copy_region.extent = {48, 48, 1};
3186 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3187 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3188 copy_region.srcSubresource.mipLevel = 0;
3189 copy_region.dstSubresource.mipLevel = 0;
3190 copy_region.srcSubresource.baseArrayLayer = 0;
3191 copy_region.dstSubresource.baseArrayLayer = 0;
3192 copy_region.srcSubresource.layerCount = 1;
3193 copy_region.dstSubresource.layerCount = 1;
3194 copy_region.srcOffset = {0, 0, 0};
3195 copy_region.dstOffset = {0, 0, 0};
3196
3197 // Src offsets must be multiples of compressed block sizes
3198 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003200 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003201 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3202 &copy_region);
3203 m_errorMonitor->VerifyFound();
3204 copy_region.srcOffset = {0, 0, 0};
3205
3206 // Dst offsets must be multiples of compressed block sizes
3207 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003208 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003210 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003211 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3212 &copy_region);
3213 m_errorMonitor->VerifyFound();
3214 copy_region.dstOffset = {0, 0, 0};
3215
3216 // Copy extent must be multiples of compressed block sizes if not full width/height
3217 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003218 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003219 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003220 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3221 &copy_region);
3222 m_errorMonitor->VerifyFound();
3223
unknown357e1782019-09-25 17:57:40 -06003224 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003225 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3226 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003227 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003228 copy_region.dstOffset = {0, 0, 0};
3229
3230 m_commandBuffer->end();
3231}
3232
3233TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3234 // Image copy tests on multiplane images with aspect errors
3235
3236 // Enable KHR multiplane req'd extensions
3237 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3238 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3239 if (mp_extensions) {
3240 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3241 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003242 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003243 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003244 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3245 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3246 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3247 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003248 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003249 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3250 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3251 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3252 } else {
3253 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3254 return;
3255 }
3256 ASSERT_NO_FATAL_FAILURE(InitState());
3257
3258 // Select multi-plane formats and verify support
3259 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3260 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3261
sfricke-samsung1c61f192021-12-31 01:53:03 -06003262 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003263 ci.flags = 0;
3264 ci.imageType = VK_IMAGE_TYPE_2D;
3265 ci.format = mp2_format;
3266 ci.extent = {256, 256, 1};
3267 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3268 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3269 ci.mipLevels = 1;
3270 ci.arrayLayers = 1;
3271 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3272 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3273 ci.queueFamilyIndexCount = 0;
3274 ci.pQueueFamilyIndices = NULL;
3275 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3276
3277 // Verify formats
3278 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3279 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3280 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3281 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3282 ci.format = mp3_format;
3283 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3284 if (!supported) {
3285 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3286 kSkipPrefix);
3287 return; // Assume there's low ROI on searching for different mp formats
3288 }
3289
3290 // Create images
3291 VkImageObj mp3_image(m_device);
3292 mp3_image.init(&ci);
3293 ASSERT_TRUE(mp3_image.initialized());
3294
3295 ci.format = mp2_format;
3296 VkImageObj mp2_image(m_device);
3297 mp2_image.init(&ci);
3298 ASSERT_TRUE(mp2_image.initialized());
3299
3300 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3301 VkImageObj sp_image(m_device);
3302 sp_image.init(&ci);
3303 ASSERT_TRUE(sp_image.initialized());
3304
3305 m_commandBuffer->begin();
3306
3307 VkImageCopy copy_region;
3308 copy_region.extent = {128, 128, 1};
3309 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3310 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3311 copy_region.srcSubresource.mipLevel = 0;
3312 copy_region.dstSubresource.mipLevel = 0;
3313 copy_region.srcSubresource.baseArrayLayer = 0;
3314 copy_region.dstSubresource.baseArrayLayer = 0;
3315 copy_region.srcSubresource.layerCount = 1;
3316 copy_region.dstSubresource.layerCount = 1;
3317 copy_region.srcOffset = {0, 0, 0};
3318 copy_region.dstOffset = {0, 0, 0};
3319
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003320 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003321 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3322 &copy_region);
3323 m_errorMonitor->VerifyFound();
3324
unknown088160a2019-05-23 17:43:13 -06003325 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3326 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003328 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3329 &copy_region);
3330 m_errorMonitor->VerifyFound();
3331
3332 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3333 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003334 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003335 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3336 &copy_region);
3337 m_errorMonitor->VerifyFound();
3338
3339 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003340 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003341 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3342 &copy_region);
3343 m_errorMonitor->VerifyFound();
3344
3345 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003347 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003348 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3349 &copy_region);
3350 m_errorMonitor->VerifyFound();
3351
3352 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3353 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003354 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003355 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003356 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3357 &copy_region);
3358 m_errorMonitor->VerifyFound();
3359
3360 m_commandBuffer->end();
3361}
3362
3363TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3364 // Image copy with source region specified greater than src image size
3365 ASSERT_NO_FATAL_FAILURE(Init());
3366
3367 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003368 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003369 ci.flags = 0;
3370 ci.imageType = VK_IMAGE_TYPE_3D;
3371 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3372 ci.extent = {32, 32, 8};
3373 ci.mipLevels = 6;
3374 ci.arrayLayers = 1;
3375 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3376 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3377 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3378 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3379 ci.queueFamilyIndexCount = 0;
3380 ci.pQueueFamilyIndices = NULL;
3381 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3382
3383 VkImageObj src_image(m_device);
3384 src_image.init(&ci);
3385 ASSERT_TRUE(src_image.initialized());
3386
3387 // Dest image with one more mip level
3388 ci.extent = {64, 64, 16};
3389 ci.mipLevels = 7;
3390 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3391 VkImageObj dst_image(m_device);
3392 dst_image.init(&ci);
3393 ASSERT_TRUE(dst_image.initialized());
3394
3395 m_commandBuffer->begin();
3396
3397 VkImageCopy copy_region;
3398 copy_region.extent = {32, 32, 8};
3399 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3400 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3401 copy_region.srcSubresource.mipLevel = 0;
3402 copy_region.dstSubresource.mipLevel = 0;
3403 copy_region.srcSubresource.baseArrayLayer = 0;
3404 copy_region.dstSubresource.baseArrayLayer = 0;
3405 copy_region.srcSubresource.layerCount = 1;
3406 copy_region.dstSubresource.layerCount = 1;
3407 copy_region.srcOffset = {0, 0, 0};
3408 copy_region.dstOffset = {0, 0, 0};
3409
3410 m_errorMonitor->ExpectSuccess();
3411 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3412 &copy_region);
3413 m_errorMonitor->VerifyNotFound();
3414
3415 // Source exceeded in x-dim, VU 01202
3416 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
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);
3420 m_errorMonitor->VerifyFound();
3421
3422 // Source exceeded in y-dim, VU 01203
3423 copy_region.srcOffset.x = 0;
3424 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003426 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3427 &copy_region);
3428 m_errorMonitor->VerifyFound();
3429
3430 // Source exceeded in z-dim, VU 01204
3431 copy_region.extent = {4, 4, 4};
3432 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003433 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003434 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3435 &copy_region);
3436 m_errorMonitor->VerifyFound();
3437
3438 m_commandBuffer->end();
3439}
3440
3441TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3442 // Image copy with dest region specified greater than dest image size
3443 ASSERT_NO_FATAL_FAILURE(Init());
3444
3445 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003446 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003447 ci.flags = 0;
3448 ci.imageType = VK_IMAGE_TYPE_3D;
3449 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3450 ci.extent = {32, 32, 8};
3451 ci.mipLevels = 6;
3452 ci.arrayLayers = 1;
3453 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3454 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3455 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3456 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3457 ci.queueFamilyIndexCount = 0;
3458 ci.pQueueFamilyIndices = NULL;
3459 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3460
3461 VkImageObj dst_image(m_device);
3462 dst_image.init(&ci);
3463 ASSERT_TRUE(dst_image.initialized());
3464
3465 // Src image with one more mip level
3466 ci.extent = {64, 64, 16};
3467 ci.mipLevels = 7;
3468 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3469 VkImageObj src_image(m_device);
3470 src_image.init(&ci);
3471 ASSERT_TRUE(src_image.initialized());
3472
3473 m_commandBuffer->begin();
3474
3475 VkImageCopy copy_region;
3476 copy_region.extent = {32, 32, 8};
3477 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3478 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3479 copy_region.srcSubresource.mipLevel = 0;
3480 copy_region.dstSubresource.mipLevel = 0;
3481 copy_region.srcSubresource.baseArrayLayer = 0;
3482 copy_region.dstSubresource.baseArrayLayer = 0;
3483 copy_region.srcSubresource.layerCount = 1;
3484 copy_region.dstSubresource.layerCount = 1;
3485 copy_region.srcOffset = {0, 0, 0};
3486 copy_region.dstOffset = {0, 0, 0};
3487
3488 m_errorMonitor->ExpectSuccess();
3489 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3490 &copy_region);
3491 m_errorMonitor->VerifyNotFound();
3492
3493 // Dest exceeded in x-dim, VU 01205
3494 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003495 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003496 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3497 &copy_region);
3498 m_errorMonitor->VerifyFound();
3499
3500 // Dest exceeded in y-dim, VU 01206
3501 copy_region.dstOffset.x = 0;
3502 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003504 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 // Dest exceeded in z-dim, VU 01207
3509 copy_region.extent = {4, 4, 4};
3510 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003511 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003512 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3513 &copy_region);
3514 m_errorMonitor->VerifyFound();
3515
3516 m_commandBuffer->end();
3517}
3518
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003519TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3520 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3521
3522 // Enable KHR multiplane req'd extensions
3523 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3524 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3525 if (mp_extensions == true) {
3526 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3527 }
3528 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003529 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003530 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3531 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3532 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3533 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003534 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003535 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3536 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3537 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3538 } else {
3539 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3540 return;
3541 }
3542 ASSERT_NO_FATAL_FAILURE(InitState());
3543
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003544 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3545 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003546 VkFormatProperties props = {0, 0, 0};
3547 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003548 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003549 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3550 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3551 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3552
3553 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003554 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003555 return;
3556 }
3557
3558 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3559 VkImageObj src_image(m_device);
3560 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003561 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 -08003562 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003563 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 -08003564 ASSERT_TRUE(dst_image.initialized());
3565
3566 VkImageCopy copy_region = {};
3567 copy_region.extent = {64, 64, 1}; // Size of plane 1
3568 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3569 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3570 copy_region.srcSubresource.mipLevel = 0;
3571 copy_region.dstSubresource.mipLevel = 0;
3572 copy_region.srcSubresource.baseArrayLayer = 0;
3573 copy_region.dstSubresource.baseArrayLayer = 0;
3574 copy_region.srcSubresource.layerCount = 1;
3575 copy_region.dstSubresource.layerCount = 1;
3576 copy_region.srcOffset = {0, 0, 0};
3577 copy_region.dstOffset = {0, 0, 0};
3578 VkImageCopy original_region = copy_region;
3579
3580 m_commandBuffer->begin();
3581
3582 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3583 m_errorMonitor->ExpectSuccess();
3584 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3585 &copy_region);
3586 m_errorMonitor->VerifyNotFound();
3587
3588 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3589 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3590 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3591 m_errorMonitor->ExpectSuccess();
3592 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3593 &copy_region);
3594 m_errorMonitor->VerifyNotFound();
3595
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003596 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003597 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3598 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3599
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003600 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3601 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3602 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3603 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003604 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3605 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003606 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3607 &copy_region);
3608 m_errorMonitor->VerifyNotFound();
3609
3610 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3611 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3612 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3613 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003614 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3615 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003616 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3617 &copy_region);
3618 m_errorMonitor->VerifyNotFound();
3619
3620 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3621 copy_region.extent = {128, 64, 1};
3622 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3623 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3624 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003625 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3626 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003627 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3628 &copy_region);
3629 m_errorMonitor->VerifyNotFound();
3630
3631 // 128x64 copy from plane 0 -> Plane 1
3632 copy_region.extent = {128, 64, 1};
3633 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3634 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003636 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3637 &copy_region);
3638 m_errorMonitor->VerifyFound();
3639
3640 // 128x64 copy from plane 1 -> Plane 0
3641 copy_region.extent = {128, 64, 1};
3642 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3643 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003644 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003645 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3646 &copy_region);
3647 m_errorMonitor->VerifyFound();
3648
3649 // src exceeded in y-dim from offset
3650 copy_region = original_region;
3651 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003653 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3654 &copy_region);
3655 m_errorMonitor->VerifyFound();
3656
3657 // dst exceeded in y-dim from offset
3658 copy_region = original_region;
3659 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003661 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3662 &copy_region);
3663 m_errorMonitor->VerifyFound();
3664
3665 m_commandBuffer->end();
3666}
3667
unknown088160a2019-05-23 17:43:13 -06003668TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003669 if (!EnableDeviceProfileLayer()) {
3670 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3671 return;
3672 }
unknown088160a2019-05-23 17:43:13 -06003673
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003674 // Enable KHR multiplane req'd extensions
3675 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3676 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3677 if (mp_extensions == true) {
3678 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3679 }
3680 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003681 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003682 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3683 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3684 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3685 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003686 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003687 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3688 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3689 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3690 }
3691 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003692
sfricke-samsung51067b22020-04-30 21:41:17 -07003693 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3694 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003695
sfricke-samsung51067b22020-04-30 21:41:17 -07003696 // Load required functions
3697 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3698 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3699 return;
3700 }
3701
3702 // Set transfer for all potential used formats
3703 VkFormatProperties format_props;
3704 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3705 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3706 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3707
3708 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3709 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3710 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003711
sfricke-samsung1c61f192021-12-31 01:53:03 -06003712 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003713 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003714 image_create_info.extent.width = 32;
3715 image_create_info.extent.height = 32;
3716 image_create_info.extent.depth = 1;
3717 image_create_info.mipLevels = 1;
3718 image_create_info.arrayLayers = 1;
3719 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003720 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3721 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003722 image_create_info.flags = 0;
3723
sfricke-samsung51067b22020-04-30 21:41:17 -07003724 image_create_info.format = VK_FORMAT_R8_UNORM;
3725 VkImageObj image_8b_unorm(m_device);
3726 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003727
sfricke-samsung51067b22020-04-30 21:41:17 -07003728 image_create_info.format = VK_FORMAT_R8_UINT;
3729 VkImageObj image_8b_uint(m_device);
3730 image_8b_uint.init(&image_create_info);
3731
3732 // First try to test two single plane mismatch
3733 {
3734 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3735 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3736 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3737
3738 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3739 VkImageObj image_32b_unorm(m_device);
3740 image_32b_unorm.init(&image_create_info);
3741
3742 m_commandBuffer->begin();
3743 VkImageCopy copyRegion;
3744 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3745 copyRegion.srcSubresource.mipLevel = 0;
3746 copyRegion.srcSubresource.baseArrayLayer = 0;
3747 copyRegion.srcSubresource.layerCount = 1;
3748 copyRegion.srcOffset.x = 0;
3749 copyRegion.srcOffset.y = 0;
3750 copyRegion.srcOffset.z = 0;
3751 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3752 copyRegion.dstSubresource.mipLevel = 0;
3753 copyRegion.dstSubresource.baseArrayLayer = 0;
3754 copyRegion.dstSubresource.layerCount = 1;
3755 copyRegion.dstOffset.x = 0;
3756 copyRegion.dstOffset.y = 0;
3757 copyRegion.dstOffset.z = 0;
3758 copyRegion.extent.width = 1;
3759 copyRegion.extent.height = 1;
3760 copyRegion.extent.depth = 1;
3761
3762 // Sanity check between two 8bit formats
3763 m_errorMonitor->ExpectSuccess();
3764 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3765 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3766 m_errorMonitor->VerifyNotFound();
3767
3768 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3770 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3771 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3772 m_errorMonitor->VerifyFound();
3773
3774 // Swap src and dst
3775 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3776 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3777 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3778 m_errorMonitor->VerifyFound();
3779
3780 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003781 }
3782
sfricke-samsung51067b22020-04-30 21:41:17 -07003783 // DstImage is a mismatched plane of a multi-planar format
3784 if (mp_extensions == false) {
3785 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3786 } else {
3787 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3788 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3789 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003790
sfricke-samsung51067b22020-04-30 21:41:17 -07003791 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3792 VkImageObj image_8b_16b_420_unorm(m_device);
3793 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003794
sfricke-samsung51067b22020-04-30 21:41:17 -07003795 m_commandBuffer->begin();
3796 VkImageCopy copyRegion;
3797 copyRegion.srcSubresource.mipLevel = 0;
3798 copyRegion.srcSubresource.baseArrayLayer = 0;
3799 copyRegion.srcSubresource.layerCount = 1;
3800 copyRegion.srcOffset.x = 0;
3801 copyRegion.srcOffset.y = 0;
3802 copyRegion.srcOffset.z = 0;
3803 copyRegion.dstSubresource.mipLevel = 0;
3804 copyRegion.dstSubresource.baseArrayLayer = 0;
3805 copyRegion.dstSubresource.layerCount = 1;
3806 copyRegion.dstOffset.x = 0;
3807 copyRegion.dstOffset.y = 0;
3808 copyRegion.dstOffset.z = 0;
3809 copyRegion.extent.width = 1;
3810 copyRegion.extent.height = 1;
3811 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003812
sfricke-samsung51067b22020-04-30 21:41:17 -07003813 // First test single-plane -> multi-plan
3814 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3815 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003816
sfricke-samsung51067b22020-04-30 21:41:17 -07003817 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3818 m_errorMonitor->ExpectSuccess();
3819 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3820 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3821 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003822
locke-lunargdf00db02020-03-04 19:00:57 -07003823 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3824 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3825
sfricke-samsung51067b22020-04-30 21:41:17 -07003826 // Make sure no false postiives if Compatible format
3827 m_errorMonitor->ExpectSuccess();
3828 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3829 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3830 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003831
sfricke-samsung51067b22020-04-30 21:41:17 -07003832 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3833 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3835 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3836 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3837 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003838
sfricke-samsung51067b22020-04-30 21:41:17 -07003839 // Same tests but swap src and dst
3840 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3841 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003842
locke-lunargdf00db02020-03-04 19:00:57 -07003843 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3844 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3845 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3846 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3847
sfricke-samsung51067b22020-04-30 21:41:17 -07003848 m_errorMonitor->ExpectSuccess();
3849 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3850 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3851 m_errorMonitor->VerifyNotFound();
3852
locke-lunargdf00db02020-03-04 19:00:57 -07003853 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3854 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3855
sfricke-samsung51067b22020-04-30 21:41:17 -07003856 m_errorMonitor->ExpectSuccess();
3857 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3858 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3859 m_errorMonitor->VerifyNotFound();
3860
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
4011 if (!EnableDeviceProfileLayer()) {
4012 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4013 return;
4014 }
4015
4016 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4017 if (mp_extensions) {
4018 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4019 }
4020
4021 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004022 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004023 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4024 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4025 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4026 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004027 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004028 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4029 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4030 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4031 }
4032 ASSERT_NO_FATAL_FAILURE(InitState());
4033
4034 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4035 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4036
4037 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4038 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4039 return;
4040 }
4041
unknown088160a2019-05-23 17:43:13 -06004042 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4043 if (!ds_format) {
4044 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4045 return;
4046 }
4047
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004048 // Add Transfer support for all used formats
4049 VkFormatProperties formatProps;
4050 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_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(), VK_FORMAT_D32_SFLOAT, &formatProps);
4054 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4055 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4056 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4057 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4058 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4059
unknown088160a2019-05-23 17:43:13 -06004060 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4061 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4062 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4063 VK_IMAGE_TILING_OPTIMAL, 0);
4064 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4065 VK_IMAGE_TILING_OPTIMAL, 0);
4066 ASSERT_TRUE(color_image.initialized());
4067 ASSERT_TRUE(depth_image.initialized());
4068 ASSERT_TRUE(ds_image.initialized());
4069
4070 VkImageCopy copyRegion;
4071 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4072 copyRegion.srcSubresource.mipLevel = 0;
4073 copyRegion.srcSubresource.baseArrayLayer = 0;
4074 copyRegion.srcSubresource.layerCount = 1;
4075 copyRegion.srcOffset = {0, 0, 0};
4076 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4077 copyRegion.dstSubresource.mipLevel = 0;
4078 copyRegion.dstSubresource.baseArrayLayer = 0;
4079 copyRegion.dstSubresource.layerCount = 1;
4080 copyRegion.dstOffset = {64, 0, 0};
4081 copyRegion.extent = {64, 128, 1};
4082
4083 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004085 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004086 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4087 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004088 m_errorMonitor->VerifyFound();
4089
4090 m_commandBuffer->begin();
4091
4092 // Src and dest aspect masks don't match
4093 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004094 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004096 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4097 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004098 m_errorMonitor->VerifyFound();
4099 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4100
4101 // Illegal combinations of aspect bits
4102 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4103 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004104 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004105 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004106 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004107 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004108 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4109 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004110 m_errorMonitor->VerifyFound();
4111 // same test for dstSubresource
4112 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4113 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004114 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004115 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004118 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4119 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004120 m_errorMonitor->VerifyFound();
4121
4122 // Metadata aspect is illegal
4123 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4124 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004126 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004128 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4129 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004130 m_errorMonitor->VerifyFound();
4131 // same test for dstSubresource
4132 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4133 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004135 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004136 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004137 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4138 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004139 m_errorMonitor->VerifyFound();
4140
sfricke-samsung6141db32020-10-26 03:31:38 -07004141 // Aspect Memory Plane mask is illegal
4142 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4143 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4145 // These aspect/format mismatches are redundant but unavoidable here
4146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4147 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4148 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4149 m_errorMonitor->VerifyFound();
4150
unknown088160a2019-05-23 17:43:13 -06004151 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4152 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004153 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004154
4155 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004156 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004157 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004159 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4160 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004161 m_errorMonitor->VerifyFound();
4162
4163 // Aspect mask doesn't match dest image format
4164 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4165 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004167 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004169 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4170 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004171 m_errorMonitor->VerifyFound();
4172
aitor-lunarg54c295b2022-01-28 17:02:32 +01004173 // Check no performance warnings regarding layout are thrown when copying from and to the same image
4174 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4175 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4176 m_errorMonitor->ExpectSuccess(kPerformanceWarningBit);
4177 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4178 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4179 m_errorMonitor->VerifyNotFound();
4180
unknown088160a2019-05-23 17:43:13 -06004181 m_commandBuffer->end();
4182}
4183
4184TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004186
4187 ASSERT_NO_FATAL_FAILURE(Init());
4188
4189 // Create two images of sample count 1 and try to Resolve between them
4190
sfricke-samsung1c61f192021-12-31 01:53:03 -06004191 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004192 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4193 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4194 image_create_info.extent.width = 32;
4195 image_create_info.extent.height = 1;
4196 image_create_info.extent.depth = 1;
4197 image_create_info.mipLevels = 1;
4198 image_create_info.arrayLayers = 1;
4199 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4200 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4201 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4202 image_create_info.flags = 0;
4203
4204 VkImageObj srcImage(m_device);
4205 srcImage.init(&image_create_info);
4206 ASSERT_TRUE(srcImage.initialized());
4207
4208 VkImageObj dstImage(m_device);
4209 dstImage.init(&image_create_info);
4210 ASSERT_TRUE(dstImage.initialized());
4211
4212 m_commandBuffer->begin();
4213 VkImageResolve resolveRegion;
4214 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4215 resolveRegion.srcSubresource.mipLevel = 0;
4216 resolveRegion.srcSubresource.baseArrayLayer = 0;
4217 resolveRegion.srcSubresource.layerCount = 1;
4218 resolveRegion.srcOffset.x = 0;
4219 resolveRegion.srcOffset.y = 0;
4220 resolveRegion.srcOffset.z = 0;
4221 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4222 resolveRegion.dstSubresource.mipLevel = 0;
4223 resolveRegion.dstSubresource.baseArrayLayer = 0;
4224 resolveRegion.dstSubresource.layerCount = 1;
4225 resolveRegion.dstOffset.x = 0;
4226 resolveRegion.dstOffset.y = 0;
4227 resolveRegion.dstOffset.z = 0;
4228 resolveRegion.extent.width = 1;
4229 resolveRegion.extent.height = 1;
4230 resolveRegion.extent.depth = 1;
4231 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4232 &resolveRegion);
4233 m_commandBuffer->end();
4234
4235 m_errorMonitor->VerifyFound();
4236}
4237
4238TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004240
4241 ASSERT_NO_FATAL_FAILURE(Init());
4242
4243 // Create two images of sample count 4 and try to Resolve between them
4244
sfricke-samsung1c61f192021-12-31 01:53:03 -06004245 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004246 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4247 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4248 image_create_info.extent.width = 32;
4249 image_create_info.extent.height = 1;
4250 image_create_info.extent.depth = 1;
4251 image_create_info.mipLevels = 1;
4252 image_create_info.arrayLayers = 1;
4253 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4254 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4255 // Note: Some implementations expect color attachment usage for any
4256 // multisample surface
4257 image_create_info.usage =
4258 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4259 image_create_info.flags = 0;
4260
4261 VkImageObj srcImage(m_device);
4262 srcImage.init(&image_create_info);
4263 ASSERT_TRUE(srcImage.initialized());
4264
4265 VkImageObj dstImage(m_device);
4266 dstImage.init(&image_create_info);
4267 ASSERT_TRUE(dstImage.initialized());
4268
4269 m_commandBuffer->begin();
4270 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4271 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4272 // VK_IMAGE_LAYOUT_GENERAL = 1,
4273 VkImageResolve resolveRegion;
4274 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4275 resolveRegion.srcSubresource.mipLevel = 0;
4276 resolveRegion.srcSubresource.baseArrayLayer = 0;
4277 resolveRegion.srcSubresource.layerCount = 1;
4278 resolveRegion.srcOffset.x = 0;
4279 resolveRegion.srcOffset.y = 0;
4280 resolveRegion.srcOffset.z = 0;
4281 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4282 resolveRegion.dstSubresource.mipLevel = 0;
4283 resolveRegion.dstSubresource.baseArrayLayer = 0;
4284 resolveRegion.dstSubresource.layerCount = 1;
4285 resolveRegion.dstOffset.x = 0;
4286 resolveRegion.dstOffset.y = 0;
4287 resolveRegion.dstOffset.z = 0;
4288 resolveRegion.extent.width = 1;
4289 resolveRegion.extent.height = 1;
4290 resolveRegion.extent.depth = 1;
4291 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4292 &resolveRegion);
4293 m_commandBuffer->end();
4294
4295 m_errorMonitor->VerifyFound();
4296}
4297
4298TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004300
4301 ASSERT_NO_FATAL_FAILURE(Init());
4302
4303 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004304 VkImageObj srcImage(m_device);
4305 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004306
sfricke-samsung1c61f192021-12-31 01:53:03 -06004307 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004308 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4309 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4310 image_create_info.extent.width = 32;
4311 image_create_info.extent.height = 1;
4312 image_create_info.extent.depth = 1;
4313 image_create_info.mipLevels = 1;
4314 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004315 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004316 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4317 // Note: Some implementations expect color attachment usage for any
4318 // multisample surface
4319 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4320 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004321 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004322
4323 // Set format to something other than source image
4324 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4325 // Note: Some implementations expect color attachment usage for any
4326 // multisample surface
4327 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4328 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004329 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004330
4331 m_commandBuffer->begin();
4332 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4333 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4334 // VK_IMAGE_LAYOUT_GENERAL = 1,
4335 VkImageResolve resolveRegion;
4336 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4337 resolveRegion.srcSubresource.mipLevel = 0;
4338 resolveRegion.srcSubresource.baseArrayLayer = 0;
4339 resolveRegion.srcSubresource.layerCount = 1;
4340 resolveRegion.srcOffset.x = 0;
4341 resolveRegion.srcOffset.y = 0;
4342 resolveRegion.srcOffset.z = 0;
4343 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4344 resolveRegion.dstSubresource.mipLevel = 0;
4345 resolveRegion.dstSubresource.baseArrayLayer = 0;
4346 resolveRegion.dstSubresource.layerCount = 1;
4347 resolveRegion.dstOffset.x = 0;
4348 resolveRegion.dstOffset.y = 0;
4349 resolveRegion.dstOffset.z = 0;
4350 resolveRegion.extent.width = 1;
4351 resolveRegion.extent.height = 1;
4352 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004353 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4354 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004355 m_commandBuffer->end();
4356
4357 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004358}
4359
4360TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004361 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004362
4363 ASSERT_NO_FATAL_FAILURE(Init());
4364
4365 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004366 VkImageObj srcImage(m_device);
4367 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004368
sfricke-samsung1c61f192021-12-31 01:53:03 -06004369 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004370 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4371 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4372 image_create_info.extent.width = 32;
4373 image_create_info.extent.height = 1;
4374 image_create_info.extent.depth = 1;
4375 image_create_info.mipLevels = 1;
4376 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004377 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004378 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4379 // Note: Some implementations expect color attachment usage for any
4380 // multisample surface
4381 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4382 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004383 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004384
4385 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4386 // Note: Some implementations expect color attachment usage for any
4387 // multisample surface
4388 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4389 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004390 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004391
4392 m_commandBuffer->begin();
4393 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4394 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4395 // VK_IMAGE_LAYOUT_GENERAL = 1,
4396 VkImageResolve resolveRegion;
4397 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4398 resolveRegion.srcSubresource.mipLevel = 0;
4399 resolveRegion.srcSubresource.baseArrayLayer = 0;
4400 resolveRegion.srcSubresource.layerCount = 1;
4401 resolveRegion.srcOffset.x = 0;
4402 resolveRegion.srcOffset.y = 0;
4403 resolveRegion.srcOffset.z = 0;
4404 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4405 resolveRegion.dstSubresource.mipLevel = 0;
4406 resolveRegion.dstSubresource.baseArrayLayer = 0;
4407 resolveRegion.dstSubresource.layerCount = 1;
4408 resolveRegion.dstOffset.x = 0;
4409 resolveRegion.dstOffset.y = 0;
4410 resolveRegion.dstOffset.z = 0;
4411 resolveRegion.extent.width = 1;
4412 resolveRegion.extent.height = 1;
4413 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004414 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4415 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004416 m_commandBuffer->end();
4417
4418 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004419}
4420
4421TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4422 ASSERT_NO_FATAL_FAILURE(Init());
4423
4424 // Create two images of different types and try to copy between them
4425 VkImageObj srcImage(m_device);
4426 VkImageObj dstImage(m_device);
4427
sfricke-samsung1c61f192021-12-31 01:53:03 -06004428 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004429 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4430 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4431 image_create_info.extent.width = 32;
4432 image_create_info.extent.height = 32;
4433 image_create_info.extent.depth = 1;
4434 image_create_info.mipLevels = 1;
4435 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004436 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004437 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4438 image_create_info.usage =
4439 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4440 // Note: Some implementations expect color attachment usage for any
4441 // multisample surface
4442 image_create_info.flags = 0;
4443 srcImage.init(&image_create_info);
4444 ASSERT_TRUE(srcImage.initialized());
4445
4446 // Note: Some implementations expect color attachment usage for any
4447 // multisample surface
4448 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4449 dstImage.init(&image_create_info);
4450 ASSERT_TRUE(dstImage.initialized());
4451
4452 m_commandBuffer->begin();
4453 // source image must have valid contents before resolve
4454 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4455 VkImageSubresourceRange subresource = {};
4456 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4457 subresource.layerCount = 1;
4458 subresource.levelCount = 1;
4459 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4460 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4461 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4462 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4463
4464 VkImageResolve resolveRegion;
4465 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4466 resolveRegion.srcSubresource.mipLevel = 0;
4467 resolveRegion.srcSubresource.baseArrayLayer = 0;
4468 resolveRegion.srcSubresource.layerCount = 1;
4469 resolveRegion.srcOffset.x = 0;
4470 resolveRegion.srcOffset.y = 0;
4471 resolveRegion.srcOffset.z = 0;
4472 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4473 resolveRegion.dstSubresource.mipLevel = 0;
4474 resolveRegion.dstSubresource.baseArrayLayer = 0;
4475 resolveRegion.dstSubresource.layerCount = 1;
4476 resolveRegion.dstOffset.x = 0;
4477 resolveRegion.dstOffset.y = 0;
4478 resolveRegion.dstOffset.z = 0;
4479 resolveRegion.extent.width = 1;
4480 resolveRegion.extent.height = 1;
4481 resolveRegion.extent.depth = 1;
4482 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004483 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004484 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4485 1, &resolveRegion);
4486 m_errorMonitor->VerifyFound();
4487 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004488 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004489 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4490 1, &resolveRegion);
4491 m_errorMonitor->VerifyFound();
4492 m_commandBuffer->end();
4493}
4494
4495TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004496 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4497
4498 bool copy_commands2 = false;
4499 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4500 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4501 copy_commands2 = true;
4502 }
4503 ASSERT_NO_FATAL_FAILURE(InitState());
4504
4505 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4506 if (copy_commands2) {
4507 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4508 }
unknown088160a2019-05-23 17:43:13 -06004509
4510 // Create two images of different types and try to copy between them
4511 VkImageObj srcImage(m_device);
4512 VkImageObj dstImage(m_device);
4513
sfricke-samsung1c61f192021-12-31 01:53:03 -06004514 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004515 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4516 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4517 image_create_info.extent.width = 32;
4518 image_create_info.extent.height = 32;
4519 image_create_info.extent.depth = 1;
4520 image_create_info.mipLevels = 1;
4521 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004522 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004523 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4524 image_create_info.usage =
4525 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4526 // Note: Some implementations expect color attachment usage for any
4527 // multisample surface
4528 image_create_info.flags = 0;
4529 srcImage.init(&image_create_info);
4530 ASSERT_TRUE(srcImage.initialized());
4531
4532 // Note: Some implementations expect color attachment usage for any
4533 // multisample surface
4534 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4535 dstImage.init(&image_create_info);
4536 ASSERT_TRUE(dstImage.initialized());
4537
4538 m_commandBuffer->begin();
4539 // source image must have valid contents before resolve
4540 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4541 VkImageSubresourceRange subresource = {};
4542 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4543 subresource.layerCount = 1;
4544 subresource.levelCount = 1;
4545 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4546 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4547 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4548 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4549
4550 VkImageResolve resolveRegion;
4551 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4552 resolveRegion.srcSubresource.mipLevel = 0;
4553 resolveRegion.srcSubresource.baseArrayLayer = 0;
4554 resolveRegion.srcSubresource.layerCount = 1;
4555 resolveRegion.srcOffset.x = 0;
4556 resolveRegion.srcOffset.y = 0;
4557 resolveRegion.srcOffset.z = 0;
4558 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4559 resolveRegion.dstSubresource.mipLevel = 0;
4560 resolveRegion.dstSubresource.baseArrayLayer = 0;
4561 resolveRegion.dstSubresource.layerCount = 1;
4562 resolveRegion.dstOffset.x = 0;
4563 resolveRegion.dstOffset.y = 0;
4564 resolveRegion.dstOffset.z = 0;
4565 resolveRegion.extent.width = 1;
4566 resolveRegion.extent.height = 1;
4567 resolveRegion.extent.depth = 1;
4568 // invalid source mip level
4569 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004570 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004571 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4572 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4573 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004574
4575 // Equivalent test using KHR_copy_commands2
4576 if (copy_commands2 && vkCmdResolveImage2Function) {
4577 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4578 NULL,
4579 resolveRegion.srcSubresource,
4580 resolveRegion.srcOffset,
4581 resolveRegion.dstSubresource,
4582 resolveRegion.dstOffset,
4583 resolveRegion.extent};
4584 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4585 NULL,
4586 srcImage.image(),
4587 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4588 dstImage.image(),
4589 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4590 1,
4591 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004592 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01709");
Jeff Leger465acf52020-10-12 18:07:16 -04004593 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4594 m_errorMonitor->VerifyFound();
4595 }
4596
unknown088160a2019-05-23 17:43:13 -06004597 resolveRegion.srcSubresource.mipLevel = 0;
4598 // invalid dest mip level
4599 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004601 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4602 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4603 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004604
4605 // Equivalent test using KHR_copy_commands2
4606 if (copy_commands2 && vkCmdResolveImage2Function) {
4607 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4608 NULL,
4609 resolveRegion.srcSubresource,
4610 resolveRegion.srcOffset,
4611 resolveRegion.dstSubresource,
4612 resolveRegion.dstOffset,
4613 resolveRegion.extent};
4614 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4615 NULL,
4616 srcImage.image(),
4617 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4618 dstImage.image(),
4619 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4620 1,
4621 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004622 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01710");
Jeff Leger465acf52020-10-12 18:07:16 -04004623 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4624 m_errorMonitor->VerifyFound();
4625 }
4626
unknown088160a2019-05-23 17:43:13 -06004627 resolveRegion.dstSubresource.mipLevel = 0;
4628 // invalid source array layer range
4629 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004631 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4632 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4633 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004634
4635 // Equivalent test using KHR_copy_commands2
4636 if (copy_commands2 && vkCmdResolveImage2Function) {
4637 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4638 NULL,
4639 resolveRegion.srcSubresource,
4640 resolveRegion.srcOffset,
4641 resolveRegion.dstSubresource,
4642 resolveRegion.dstOffset,
4643 resolveRegion.extent};
4644 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4645 NULL,
4646 srcImage.image(),
4647 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4648 dstImage.image(),
4649 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4650 1,
4651 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01711");
Jeff Leger465acf52020-10-12 18:07:16 -04004653 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4654 m_errorMonitor->VerifyFound();
4655 }
4656
unknown088160a2019-05-23 17:43:13 -06004657 resolveRegion.srcSubresource.baseArrayLayer = 0;
4658 // invalid dest array layer range
4659 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004661 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4662 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4663 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004664
4665 // Equivalent test using KHR_copy_commands2
4666 if (copy_commands2 && vkCmdResolveImage2Function) {
4667 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4668 NULL,
4669 resolveRegion.srcSubresource,
4670 resolveRegion.srcOffset,
4671 resolveRegion.dstSubresource,
4672 resolveRegion.dstOffset,
4673 resolveRegion.extent};
4674 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4675 NULL,
4676 srcImage.image(),
4677 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4678 dstImage.image(),
4679 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4680 1,
4681 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01712");
Jeff Leger465acf52020-10-12 18:07:16 -04004683 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4684 m_errorMonitor->VerifyFound();
4685 }
4686
unknown088160a2019-05-23 17:43:13 -06004687 resolveRegion.dstSubresource.baseArrayLayer = 0;
4688
4689 m_commandBuffer->end();
4690}
4691
sfricke-samsungf78d0592020-06-11 21:34:44 -07004692TEST_F(VkLayerTest, ResolveImageImageType) {
4693 ASSERT_NO_FATAL_FAILURE(Init());
4694 // Create images of different types and try to resolve between them
4695 VkImageObj srcImage2D(m_device);
4696 VkImageObj dstImage1D(m_device);
4697 VkImageObj dstImage3D(m_device);
4698
sfricke-samsung1c61f192021-12-31 01:53:03 -06004699 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungf78d0592020-06-11 21:34:44 -07004700 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4701 image_create_info.extent.width = 32;
4702 image_create_info.extent.height = 1;
4703 image_create_info.extent.depth = 1;
4704 image_create_info.mipLevels = 1;
4705 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004706 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004707 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4708 image_create_info.usage =
4709 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4710 // Note: Some implementations expect color attachment usage for any
4711 // multisample surface
4712 image_create_info.flags = 0;
4713
4714 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4715 srcImage2D.init(&image_create_info);
4716 ASSERT_TRUE(srcImage2D.initialized());
4717
4718 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4719 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4720 dstImage1D.init(&image_create_info);
4721 ASSERT_TRUE(dstImage1D.initialized());
4722
4723 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4724 image_create_info.extent.height = 16;
4725 image_create_info.extent.depth = 16;
4726 image_create_info.arrayLayers = 1;
4727 dstImage3D.init(&image_create_info);
4728 ASSERT_TRUE(dstImage3D.initialized());
4729
4730 m_commandBuffer->begin();
4731
4732 VkImageResolve resolveRegion;
4733 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4734 resolveRegion.srcSubresource.mipLevel = 0;
4735 resolveRegion.srcSubresource.baseArrayLayer = 0;
4736 resolveRegion.srcSubresource.layerCount = 1;
4737 resolveRegion.srcOffset.x = 0;
4738 resolveRegion.srcOffset.y = 0;
4739 resolveRegion.srcOffset.z = 0;
4740 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4741 resolveRegion.dstSubresource.mipLevel = 0;
4742 resolveRegion.dstSubresource.baseArrayLayer = 0;
4743 resolveRegion.dstSubresource.layerCount = 1;
4744 resolveRegion.dstOffset.x = 0;
4745 resolveRegion.dstOffset.y = 0;
4746 resolveRegion.dstOffset.z = 0;
4747 resolveRegion.extent.width = 1;
4748 resolveRegion.extent.height = 1;
4749 resolveRegion.extent.depth = 1;
4750
4751 // non-zero value baseArrayLayer
4752 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004754 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4755 &resolveRegion);
4756 m_errorMonitor->VerifyFound();
4757 resolveRegion.srcSubresource.baseArrayLayer = 0;
4758
4759 // Set height with 1D dstImage
4760 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004762 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4764 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004765 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4766 &resolveRegion);
4767 m_errorMonitor->VerifyFound();
4768 resolveRegion.extent.height = 1;
4769
4770 // Set depth with 1D dstImage and 2D srcImage
4771 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004774 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4775 &resolveRegion);
4776 m_errorMonitor->VerifyFound();
4777 resolveRegion.extent.depth = 1;
4778
4779 m_commandBuffer->end();
4780}
4781
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004782TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4783 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4784 ASSERT_NO_FATAL_FAILURE(Init());
4785
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004786 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004787 VkImageObj srcImage2D(m_device);
4788 VkImageObj dstImage2D(m_device);
4789
sfricke-samsung1c61f192021-12-31 01:53:03 -06004790 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004791 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4792 image_create_info.extent.width = 32;
4793 image_create_info.extent.height = 32;
4794 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004795 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004796 image_create_info.arrayLayers = 1;
4797 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4798 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4799 image_create_info.usage =
4800 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4801 // Note: Some implementations expect color attachment usage for any
4802 // multisample surface
4803 image_create_info.flags = 0;
4804
4805 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4806 srcImage2D.init(&image_create_info);
4807 ASSERT_TRUE(srcImage2D.initialized());
4808
4809 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4810 dstImage2D.init(&image_create_info);
4811 ASSERT_TRUE(dstImage2D.initialized());
4812
4813 m_commandBuffer->begin();
4814
4815 VkImageResolve resolveRegion = {};
4816 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4817 resolveRegion.srcSubresource.mipLevel = 0;
4818 resolveRegion.srcSubresource.baseArrayLayer = 0;
4819 resolveRegion.srcSubresource.layerCount = 1;
4820 resolveRegion.srcOffset.x = 0;
4821 resolveRegion.srcOffset.y = 0;
4822 resolveRegion.srcOffset.z = 0;
4823 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4824 resolveRegion.dstSubresource.mipLevel = 0;
4825 resolveRegion.dstSubresource.baseArrayLayer = 0;
4826 resolveRegion.dstSubresource.layerCount = 1;
4827 resolveRegion.dstOffset.x = 0;
4828 resolveRegion.dstOffset.y = 0;
4829 resolveRegion.dstOffset.z = 0;
4830 resolveRegion.extent.width = 32;
4831 resolveRegion.extent.height = 32;
4832 resolveRegion.extent.depth = 1;
4833
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->VerifyNotFound();
4837
4838 // srcImage exceeded in x-dim
4839 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004840 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004841 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4842 &resolveRegion);
4843 m_errorMonitor->VerifyFound();
4844 resolveRegion.srcOffset.x = 0;
4845
4846 // dstImage exceeded in x-dim
4847 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004848 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004849 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4850 &resolveRegion);
4851 m_errorMonitor->VerifyFound();
4852 resolveRegion.dstOffset.x = 0;
4853
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004854 // both image exceeded in y-dim
4855 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
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.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004861
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004862 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004864 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4865 &resolveRegion);
4866 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004867 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004868
4869 // srcImage exceeded in z-dim
4870 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4872 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004873 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4874 &resolveRegion);
4875 m_errorMonitor->VerifyFound();
4876 resolveRegion.srcOffset.z = 0;
4877
4878 // dstImage exceeded in z-dim
4879 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004880 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004882 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4883 &resolveRegion);
4884 m_errorMonitor->VerifyFound();
4885 resolveRegion.dstOffset.z = 0;
4886
4887 m_commandBuffer->end();
4888}
4889
unknown088160a2019-05-23 17:43:13 -06004890TEST_F(VkLayerTest, ClearImageErrors) {
4891 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4892
4893 ASSERT_NO_FATAL_FAILURE(Init());
4894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4895
4896 m_commandBuffer->begin();
4897
4898 // Color image
4899 VkClearColorValue clear_color;
4900 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4901 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4902 const int32_t img_width = 32;
4903 const int32_t img_height = 32;
sfricke-samsung1c61f192021-12-31 01:53:03 -06004904 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4906 image_create_info.format = color_format;
4907 image_create_info.extent.width = img_width;
4908 image_create_info.extent.height = img_height;
4909 image_create_info.extent.depth = 1;
4910 image_create_info.mipLevels = 1;
4911 image_create_info.arrayLayers = 1;
4912 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4913 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4914
4915 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4916 vk_testing::Image color_image_no_transfer;
4917 color_image_no_transfer.init(*m_device, image_create_info);
4918
4919 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4920 vk_testing::Image color_image;
4921 color_image.init(*m_device, image_create_info);
4922
4923 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4924
4925 // Depth/Stencil image
4926 VkClearDepthStencilValue clear_value = {0};
4927 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4928 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4929 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4930 ds_image_create_info.extent.width = 64;
4931 ds_image_create_info.extent.height = 64;
4932 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4933 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4934
4935 vk_testing::Image ds_image;
4936 ds_image.init(*m_device, ds_image_create_info);
4937
4938 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4939
sfricke-samsungcd924d92020-05-20 23:51:17 -07004940 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06004941
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004942 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06004943
4944 m_errorMonitor->VerifyFound();
4945
sfricke-samsungcd924d92020-05-20 23:51:17 -07004946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06004947
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004948 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
4949 &color_range);
unknown088160a2019-05-23 17:43:13 -06004950
4951 m_errorMonitor->VerifyFound();
4952
4953 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07004954 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07004955 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06004956
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004957 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4958 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06004959
4960 m_errorMonitor->VerifyFound();
4961}
4962
4963TEST_F(VkLayerTest, CommandQueueFlags) {
4964 TEST_DESCRIPTION(
4965 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
4966
4967 ASSERT_NO_FATAL_FAILURE(Init());
4968
4969 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4970 if (queueFamilyIndex == UINT32_MAX) {
4971 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4972 return;
4973 } else {
4974 // Create command pool on a non-graphics queue
4975 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4976
4977 // Setup command buffer on pool
4978 VkCommandBufferObj command_buffer(m_device, &command_pool);
4979 command_buffer.begin();
4980
4981 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07004982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06004983 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4984 command_buffer.SetViewport(0, 1, &viewport);
4985 m_errorMonitor->VerifyFound();
4986 }
4987}
4988
sfricke-samsung674ba102020-08-18 22:38:49 -07004989TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
4990 TEST_DESCRIPTION(
4991 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
4992 "buffer");
4993
4994 ASSERT_NO_FATAL_FAILURE(Init());
4995
4996 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4997 if (queueFamilyIndex == UINT32_MAX) {
4998 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4999 return;
5000 } else {
5001 // Create Depth image
5002 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5003 if (ds_format == VK_FORMAT_UNDEFINED) {
5004 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5005 return;
5006 }
5007
5008 VkImageObj ds_image(m_device);
5009 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5010 VK_IMAGE_TILING_OPTIMAL, 0);
5011 ASSERT_TRUE(ds_image.initialized());
5012
5013 // Allocate buffers
5014 VkBufferObj buffer;
5015 VkMemoryPropertyFlags reqs = 0;
5016 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5017
5018 VkBufferImageCopy region = {};
5019 region.bufferRowLength = 0;
5020 region.bufferImageHeight = 0;
5021 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5022 region.imageSubresource.layerCount = 1;
5023 region.imageOffset = {0, 0, 0};
5024 region.imageExtent = {64, 64, 1};
5025 region.bufferOffset = 0;
5026
5027 // Create command pool on a non-graphics queue
5028 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5029
5030 // Setup command buffer on pool
5031 VkCommandBufferObj command_buffer(m_device, &command_pool);
5032 command_buffer.begin();
5033
sfricke-samsungea4fd142020-10-17 23:51:59 -07005034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005035 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5036 1, &region);
5037 m_errorMonitor->VerifyFound();
5038 }
5039}
5040
sfricke-samsung5a019492021-01-25 10:32:08 -08005041TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5042 TEST_DESCRIPTION(
5043 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5044 "buffer");
5045
5046 ASSERT_NO_FATAL_FAILURE(Init());
5047
5048 // Should be left with a tranfser queue
5049 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5050 if (queueFamilyIndex == UINT32_MAX) {
5051 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5052 return;
5053 }
5054
5055 VkImageObj image(m_device);
5056 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5057 VK_IMAGE_TILING_OPTIMAL, 0);
5058 ASSERT_TRUE(image.initialized());
5059
5060 // Allocate buffers
5061 VkBufferObj buffer;
5062 VkMemoryPropertyFlags reqs = 0;
5063 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5064
5065 VkBufferImageCopy region = {};
5066 region.bufferRowLength = 0;
5067 region.bufferImageHeight = 0;
5068 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5069 region.imageSubresource.layerCount = 1;
5070 region.imageOffset = {0, 0, 0};
5071 region.imageExtent = {16, 16, 1};
5072 region.bufferOffset = 5;
5073
5074 // Create command pool on a non-graphics queue
5075 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5076
5077 // Setup command buffer on pool
5078 VkCommandBufferObj command_buffer(m_device, &command_pool);
5079 command_buffer.begin();
5080
5081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5082 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5083 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5084 &region);
5085 m_errorMonitor->VerifyFound();
5086}
5087
sfricke-samsungcb467672020-11-25 00:09:28 -08005088TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5089 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5090
5091 ASSERT_NO_FATAL_FAILURE(Init());
5092
5093 if (m_device->queue_props.size() < 2) {
5094 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5095 return;
5096 }
5097
5098 // First two queue families
5099 uint32_t queue_index_A = 0;
5100 uint32_t queue_index_B = 1;
5101
sfricke-samsung1c61f192021-12-31 01:53:03 -06005102 VkCommandPoolCreateInfo pool_create_info = LvlInitStruct<VkCommandPoolCreateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005103 pool_create_info.flags = 0;
5104
5105 VkCommandPool command_pool_A;
5106 pool_create_info.queueFamilyIndex = queue_index_A;
5107 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5108
5109 VkCommandPool command_pool_B;
5110 pool_create_info.queueFamilyIndex = queue_index_B;
5111 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5112
5113 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
sfricke-samsung1c61f192021-12-31 01:53:03 -06005114 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005115 command_buffer_allocate_info.commandBufferCount = 1;
5116 command_buffer_allocate_info.commandPool = command_pool_A;
5117 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5118 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5119
5120 command_buffer_allocate_info.commandPool = command_pool_B;
5121 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5122 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5123
sfricke-samsung1c61f192021-12-31 01:53:03 -06005124 VkCommandBufferBeginInfo begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005125
5126 // secondary
5127 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5128 vk::EndCommandBuffer(command_buffer[1]);
5129
5130 // Try using different pool's command buffer as secondary
5131 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5133 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5134 m_errorMonitor->VerifyFound();
5135 vk::EndCommandBuffer(command_buffer[0]);
5136
5137 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5138 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5139}
5140
unknown088160a2019-05-23 17:43:13 -06005141TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5142 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5143 ASSERT_NO_FATAL_FAILURE(Init());
5144 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5145 // never record secondary
5146
Mark Lobodzinski20310782020-02-28 14:25:17 -07005147 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005148 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005149 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005150 m_errorMonitor->VerifyFound();
5151 m_commandBuffer->end();
5152}
5153
5154TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5155 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5156
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005157 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005158 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5159
sfricke-samsung1c61f192021-12-31 01:53:03 -06005160 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005161 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5162 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5163 image_create_info.extent.width = 32;
5164 image_create_info.extent.height = 1;
5165 image_create_info.extent.depth = 1;
5166 image_create_info.mipLevels = 1;
5167 image_create_info.arrayLayers = 1;
5168 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5169 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5170 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5171 image_create_info.flags = 0;
5172
5173 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5174 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5175
5176 VkImageObj image(m_device);
5177 image.init(&image_create_info);
5178 ASSERT_TRUE(image.initialized());
5179 VkImageMemoryBarrier image_barrier =
5180 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5181
5182 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5183 image_barrier.oldLayout = old_layout;
5184 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005185 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5186 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005187 };
5188
5189 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5190 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5191 secondary.begin();
5192 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5193 secondary.end();
5194
Mark Lobodzinski20310782020-02-28 14:25:17 -07005195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005196 m_commandBuffer->begin();
5197 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005198 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005199 m_errorMonitor->VerifyFound();
5200
unknown088160a2019-05-23 17:43:13 -06005201 m_commandBuffer->reset();
5202 secondary.reset();
5203
5204 // Validate that UNDEFINED doesn't false positive on us
5205 secondary.begin();
5206 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5207 secondary.end();
5208 m_commandBuffer->begin();
5209 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5210 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005211 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005212 m_errorMonitor->VerifyNotFound();
5213 m_commandBuffer->end();
5214}
5215
5216TEST_F(VkLayerTest, SetDynViewportParamTests) {
5217 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5218
5219 SetTargetApiVersion(VK_API_VERSION_1_1);
5220 VkPhysicalDeviceFeatures features{};
5221 ASSERT_NO_FATAL_FAILURE(Init(&features));
5222
5223 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5224 const VkViewport viewports[] = {vp, vp};
5225
5226 m_commandBuffer->begin();
5227
5228 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005229 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005230 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005231 m_errorMonitor->VerifyFound();
5232
Mark Lobodzinski20310782020-02-28 14:25:17 -07005233 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005234 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005235 m_errorMonitor->VerifyFound();
5236
Mark Lobodzinski20310782020-02-28 14:25:17 -07005237 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005238 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005239 m_errorMonitor->VerifyFound();
5240
Mark Lobodzinski20310782020-02-28 14:25:17 -07005241 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5242 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005243 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005244 m_errorMonitor->VerifyFound();
5245
Mark Lobodzinski20310782020-02-28 14:25:17 -07005246 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005247 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005248 m_errorMonitor->VerifyFound();
5249
5250 // core viewport tests
5251 using std::vector;
5252 struct TestCase {
5253 VkViewport vp;
5254 std::string veid;
5255 };
5256
5257 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5258 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5259 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5260
5261 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5262 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5263 const auto one_before_min_bounds = NearestSmaller(min_bound);
5264 const auto one_past_max_bounds = NearestGreater(max_bound);
5265
5266 const auto below_zero = NearestSmaller(0.0f);
5267 const auto past_one = NearestGreater(1.0f);
5268
5269 vector<TestCase> test_cases = {
5270 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5271 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5272 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5273 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5274 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5275 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5276 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5277 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5278 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5279 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5280 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5281 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5282 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5283 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5284 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5285 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5286 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5287 };
5288
5289 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5290 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5291 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5292 } else {
5293 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5294 }
5295
5296 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005297 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005298 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005299 m_errorMonitor->VerifyFound();
5300 }
5301}
5302
5303TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5304 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5305
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005306 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005307
Mike Schuchardt7cc57842021-09-15 10:49:59 -07005308 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
5309 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005310 } else {
5311 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5312 return;
5313 }
5314 ASSERT_NO_FATAL_FAILURE(InitState());
5315
5316 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5317}
5318
5319TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5320 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5321
5322 ASSERT_NO_FATAL_FAILURE(Init());
5323
5324 if (!m_device->phy().features().multiViewport) {
5325 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5326 return;
5327 }
5328
unknown088160a2019-05-23 17:43:13 -06005329 m_commandBuffer->begin();
5330
Mark Lobodzinski20310782020-02-28 14:25:17 -07005331 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005332 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005333 m_errorMonitor->VerifyFound();
5334
Petr Kraus14e49492019-09-09 20:13:29 +02005335 const auto max_viewports = m_device->props.limits.maxViewports;
5336
Mark Lobodzinski20310782020-02-28 14:25:17 -07005337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005338 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005339 m_errorMonitor->VerifyFound();
5340
Petr Kraus14e49492019-09-09 20:13:29 +02005341 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5342 if (max_viewports >= too_big_max_viewports) {
5343 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5344 kSkipPrefix);
5345 } else {
5346 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5347 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5348
Mark Lobodzinski20310782020-02-28 14:25:17 -07005349 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005350 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005351 m_errorMonitor->VerifyFound();
5352
Mark Lobodzinski20310782020-02-28 14:25:17 -07005353 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005354 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005355 m_errorMonitor->VerifyFound();
5356
Mark Lobodzinski20310782020-02-28 14:25:17 -07005357 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005358 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005359 m_errorMonitor->VerifyFound();
5360
Mark Lobodzinski20310782020-02-28 14:25:17 -07005361 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005362 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005363 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005364 }
unknown088160a2019-05-23 17:43:13 -06005365}
5366
5367TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5368 TEST_DESCRIPTION(
5369 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5370
5371 ASSERT_NO_FATAL_FAILURE(Init());
5372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5373
5374 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5375 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5376
5377 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5378 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5379 nullptr, // pNext
5380 m_renderPass,
5381 0, // subpass
5382 m_framebuffer,
5383 };
5384 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5385 nullptr, // pNext
5386 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5387
5388 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5389 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5390 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5391 sec_cmdbuff_inside_rp.end();
5392
5393 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5394 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5395 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5396 sec_cmdbuff_outside_rp.end();
5397
5398 m_commandBuffer->begin();
5399
Mark Lobodzinski20310782020-02-28 14:25:17 -07005400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005401 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005402 m_errorMonitor->VerifyFound();
5403
5404 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5405 nullptr, // pNext
5406 m_renderPass,
5407 m_framebuffer,
5408 {{0, 0}, {32, 32}},
5409 static_cast<uint32_t>(m_renderPassClearValues.size()),
5410 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005411 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005412
Mark Lobodzinski20310782020-02-28 14:25:17 -07005413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005414 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005415 m_errorMonitor->VerifyFound();
5416}
5417
5418TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5419 TEST_DESCRIPTION(
5420 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5421 ASSERT_NO_FATAL_FAILURE(Init());
5422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5423
sfricke-samsung1c61f192021-12-31 01:53:03 -06005424 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06005425 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5426 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5427 command_buffer_allocate_info.commandBufferCount = 1;
5428
5429 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005430 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
sfricke-samsung1c61f192021-12-31 01:53:03 -06005431 VkCommandBufferBeginInfo command_buffer_begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5432 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06005433 command_buffer_inheritance_info.renderPass = m_renderPass;
5434 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5435
unknown088160a2019-05-23 17:43:13 -06005436 command_buffer_begin_info.flags =
5437 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5438 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5439
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005440 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005441 VkClearAttachment color_attachment;
5442 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5443 color_attachment.clearValue.color.float32[0] = 0;
5444 color_attachment.clearValue.color.float32[1] = 0;
5445 color_attachment.clearValue.color.float32[2] = 0;
5446 color_attachment.clearValue.color.float32[3] = 0;
5447 color_attachment.colorAttachment = 0;
5448 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005449 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005450 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5451 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005452 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005453 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005454
Mark Lobodzinski20310782020-02-28 14:25:17 -07005455 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005456 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005457 m_errorMonitor->VerifyFound();
5458
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005459 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005460 m_commandBuffer->end();
5461}
5462
5463TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5464 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5465 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5466 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5467 } else {
5468 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5469 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5470 return;
5471 }
5472
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005473 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005474 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5475 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5476 } else {
5477 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5478 return;
5479 }
5480 ASSERT_NO_FATAL_FAILURE(InitState());
5481
5482 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5483 if (push_descriptor_prop.maxPushDescriptors < 1) {
5484 // Some implementations report an invalid maxPushDescriptors of 0
5485 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5486 return;
5487 }
5488
5489 // Create ordinary and push descriptor set layout
5490 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5491 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5492 ASSERT_TRUE(ds_layout.initialized());
5493 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5494 ASSERT_TRUE(push_ds_layout.initialized());
5495
5496 // Now use the descriptor set layouts to create a pipeline layout
5497 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5498 ASSERT_TRUE(pipeline_layout.initialized());
5499
5500 // Create a descriptor to push
5501 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5502 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5503 ASSERT_TRUE(buffer_obj.initialized());
5504
5505 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5506 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5507 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5508
5509 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5510 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5511
5512 // Find address of extension call and make the call
5513 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005514 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005515 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5516
5517 // Section 1: Queue family matching/capabilities.
5518 // Create command pool on a non-graphics queue
5519 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5520 const uint32_t transfer_only_qfi =
5521 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5522 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005523 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005524 } else {
5525 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5526
5527 VkCommandPoolObj command_pool(m_device, err_qfi);
5528 ASSERT_TRUE(command_pool.initialized());
5529 VkCommandBufferObj command_buffer(m_device, &command_pool);
5530 ASSERT_TRUE(command_buffer.initialized());
5531 command_buffer.begin();
5532
Mark Lobodzinski20310782020-02-28 14:25:17 -07005533 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005535 if (err_qfi == transfer_only_qfi) {
5536 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005537 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005538 }
5539 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5540 &descriptor_write);
5541 m_errorMonitor->VerifyFound();
5542 command_buffer.end();
5543
5544 // If we succeed in testing only one condition above, we need to test the other below.
5545 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5546 // Need to test the neither compute/gfx supported case separately.
5547 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5548 ASSERT_TRUE(tran_command_pool.initialized());
5549 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5550 ASSERT_TRUE(tran_command_buffer.initialized());
5551 tran_command_buffer.begin();
5552
5553 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005554 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5555 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5556 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005557 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5558 &descriptor_write);
5559 m_errorMonitor->VerifyFound();
5560 tran_command_buffer.end();
5561 }
5562 }
5563
5564 // Push to the non-push binding
5565 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005567 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5568 &descriptor_write);
5569 m_errorMonitor->VerifyFound();
5570
5571 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005572 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005573 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5574 &descriptor_write);
5575 m_errorMonitor->VerifyFound();
5576 m_commandBuffer->end();
5577
5578 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5579 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005580 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung85584a72021-09-30 21:43:38 -07005581 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005583 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5584 &descriptor_write);
5585 m_errorMonitor->VerifyFound();
5586}
5587
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005588TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5589 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5590 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5591 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5592 } else {
5593 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5594 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5595 return;
5596 }
5597
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005598 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005599 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5600 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5601 } else {
5602 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5603 return;
5604 }
5605 ASSERT_NO_FATAL_FAILURE(InitState());
5606
5607 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5608 if (push_descriptor_prop.maxPushDescriptors < 1) {
5609 // Some implementations report an invalid maxPushDescriptors of 0.
5610 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5611 return;
5612 }
5613
5614 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5615 if (min_alignment == 0) {
5616 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5617 return;
5618 }
5619
5620 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5621 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5622 ASSERT_TRUE(push_ds_layout.initialized());
5623
5624 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5625 ASSERT_TRUE(pipeline_layout.initialized());
5626
5627 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5628 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5629 ASSERT_TRUE(buffer_obj.initialized());
5630
5631 // Use an invalid alignment.
5632 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5633 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5634 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5635
5636 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5637 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5638 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5639
5640 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005641 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005642 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5643 &descriptor_write);
5644 m_errorMonitor->VerifyFound();
5645
5646 m_commandBuffer->end();
5647}
5648
unknown088160a2019-05-23 17:43:13 -06005649TEST_F(VkLayerTest, SetDynScissorParamTests) {
5650 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5651
5652 VkPhysicalDeviceFeatures features{};
5653 ASSERT_NO_FATAL_FAILURE(Init(&features));
5654
5655 const VkRect2D scissor = {{0, 0}, {16, 16}};
5656 const VkRect2D scissors[] = {scissor, scissor};
5657
5658 m_commandBuffer->begin();
5659
5660 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005661 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005662 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005663 m_errorMonitor->VerifyFound();
5664
Mark Lobodzinski20310782020-02-28 14:25:17 -07005665 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005666 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005667 m_errorMonitor->VerifyFound();
5668
Mark Lobodzinski20310782020-02-28 14:25:17 -07005669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005670 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005671 m_errorMonitor->VerifyFound();
5672
Mark Lobodzinski20310782020-02-28 14:25:17 -07005673 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5674 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005675 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005676 m_errorMonitor->VerifyFound();
5677
Mark Lobodzinski20310782020-02-28 14:25:17 -07005678 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005679 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005680 m_errorMonitor->VerifyFound();
5681
5682 struct TestCase {
5683 VkRect2D scissor;
5684 std::string vuid;
5685 };
5686
5687 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5688 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5689 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5690 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5691 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5692 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5693 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5694 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5695
5696 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005697 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005698 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005699 m_errorMonitor->VerifyFound();
5700 }
5701
5702 m_commandBuffer->end();
5703}
5704
5705TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5706 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5707
5708 ASSERT_NO_FATAL_FAILURE(Init());
5709
5710 if (!m_device->phy().features().multiViewport) {
5711 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5712 return;
5713 }
5714
unknown088160a2019-05-23 17:43:13 -06005715 m_commandBuffer->begin();
5716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005718 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005719 m_errorMonitor->VerifyFound();
5720
Petr Kraus14e49492019-09-09 20:13:29 +02005721 const auto max_scissors = m_device->props.limits.maxViewports;
5722
Mark Lobodzinski20310782020-02-28 14:25:17 -07005723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005724 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005725 m_errorMonitor->VerifyFound();
5726
Petr Kraus14e49492019-09-09 20:13:29 +02005727 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5728 if (max_scissors >= too_big_max_scissors) {
5729 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5730 kSkipPrefix);
5731 } else {
5732 const VkRect2D scissor = {{0, 0}, {16, 16}};
5733 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5734
Mark Lobodzinski20310782020-02-28 14:25:17 -07005735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005736 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005737 m_errorMonitor->VerifyFound();
5738
Mark Lobodzinski20310782020-02-28 14:25:17 -07005739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005740 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005741 m_errorMonitor->VerifyFound();
5742
Mark Lobodzinski20310782020-02-28 14:25:17 -07005743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005744 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005745 m_errorMonitor->VerifyFound();
5746
Mark Lobodzinski20310782020-02-28 14:25:17 -07005747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005748 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005749 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005750 }
unknown088160a2019-05-23 17:43:13 -06005751}
5752
Tony-LunarG667cc022021-06-25 10:11:17 -06005753TEST_F(VkLayerTest, MultiDrawTests) {
5754 TEST_DESCRIPTION("Test validation of multi_draw extension");
5755 SetTargetApiVersion(VK_API_VERSION_1_2);
5756 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5757 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5758 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5759 return;
5760 }
5761
5762 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
5763 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multi_draw_features);
5764 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
5765 if (!multi_draw_features.multiDraw) {
5766 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5767 return;
5768 }
5769 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5770 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5771 } else {
5772 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5773 return;
5774 }
5775 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5776 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
5777 vk::GetPhysicalDeviceProperties2(gpu(), &properties2);
5778
5779 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5781
5782 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5783 auto vkCmdDrawMultiIndexedEXT =
5784 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5785 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5786
5787 VkMultiDrawInfoEXT multi_draws[3] = {};
5788 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5789
5790 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5791 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5792
5793 CreatePipelineHelper pipe(*this);
5794 pipe.InitInfo();
5795 pipe.InitState();
5796 pipe.CreateGraphicsPipeline();
5797
5798 // Try existing VUID checks
5799 m_commandBuffer->begin();
5800 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5801
5802 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5803 &pipe.descriptor_set_->set_, 0, NULL);
5804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5805 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5806 m_errorMonitor->VerifyFound();
5807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5808 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5809 m_errorMonitor->VerifyFound();
5810
5811 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5812
5813 // New VUIDs added with multi_draw (also see GPU-AV)
5814 VkBufferObj buffer;
5815 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5816 multi_draw_indices[2].indexCount = 513;
5817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5818 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5819 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5820 m_errorMonitor->VerifyFound();
5821 multi_draw_indices[2].indexCount = 1;
5822
5823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5824 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5825 m_errorMonitor->VerifyFound();
5826 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5827 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5828 m_errorMonitor->VerifyFound();
5829
5830 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5831 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5832 m_errorMonitor->VerifyFound();
5833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5834 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5835 m_errorMonitor->VerifyFound();
5836
5837 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5838 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5839 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5840 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5842 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5843 m_errorMonitor->VerifyFound();
5844 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5845 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5846 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5847 m_errorMonitor->VerifyFound();
5848 }
5849}
5850
5851TEST_F(VkLayerTest, MultiDrawFeatures) {
5852 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5853 SetTargetApiVersion(VK_API_VERSION_1_2);
5854 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5855 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5856 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5857 return;
5858 }
5859 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5860 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5861 } else {
5862 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5863 return;
5864 }
5865 ASSERT_NO_FATAL_FAILURE(InitState());
5866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5867
sfricke-samsungca162082022-02-10 08:53:41 -08005868 auto multi_draw_props = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5869 auto pd_props2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_props);
5870 vk::GetPhysicalDeviceProperties2(gpu(), &pd_props2);
5871 if (multi_draw_props.maxMultiDrawCount == 0) {
5872 // If using MockICD and devsim the value might be zero'ed and cause false errors
5873 return;
5874 }
5875
Tony-LunarG667cc022021-06-25 10:11:17 -06005876 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5877 auto vkCmdDrawMultiIndexedEXT =
5878 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5879 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5880
5881 VkMultiDrawInfoEXT multi_draws[3] = {};
5882 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5883
5884 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5885 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5886
5887 CreatePipelineHelper pipe(*this);
5888 pipe.InitInfo();
5889 pipe.InitState();
5890 pipe.CreateGraphicsPipeline();
5891
5892 m_commandBuffer->begin();
5893 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5894 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5896 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5897 m_errorMonitor->VerifyFound();
5898 VkBufferObj buffer;
5899 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5900 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5901 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5902 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5903 m_errorMonitor->VerifyFound();
5904}
5905
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005906TEST_F(VkLayerTest, IndirectDrawTests) {
5907 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005908
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005909 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5910 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5911 } else {
5912 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5913 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5914 return;
5915 }
5916 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5917
5918 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5919 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5920 return;
5921 }
5922
Aaron Hagand1a61212021-12-22 11:53:49 -05005923 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06005924 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5925
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005926 CreatePipelineHelper pipe(*this);
5927 pipe.InitInfo();
5928 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06005929 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005930 dyn_state_ci.dynamicStateCount = size(dyn_states);
5931 dyn_state_ci.pDynamicStates = dyn_states;
5932 pipe.dyn_state_ci_ = dyn_state_ci;
5933 pipe.InitState();
5934 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005935
5936 m_commandBuffer->begin();
5937 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5938
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005939 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5940 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5941 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005942
5943 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005944 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005945 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005946 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005947
sfricke-samsung1c61f192021-12-31 01:53:03 -06005948 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005949 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5950 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005951 VkBufferObj draw_buffer;
5952 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005953
Aaron Hagand1a61212021-12-22 11:53:49 -05005954 VkBufferObj draw_buffer_correct;
5955 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5956 draw_buffer_correct.init(*m_device, buffer_create_info);
5957
unknown088160a2019-05-23 17:43:13 -06005958 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005959 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005960 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005961 m_errorMonitor->VerifyFound();
5962
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005963 // VUID-vkCmdDrawIndirect-drawCount-02718
Aaron Hagand1a61212021-12-22 11:53:49 -05005964 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-00488");
5965 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005966 m_errorMonitor->VerifyFound();
5967
Aaron Hagand1a61212021-12-22 11:53:49 -05005968 // VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701
5969 // VUID-vkCmdDrawIndexedIndirect-drawCount-00540
5970 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
5971 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
5972 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005973 m_errorMonitor->VerifyFound();
5974
unknown088160a2019-05-23 17:43:13 -06005975 m_commandBuffer->EndRenderPass();
5976 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005977}
5978
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005979TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5980 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5981
5982 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5983 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5984 } else {
5985 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5986 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5987 return;
5988 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005989 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005990
5991 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5992 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5993 } else {
5994 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005995 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005996 }
5997
5998 ASSERT_NO_FATAL_FAILURE(InitState());
5999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6000
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006001 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6002 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006003 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6004
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006005 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
6006 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
6007
6008 m_commandBuffer->begin();
6009 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
sfricke-samsung1c61f192021-12-31 01:53:03 -06006010 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006011 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6012 buffer_create_info.size = 1024;
6013 VkBufferObj counter_buffer;
6014 counter_buffer.init(*m_device, buffer_create_info);
6015
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006016 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006017 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006018 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006019 m_errorMonitor->VerifyFound();
6020
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006021 // some mock ICD json files are missing a valid stride value
6022 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6023 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006024 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006025 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6026 m_errorMonitor->VerifyFound();
6027 }
6028
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006029 m_commandBuffer->EndRenderPass();
6030 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006031
6032 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6033 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6034 return;
6035 }
6036
6037 std::vector<const char *> device_extension_names;
6038 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6039 VkDeviceObj test_device(0, gpu(), device_extension_names);
6040 VkCommandPoolObj commandPool(&test_device, 0);
6041 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6042 VkBufferObj counter_buffer2;
6043 counter_buffer2.init(test_device, buffer_create_info);
6044 VkPipelineLayoutObj pipelineLayout(&test_device);
6045 VkRenderPass renderpass;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006046 VkRenderPassCreateInfo rp_info = LvlInitStruct<VkRenderPassCreateInfo>();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006047 VkSubpassDescription subpass = {};
Tony-LunarG983bbc52020-11-06 11:04:59 -07006048 rp_info.pSubpasses = &subpass;
6049 rp_info.subpassCount = 1;
6050 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6051 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006052 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
6053 vs.InitFromGLSLTry(bindStateVertShaderText, false, SPV_ENV_VULKAN_1_0, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006054 pipeline.AddShader(&vs);
6055 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6056 m_renderPassBeginInfo.renderPass = renderpass;
6057 VkFramebuffer fb;
6058 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6059 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6060 m_renderPassBeginInfo.framebuffer = fb;
6061 m_renderPassBeginInfo.renderPass = renderpass;
6062 commandBuffer.begin();
6063 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6064 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6065 VkRect2D scissor = {{0, 0}, {16, 16}};
6066 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6067 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6068 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6069 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006071 }
6072 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6073 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6074 m_errorMonitor->VerifyFound();
6075 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6076 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006077}
6078
unknown088160a2019-05-23 17:43:13 -06006079TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6080 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6081
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006082 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006083 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6084 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6085 } else {
6086 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6087 return;
6088 }
6089 ASSERT_NO_FATAL_FAILURE(InitState());
6090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6091
6092 VkMemoryRequirements memory_requirements;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006093 VkMemoryAllocateInfo memory_allocate_info = LvlInitStruct<VkMemoryAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06006094
6095 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006096 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006097
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006098 CreatePipelineHelper pipe(*this);
6099 pipe.InitInfo();
6100 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006101 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006102 dyn_state_ci.dynamicStateCount = size(dyn_states);
6103 dyn_state_ci.pDynamicStates = dyn_states;
6104 pipe.dyn_state_ci_ = dyn_state_ci;
6105 pipe.InitState();
6106 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006107
6108 m_commandBuffer->begin();
6109 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6110
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006111 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6112 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6113 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006114
6115 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006116 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006117 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006118 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006119
sfricke-samsung1c61f192021-12-31 01:53:03 -06006120 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006121 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6122 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6123 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006124 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006125
sfricke-samsung1c61f192021-12-31 01:53:03 -06006126 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006127 count_buffer_create_info.size = sizeof(uint32_t);
6128 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006129 VkBufferObj count_buffer;
6130 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006131
Mike Schuchardt65847d92019-12-20 13:50:47 -08006132 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006134 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6135 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006136 m_errorMonitor->VerifyFound();
6137
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006138 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006139 memory_allocate_info.allocationSize = memory_requirements.size;
6140 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6141 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006142 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6143 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006144
6145 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006146 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006147
Mike Schuchardt65847d92019-12-20 13:50:47 -08006148 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006149 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006150 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6151 m_errorMonitor->VerifyFound();
6152
Mike Schuchardt65847d92019-12-20 13:50:47 -08006153 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006155 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6156 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006157 m_errorMonitor->VerifyFound();
6158
Mike Schuchardt65847d92019-12-20 13:50:47 -08006159 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006160 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006161 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6162 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006163 m_errorMonitor->VerifyFound();
6164
Mike Schuchardt65847d92019-12-20 13:50:47 -08006165 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006167 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006168 m_errorMonitor->VerifyFound();
6169
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006170 // TODO: These covered VUIDs aren't tested. There is also no test coverage for the core Vulkan 1.0 vk::CmdDraw* equivalent of
unknown088160a2019-05-23 17:43:13 -06006171 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006172 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6173 // VUID-vkCmdDrawIndirectCount-subpass-02685
6174 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006175
6176 m_commandBuffer->EndRenderPass();
6177 m_commandBuffer->end();
6178
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006179 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6180 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006181
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006182 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006183}
6184
6185TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6186 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6187
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006188 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006189 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6190 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6191 } else {
6192 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6193 return;
6194 }
6195 ASSERT_NO_FATAL_FAILURE(InitState());
6196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6197
unknown088160a2019-05-23 17:43:13 -06006198 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006199 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006200
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006201 CreatePipelineHelper pipe(*this);
6202 pipe.InitInfo();
6203 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006204 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006205 dyn_state_ci.dynamicStateCount = size(dyn_states);
6206 dyn_state_ci.pDynamicStates = dyn_states;
6207 pipe.dyn_state_ci_ = dyn_state_ci;
6208 pipe.InitState();
6209 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006210
6211 m_commandBuffer->begin();
6212 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6213
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006214 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6215 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6216 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006217
6218 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006219 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006220 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006221 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006222
sfricke-samsung1c61f192021-12-31 01:53:03 -06006223 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006224 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6225 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006226 VkBufferObj draw_buffer;
6227 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006228
sfricke-samsung1c61f192021-12-31 01:53:03 -06006229 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006230 count_buffer_create_info.size = sizeof(uint32_t);
6231 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006232 VkBufferObj count_buffer;
6233 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006234
sfricke-samsung1c61f192021-12-31 01:53:03 -06006235 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006236 index_buffer_create_info.size = sizeof(uint32_t);
6237 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006238 VkBufferObj index_buffer;
6239 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006240
Mike Schuchardt65847d92019-12-20 13:50:47 -08006241 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006242 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006243 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006244 sizeof(VkDrawIndexedIndirectCommand));
6245 m_errorMonitor->VerifyFound();
6246
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006247 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006248
6249 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006250 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006251
Mike Schuchardt65847d92019-12-20 13:50:47 -08006252 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006254 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006255 sizeof(VkDrawIndexedIndirectCommand));
6256 m_errorMonitor->VerifyFound();
6257
6258 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006259 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006260
Mike Schuchardt65847d92019-12-20 13:50:47 -08006261 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006262 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006263 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006264 sizeof(VkDrawIndexedIndirectCommand));
6265 m_errorMonitor->VerifyFound();
6266
Mike Schuchardt65847d92019-12-20 13:50:47 -08006267 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006269 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006270 sizeof(VkDrawIndexedIndirectCommand));
6271 m_errorMonitor->VerifyFound();
6272
Mike Schuchardt65847d92019-12-20 13:50:47 -08006273 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006274 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006275 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006276 sizeof(VkDrawIndexedIndirectCommand));
6277 m_errorMonitor->VerifyFound();
6278
Mike Schuchardt65847d92019-12-20 13:50:47 -08006279 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006280 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006281 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006282 m_errorMonitor->VerifyFound();
6283
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006284 // TODO: These covered VUIDs aren't tested. There is also no test coverage for the core Vulkan 1.0 vk::CmdDraw* equivalent of
unknown088160a2019-05-23 17:43:13 -06006285 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006286 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6287 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6288 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006289
6290 m_commandBuffer->EndRenderPass();
6291 m_commandBuffer->end();
6292
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006293 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6294 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006295}
6296
sfricke-samsung860d3b22020-05-04 21:08:29 -07006297TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6298 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6299
6300 SetTargetApiVersion(VK_API_VERSION_1_2);
6301 ASSERT_NO_FATAL_FAILURE(Init());
6302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6303 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6304 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6305 return;
6306 }
6307
6308 VkBufferObj indirect_buffer;
6309 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6310 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6311
6312 VkBufferObj indexed_indirect_buffer;
6313 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6314 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6315
6316 VkBufferObj count_buffer;
6317 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6318
6319 VkBufferObj index_buffer;
6320 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6321
6322 CreatePipelineHelper pipe(*this);
6323 pipe.InitInfo();
6324 pipe.InitState();
6325 pipe.CreateGraphicsPipeline();
6326
6327 // Make calls to valid commands but without the drawIndirectCount feature set
6328 m_commandBuffer->begin();
6329 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6330
6331 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6332
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006334 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6335 sizeof(VkDrawIndirectCommand));
6336 m_errorMonitor->VerifyFound();
6337
6338 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6339
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006340 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006341 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6342 sizeof(VkDrawIndexedIndirectCommand));
6343 m_errorMonitor->VerifyFound();
6344
6345 m_commandBuffer->EndRenderPass();
6346 m_commandBuffer->end();
6347}
6348
unknown088160a2019-05-23 17:43:13 -06006349TEST_F(VkLayerTest, ExclusiveScissorNV) {
6350 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6351
6352 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6353 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6354 } else {
6355 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6356 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6357 return;
6358 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006359 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006360 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6361 for (auto device_extension : required_device_extensions) {
6362 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6363 m_device_extension_names.push_back(device_extension);
6364 } else {
6365 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6366 return;
6367 }
6368 }
6369
6370 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006371 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006372 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6373
6374 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006375 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6376 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006377 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6378
6379 features2.features.multiViewport = VK_FALSE;
6380
6381 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6383
6384 if (m_device->phy().properties().limits.maxViewports) {
6385 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6386 return;
6387 }
6388
6389 // Based on PSOViewportStateTests
6390 {
6391 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6392 VkViewport viewports[] = {viewport, viewport};
6393 VkRect2D scissor = {{0, 0}, {64, 64}};
6394 VkRect2D scissors[100] = {scissor, scissor};
6395
6396 using std::vector;
6397 struct TestCase {
6398 uint32_t viewport_count;
6399 VkViewport *viewports;
6400 uint32_t scissor_count;
6401 VkRect2D *scissors;
6402 uint32_t exclusive_scissor_count;
6403 VkRect2D *exclusive_scissors;
6404
6405 vector<std::string> vuids;
6406 };
6407
6408 vector<TestCase> test_cases = {
6409 {1,
6410 viewports,
6411 1,
6412 scissors,
6413 2,
6414 scissors,
6415 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6416 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6417 {1,
6418 viewports,
6419 1,
6420 scissors,
6421 100,
6422 scissors,
6423 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6424 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6425 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006426 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006427 };
6428
6429 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006430 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6431 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006432
6433 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6434 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6435 helper.vp_state_ci_.pViewports = test_case.viewports;
6436 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6437 helper.vp_state_ci_.pScissors = test_case.scissors;
6438 helper.vp_state_ci_.pNext = &exc;
6439
6440 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6441 exc.pExclusiveScissors = test_case.exclusive_scissors;
6442 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006443 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006444 }
6445 }
6446
6447 // Based on SetDynScissorParamTests
6448 {
6449 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006450 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006451
6452 const VkRect2D scissor = {{0, 0}, {16, 16}};
6453 const VkRect2D scissors[] = {scissor, scissor};
6454
6455 m_commandBuffer->begin();
6456
Mark Lobodzinski20310782020-02-28 14:25:17 -07006457 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006458 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6459 m_errorMonitor->VerifyFound();
6460
Mark Lobodzinski20310782020-02-28 14:25:17 -07006461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006462 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6463 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6464 m_errorMonitor->VerifyFound();
6465
Mark Lobodzinski20310782020-02-28 14:25:17 -07006466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006467 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6468 m_errorMonitor->VerifyFound();
6469
Mark Lobodzinski20310782020-02-28 14:25:17 -07006470 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006471 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006472 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006473 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6474 m_errorMonitor->VerifyFound();
6475
Mark Lobodzinski20310782020-02-28 14:25:17 -07006476 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006478 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6479 m_errorMonitor->VerifyFound();
6480
Mark Lobodzinski20310782020-02-28 14:25:17 -07006481 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006482 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6483 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6484 m_errorMonitor->VerifyFound();
6485
6486 struct TestCase {
6487 VkRect2D scissor;
6488 std::string vuid;
6489 };
6490
6491 std::vector<TestCase> test_cases = {
6492 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6493 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6494 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6495 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6496 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6497 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6498 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6499 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6500
6501 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006502 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006503 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6504 m_errorMonitor->VerifyFound();
6505 }
6506
6507 m_commandBuffer->end();
6508 }
6509}
6510
6511TEST_F(VkLayerTest, MeshShaderNV) {
6512 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6513
6514 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6515 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6516 } else {
6517 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6518 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6519 return;
6520 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006521 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006522 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6523 for (auto device_extension : required_device_extensions) {
6524 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6525 m_device_extension_names.push_back(device_extension);
6526 } else {
6527 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6528 return;
6529 }
6530 }
6531
Tony-LunarG048f5012020-04-29 16:55:11 -06006532 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006533 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6534 return;
6535 }
6536
6537 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006538 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006539 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6540
6541 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006542 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6543 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006544 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6545 features2.features.multiDrawIndirect = VK_FALSE;
6546
6547 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6548 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6549
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006550 static const char vertShaderText[] = R"glsl(
6551 #version 450
6552 vec2 vertices[3];
6553 void main() {
6554 vertices[0] = vec2(-1.0, -1.0);
6555 vertices[1] = vec2( 1.0, -1.0);
6556 vertices[2] = vec2( 0.0, 1.0);
6557 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6558 gl_PointSize = 1.0f;
6559 }
6560 )glsl";
unknown088160a2019-05-23 17:43:13 -06006561
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006562 static const char meshShaderText[] = R"glsl(
6563 #version 450
6564 #extension GL_NV_mesh_shader : require
6565 layout(local_size_x = 1) in;
6566 layout(max_vertices = 3) out;
6567 layout(max_primitives = 1) out;
6568 layout(triangles) out;
6569 void main() {
6570 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6571 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6572 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6573 gl_PrimitiveIndicesNV[0] = 0;
6574 gl_PrimitiveIndicesNV[1] = 1;
6575 gl_PrimitiveIndicesNV[2] = 2;
6576 gl_PrimitiveCountNV = 1;
6577 }
6578 )glsl";
unknown088160a2019-05-23 17:43:13 -06006579
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006580 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6581 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6582 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006583
6584 // Test pipeline creation
6585 {
6586 // can't mix mesh with vertex
6587 const auto break_vp = [&](CreatePipelineHelper &helper) {
6588 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6589 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006590 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006591 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6592
6593 // vertex or mesh must be present
6594 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006595 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006596 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6597
6598 // vertexinput and inputassembly must be valid when vertex stage is present
6599 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6600 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6601 helper.gp_ci_.pVertexInputState = nullptr;
6602 helper.gp_ci_.pInputAssemblyState = nullptr;
6603 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006604 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006605 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6606 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6607 }
6608
6609 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006610 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006611
sfricke-samsung1c61f192021-12-31 01:53:03 -06006612 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006613 buffer_create_info.size = sizeof(uint32_t);
6614 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6615 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006616 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006617 ASSERT_VK_SUCCESS(result);
6618
6619 m_commandBuffer->begin();
6620
Mark Lobodzinski20310782020-02-28 14:25:17 -07006621 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6622 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006623 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6624 m_errorMonitor->VerifyFound();
6625
6626 m_commandBuffer->end();
6627
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006628 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006629}
6630
6631TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6632 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6633 ASSERT_NO_FATAL_FAILURE(Init());
6634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6635
6636 VkEvent event;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006637 VkEventCreateInfo event_create_info = LvlInitStruct<VkEventCreateInfo>();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006638 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006639
6640 m_commandBuffer->begin();
6641
Shannon McPherson93970b12020-06-12 14:34:35 -06006642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006643 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006644 m_errorMonitor->VerifyFound();
6645
Shannon McPherson93970b12020-06-12 14:34:35 -06006646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006647 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006648 m_errorMonitor->VerifyFound();
6649
Shannon McPherson93970b12020-06-12 14:34:35 -06006650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006651 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006652 m_errorMonitor->VerifyFound();
6653
Shannon McPherson93970b12020-06-12 14:34:35 -06006654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006655 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006656 m_errorMonitor->VerifyFound();
6657
Shannon McPherson93970b12020-06-12 14:34:35 -06006658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6659 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006660 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6661 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006662 m_errorMonitor->VerifyFound();
6663
Shannon McPherson93970b12020-06-12 14:34:35 -06006664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6665 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006666 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6667 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006668 m_errorMonitor->VerifyFound();
6669
Shannon McPherson93970b12020-06-12 14:34:35 -06006670 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6671 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006672 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6673 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006674 m_errorMonitor->VerifyFound();
6675
Shannon McPherson93970b12020-06-12 14:34:35 -06006676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006678 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6679 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006680 m_errorMonitor->VerifyFound();
6681
6682 m_commandBuffer->end();
6683
sfricke-samsung1c61f192021-12-31 01:53:03 -06006684 VkSemaphoreCreateInfo semaphore_create_info = LvlInitStruct<VkSemaphoreCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006685 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006686 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006687
6688 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006689 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006690
6691 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006692 submit_info.signalSemaphoreCount = 1;
6693 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006694 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006695 m_errorMonitor->VerifyNotFound();
6696
unknown088160a2019-05-23 17:43:13 -06006697 submit_info.signalSemaphoreCount = 0;
6698 submit_info.pSignalSemaphores = nullptr;
6699 submit_info.waitSemaphoreCount = 1;
6700 submit_info.pWaitSemaphores = &semaphore;
6701 submit_info.pWaitDstStageMask = &stage_flags;
6702
sfricke-samsung1ac64842021-09-23 14:11:17 -07006703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006705 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006706 m_errorMonitor->VerifyFound();
6707
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006708 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006709
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006710 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
sfricke-samsung1c61f192021-12-31 01:53:03 -06006711 VkPipelineShaderStageCreateInfo meshStage = LvlInitStruct<VkPipelineShaderStageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006712 meshStage = vs.GetStageCreateInfo();
6713 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006714 VkPipelineShaderStageCreateInfo taskStage = LvlInitStruct<VkPipelineShaderStageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006715 taskStage = vs.GetStageCreateInfo();
6716 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6717
6718 // mesh and task shaders not supported
6719 const auto break_vp = [&](CreatePipelineHelper &helper) {
6720 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6721 };
6722 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006723 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006724 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6725 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6726 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6727
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006728 vk::DestroyEvent(m_device->device(), event, nullptr);
6729 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006730}
Chris Mayerc93536f2019-09-19 16:34:49 +02006731
6732TEST_F(VkLayerTest, ViewportWScalingNV) {
6733 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6734
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006735 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006736
6737 VkPhysicalDeviceFeatures device_features = {};
6738 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6739
6740 if (!device_features.multiViewport) {
6741 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6742 return;
6743 }
6744
6745 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6746 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6747 } else {
6748 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6749 return;
6750 }
6751
6752 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6754
6755 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006756 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006757
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006758 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006759 #version 450
6760 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6761 vec2( 1.0f, 1.0f),
6762 vec2(-1.0f, -1.0f),
6763 vec2( 1.0f, -1.0f) };
6764 out gl_PerVertex {
6765 vec4 gl_Position;
6766 };
6767
6768 void main() {
6769 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006770 }
6771 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006772
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006773 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006774 #version 450
6775 layout(location = 0) out vec4 outColor;
6776
6777 void main() {
6778 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006779 }
6780 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006781
6782 const std::vector<VkViewport> vp = {
6783 {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}};
6784 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6785 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6786
6787 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6788
sfricke-samsung1c61f192021-12-31 01:53:03 -06006789 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006790 vpsi.viewportWScalingEnable = VK_TRUE;
6791 vpsi.viewportCount = vp_count;
6792 vpsi.pViewportWScalings = scale.data();
6793
sfricke-samsung1c61f192021-12-31 01:53:03 -06006794 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006795 vpci.viewportCount = vp_count;
6796 vpci.pViewports = vp.data();
6797 vpci.scissorCount = vp_count;
6798 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006799
6800 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6801
6802 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006803 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006804
6805 // Create pipeline with w-scaling enabled but without a valid scaling array
6806 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006807 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006808 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6809
6810 vpsi.pViewportWScalings = scale.data();
6811
6812 // Create pipeline with w-scaling enabled but without matching viewport counts
6813 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006814 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006815 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6816
6817 const VkPipelineLayoutObj pl(m_device);
6818
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006819 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6820 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006821
6822 VkPipelineObj pipe(m_device);
6823 pipe.AddDefaultColorAttachment();
6824 pipe.AddShader(&vs);
6825 pipe.AddShader(&fs);
6826 pipe.SetViewport(vp);
6827 pipe.SetScissor(sc);
6828 pipe.CreateVKPipeline(pl.handle(), renderPass());
6829
6830 VkPipelineObj pipeDynWScale(m_device);
6831 pipeDynWScale.AddDefaultColorAttachment();
6832 pipeDynWScale.AddShader(&vs);
6833 pipeDynWScale.AddShader(&fs);
6834 pipeDynWScale.SetViewport(vp);
6835 pipeDynWScale.SetScissor(sc);
6836 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6837 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6838
6839 m_commandBuffer->begin();
6840
6841 // Bind pipeline without dynamic w scaling enabled
6842 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006843 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006844 m_errorMonitor->VerifyNotFound();
6845
Chris Mayerc93536f2019-09-19 16:34:49 +02006846 // Bind pipeline that has dynamic w-scaling enabled
6847 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006848 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006849 m_errorMonitor->VerifyNotFound();
6850
6851 const auto max_vps = m_device->props.limits.maxViewports;
6852
Mark Lobodzinski20310782020-02-28 14:25:17 -07006853 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006854 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6855 m_errorMonitor->VerifyFound();
6856
6857 m_errorMonitor->ExpectSuccess();
6858 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6859 m_errorMonitor->VerifyNotFound();
6860
6861 m_commandBuffer->end();
6862}
sfricke-samsung914e8002020-01-07 22:26:18 -08006863
6864TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6865 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6866
6867 // Enable Sampler YCbCr Conversion req'd extensions
6868 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6869 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6870 if (mp_extensions) {
6871 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6872 }
6873 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006874 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006875 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006876 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6877 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6878 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6879 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006880 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006881 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6882 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6883 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6884 } else {
6885 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6886 return;
6887 }
6888
6889 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06006890 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08006891 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6892 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6893
6894 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6895 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6896 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6897 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6898 return;
6899 }
6900
6901 // Create Ycbcr conversion
6902 VkSamplerYcbcrConversion conversions;
6903 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6904 NULL,
6905 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6906 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6907 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6908 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6909 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6910 VK_CHROMA_LOCATION_COSITED_EVEN,
6911 VK_CHROMA_LOCATION_COSITED_EVEN,
6912 VK_FILTER_NEAREST,
6913 false};
6914
Mark Lobodzinski20310782020-02-28 14:25:17 -07006915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006916 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6917 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006918}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006919
6920TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6921 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6922
6923 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6924 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6925 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6926 return;
6927 }
6928 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6929
6930 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6931
6932 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6933 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6934 return;
6935 }
6936 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6937
6938 {
6939 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6940 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6941 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6942
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006943 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6944 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006945 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6946
6947 if (!tf_features.transformFeedback) {
6948 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6949 return;
6950 }
6951 }
6952
6953 ASSERT_NO_FATAL_FAILURE(InitState());
6954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6955
6956 {
6957 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6958 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6959 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6960
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006961 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006962 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6963 info.size = 4;
6964 VkBufferObj buffer;
6965 buffer.init(*m_device, info);
6966 VkDeviceSize offsets[1]{};
6967
6968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6969 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6970 m_errorMonitor->VerifyFound();
6971 }
6972
6973 {
6974 auto vkCmdBeginTransformFeedbackEXT =
6975 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6976 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6977
6978 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6979 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6980 m_errorMonitor->VerifyFound();
6981 }
6982
6983 {
6984 auto vkCmdEndTransformFeedbackEXT =
6985 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6986 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6987
6988 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6989 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6990 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6991 m_errorMonitor->VerifyFound();
6992 }
6993}
6994
6995TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6996 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6997
6998 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6999 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7000 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7001 return;
7002 }
7003 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7004
7005 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7006
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007007 if (IsPlatform(kGalaxyS10)) {
7008 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7009 return;
7010 }
7011
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007012 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7013 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7014 return;
7015 }
7016 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7017
7018 {
7019 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7020 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7021 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7022
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007023 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7024 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007025 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7026
7027 if (!tf_features.transformFeedback) {
7028 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7029 return;
7030 }
7031
7032 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7033 }
7034
7035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7036
7037 auto vkCmdBindTransformFeedbackBuffersEXT =
7038 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7039 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7040
7041 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007042 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7043 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007044 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7045
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007046 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007047 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7048 info.size = 8;
7049 VkBufferObj const buffer_obj(*m_device, info);
7050
7051 // Request a firstBinding that is too large.
7052 {
7053 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7054 VkDeviceSize const offsets[1]{};
7055
7056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7057 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7058 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7059 nullptr);
7060 m_errorMonitor->VerifyFound();
7061 }
7062
7063 // Request too many bindings.
7064 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7065 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7066 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7067
7068 std::vector<VkDeviceSize> offsets(bindingCount);
7069
7070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7071 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7072 nullptr);
7073 m_errorMonitor->VerifyFound();
7074 }
7075
7076 // Request a size that is larger than the maximum size.
7077 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7078 VkDeviceSize const offsets[1]{};
7079 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7080
7081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7082 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7083 m_errorMonitor->VerifyFound();
7084 }
7085 }
7086
7087 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007088 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007089 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7090 info.size = 8;
7091 VkBufferObj const buffer_obj(*m_device, info);
7092
7093 // Request an offset that is too large.
7094 {
7095 VkDeviceSize const offsets[1]{info.size + 4};
7096
7097 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7098 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7099 m_errorMonitor->VerifyFound();
7100 }
7101
7102 // Request an offset that is not a multiple of 4.
7103 {
7104 VkDeviceSize const offsets[1]{1};
7105
7106 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7107 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7108 m_errorMonitor->VerifyFound();
7109 }
7110
7111 // Request a size that is larger than the buffer's size.
7112 {
7113 VkDeviceSize const offsets[1]{};
7114 VkDeviceSize const sizes[1]{info.size + 1};
7115
7116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007117 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7118 m_errorMonitor->VerifyFound();
7119 }
7120
7121 // Request an offset and size whose sum is larger than the buffer's size.
7122 {
7123 VkDeviceSize const offsets[1]{4};
7124 VkDeviceSize const sizes[1]{info.size - 3};
7125
7126 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7127 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7128 m_errorMonitor->VerifyFound();
7129 }
7130
7131 // Bind while transform feedback is active.
7132 {
7133 auto vkCmdBeginTransformFeedbackEXT =
7134 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7135 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7136 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7137
7138 VkDeviceSize const offsets[1]{};
7139
7140 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7141 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7142 m_errorMonitor->VerifyFound();
7143
7144 auto vkCmdEndTransformFeedbackEXT =
7145 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7146 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7147 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7148 }
7149 }
7150
7151 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7152 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007153 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007154 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7155 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007156 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007157 VkBufferObj const buffer_obj(*m_device, info);
7158
7159 VkDeviceSize const offsets[1]{};
7160
7161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7162 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7163 m_errorMonitor->VerifyFound();
7164 }
7165
7166 // Don't bind memory.
7167 {
7168 VkBuffer buffer{};
7169 {
7170 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7171 ASSERT_TRUE(vkCreateBuffer != nullptr);
7172
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007173 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007174 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7175 info.size = 4;
7176 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7177 }
7178
7179 VkDeviceSize const offsets[1]{};
7180
7181 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7182 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7183 m_errorMonitor->VerifyFound();
7184 }
7185}
7186
7187TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7188 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7189
7190 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7191 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7192 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7193 return;
7194 }
7195 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7196
7197 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7198
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007199 if (IsPlatform(kGalaxyS10)) {
7200 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7201 return;
7202 }
7203
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007204 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7205 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7206 return;
7207 }
7208 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7209
7210 {
7211 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7212 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7213 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7214
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007215 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7216 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007217 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7218
7219 if (!tf_features.transformFeedback) {
7220 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7221 return;
7222 }
7223
7224 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7225 }
7226
7227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7228
7229 auto vkCmdBeginTransformFeedbackEXT =
7230 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7231 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7232
7233 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007234 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7235 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007236 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7237
7238 // Request a firstCounterBuffer that is too large.
7239 {
7240 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7241
7242 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7243 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7244 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7245 m_errorMonitor->VerifyFound();
7246 }
7247
7248 // Request too many buffers.
7249 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7250 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7251
7252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7253 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7254 m_errorMonitor->VerifyFound();
7255 }
7256 }
7257
7258 // Request an out-of-bounds location.
7259 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007260 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007261 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7262 info.size = 4;
7263 VkBufferObj const buffer_obj(*m_device, info);
7264
7265 VkDeviceSize const offsets[1]{1};
7266
7267 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7268 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7269 m_errorMonitor->VerifyFound();
7270 }
7271
7272 // Request specific offsets without specifying buffers.
7273 {
7274 VkDeviceSize const offsets[1]{};
7275
7276 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7277 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7278 m_errorMonitor->VerifyFound();
7279 }
7280
7281 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7282 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007283 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007284 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7285 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007286 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007287 VkBufferObj const buffer_obj(*m_device, info);
7288
7289 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7290 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7291 m_errorMonitor->VerifyFound();
7292 }
7293
7294 // Begin while transform feedback is active.
7295 {
7296 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7297
7298 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7299 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7300 m_errorMonitor->VerifyFound();
7301
7302 auto vkCmdEndTransformFeedbackEXT =
7303 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7304 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7305
7306 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7307 }
7308}
7309
7310TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7311 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7312
7313 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7314 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7315 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7316 return;
7317 }
7318 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7319
7320 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7321
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007322 if (IsPlatform(kGalaxyS10)) {
7323 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7324 return;
7325 }
7326
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007327 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7328 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7329 return;
7330 }
7331 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7332
7333 {
7334 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7335 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7336 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7337
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007338 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7339 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007340 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7341
7342 if (!tf_features.transformFeedback) {
7343 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7344 return;
7345 }
7346
7347 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7348 }
7349
7350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7351
7352 auto vkCmdEndTransformFeedbackEXT =
7353 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7354 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7355
7356 {
7357 // Activate transform feedback.
7358 auto vkCmdBeginTransformFeedbackEXT =
7359 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7360 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7361 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7362
7363 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007364 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7365 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007366 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7367
7368 // Request a firstCounterBuffer that is too large.
7369 {
7370 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7371
7372 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7373 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7374 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7375 m_errorMonitor->VerifyFound();
7376 }
7377
7378 // Request too many buffers.
7379 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7380 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7381
7382 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7383 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7384 m_errorMonitor->VerifyFound();
7385 }
7386 }
7387
7388 // Request an out-of-bounds location.
7389 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007390 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007391 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7392 info.size = 4;
7393 VkBufferObj const buffer_obj(*m_device, info);
7394
7395 VkDeviceSize const offsets[1]{1};
7396
7397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7398 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7399 m_errorMonitor->VerifyFound();
7400 }
7401
7402 // Request specific offsets without specifying buffers.
7403 {
7404 VkDeviceSize const offsets[1]{};
7405
7406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7407 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7408 m_errorMonitor->VerifyFound();
7409 }
7410
7411 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7412 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007413 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007414 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7415 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007416 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007417 VkBufferObj const buffer_obj(*m_device, info);
7418
7419 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7420 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7421 m_errorMonitor->VerifyFound();
7422 }
7423 }
7424
7425 // End while transform feedback is inactive.
7426 {
7427 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7428
7429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7430 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7431 m_errorMonitor->VerifyFound();
7432 }
7433}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007434
sfricke-samsung39ee2442020-07-22 21:21:15 -07007435TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7436 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007437
7438 // protect memory added in VK 1.1
7439 SetTargetApiVersion(VK_API_VERSION_1_1);
7440
7441 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7442 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7443 } else {
7444 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7445 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7446 return;
7447 }
7448 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7449
7450 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7451 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7452 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7453
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007454 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7455 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007456 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7457
7458 if (protected_memory_features.protectedMemory == VK_FALSE) {
7459 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7460 return;
7461 };
7462
7463 // Turns m_commandBuffer into a protected command buffer
7464 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7465
7466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7467 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7468 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7469 return;
7470 }
7471
7472 VkBufferObj indirect_buffer;
7473 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7474 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7475
7476 VkBufferObj indexed_indirect_buffer;
7477 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7478 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7479
7480 VkBufferObj index_buffer;
7481 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7482
7483 CreatePipelineHelper pipe(*this);
7484 pipe.InitInfo();
7485 pipe.InitState();
7486 pipe.CreateGraphicsPipeline();
7487
sfricke-samsung39ee2442020-07-22 21:21:15 -07007488 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007489 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007490 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7491 query_pool_create_info.queryCount = 1;
7492 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7493
sfricke-samsung071af2d2020-07-02 10:37:22 -07007494 m_commandBuffer->begin();
7495 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7496
7497 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7498
7499 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7500 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7501 m_errorMonitor->VerifyFound();
7502
7503 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7504
7505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7506 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7507 sizeof(VkDrawIndexedIndirectCommand));
7508 m_errorMonitor->VerifyFound();
7509
7510 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007511
7512 // Query should be outside renderpass
7513 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7514
7515 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7516 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7517 m_errorMonitor->VerifyFound();
7518
7519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7520 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7521 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7522 m_errorMonitor->VerifyFound();
7523
sfricke-samsung071af2d2020-07-02 10:37:22 -07007524 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007525
7526 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007527}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007528
7529TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7530 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7531
7532 SetTargetApiVersion(VK_API_VERSION_1_1);
7533
7534 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7535 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7536 } else {
7537 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7538 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7539 return;
7540 }
7541 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7542
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007543 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7544 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7545 return;
7546 }
7547
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007548 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7549 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7550 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007551 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7552 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7553 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007554
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007555 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7556 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007557 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7558
7559 if (protected_memory_features.protectedMemory == VK_FALSE) {
7560 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7561 return;
7562 };
7563
sfricke-samsung21286f82021-11-16 08:21:46 -08007564 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7565 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7566 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7567 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7568
7569 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
7570 ASSERT_NO_FATAL_FAILURE(InitState());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007571
7572 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7573 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7574
7575 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7576 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7577 return;
7578 }
7579
7580 // Create actual protected and unprotected buffers
7581 VkBuffer buffer_protected = VK_NULL_HANDLE;
7582 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007583 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007584 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007585 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7586 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7587 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007588 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7589
7590 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7591 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7592 buffer_create_info.flags = 0;
7593 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7594
7595 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007596 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007597 VkImageObj image_protected(m_device);
7598 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007599 VkImageObj image_protected_descriptor(m_device);
7600 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007601 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007602 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007603 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007604 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007605 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007606 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7607 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007608 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7609 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007610 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7611 image_create_info.arrayLayers = 1;
7612 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007613 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7614 image_protected.init_no_mem(*m_device, image_create_info);
7615 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7616
locke-lunarg0de02522020-10-27 22:55:17 -06007617 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7618 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007619
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007620 image_create_info.flags = 0;
7621 image_unprotected.init_no_mem(*m_device, image_create_info);
7622 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7623
locke-lunarg0de02522020-10-27 22:55:17 -06007624 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7625 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007626
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007627 // Create protected and unproteced memory
7628 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7629 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7630
sfricke-samsung1c61f192021-12-31 01:53:03 -06007631 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007632 alloc_info.allocationSize = 0;
7633
7634 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7635 VkMemoryRequirements mem_reqs_protected;
7636 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7637 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7638 VkMemoryRequirements mem_reqs_unprotected;
7639 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7640 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7641
7642 // Get memory index for a protected and unprotected memory
7643 VkPhysicalDeviceMemoryProperties phys_mem_props;
7644 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7645 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7646 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7647 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7648 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7649 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7650 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7651 memory_type_unprotected = i;
7652 }
7653 // Check just protected bit is in type at all
7654 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7655 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7656 memory_type_protected = i;
7657 }
7658 }
7659 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7660 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7661 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7662 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7663 return;
7664 }
7665
7666 alloc_info.memoryTypeIndex = memory_type_protected;
7667 alloc_info.allocationSize = mem_reqs_protected.size;
7668 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7669
7670 alloc_info.allocationSize = mem_reqs_unprotected.size;
7671 alloc_info.memoryTypeIndex = memory_type_unprotected;
7672 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7673
7674 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7675 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7676 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7677 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007678 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7679 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7680
7681 // need memory bound at image view creation time
7682 image_views[0] = image_protected.targetView(image_format);
7683 image_views[1] = image_unprotected.targetView(image_format);
7684 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7685 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007686
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007687 // A renderpass and framebuffer that contains a protected and unprotected image view
7688 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007689 {0, image_format, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007690 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7691 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007692 {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 -07007693 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7694 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7695 };
7696 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7697 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7698 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7699 VkSubpassDependency dependency = {0,
7700 0,
7701 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7702 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7703 VK_ACCESS_SHADER_WRITE_BIT,
7704 VK_ACCESS_SHADER_WRITE_BIT,
7705 VK_DEPENDENCY_BY_REGION_BIT};
7706 VkRenderPassCreateInfo render_pass_create_info = {
7707 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7708 VkRenderPass render_pass;
7709 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7710 VkFramebufferCreateInfo framebuffer_create_info = {
7711 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7712 VkFramebuffer framebuffer;
7713 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7714
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007715 // Various structs used for commands
7716 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7717 VkImageBlit blit_region = {};
7718 blit_region.srcSubresource = image_subresource;
7719 blit_region.dstSubresource = image_subresource;
7720 blit_region.srcOffsets[0] = {0, 0, 0};
7721 blit_region.srcOffsets[1] = {8, 8, 1};
7722 blit_region.dstOffsets[0] = {0, 8, 0};
7723 blit_region.dstOffsets[1] = {8, 8, 1};
7724 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7725 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7726 VkBufferCopy buffer_copy = {0, 0, 64};
7727 VkBufferImageCopy buffer_image_copy = {};
7728 buffer_image_copy.bufferRowLength = 0;
7729 buffer_image_copy.bufferImageHeight = 0;
7730 buffer_image_copy.imageSubresource = image_subresource;
7731 buffer_image_copy.imageOffset = {0, 0, 0};
7732 buffer_image_copy.imageExtent = {1, 1, 1};
7733 buffer_image_copy.bufferOffset = 0;
7734 VkImageCopy image_copy = {};
7735 image_copy.srcSubresource = image_subresource;
7736 image_copy.srcOffset = {0, 0, 0};
7737 image_copy.dstSubresource = image_subresource;
7738 image_copy.dstOffset = {0, 0, 0};
7739 image_copy.extent = {1, 1, 1};
7740 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007741 VkRect2D render_area = {{0, 0}, {8, 8}};
7742 VkRenderPassBeginInfo render_pass_begin = {
7743 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7744 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7745 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7746 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007747
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007748 const char fsSource[] = R"glsl(
7749 #version 450
7750 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7751 layout(set=0, binding=1, rgba8) uniform image2D si1;
7752 layout(location=0) out vec4 x;
7753 void main(){
7754 x = vec4(bar.y);
7755 imageStore(si1, ivec2(0), vec4(0));
7756 }
7757 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007758 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007759
7760 CreatePipelineHelper g_pipe(*this);
7761 g_pipe.InitInfo();
7762 g_pipe.gp_ci_.renderPass = render_pass;
7763 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7764 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7765 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7766 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7767 color_blend_attachments[0] = g_pipe.cb_attachments_;
7768 color_blend_attachments[1] = g_pipe.cb_attachments_;
7769 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7770 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7771 g_pipe.InitState();
7772 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7773
7774 VkSampler sampler;
7775 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7776 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7777 ASSERT_VK_SUCCESS(err);
7778
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007779 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007780 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007781 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7782 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7783 g_pipe.descriptor_set_->UpdateDescriptorSets();
7784
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007785 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007786 // will get undefined values, but not invalid if protectedNoFault is supported
7787 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7788 if (!protected_memory_properties.protectedNoFault) {
7789 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7790 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7791 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7792 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007793
sfricke-samsung21286f82021-11-16 08:21:46 -08007794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7795 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7796 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7797 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007798
sfricke-samsung21286f82021-11-16 08:21:46 -08007799 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7800 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7801 &subresource_range);
7802 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007803
sfricke-samsung21286f82021-11-16 08:21:46 -08007804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7805 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7806 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007807
sfricke-samsung21286f82021-11-16 08:21:46 -08007808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7809 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7810 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007811
sfricke-samsung21286f82021-11-16 08:21:46 -08007812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7813 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7814 1, &buffer_image_copy);
7815 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007816
sfricke-samsung21286f82021-11-16 08:21:46 -08007817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7818 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7819 1, &buffer_image_copy);
7820 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007821
sfricke-samsung21286f82021-11-16 08:21:46 -08007822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7823 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7824 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7825 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007826
sfricke-samsung21286f82021-11-16 08:21:46 -08007827 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7828 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7829 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7830 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007831
sfricke-samsung21286f82021-11-16 08:21:46 -08007832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7833 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7834 1, &buffer_image_copy);
7835 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007836
sfricke-samsung21286f82021-11-16 08:21:46 -08007837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7838 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7839 1, &buffer_image_copy);
7840 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007841
sfricke-samsung21286f82021-11-16 08:21:46 -08007842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7843 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7844 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007845
sfricke-samsung21286f82021-11-16 08:21:46 -08007846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7847 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7848 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007849
sfricke-samsung21286f82021-11-16 08:21:46 -08007850 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007851
sfricke-samsung21286f82021-11-16 08:21:46 -08007852 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7853 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7854 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007855
sfricke-samsung21286f82021-11-16 08:21:46 -08007856 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7857 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7858 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7859 VkDeviceSize offset = 0;
7860 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7861 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007862
sfricke-samsung21286f82021-11-16 08:21:46 -08007863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7864 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007868
sfricke-samsung21286f82021-11-16 08:21:46 -08007869 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7870 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007871
sfricke-samsung21286f82021-11-16 08:21:46 -08007872 vk::CmdEndRenderPass(m_commandBuffer->handle());
7873 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007874 m_commandBuffer->end();
7875
7876 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007877 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007878 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7879 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007880 g_pipe.descriptor_set_->UpdateDescriptorSets();
7881
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007882 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007883 if (!protected_memory_properties.protectedNoFault) {
7884 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7885 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7886 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7887 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007888
sfricke-samsung21286f82021-11-16 08:21:46 -08007889 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7890 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7891 1, &subresource_range);
7892 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007893
sfricke-samsung21286f82021-11-16 08:21:46 -08007894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7895 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7896 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007897
sfricke-samsung21286f82021-11-16 08:21:46 -08007898 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7899 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7900 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
7901 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007902
sfricke-samsung21286f82021-11-16 08:21:46 -08007903 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7904 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7905 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7906 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007907
sfricke-samsung21286f82021-11-16 08:21:46 -08007908 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7909 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7910 buffer_unprotected, 1, &buffer_image_copy);
7911 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007912
sfricke-samsung21286f82021-11-16 08:21:46 -08007913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7914 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7915 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007916
sfricke-samsung21286f82021-11-16 08:21:46 -08007917 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7918 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7919 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007920
sfricke-samsung21286f82021-11-16 08:21:46 -08007921 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007922
sfricke-samsung21286f82021-11-16 08:21:46 -08007923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7924 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7925 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007926
sfricke-samsung21286f82021-11-16 08:21:46 -08007927 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7928 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7929 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7930 VkDeviceSize offset = 0;
7931 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7932 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007933
sfricke-samsung21286f82021-11-16 08:21:46 -08007934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7935 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7936 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7937 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007938
sfricke-samsung21286f82021-11-16 08:21:46 -08007939 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
7940 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007941 protectedCommandBuffer.end();
7942
sfricke-samsung96cd9932020-08-23 20:57:11 -07007943 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7944 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7945
sfricke-samsung1c61f192021-12-31 01:53:03 -06007946 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
7947 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07007948 submit_info.commandBufferCount = 2;
7949 submit_info.pCommandBuffers = comman_buffers;
7950
7951 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08007952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007953 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007954 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7955 m_errorMonitor->VerifyFound();
7956
7957 protected_submit_info.protectedSubmit = VK_FALSE;
7958 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7959 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7960 m_errorMonitor->VerifyFound();
7961
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007962 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7963 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7964 vk::FreeMemory(device(), memory_protected, nullptr);
7965 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007966 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7967 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007968}
locke-lunarg6b0de702020-08-07 17:42:13 -06007969
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007970TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007971 TEST_DESCRIPTION(
7972 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7973 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7974
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007975 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7976 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7977 } else {
7978 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7979 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7980 return;
7981 }
7982 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7983 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)) {
7984 m_device_extension_names.push_back(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
7985 } else {
7986 printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
7987 return;
7988 }
7989
7990 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7991 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7992 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7993
7994 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
7995 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
7996 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7997 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7998
7999 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
8000 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
8001 return;
8002 }
locke-lunarg6b0de702020-08-07 17:42:13 -06008003
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008004 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06008005 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
8006 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
8007 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8008 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
8009
8010 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
8011 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8012 return;
8013 }
8014
8015 VkFormat buffer_view_format =
8016 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
8017 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8018 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8019 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8020 return;
8021 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008022 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8024
8025 VkPhysicalDeviceFeatures device_features = {};
8026 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8027 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8028 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8029 return;
8030 }
8031
8032 VkImageObj image(m_device);
8033 image.Init(image_ci);
8034 VkImageView image_view = image.targetView(image_format);
8035
8036 VkSampler sampler = VK_NULL_HANDLE;
8037 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8038 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8039
8040 VkBufferObj buffer;
8041 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8042
sfricke-samsung1c61f192021-12-31 01:53:03 -06008043 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06008044 bvci.buffer = buffer.handle();
8045 bvci.format = buffer_view_format;
8046 bvci.range = VK_WHOLE_SIZE;
8047 VkBufferView buffer_view;
8048 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8049
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008050 char const *fsSource = R"glsl(
8051 #version 450
8052 layout(set=0, binding=3, r32f) uniform image2D si0;
8053 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8054 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8055 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8056 void main() {
8057 imageAtomicExchange(si0, ivec2(0), 1);
8058 imageAtomicExchange(si1[0], ivec2(0), 1);
8059 imageAtomicExchange(si1[1], ivec2(0), 1);
8060 imageAtomicExchange(stb2, 0, 1);
8061 imageAtomicExchange(stb3[0], 0, 1);
8062 imageAtomicExchange(stb3[1], 0, 1);
8063 }
8064 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008065
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008066 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
8067 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06008068
8069 CreatePipelineHelper g_pipe(*this);
8070 g_pipe.InitInfo();
8071 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008072 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8073 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8074 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8075 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008076 g_pipe.InitState();
8077 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8078
locke-lunarg76e8dee2020-08-21 13:20:02 -06008079 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008080 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008081 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008082 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008083 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008084 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008085 g_pipe.descriptor_set_->UpdateDescriptorSets();
8086
8087 m_commandBuffer->begin();
8088 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8089 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8090 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8091 &g_pipe.descriptor_set_->set_, 0, nullptr);
8092
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008093 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8098 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8099 m_errorMonitor->VerifyFound();
8100
8101 m_commandBuffer->EndRenderPass();
8102 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008103 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8104 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008105}
locke-lunargae1bbab2020-09-10 11:55:56 -06008106
8107TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8108 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8109
8110 ASSERT_NO_FATAL_FAILURE(Init());
8111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8112
8113 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008114 char const *const vsSource = R"glsl(
8115 #version 450
8116 layout(push_constant, std430) uniform foo {
8117 bool b;
8118 float f2[3];
8119 vec3 v;
8120 vec4 v2[2];
8121 mat3 m;
8122 } constants;
8123 void func1( float f ){
8124 // use the whole v2[1]. byte: 48-63.
8125 vec2 v2 = constants.v2[1].yz;
8126 }
8127 void main(){
8128 // use only v2[0].z. byte: 40-43.
8129 func1( constants.v2[0].z);
8130 // index of m is variable. The all m is used. byte: 64-99.
8131 for(int i=1;i<2;++i) {
8132 vec3 v3 = constants.m[i];
8133 }
8134 }
8135 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008136
8137 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008138 char const *const fsSource = R"glsl(
8139 #version 450
8140 struct foo1{
8141 int i[4];
8142 }f;
8143 layout(push_constant, std430) uniform foo {
8144 float x[2][2][2];
8145 foo1 s;
8146 foo1 ss[3];
8147 } constants;
8148 void main(){
8149 // use s. byte: 32-47.
8150 f = constants.s;
8151 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8152 for(int i=1;i<2;++i) {
8153 int ii = constants.ss[i].i[3];
8154 }
8155 }
8156 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008157
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008158 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8159 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008160
8161 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8162 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8163
8164 VkPipelineLayoutCreateInfo pipeline_layout_info{
8165 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8166
8167 VkPipelineLayout pipeline_layout;
8168 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8169
8170 CreatePipelineHelper g_pipe(*this);
8171 g_pipe.InitInfo();
8172 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8173 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8174 g_pipe.InitState();
8175 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8176
8177 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8178 VkPipelineLayout pipeline_layout_small;
8179 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8180
8181 CreatePipelineHelper g_pipe_small_range(*this);
8182 g_pipe_small_range.InitInfo();
8183 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8184 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8185 g_pipe_small_range.InitState();
8186
sfricke-samsung7699b912021-04-12 23:01:51 -07008187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008189 g_pipe_small_range.CreateGraphicsPipeline();
8190 m_errorMonitor->VerifyFound();
8191
8192 m_commandBuffer->begin();
8193 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8194
Piers Daniella7f93b62021-11-20 12:32:04 -07008195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008196 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8197 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8198 &g_pipe.descriptor_set_->set_, 0, nullptr);
8199 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8200 m_errorMonitor->VerifyFound();
8201
locke-lunargae1bbab2020-09-10 11:55:56 -06008202 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008203
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008204 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8205 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8206 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8207 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008208 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008209 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8210 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8211 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8212 // m_errorMonitor->VerifyFound();
8213
Piers Daniella7f93b62021-11-20 12:32:04 -07008214 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008215 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8216 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8217 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008218
8219 m_errorMonitor->ExpectSuccess();
8220 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8221 68, dummy_values);
8222 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8223 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008224}
8225
8226TEST_F(VkLayerTest, VerifyVertextBinding) {
8227 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8228
8229 ASSERT_NO_FATAL_FAILURE(Init());
8230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8231
8232 VkBufferObj vtx_buf;
8233 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8234 vtx_buf.init(*m_device, info);
8235
8236 CreatePipelineHelper pipe(*this);
8237 pipe.InitInfo();
8238 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8239 VkVertexInputBindingDescription vtx_binding_des[3] = {
8240 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8241
8242 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8243 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8244 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8245 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8246 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8247 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8248 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8249 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8250 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8251 pipe.InitState();
8252 pipe.CreateGraphicsPipeline();
8253
8254 m_commandBuffer->begin();
8255 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8256 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8257 VkDeviceSize offset = 0;
8258 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8259
8260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8265 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8266 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008267
8268 m_commandBuffer->EndRenderPass();
8269 m_commandBuffer->end();
8270}
locke-lunargd7a08e92020-10-21 00:24:00 -06008271
8272TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8273 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8274 ASSERT_NO_FATAL_FAILURE(Init());
8275 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8276
8277 CreatePipelineHelper pipe(*this);
8278 pipe.InitInfo();
8279
8280 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8281
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008282 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008283 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8284 dyn_state_ci.pDynamicStates = dyn_states.data();
8285 pipe.dyn_state_ci_ = dyn_state_ci;
8286 pipe.InitState();
8287 pipe.CreateGraphicsPipeline();
8288
8289 m_commandBuffer->begin();
8290 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8291 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8292
8293 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8294 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8295 VkRect2D scissor = {{0, 0}, {16, 16}};
8296 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8297 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8298
8299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8300 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8301 m_errorMonitor->VerifyFound();
8302
8303 m_commandBuffer->EndRenderPass();
8304 m_commandBuffer->end();
8305}
locke-lunarg0de02522020-10-27 22:55:17 -06008306
8307TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8308 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8309 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8310 if (version < VK_API_VERSION_1_1) {
8311 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8312 return;
8313 }
8314 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8315
8316 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8317 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8318 } else {
8319 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8320 return;
8321 }
8322
8323 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8325
8326 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8327 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008328
8329 VkFormatProperties format_props;
8330 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8331 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8332 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8333 return;
8334 }
8335
locke-lunarg0de02522020-10-27 22:55:17 -06008336 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8337 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8338
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008339 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008340 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008341 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008342 image_format_info.type = image_ci.imageType;
8343 image_format_info.format = image_ci.format;
8344 image_format_info.tiling = image_ci.tiling;
8345 image_format_info.usage = image_ci.usage;
8346 image_format_info.flags = image_ci.flags;
8347
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008348 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8349 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008350
8351 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8352
8353 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8354 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8355 return;
8356 }
8357
8358 VkImageObj image(m_device);
8359 image.Init(image_ci);
8360 VkImageView imageView = image.targetView(format, imageViewType);
8361
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008362 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008363 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8364 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8365 VkSampler sampler;
8366 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8367
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008368 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008369 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8370 sampler_ci.pNext = &reduction_mode_ci;
8371 VkSampler sampler_rediction;
8372 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8373
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008374 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008375
8376 CreatePipelineHelper g_pipe(*this);
8377 g_pipe.InitInfo();
8378 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8379 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8380 g_pipe.InitState();
8381 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8382
8383 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8384 g_pipe.descriptor_set_->UpdateDescriptorSets();
8385
8386 m_commandBuffer->begin();
8387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8388 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8389 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8390 &g_pipe.descriptor_set_->set_, 0, nullptr);
8391
8392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8393 m_commandBuffer->Draw(1, 0, 0, 0);
8394 m_errorMonitor->VerifyFound();
8395
8396 m_commandBuffer->EndRenderPass();
8397 m_commandBuffer->end();
8398 m_commandBuffer->reset();
8399
8400 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8401 g_pipe.descriptor_set_->UpdateDescriptorSets();
8402
8403 m_commandBuffer->begin();
8404 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8405 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8406 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8407 &g_pipe.descriptor_set_->set_, 0, nullptr);
8408
8409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8410 m_commandBuffer->Draw(1, 0, 0, 0);
8411 m_errorMonitor->VerifyFound();
8412
8413 m_commandBuffer->EndRenderPass();
8414 m_commandBuffer->end();
8415}
8416
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008417TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008418 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 -07008419
Clemens Kern5a42ea62021-09-29 16:30:23 +02008420 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8421 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8422 if (!AreRequestedExtensionsEnabled()) {
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008423 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8424 return;
8425 }
8426
8427 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8429
8430 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8431 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008432 auto image_ci = vk_testing::Image::create_info();
8433 image_ci.imageType = VK_IMAGE_TYPE_3D;
8434 image_ci.format = format;
8435 image_ci.extent.width = 128;
8436 image_ci.extent.height = 128;
8437 image_ci.mipLevels = 1;
8438 image_ci.arrayLayers = 1;
8439 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8440 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8441 image_ci.usage = usage;
8442 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008443
8444 VkImageObj image(m_device);
8445 image.Init(image_ci);
8446 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8447 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8448
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008449 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008450 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8451 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8452 VkSampler sampler;
8453 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8454
Clemens Kern5a42ea62021-09-29 16:30:23 +02008455 static const char fs_src[] = R"glsl(
8456 #version 450
8457 layout(set=0, binding=0) uniform sampler3D s;
8458 layout(location=0) out vec4 x;
8459 void main(){
8460 x = texture(s, vec3(1));
8461 }
8462 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008463 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008464
8465 CreatePipelineHelper g_pipe(*this);
8466 g_pipe.InitInfo();
8467 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8468 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8469 g_pipe.InitState();
8470 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8471
8472 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8473 g_pipe.descriptor_set_->UpdateDescriptorSets();
8474
8475 m_commandBuffer->begin();
8476 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8477 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8478 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8479 &g_pipe.descriptor_set_->set_, 0, nullptr);
8480
8481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8482 m_commandBuffer->Draw(1, 0, 0, 0);
8483 m_errorMonitor->VerifyFound();
8484
8485 m_commandBuffer->EndRenderPass();
8486 m_commandBuffer->end();
8487}
8488
locke-lunarg0de02522020-10-27 22:55:17 -06008489TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8490 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8491 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8492 if (version < VK_API_VERSION_1_1) {
8493 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8494 return;
8495 }
8496 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8497 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8498 } else {
8499 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8500 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8501 return;
8502 }
8503 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8504
8505 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8506 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8507 } else {
8508 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8509 return;
8510 }
8511
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008512 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008513 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008514 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008515
8516 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8517 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8518
8519 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8520 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8521 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008522 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8523 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008524 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8525 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8526 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8527 return;
8528 }
8529 CreatePipelineHelper pipe(*this);
8530 pipe.InitInfo();
8531 pipe.InitState();
8532 pipe.CreateGraphicsPipeline();
8533
8534 m_commandBuffer->begin();
8535 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8536 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8537
8538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8539 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8540 m_errorMonitor->VerifyFound();
8541
8542 m_commandBuffer->EndRenderPass();
8543 m_commandBuffer->end();
8544}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008545
8546TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8547 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8548
8549 // Enable KHR_fragment_shading_rate and all of its required extensions
8550 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8551 if (fsr_extensions) {
8552 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8553 }
8554 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8555
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008556 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8557 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008558 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8559 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8560 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8561 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008562 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8563 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008564 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8565 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8566 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8567 } else {
8568 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8569 return;
8570 }
8571
sfricke-samsung1c61f192021-12-31 01:53:03 -06008572 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008573 fsr_features.pipelineFragmentShadingRate = true;
8574
sfricke-samsung1c61f192021-12-31 01:53:03 -06008575 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008576
8577 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8578
8579 // Find address of extension call and make the call
8580 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8581 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8582 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8583
8584 VkExtent2D fragmentSize = {1, 1};
8585 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8586 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8587
8588 m_commandBuffer->begin();
8589 fragmentSize.width = 0;
8590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8591 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8592 m_errorMonitor->VerifyFound();
8593 fragmentSize.width = 1;
8594
8595 fragmentSize.height = 0;
8596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8597 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8598 m_errorMonitor->VerifyFound();
8599 fragmentSize.height = 1;
8600
8601 fragmentSize.width = 3;
8602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8603 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8604 m_errorMonitor->VerifyFound();
8605 fragmentSize.width = 1;
8606
8607 fragmentSize.height = 3;
8608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8609 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8610 m_errorMonitor->VerifyFound();
8611 fragmentSize.height = 1;
8612
8613 fragmentSize.width = 8;
8614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8615 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8616 m_errorMonitor->VerifyFound();
8617 fragmentSize.width = 1;
8618
8619 fragmentSize.height = 8;
8620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8621 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8622 m_errorMonitor->VerifyFound();
8623 fragmentSize.height = 1;
8624 m_commandBuffer->end();
8625}
8626
8627TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8628 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8629
8630 // Enable KHR_fragment_shading_rate and all of its required extensions
8631 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8632 if (fsr_extensions) {
8633 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8634 }
8635 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8636
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008637 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8638 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008639 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8640 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8641 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8642 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008643 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8644 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008645 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8646 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8647 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8648 } else {
8649 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8650 return;
8651 }
8652
8653 ASSERT_NO_FATAL_FAILURE(InitState());
8654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8655
8656 // Find address of extension call and make the call
8657 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8658 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8659 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8660
8661 VkExtent2D fragmentSize = {1, 1};
8662 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8663 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8664
8665 m_commandBuffer->begin();
8666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8667 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8668 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8669 m_errorMonitor->VerifyFound();
8670 m_commandBuffer->end();
8671}
8672
8673TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8674 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8675
8676 // Enable KHR_fragment_shading_rate and all of its required extensions
8677 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8678 if (fsr_extensions) {
8679 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8680 }
8681 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8682
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008683 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8684 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008685 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8686 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8687 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8688 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008689 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8690 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008691 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8692 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8693 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8694 } else {
8695 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8696 return;
8697 }
8698
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008699 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8700 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008701
8702 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8703 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8704 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8705
8706 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8708
8709 // Find address of extension call and make the call
8710 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8711 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8712 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8713
8714 VkExtent2D fragmentSize = {1, 1};
8715 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8716 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8717
8718 m_commandBuffer->begin();
8719
8720 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8722 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8723 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8724 m_errorMonitor->VerifyFound();
8725 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8726
8727 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8729 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8730 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8731 m_errorMonitor->VerifyFound();
8732 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8733
8734 m_commandBuffer->end();
8735}
8736
8737TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8738 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8739
8740 // Enable KHR_fragment_shading_rate and all of its required extensions
8741 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8742 if (fsr_extensions) {
8743 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8744 }
8745 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8746
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008747 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8748 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008749 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8750 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8751 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8752 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008753 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8754 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008755 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8756 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8757 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8758 } else {
8759 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8760 return;
8761 }
8762
8763 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8764 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8765 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008766 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8767 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008768 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8769
8770 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8771 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8772 return;
8773 }
8774
8775 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8776
8777 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8779
8780 // Find address of extension call and make the call
8781 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8782 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8783 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8784
8785 VkExtent2D fragmentSize = {1, 1};
8786 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8787 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8788
8789 m_commandBuffer->begin();
8790 fragmentSize.width = 2;
8791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8792 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8793 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8794 m_errorMonitor->VerifyFound();
8795 fragmentSize.width = 1;
8796
8797 fragmentSize.height = 2;
8798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8799 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8800 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8801 m_errorMonitor->VerifyFound();
8802 fragmentSize.height = 1;
8803}
8804
8805TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8806 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8807
8808 // Enable KHR_fragment_shading_rate and all of its required extensions
8809 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8810 if (fsr_extensions) {
8811 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8812 }
8813 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8814
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008815 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8816 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008817 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8818 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8819 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8820 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008821 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8822 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008823 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8824 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8825 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8826 } else {
8827 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8828 return;
8829 }
8830
8831 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8832 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8833 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8834 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008835 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8836 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008837 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8838
8839 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8840 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8841 return;
8842 }
8843
8844 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8845 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8846 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008847 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8848 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008849 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8850
8851 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8852 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8853 return;
8854 }
8855
8856 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8857 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8858
8859 // Find address of extension call and make the call
8860 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8861 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8862 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8863
8864 VkExtent2D fragmentSize = {1, 1};
8865 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8866 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8867
8868 m_commandBuffer->begin();
8869 if (fsr_features.primitiveFragmentShadingRate) {
8870 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8872 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8873 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8874 m_errorMonitor->VerifyFound();
8875 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8876 }
8877
8878 if (fsr_features.attachmentFragmentShadingRate) {
8879 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8881 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8882 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8883 m_errorMonitor->VerifyFound();
8884 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8885 }
8886 m_commandBuffer->end();
8887}
8888
8889TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8890 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8891
8892 // Enable KHR_fragment_shading_rate and all of its required extensions
8893 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8894 if (fsr_extensions) {
8895 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8896 }
8897 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8898
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008899 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8900 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008901 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8902 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8903 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8904 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008905 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8906 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008907 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8908 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8909 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8910 } else {
8911 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8912 return;
8913 }
8914
8915 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8916 if (eds_extension) {
8917 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8918 } else {
8919 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8920 return;
8921 }
8922
8923 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8924 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8925 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8926 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008927 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8928 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008929 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8930
8931 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8932 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8933 return;
8934 }
8935
8936 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8937 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8938 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008939 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008940 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008941 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8942 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008943 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8944
8945 if (!fsr_features.primitiveFragmentShadingRate) {
8946 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8947 return;
8948 }
8949
8950 if (!features2.features.multiViewport) {
8951 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8952 return;
8953 }
8954
8955 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8957
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008958 char const *vsSource = R"glsl(
8959 #version 450
8960 #extension GL_EXT_fragment_shading_rate : enable
8961 void main() {
8962 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8963 }
8964 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008965
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008966 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008967
8968 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008969 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8970 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008971 pipe.AddShader(&fs);
8972 pipe.AddDefaultColorAttachment();
8973 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008974 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008975 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008976 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008977 pipe.AddShader(&vs);
8978 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8979 ASSERT_VK_SUCCESS(err);
8980 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008981 m_commandBuffer->begin();
8982 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8983
8984 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8985
8986 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8987 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8988 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8989 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8990
8991 // error produced here.
8992 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
8993
8994 m_errorMonitor->VerifyFound();
8995
8996 m_commandBuffer->EndRenderPass();
8997 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008998}
ziga-lunargdada63d2021-07-13 22:10:11 +02008999
9000TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
9001 TEST_DESCRIPTION("Update buffer with invalid dataSize");
9002
9003 ASSERT_NO_FATAL_FAILURE(Init());
9004
9005 uint32_t update_data[4] = {0, 0, 0, 0};
9006 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9007 VkMemoryPropertyFlags reqs = 0;
9008 VkBufferObj buffer;
9009 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9010
9011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
9012 m_commandBuffer->begin();
9013 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
9014 m_commandBuffer->end();
9015 m_errorMonitor->VerifyFound();
9016}
ziga-lunargc08456d2021-07-16 21:40:13 +02009017
9018TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
9019 TEST_DESCRIPTION("Update buffer with invalid dst offset");
9020
9021 ASSERT_NO_FATAL_FAILURE(Init());
9022
9023 uint32_t update_data[4] = {0, 0, 0, 0};
9024 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9025 VkMemoryPropertyFlags reqs = 0;
9026 VkBufferObj buffer;
9027 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9028
9029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
9030 m_commandBuffer->begin();
9031 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
9032 m_commandBuffer->end();
9033 m_errorMonitor->VerifyFound();
9034}
ziga-lunarg4e31a752021-07-22 14:35:03 +02009035
9036TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
9037 TEST_DESCRIPTION(
9038 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
9039
9040 ASSERT_NO_FATAL_FAILURE(Init());
9041
9042 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
9043 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
9044 if (INVALID_QUEUE == no_gfx_qfi) {
9045 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
9046 return;
9047 }
9048
9049 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
9050 ASSERT_TRUE(command_pool.initialized());
9051 VkCommandBufferObj command_buffer(m_device, &command_pool);
9052
9053 VkDescriptorPoolSize ds_type_count = {};
9054 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9055 ds_type_count.descriptorCount = 1;
9056
9057 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
9058 ds_pool_ci.maxSets = 1;
9059 ds_pool_ci.poolSizeCount = 1;
9060 ds_pool_ci.flags = 0;
9061 ds_pool_ci.pPoolSizes = &ds_type_count;
9062
9063 VkDescriptorPool ds_pool;
9064 vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, nullptr, &ds_pool);
9065
9066 VkDescriptorSetLayoutBinding dsl_binding = {};
9067 dsl_binding.binding = 0;
9068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9069 dsl_binding.descriptorCount = 1;
9070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9071 dsl_binding.pImmutableSamplers = nullptr;
9072
9073 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9074
9075 VkDescriptorSet descriptorSet;
9076 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9077 alloc_info.descriptorSetCount = 1;
9078 alloc_info.descriptorPool = ds_pool;
9079 alloc_info.pSetLayouts = &ds_layout.handle();
9080 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9081
9082 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9083 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9084
9085 command_buffer.begin();
9086 // Set invalid set
9087 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9088 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9089 &descriptorSet, 0, nullptr);
9090 m_errorMonitor->VerifyFound();
9091 command_buffer.end();
9092}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009093
9094TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9095 TEST_DESCRIPTION(
9096 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9097 "occlusion query is active.");
9098 ASSERT_NO_FATAL_FAILURE(Init());
9099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9100
9101 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9102 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9103 qpci.queryCount = 1;
9104
9105 VkQueryPool query_pool;
9106 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9107
9108 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9109
9110 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9111 cbii.renderPass = m_renderPass;
9112 cbii.framebuffer = m_framebuffer;
9113 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9114
9115 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9116 cbbi.pInheritanceInfo = &cbii;
9117
9118 VkCommandBuffer secondary_handle = secondary.handle();
9119 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9120 vk::EndCommandBuffer(secondary_handle);
9121
9122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9123 m_commandBuffer->begin();
9124 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9125 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9126 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9127 m_commandBuffer->end();
9128 m_errorMonitor->VerifyFound();
9129
9130 vk::DestroyQueryPool(device(), query_pool, nullptr);
9131}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009132
9133TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9134 TEST_DESCRIPTION("Test invalid null entries for clear color");
9135
9136 ASSERT_NO_FATAL_FAILURE(InitFramework());
9137 ASSERT_NO_FATAL_FAILURE(InitState());
9138
9139 VkImageObj image(m_device);
9140 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9141
9142 VkImageSubresourceRange isr = {};
9143 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9144 isr.baseArrayLayer = 0;
9145 isr.baseMipLevel = 0;
9146 isr.layerCount = 1;
9147 isr.levelCount = 1;
9148
9149 m_commandBuffer->begin();
9150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9151 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9152 m_errorMonitor->VerifyFound();
9153 m_commandBuffer->end();
9154}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009155
9156TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9157 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9158
9159 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9160 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9161 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9162 return;
9163 }
9164 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9165 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9166 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9167 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9168 return;
9169 }
9170 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9171 ASSERT_NO_FATAL_FAILURE(InitState());
9172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9173
9174 VkAttachmentDescription attachmentDescription = {};
9175 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9176 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9177 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9178
9179 VkAttachmentReference colorAttachmentReference = {};
9180 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9181 colorAttachmentReference.attachment = 0;
9182
9183 VkSubpassDescription subpassDescription = {};
9184 subpassDescription.colorAttachmentCount = 1;
9185 subpassDescription.pColorAttachments = &colorAttachmentReference;
9186
9187 uint32_t viewMask = 0x1u;
9188 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9189 renderPassMultiviewCreateInfo.subpassCount = 1;
9190 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9191
9192 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9193 renderPassCreateInfo.attachmentCount = 1;
9194 renderPassCreateInfo.pAttachments = &attachmentDescription;
9195 renderPassCreateInfo.subpassCount = 1;
9196 renderPassCreateInfo.pSubpasses = &subpassDescription;
9197
9198 VkRenderPass renderPass;
9199 vk::CreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
9200
9201 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9202 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9203 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9204 image_create_info.extent.width = 32;
9205 image_create_info.extent.height = 32;
9206 image_create_info.extent.depth = 1;
9207 image_create_info.mipLevels = 1;
9208 image_create_info.arrayLayers = 4;
9209 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9210 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9211 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9212 image_create_info.flags = 0;
9213
9214 VkImageObj image(m_device);
9215 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009216 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9217 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009218
9219 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9220 framebufferCreateInfo.width = 32;
9221 framebufferCreateInfo.height = 32;
9222 framebufferCreateInfo.layers = 1;
9223 framebufferCreateInfo.renderPass = renderPass;
9224 framebufferCreateInfo.attachmentCount = 1;
9225 framebufferCreateInfo.pAttachments = &imageView;
9226
9227 VkFramebuffer framebuffer = VK_NULL_HANDLE;
9228 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
9229
9230 // Start no RenderPass
9231 m_commandBuffer->begin();
9232
9233 VkClearAttachment color_attachment;
9234 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9235 color_attachment.clearValue.color.float32[0] = 0;
9236 color_attachment.clearValue.color.float32[1] = 0;
9237 color_attachment.clearValue.color.float32[2] = 0;
9238 color_attachment.clearValue.color.float32[3] = 0;
9239 color_attachment.colorAttachment = 0;
9240
9241 VkClearRect clear_rect = {};
9242 clear_rect.rect.extent.width = 32;
9243 clear_rect.rect.extent.height = 32;
9244
9245 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9246 render_pass_begin_info.renderPass = renderPass;
9247 render_pass_begin_info.framebuffer = framebuffer;
9248 render_pass_begin_info.renderArea.extent.width = 32;
9249 render_pass_begin_info.renderArea.extent.height = 32;
9250
9251 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9253 clear_rect.layerCount = 2;
9254 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9255 m_errorMonitor->VerifyFound();
9256
9257 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9258 clear_rect.baseArrayLayer = 1;
9259 clear_rect.layerCount = 1;
9260 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9261 m_errorMonitor->VerifyFound();
9262}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009263
9264TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9265 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9266
9267 ASSERT_NO_FATAL_FAILURE(InitFramework());
9268 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9269 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9270 } else {
9271 printf("%s %s not supported, skipping test\n", kSkipPrefix, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9272 return;
9273 }
9274 ASSERT_NO_FATAL_FAILURE(InitState());
9275
9276 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9277 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9278
9279 VkBufferObj buffer;
9280 VkMemoryPropertyFlags reqs = 0;
9281 buffer.init_as_storage(*m_device, 32, reqs);
9282
9283 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9284 conditional_rendering_begin.buffer = buffer.handle();
9285
9286 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9287
9288 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9289 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9291 vk::EndCommandBuffer(m_commandBuffer->handle());
9292 m_errorMonitor->VerifyFound();
9293}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009294
9295TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9296 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9297
9298 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9299 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9300 } else {
9301 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9302 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9303 return;
9304 }
9305 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9306
9307 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9308 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9309 } else {
9310 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
9311 return;
9312 }
9313
9314 ASSERT_NO_FATAL_FAILURE(InitState());
9315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9316
9317 CreatePipelineHelper pipe_one(*this);
9318 pipe_one.InitInfo();
9319 pipe_one.InitState();
9320 pipe_one.CreateGraphicsPipeline();
9321
9322 CreatePipelineHelper pipe_two(*this);
9323 pipe_two.InitInfo();
9324 pipe_two.InitState();
9325 pipe_two.CreateGraphicsPipeline();
9326
9327 auto vkCmdBeginTransformFeedbackEXT =
9328 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9329 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9330 auto vkCmdEndTransformFeedbackEXT =
9331 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9332 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9333
9334 m_commandBuffer->begin();
9335 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9336 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9338 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9339 m_errorMonitor->VerifyFound();
9340 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9341 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009342}
9343
9344TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9345 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9346
9347 ASSERT_NO_FATAL_FAILURE(Init());
9348
9349 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9350 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9351
9352 // Load required functions
9353 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9354 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9355 return;
9356 }
9357
9358 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9359
9360 // Set format features from being found
9361 VkFormatProperties formatProps;
9362 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9363 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9364 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9365 return;
9366 }
9367 // Gets pass pipeline creation but not the actual tiling used
9368 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9369 // will be caught at draw time that feature for optimal image is not set
9370 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9371 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9372 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9373
9374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9375
9376 CreatePipelineHelper pipe(*this);
9377 pipe.InitInfo();
9378 pipe.InitState();
9379 pipe.cb_attachments_.blendEnable = VK_TRUE;
9380 pipe.CreateGraphicsPipeline();
9381
9382 m_commandBuffer->begin();
9383 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9384 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9385
9386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9387 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9388 m_errorMonitor->VerifyFound();
9389
9390 m_commandBuffer->EndRenderPass();
9391 m_commandBuffer->end();
9392}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009393
9394TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9395 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9396
9397 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9398 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9399 printf("%s Did not find required device extension %s; test skipped.\n", kSkipPrefix, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
9400 return;
9401 }
9402 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9403 ASSERT_NO_FATAL_FAILURE(InitState());
9404
9405 VkAttachmentDescription attach[] = {
9406 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9407 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9408 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9409 };
9410 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9411 VkSubpassDescription subpasses[] = {
9412 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9413 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9414 };
9415
9416 VkSubpassDependency dep = {0,
9417 1,
9418 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9419 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9420 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9421 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9422 VK_DEPENDENCY_BY_REGION_BIT};
9423
9424 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9425 rpci.attachmentCount = 1;
9426 rpci.pAttachments = attach;
9427 rpci.subpassCount = 2;
9428 rpci.pSubpasses = subpasses;
9429 rpci.dependencyCount = 1;
9430 rpci.pDependencies = &dep;
9431
9432 vk_testing::RenderPass render_pass;
9433 render_pass.init(*m_device, rpci);
9434
9435 VkImageObj image(m_device);
9436 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9437 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9438
9439 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9440 fbci.renderPass = render_pass.handle();
9441 fbci.attachmentCount = 1;
9442 fbci.pAttachments = &imageView;
9443 fbci.width = 32;
9444 fbci.height = 32;
9445 fbci.layers = 1;
9446 VkFramebuffer framebuffer;
9447 vk::CreateFramebuffer(device(), &fbci, nullptr, &framebuffer);
9448
9449 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9450 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9451 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9452 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9453
9454 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9455 buffer_create_info.size = 32;
9456 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9457 VkBufferObj buffer;
9458 buffer.init(*m_device, buffer_create_info);
9459
9460 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9461 conditional_rendering_begin.buffer = buffer.handle();
9462
9463 VkClearValue clear_value;
9464 clear_value.color = m_clear_color;
9465
9466 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9467 rpbi.renderPass = render_pass.handle();
9468 rpbi.framebuffer = framebuffer;
9469 rpbi.renderArea = {{0, 0}, {32, 32}};
9470 rpbi.clearValueCount = 1;
9471 rpbi.pClearValues = &clear_value;
9472
9473 m_commandBuffer->begin();
9474
9475 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9476 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9477 m_errorMonitor->VerifyFound();
9478
9479 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
9480 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9481 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9482 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9483 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9484 vk::CmdEndRenderPass(m_commandBuffer->handle());
9485 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9486 m_errorMonitor->VerifyFound();
9487
9488 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
9489 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9490 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9491 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9492 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9493 vk::CmdEndRenderPass(m_commandBuffer->handle());
9494 m_errorMonitor->VerifyFound();
9495
9496 m_commandBuffer->end();
9497}
ziga-lunarg58255142021-09-12 13:25:17 +02009498
9499TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9500 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9501
9502 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9503 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9504 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9505 return;
9506 }
9507 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9508
9509 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9510 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9511 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9512 return;
9513 }
9514 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9515 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9516 return;
9517 }
9518 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9519 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9520
9521 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9522 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
9523
9524 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
9525 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
9526 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
9527 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
9528
9529 if (!tf_features.transformFeedback) {
9530 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
9531 return;
9532 }
9533
9534 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9536
9537 VkAttachmentDescription attachmentDescription = {};
9538 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9539 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9540 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9541
9542 VkAttachmentReference colorAttachmentReference = {};
9543 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9544 colorAttachmentReference.attachment = 0;
9545
9546 VkSubpassDescription subpassDescription = {};
9547 subpassDescription.colorAttachmentCount = 1;
9548 subpassDescription.pColorAttachments = &colorAttachmentReference;
9549
9550 uint32_t viewMask = 0x1u;
9551 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9552 renderPassMultiviewCreateInfo.subpassCount = 1;
9553 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9554
9555 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9556 renderPassCreateInfo.attachmentCount = 1;
9557 renderPassCreateInfo.pAttachments = &attachmentDescription;
9558 renderPassCreateInfo.subpassCount = 1;
9559 renderPassCreateInfo.pSubpasses = &subpassDescription;
9560
9561 vk_testing::RenderPass render_pass;
9562 render_pass.init(*m_device, renderPassCreateInfo);
9563
9564 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9565 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9566 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9567 image_create_info.extent.width = 32;
9568 image_create_info.extent.height = 32;
9569 image_create_info.extent.depth = 1;
9570 image_create_info.mipLevels = 1;
9571 image_create_info.arrayLayers = 4;
9572 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9573 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9574 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9575 image_create_info.flags = 0;
9576
9577 VkImageObj image(m_device);
9578 image.Init(image_create_info);
9579 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9580
9581 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9582 framebufferCreateInfo.width = 32;
9583 framebufferCreateInfo.height = 32;
9584 framebufferCreateInfo.layers = 1;
9585 framebufferCreateInfo.renderPass = render_pass.handle();
9586 framebufferCreateInfo.attachmentCount = 1;
9587 framebufferCreateInfo.pAttachments = &imageView;
9588
9589 vk_testing::Framebuffer framebuffer;
9590 framebuffer.init(*m_device, framebufferCreateInfo);
9591
9592 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9593 render_pass_begin_info.renderPass = render_pass.handle();
9594 render_pass_begin_info.framebuffer = framebuffer.handle();
9595 render_pass_begin_info.renderArea.extent.width = 32;
9596 render_pass_begin_info.renderArea.extent.height = 32;
9597
9598 auto vkCmdBeginTransformFeedbackEXT =
9599 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9600 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9601
9602 m_commandBuffer->begin();
9603 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9604
9605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9606 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9607 m_errorMonitor->VerifyFound();
9608
9609 m_commandBuffer->EndRenderPass();
9610 m_commandBuffer->end();
9611}
stusmithd2f36832021-11-26 11:44:11 +00009612
9613TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9614 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9615
9616 SetTargetApiVersion(VK_API_VERSION_1_1);
9617
stusmithab8e2a22021-12-17 11:20:03 +00009618 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9619
stusmithd2f36832021-11-26 11:44:11 +00009620 ASSERT_NO_FATAL_FAILURE(InitFramework());
9621
stusmithab8e2a22021-12-17 11:20:03 +00009622 if (!AreRequestedExtensionsEnabled()) {
9623 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9624 return;
9625 }
9626
9627 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
9628 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +00009629 return;
9630 }
9631
9632 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9633 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9634 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9635 if (!dynamic_rendering_features.dynamicRendering) {
9636 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9637 return;
9638 }
9639
9640 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9641
sfricke-samsung1c61f192021-12-31 01:53:03 -06009642 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009643 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9644
sfricke-samsung1c61f192021-12-31 01:53:03 -06009645 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009646 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9647 begin_rendering_info.colorAttachmentCount = 1;
9648 begin_rendering_info.pColorAttachments = &color_attachment;
9649
9650 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9651
9652 secondary.begin();
9653
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009655 secondary.BeginRendering(begin_rendering_info);
9656 m_errorMonitor->VerifyFound();
9657
9658 secondary.end();
9659}
9660
9661TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9662 TEST_DESCRIPTION(
9663 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9664 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9665
9666 ASSERT_NO_FATAL_FAILURE(Init());
9667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9668
9669 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9670
9671 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9672 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9673 nullptr, // pNext
9674 m_renderPass,
9675 0, // subpass
9676 m_framebuffer,
9677 };
9678
9679 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9680 nullptr, // pNext
9681 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9682 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9683 secondary.begin(&cmdbuff__bi);
9684 secondary.end();
9685
9686 m_commandBuffer->begin();
9687
9688 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9689 nullptr, // pNext
9690 m_renderPass,
9691 m_framebuffer,
9692 {{0, 0}, {32, 32}},
9693 static_cast<uint32_t>(m_renderPassClearValues.size()),
9694 m_renderPassClearValues.data()};
9695
9696 m_commandBuffer->BeginRenderPass(rp_bi);
9697
9698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
9699 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9700 m_errorMonitor->VerifyFound();
9701
9702 m_commandBuffer->EndRenderPass();
9703 m_commandBuffer->end();
9704}
9705
9706TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9707 TEST_DESCRIPTION(
9708 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9709 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9710
9711 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009712
stusmithab8e2a22021-12-17 11:20:03 +00009713 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9714
stusmithd2f36832021-11-26 11:44:11 +00009715 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009716
9717 if (!AreRequestedExtensionsEnabled()) {
9718 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
stusmithd2f36832021-11-26 11:44:11 +00009719 return;
9720 }
stusmithab8e2a22021-12-17 11:20:03 +00009721
9722 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
9723 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
9724 return;
9725 }
9726
stusmithd2f36832021-11-26 11:44:11 +00009727 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9728 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9729 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9730 if (!dynamic_rendering_features.dynamicRendering) {
9731 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9732 return;
9733 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009734
stusmithd2f36832021-11-26 11:44:11 +00009735 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9736
9737 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009738
9739 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009740 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9741
sfricke-samsung1c61f192021-12-31 01:53:03 -06009742 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9743 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009744 inheritance_rendering_info.colorAttachmentCount = 1;
9745 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009746 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009747
sfricke-samsung1c61f192021-12-31 01:53:03 -06009748 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009749 begin_rendering_info.colorAttachmentCount = 1;
9750 begin_rendering_info.pColorAttachments = &color_attachment;
9751
9752 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9753
9754 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9755 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9756 &inheritance_rendering_info, // pNext
9757 VK_NULL_HANDLE,
9758 0, // subpass
9759 VK_NULL_HANDLE,
9760 };
9761
9762 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9763 nullptr, // pNext
9764 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9765 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9766 secondary.begin(&cmdbuff__bi);
9767 secondary.end();
9768
9769 m_commandBuffer->begin();
9770
9771 m_commandBuffer->BeginRendering(begin_rendering_info);
9772
9773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9774 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9775 m_errorMonitor->VerifyFound();
9776
9777 m_commandBuffer->EndRendering();
9778 m_commandBuffer->end();
9779}
9780
9781TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9782 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9783
9784 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9785 ASSERT_NO_FATAL_FAILURE(InitState());
9786
9787 // A renderpass with two subpasses, both writing the same attachment.
9788 VkAttachmentDescription attach[] = {
9789 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9790 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9791 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9792 };
9793 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9794 VkSubpassDescription subpasses[] = {
9795 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9796 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9797 };
9798
9799 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9800 VkRenderPass render_pass;
9801 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9802 ASSERT_VK_SUCCESS(err);
9803
9804 VkImageObj image(m_device);
9805 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9806 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9807
9808 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 1, &imageView, 32, 32, 1};
9809 VkFramebuffer framebuffer;
9810 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9811 ASSERT_VK_SUCCESS(err);
9812
9813 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9814
9815 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9816 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9817 nullptr, // pNext
9818 render_pass,
9819 1, // subpass
9820 framebuffer,
9821 };
9822
9823 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9824 nullptr, // pNext
9825 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9826 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9827 secondary.begin(&cmdbuff__bi);
9828 secondary.end();
9829
9830 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9831 nullptr, // pNext
9832 render_pass,
9833 framebuffer,
9834 {{0, 0}, {32, 32}},
9835 0,
9836 nullptr};
9837
9838 m_commandBuffer->begin();
9839 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9840
9841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
9842 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9843 m_errorMonitor->VerifyFound();
9844
9845 m_commandBuffer->EndRenderPass();
9846 m_commandBuffer->end();
9847
9848 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9849 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9850}
9851
9852TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9853 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9854
9855 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9856 ASSERT_NO_FATAL_FAILURE(InitState());
9857
9858 // A renderpass with two subpasses, both writing the same attachment.
9859 VkAttachmentDescription attach[] = {
9860 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9861 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9862 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9863 };
9864 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9865 VkSubpassDescription subpasses[] = {
9866 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9867 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9868 };
9869
9870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9871 VkRenderPass render_pass_1;
9872 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9873 ASSERT_VK_SUCCESS(err);
9874
9875 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9876 VkRenderPass render_pass_2;
9877 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9878 ASSERT_VK_SUCCESS(err);
9879
9880 VkImageObj image(m_device);
9881 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9882 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9883
9884 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9885 VkFramebuffer framebuffer;
9886 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9887 ASSERT_VK_SUCCESS(err);
9888
9889 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9890
9891 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9892 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9893 nullptr, // pNext
9894 render_pass_2,
9895 0, // subpass
9896 VK_NULL_HANDLE,
9897 };
9898
9899 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9900 nullptr, // pNext
9901 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9902 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9903 secondary.begin(&cmdbuff__bi);
9904 secondary.end();
9905
9906 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9907 nullptr, // pNext
9908 render_pass_1,
9909 framebuffer,
9910 {{0, 0}, {32, 32}},
9911 0,
9912 nullptr};
9913
9914 m_commandBuffer->begin();
9915 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9916
9917 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
9918 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9919 m_errorMonitor->VerifyFound();
9920
9921 m_commandBuffer->EndRenderPass();
9922 m_commandBuffer->end();
9923
9924 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9925 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
9926 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
9927}
9928
9929TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
9930 TEST_DESCRIPTION(
9931 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9932 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
9933
9934 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009935
stusmithab8e2a22021-12-17 11:20:03 +00009936 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9937
stusmithd2f36832021-11-26 11:44:11 +00009938 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009939
9940 if (!AreRequestedExtensionsEnabled()) {
9941 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
stusmithd2f36832021-11-26 11:44:11 +00009942 return;
9943 }
stusmithab8e2a22021-12-17 11:20:03 +00009944
9945 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
9946 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
9947 return;
9948 }
9949
stusmithd2f36832021-11-26 11:44:11 +00009950 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9951 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9952 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9953 if (!dynamic_rendering_features.dynamicRendering) {
9954 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9955 return;
9956 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009957
stusmithd2f36832021-11-26 11:44:11 +00009958 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9959
9960 VkAttachmentDescription attach[] = {
9961 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9962 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9963 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9964 };
9965 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9966 VkSubpassDescription subpasses[] = {
9967 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9968 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9969 };
9970
9971 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9972 VkRenderPass render_pass;
9973 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9974 ASSERT_VK_SUCCESS(err);
9975
9976 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009977
9978 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009979 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9980
sfricke-samsung1c61f192021-12-31 01:53:03 -06009981 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9982 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009983 inheritance_rendering_info.colorAttachmentCount = 1;
9984 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009985 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009986
sfricke-samsung1c61f192021-12-31 01:53:03 -06009987 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009988 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9989 begin_rendering_info.colorAttachmentCount = 1;
9990 begin_rendering_info.pColorAttachments = &color_attachment;
9991
9992 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9993
9994 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9995 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9996 &inheritance_rendering_info, // pNext
9997 render_pass,
9998 0, // subpass
9999 VK_NULL_HANDLE,
10000 };
10001
10002 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10003 nullptr, // pNext
10004 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10005 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10006 secondary.begin(&cmdbuff__bi);
10007 secondary.end();
10008
10009 m_commandBuffer->begin();
10010
10011 m_commandBuffer->BeginRendering(begin_rendering_info);
10012
10013 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
10014 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10015 m_errorMonitor->VerifyFound();
10016
10017 m_commandBuffer->EndRendering();
10018 m_commandBuffer->end();
10019
10020 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
10021}
10022
10023TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
10024 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
10025
10026 SetTargetApiVersion(VK_API_VERSION_1_1);
10027
stusmithab8e2a22021-12-17 11:20:03 +000010028 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10029
stusmithd2f36832021-11-26 11:44:11 +000010030 ASSERT_NO_FATAL_FAILURE(InitFramework());
10031
stusmithab8e2a22021-12-17 11:20:03 +000010032 if (!AreRequestedExtensionsEnabled()) {
10033 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10034 return;
10035 }
10036
10037 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10038 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010039 return;
10040 }
10041
10042 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10043 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10044 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10045 if (!dynamic_rendering_features.dynamicRendering) {
10046 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10047 return;
10048 }
10049
10050 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10051
10052 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10053
sfricke-samsung1c61f192021-12-31 01:53:03 -060010054 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010055 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10056
sfricke-samsung1c61f192021-12-31 01:53:03 -060010057 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10058 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010059 inheritance_rendering_info.colorAttachmentCount = 1;
10060 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010061 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010062
sfricke-samsung1c61f192021-12-31 01:53:03 -060010063 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010064 begin_rendering_info.flags =
10065 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
10066 begin_rendering_info.colorAttachmentCount = 1;
10067 begin_rendering_info.pColorAttachments = &color_attachment;
10068
10069 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10070
10071 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10072 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10073 &inheritance_rendering_info, // pNext
10074 VK_NULL_HANDLE,
10075 0, // subpass
10076 VK_NULL_HANDLE,
10077 };
10078
10079 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10080 nullptr, // pNext
10081 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10082 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10083 secondary.begin(&cmdbuff__bi);
10084 secondary.end();
10085
10086 m_commandBuffer->begin();
10087
10088 m_commandBuffer->BeginRendering(begin_rendering_info);
10089
10090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10091 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10092 m_errorMonitor->VerifyFound();
10093
10094 m_commandBuffer->EndRendering();
10095 m_commandBuffer->end();
10096}
10097
10098TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10099 TEST_DESCRIPTION(
10100 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
10101
10102 SetTargetApiVersion(VK_API_VERSION_1_1);
10103
stusmithab8e2a22021-12-17 11:20:03 +000010104 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10105
stusmithd2f36832021-11-26 11:44:11 +000010106 ASSERT_NO_FATAL_FAILURE(InitFramework());
10107
stusmithab8e2a22021-12-17 11:20:03 +000010108 if (!AreRequestedExtensionsEnabled()) {
10109 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10110 return;
10111 }
10112
10113 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10114 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010115 return;
10116 }
10117
10118 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10119 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10120 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10121 if (!dynamic_rendering_features.dynamicRendering) {
10122 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10123 return;
10124 }
10125
10126 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10127
10128 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10129
sfricke-samsung1c61f192021-12-31 01:53:03 -060010130 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010131 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10132
sfricke-samsung1c61f192021-12-31 01:53:03 -060010133 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10134 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010135 inheritance_rendering_info.colorAttachmentCount = 0;
10136 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010137 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010138
sfricke-samsung1c61f192021-12-31 01:53:03 -060010139 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010140 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10141 begin_rendering_info.colorAttachmentCount = 1;
10142 begin_rendering_info.pColorAttachments = &color_attachment;
10143
10144 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10145
10146 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10147 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10148 &inheritance_rendering_info, // pNext
10149 VK_NULL_HANDLE,
10150 0, // subpass
10151 VK_NULL_HANDLE,
10152 };
10153
10154 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10155 nullptr, // pNext
10156 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10157 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10158 secondary.begin(&cmdbuff__bi);
10159 secondary.end();
10160
10161 m_commandBuffer->begin();
10162
10163 m_commandBuffer->BeginRendering(begin_rendering_info);
10164
10165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10166 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10167 m_errorMonitor->VerifyFound();
10168
10169 m_commandBuffer->EndRendering();
10170 m_commandBuffer->end();
10171}
10172
10173TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10174 TEST_DESCRIPTION(
10175 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10176
10177 SetTargetApiVersion(VK_API_VERSION_1_1);
10178
stusmithab8e2a22021-12-17 11:20:03 +000010179 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10180
stusmithd2f36832021-11-26 11:44:11 +000010181 ASSERT_NO_FATAL_FAILURE(InitFramework());
10182
stusmithab8e2a22021-12-17 11:20:03 +000010183 if (!AreRequestedExtensionsEnabled()) {
10184 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10185 return;
10186 }
10187
10188 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10189 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010190 return;
10191 }
10192
10193 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10194 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10195 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10196 if (!dynamic_rendering_features.dynamicRendering) {
10197 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10198 return;
10199 }
10200
10201 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10202
10203 VkImageObj image(m_device);
10204 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10205 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10206
sfricke-samsung1c61f192021-12-31 01:53:03 -060010207 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010208 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10209 color_attachment.imageView = imageView;
10210
10211 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10212
sfricke-samsung1c61f192021-12-31 01:53:03 -060010213 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10214 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010215 inheritance_rendering_info.colorAttachmentCount = 1;
10216 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010217 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010218
sfricke-samsung1c61f192021-12-31 01:53:03 -060010219 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010220 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10221 begin_rendering_info.colorAttachmentCount = 1;
10222 begin_rendering_info.pColorAttachments = &color_attachment;
10223
10224 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10225
10226 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10227 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10228 &inheritance_rendering_info, // pNext
10229 VK_NULL_HANDLE,
10230 0, // subpass
10231 VK_NULL_HANDLE,
10232 };
10233
10234 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10235 nullptr, // pNext
10236 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10237 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10238 secondary.begin(&cmdbuff__bi);
10239 secondary.end();
10240
10241 m_commandBuffer->begin();
10242
10243 m_commandBuffer->BeginRendering(begin_rendering_info);
10244
10245 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10246 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10247 m_errorMonitor->VerifyFound();
10248
10249 m_commandBuffer->EndRendering();
10250 m_commandBuffer->end();
10251}
10252
10253TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10254 TEST_DESCRIPTION(
10255 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10256 "format");
10257
10258 SetTargetApiVersion(VK_API_VERSION_1_1);
10259
stusmithab8e2a22021-12-17 11:20:03 +000010260 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10261
stusmithd2f36832021-11-26 11:44:11 +000010262 ASSERT_NO_FATAL_FAILURE(InitFramework());
10263
stusmithab8e2a22021-12-17 11:20:03 +000010264 if (!AreRequestedExtensionsEnabled()) {
10265 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10266 return;
10267 }
10268
10269 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10270 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010271 return;
10272 }
10273
10274 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10275 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10276 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10277 if (!dynamic_rendering_features.dynamicRendering) {
10278 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10279 return;
10280 }
10281
10282 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10283
10284 VkImageObj image(m_device);
10285 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10286 if (!depth_stencil_format) {
10287 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10288 return;
10289 }
10290 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10291 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10292
sfricke-samsung1c61f192021-12-31 01:53:03 -060010293 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010294 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10295 depth_stencil_attachment.imageView = imageView;
10296
sfricke-samsung1c61f192021-12-31 01:53:03 -060010297 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10298 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010299 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT;
10300 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010301 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010302
sfricke-samsung1c61f192021-12-31 01:53:03 -060010303 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010304 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10305 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10306 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10307
10308 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10309
10310 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10311 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10312 &inheritance_rendering_info, // pNext
10313 VK_NULL_HANDLE,
10314 0, // subpass
10315 VK_NULL_HANDLE,
10316 };
10317
10318 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10319 nullptr, // pNext
10320 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10321 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10322 secondary.begin(&cmdbuff__bi);
10323 secondary.end();
10324
10325 m_commandBuffer->begin();
10326
10327 m_commandBuffer->BeginRendering(begin_rendering_info);
10328
10329 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10331 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10332 m_errorMonitor->VerifyFound();
10333
10334 m_commandBuffer->EndRendering();
10335 m_commandBuffer->end();
10336}
10337
10338TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10339 TEST_DESCRIPTION(
10340 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10341
10342 SetTargetApiVersion(VK_API_VERSION_1_1);
10343
stusmithab8e2a22021-12-17 11:20:03 +000010344 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10345
stusmithd2f36832021-11-26 11:44:11 +000010346 ASSERT_NO_FATAL_FAILURE(InitFramework());
10347
stusmithab8e2a22021-12-17 11:20:03 +000010348 if (!AreRequestedExtensionsEnabled()) {
10349 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10350 return;
10351 }
10352
10353 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10354 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010355 return;
10356 }
10357
10358 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10359 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10360 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10361 if (!dynamic_rendering_features.dynamicRendering) {
10362 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10363 return;
10364 }
10365
10366 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10367
sfricke-samsung1c61f192021-12-31 01:53:03 -060010368 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010369 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10370
10371 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10372
sfricke-samsung1c61f192021-12-31 01:53:03 -060010373 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10374 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010375 inheritance_rendering_info.viewMask = 0;
10376 inheritance_rendering_info.colorAttachmentCount = 1;
10377 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010378 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010379
sfricke-samsung1c61f192021-12-31 01:53:03 -060010380 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010381 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10382 begin_rendering_info.viewMask = 1;
10383 begin_rendering_info.colorAttachmentCount = 1;
10384 begin_rendering_info.pColorAttachments = &color_attachment;
10385
10386 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10387
10388 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10389 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10390 &inheritance_rendering_info, // pNext
10391 VK_NULL_HANDLE,
10392 0, // subpass
10393 VK_NULL_HANDLE,
10394 };
10395
10396 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10397 nullptr, // pNext
10398 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10399 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10400 secondary.begin(&cmdbuff__bi);
10401 secondary.end();
10402
10403 m_commandBuffer->begin();
10404
10405 m_commandBuffer->BeginRendering(begin_rendering_info);
10406
10407 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10408 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10409 m_errorMonitor->VerifyFound();
10410
10411 m_commandBuffer->EndRendering();
10412 m_commandBuffer->end();
10413}
stusmithcba0c502021-12-21 17:16:28 +000010414
10415TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10416 TEST_DESCRIPTION(
10417 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10418
10419 SetTargetApiVersion(VK_API_VERSION_1_1);
10420
10421 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10422
10423 ASSERT_NO_FATAL_FAILURE(InitFramework());
10424
10425 if (!AreRequestedExtensionsEnabled()) {
10426 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10427 return;
10428 }
10429
10430 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10431 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
10432 return;
10433 }
10434
10435 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10436 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10437 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10438 if (!dynamic_rendering_features.dynamicRendering) {
10439 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10440 return;
10441 }
10442
10443 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10444
10445 VkImageObj image(m_device);
10446 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10447 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10448
sfricke-samsung1c61f192021-12-31 01:53:03 -060010449 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010450 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10451 color_attachment.imageView = imageView;
10452
10453 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10454
sfricke-samsung1c61f192021-12-31 01:53:03 -060010455 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10456 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010457 inheritance_rendering_info.colorAttachmentCount = 1;
10458 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10459 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10460
sfricke-samsung1c61f192021-12-31 01:53:03 -060010461 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010462 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10463 begin_rendering_info.colorAttachmentCount = 1;
10464 begin_rendering_info.pColorAttachments = &color_attachment;
10465
10466 // A pool we can reset in.
10467 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10468 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10469
10470 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10471 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10472 &inheritance_rendering_info, // pNext
10473 VK_NULL_HANDLE,
10474 0, // subpass
10475 VK_NULL_HANDLE,
10476 };
10477
10478 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10479 nullptr, // pNext
10480 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10481 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10482 secondary.begin(&cmdbuff__bi);
10483 secondary.end();
10484
10485 m_commandBuffer->begin();
10486
10487 // color samples mismatch
10488 m_commandBuffer->BeginRendering(begin_rendering_info);
10489 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10490 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10491 m_errorMonitor->VerifyFound();
10492 m_commandBuffer->EndRendering();
10493
10494 VkImageObj depthStencilImage(m_device);
10495 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10496 if (!depth_stencil_format) {
10497 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10498 return;
10499 }
10500 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10501 0);
10502 VkImageView depthStencilImageView =
10503 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10504
sfricke-samsung1c61f192021-12-31 01:53:03 -060010505 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010506 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10507 depth_stencil_attachment.imageView = depthStencilImageView;
10508
10509 begin_rendering_info.colorAttachmentCount = 0;
10510 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10511 inheritance_rendering_info.colorAttachmentCount = 0;
10512 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10513
10514 secondary.begin(&cmdbuff__bi);
10515 secondary.end();
10516
10517 // depth samples mismatch
10518 m_commandBuffer->BeginRendering(begin_rendering_info);
10519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10520 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10521 m_errorMonitor->VerifyFound();
10522 m_commandBuffer->EndRendering();
10523
10524 begin_rendering_info.pDepthAttachment = nullptr;
10525 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10526 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10527 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10528
10529 secondary.begin(&cmdbuff__bi);
10530 secondary.end();
10531
10532 // stencil samples mismatch
10533 m_commandBuffer->BeginRendering(begin_rendering_info);
10534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10535 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10536 m_errorMonitor->VerifyFound();
10537 m_commandBuffer->EndRendering();
10538
10539 m_commandBuffer->end();
10540}
10541
10542TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10543 TEST_DESCRIPTION(
10544 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10545 "attachment samples");
10546
10547 SetTargetApiVersion(VK_API_VERSION_1_1);
10548
10549 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10550
10551 ASSERT_NO_FATAL_FAILURE(InitFramework());
10552
10553 if (!AreRequestedExtensionsEnabled()) {
10554 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10555 return;
10556 }
10557
10558 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10559 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
10560 return;
10561 }
10562
10563 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10564 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10565 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10566 if (!dynamic_rendering_features.dynamicRendering) {
10567 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10568 return;
10569 }
10570
10571 bool amd_samples = false;
10572 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10573 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10574 amd_samples = true;
10575 }
10576
10577 bool nv_samples = false;
10578 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10579 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10580 nv_samples = true;
10581 }
10582
10583 if (!amd_samples && !nv_samples) {
10584 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10585 kSkipPrefix);
10586 return;
10587 }
10588
10589 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10590
10591 VkImageObj image(m_device);
10592 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10593 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10594
sfricke-samsung1c61f192021-12-31 01:53:03 -060010595 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010596 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10597 color_attachment.imageView = imageView;
10598
10599 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10600
10601 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10602 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10603 samples_info.colorAttachmentCount = 1;
10604 samples_info.pColorAttachmentSamples = &counts;
10605
10606 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010607 inheritance_rendering_info.colorAttachmentCount = 1;
10608 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10609 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10610
sfricke-samsung1c61f192021-12-31 01:53:03 -060010611 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010612 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10613 begin_rendering_info.colorAttachmentCount = 1;
10614 begin_rendering_info.pColorAttachments = &color_attachment;
10615
10616 // A pool we can reset in.
10617 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10618 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10619
10620 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10621 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10622 &inheritance_rendering_info, // pNext
10623 VK_NULL_HANDLE,
10624 0, // subpass
10625 VK_NULL_HANDLE,
10626 };
10627
10628 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10629 nullptr, // pNext
10630 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10631 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10632 secondary.begin(&cmdbuff__bi);
10633 secondary.end();
10634
10635 m_commandBuffer->begin();
10636
10637 // color samples mismatch
10638 m_commandBuffer->BeginRendering(begin_rendering_info);
10639 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10640 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10641 m_errorMonitor->VerifyFound();
10642 m_commandBuffer->EndRendering();
10643
10644 VkImageObj depthStencilImage(m_device);
10645 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10646 if (!depth_stencil_format) {
10647 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10648 return;
10649 }
10650 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10651 0);
10652 VkImageView depthStencilImageView =
10653 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10654
sfricke-samsung1c61f192021-12-31 01:53:03 -060010655 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010656 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10657 depth_stencil_attachment.imageView = depthStencilImageView;
10658
10659 samples_info.colorAttachmentCount = 0;
10660 samples_info.pColorAttachmentSamples = nullptr;
10661 begin_rendering_info.colorAttachmentCount = 0;
10662 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10663 inheritance_rendering_info.colorAttachmentCount = 0;
10664 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10665 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10666
10667 secondary.begin(&cmdbuff__bi);
10668 secondary.end();
10669
10670 // depth samples mismatch
10671 m_commandBuffer->BeginRendering(begin_rendering_info);
10672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10673 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10674 m_errorMonitor->VerifyFound();
10675 m_commandBuffer->EndRendering();
10676
10677 begin_rendering_info.pDepthAttachment = nullptr;
10678 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10679 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10680 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10681
10682 secondary.begin(&cmdbuff__bi);
10683 secondary.end();
10684
10685 // stencil samples mismatch
10686 m_commandBuffer->BeginRendering(begin_rendering_info);
10687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10688 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10689 m_errorMonitor->VerifyFound();
10690 m_commandBuffer->EndRendering();
10691
10692 m_commandBuffer->end();
10693}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010694
10695TEST_F(VkLayerTest, CopyCommands2V13) {
10696 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10697
10698 SetTargetApiVersion(VK_API_VERSION_1_3);
10699 ASSERT_NO_FATAL_FAILURE(Init());
10700 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
10701 printf("%s CopyCommands2V13 test requires Vulkan 1.3+.\n", kSkipPrefix);
10702 return;
10703 }
10704 VkImageObj image(m_device);
10705 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10706 ASSERT_TRUE(image.initialized());
10707 VkBufferObj dst_buffer;
10708 VkMemoryPropertyFlags reqs = 0;
10709 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10710 VkBufferObj src_buffer;
10711 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10712 auto copy_region = LvlInitStruct<VkImageCopy2>();
10713 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10714 copy_region.srcSubresource.layerCount = 1;
10715 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10716 copy_region.dstSubresource.layerCount = 1;
10717 copy_region.dstOffset = {4, 4, 0};
10718 copy_region.extent.width = 1;
10719 copy_region.extent.height = 1;
10720 copy_region.extent.depth = 1;
10721 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10722 copy_image_info.srcImage = image.handle();
10723 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10724 copy_image_info.dstImage = image.handle();
10725 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10726 copy_image_info.regionCount = 1;
10727 copy_image_info.pRegions = &copy_region;
10728 m_commandBuffer->begin();
10729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10730 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10731 m_errorMonitor->VerifyFound();
10732 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
10733 copy_buffer.size = 4;
10734 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10735 copy_buffer_info.srcBuffer = dst_buffer.handle();
10736 copy_buffer_info.dstBuffer = dst_buffer.handle();
10737 copy_buffer_info.regionCount = 1;
10738 copy_buffer_info.pRegions = &copy_buffer;
10739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10740 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10741 m_errorMonitor->VerifyFound();
10742 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10743 bic_region.bufferRowLength = 128;
10744 bic_region.bufferImageHeight = 128;
10745 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10746 bic_region.imageSubresource.layerCount = 1;
10747 bic_region.imageExtent.height = 4;
10748 bic_region.imageExtent.width = 4;
10749 bic_region.imageExtent.depth = 1;
10750 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10751 buffer_image_info.srcBuffer = src_buffer.handle();
10752 buffer_image_info.dstImage = image.handle();
10753 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10754 buffer_image_info.regionCount = 1;
10755 buffer_image_info.pRegions = &bic_region;
10756 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10757 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10758 m_errorMonitor->VerifyFound();
10759 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10760 image_buffer_info.dstBuffer = src_buffer.handle();
10761 image_buffer_info.srcImage = image.handle();
10762 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10763 image_buffer_info.regionCount = 1;
10764 image_buffer_info.pRegions = &bic_region;
10765 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10766 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10767 m_errorMonitor->VerifyFound();
10768 auto blit_region = LvlInitStruct<VkImageBlit2>();
10769 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10770 blit_region.srcSubresource.baseArrayLayer = 0;
10771 blit_region.srcSubresource.layerCount = 1;
10772 blit_region.srcSubresource.mipLevel = 0;
10773 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10774 blit_region.dstSubresource.baseArrayLayer = 0;
10775 blit_region.dstSubresource.layerCount = 1;
10776 blit_region.dstSubresource.mipLevel = 0;
10777 blit_region.srcOffsets[0] = {0, 0, 0};
10778 blit_region.srcOffsets[1] = {64, 64, 1};
10779 blit_region.dstOffsets[0] = {0, 0, 0};
10780 blit_region.dstOffsets[1] = {32, 32, 1};
10781 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10782 blit_image_info.srcImage = image.handle();
10783 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10784 blit_image_info.dstImage = image.handle();
10785 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10786 blit_image_info.regionCount = 1;
10787 blit_image_info.pRegions = &blit_region;
10788 blit_image_info.filter = VK_FILTER_NEAREST;
10789 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10790 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10791 m_errorMonitor->VerifyFound();
10792 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10793 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10794 resolve_region.srcSubresource.mipLevel = 0;
10795 resolve_region.srcSubresource.baseArrayLayer = 0;
10796 resolve_region.srcSubresource.layerCount = 1;
10797 resolve_region.srcOffset.x = 0;
10798 resolve_region.srcOffset.y = 0;
10799 resolve_region.srcOffset.z = 0;
10800 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10801 resolve_region.dstSubresource.mipLevel = 0;
10802 resolve_region.dstSubresource.baseArrayLayer = 0;
10803 resolve_region.dstSubresource.layerCount = 1;
10804 resolve_region.dstOffset.x = 0;
10805 resolve_region.dstOffset.y = 0;
10806 resolve_region.dstOffset.z = 0;
10807 resolve_region.extent.width = 1;
10808 resolve_region.extent.height = 1;
10809 resolve_region.extent.depth = 1;
10810 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10811 resolve_image_info.srcImage = image.handle();
10812 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10813 resolve_image_info.dstImage = image.handle();
10814 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10815 resolve_image_info.regionCount = 1;
10816 resolve_image_info.pRegions = &resolve_region;
10817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10818 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10819 m_errorMonitor->VerifyFound();
10820}