blob: a0ee5ab4d53961058ccff3d7fa04a09aa999b597 [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
unknown088160a2019-05-23 17:43:13 -0600683TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
684 ASSERT_NO_FATAL_FAILURE(Init());
685
Mark Lobodzinski20310782020-02-28 14:25:17 -0700686 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600687
688 // A pool we can reset in.
689 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
690 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
691
692 secondary.begin();
693 secondary.end();
694
695 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600696 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600697
698 // rerecording of secondary
699 secondary.reset(); // explicit reset here.
700 secondary.begin();
701 secondary.end();
702
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600703 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600704 m_errorMonitor->VerifyFound();
705}
706
707TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
708 ASSERT_NO_FATAL_FAILURE(Init());
709
Mark Lobodzinski20310782020-02-28 14:25:17 -0700710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600711
712 // A pool we can reset in.
713 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
714 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
715
716 secondary.begin();
717 secondary.end();
718
719 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600720 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600721
722 // rerecording of secondary
723 secondary.begin(); // implicit reset in begin
724 secondary.end();
725
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600726 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600727 m_errorMonitor->VerifyFound();
728}
729
730TEST_F(VkLayerTest, CascadedInvalidation) {
731 ASSERT_NO_FATAL_FAILURE(Init());
732
sfricke-samsung1c61f192021-12-31 01:53:03 -0600733 VkEventCreateInfo eci = LvlInitStruct<VkEventCreateInfo>();
734 eci.flags = 0;
unknown088160a2019-05-23 17:43:13 -0600735 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600736 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600737
738 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
739 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600740 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600741 secondary.end();
742
743 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600744 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600745 m_commandBuffer->end();
746
747 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600748 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600749
Mark Lobodzinski20310782020-02-28 14:25:17 -0700750 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600751 m_commandBuffer->QueueCommandBuffer(false);
752 m_errorMonitor->VerifyFound();
753}
754
755TEST_F(VkLayerTest, CommandBufferResetErrors) {
756 // Cause error due to Begin while recording CB
757 // Then cause 2 errors for attempting to reset CB w/o having
758 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
759 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600761
762 ASSERT_NO_FATAL_FAILURE(Init());
763
764 // Calls AllocateCommandBuffers
765 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
766
767 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
sfricke-samsung1c61f192021-12-31 01:53:03 -0600768 VkCommandBufferInheritanceInfo cmd_buf_hinfo = LvlInitStruct<VkCommandBufferInheritanceInfo>();
769 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -0600770 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
771 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
772
773 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600774 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600775 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600776 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600777 m_errorMonitor->VerifyFound();
778
Mark Lobodzinski20310782020-02-28 14:25:17 -0700779 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600780 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
781 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600782 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600783 m_errorMonitor->VerifyFound();
784
Mark Lobodzinski20310782020-02-28 14:25:17 -0700785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600786 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600787 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600788 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600789 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600790 m_errorMonitor->VerifyFound();
791}
792
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700793TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
794 ASSERT_NO_FATAL_FAILURE(Init());
795
796 // Calls AllocateCommandBuffers
797 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
798
sfricke-samsung1c61f192021-12-31 01:53:03 -0600799 VkCommandBufferBeginInfo cmd_buf_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700800 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
801
802 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
803 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
804 m_errorMonitor->VerifyFound();
805}
806
unknown088160a2019-05-23 17:43:13 -0600807TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
808 // Call CmdClearAttachmentss outside of an active RenderPass
809
sfricke-samsung85584a72021-09-30 21:43:38 -0700810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearAttachments: This call must be issued inside an active render pass");
unknown088160a2019-05-23 17:43:13 -0600811
812 ASSERT_NO_FATAL_FAILURE(Init());
813 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
814
815 // Start no RenderPass
816 m_commandBuffer->begin();
817
818 VkClearAttachment color_attachment;
819 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
820 color_attachment.clearValue.color.float32[0] = 0;
821 color_attachment.clearValue.color.float32[1] = 0;
822 color_attachment.clearValue.color.float32[2] = 0;
823 color_attachment.clearValue.color.float32[3] = 0;
824 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600825 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600826 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600827
828 m_errorMonitor->VerifyFound();
829}
830
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600831TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
832 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
833
Mark Lobodzinski20310782020-02-28 14:25:17 -0700834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600835
836 ASSERT_NO_FATAL_FAILURE(Init());
837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
838
839 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600840 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600841
842 VkClearAttachment color_attachment;
843 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
844 color_attachment.clearValue.color.float32[0] = 0;
845 color_attachment.clearValue.color.float32[1] = 0;
846 color_attachment.clearValue.color.float32[2] = 0;
847 color_attachment.clearValue.color.float32[3] = 0;
848 color_attachment.colorAttachment = 0;
849 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600850 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600851
852 m_errorMonitor->VerifyFound();
853}
854
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700855TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
856 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
857
858 ASSERT_NO_FATAL_FAILURE(Init());
859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
860
861 m_commandBuffer->begin();
862 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
863
864 VkClearAttachment color_attachment;
865 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
866 color_attachment.clearValue.color.float32[0] = 0;
867 color_attachment.clearValue.color.float32[1] = 0;
868 color_attachment.clearValue.color.float32[2] = 0;
869 color_attachment.clearValue.color.float32[3] = 0;
870 color_attachment.colorAttachment = 0;
871 VkClearRect clear_rect = {};
872 clear_rect.rect.offset = {0, 0};
873 clear_rect.baseArrayLayer = 0;
874 clear_rect.layerCount = 1;
875
876 clear_rect.rect.extent = {0, 1};
877 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
878 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
879 m_errorMonitor->VerifyFound();
880
881 clear_rect.rect.extent = {1, 0};
882 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
883 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
884 m_errorMonitor->VerifyFound();
885}
886
sfricke-samsung6141db32020-10-26 03:31:38 -0700887TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
888 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
889
890 ASSERT_NO_FATAL_FAILURE(Init());
891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
892
893 m_commandBuffer->begin();
894 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
895
896 VkClearAttachment attachment;
897 attachment.clearValue.color.float32[0] = 0;
898 attachment.clearValue.color.float32[1] = 0;
899 attachment.clearValue.color.float32[2] = 0;
900 attachment.clearValue.color.float32[3] = 0;
901 attachment.colorAttachment = 0;
902 VkClearRect clear_rect = {};
903 clear_rect.rect.offset = {0, 0};
904 clear_rect.rect.extent = {1, 1};
905 clear_rect.baseArrayLayer = 0;
906 clear_rect.layerCount = 1;
907
908 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
910 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
911 m_errorMonitor->VerifyFound();
912
913 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
915 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
916 m_errorMonitor->VerifyFound();
917
918 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
919 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
920 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
921 m_errorMonitor->VerifyFound();
922
923 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
924 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
925 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
926 m_errorMonitor->VerifyFound();
927}
928
sfricke-samsung91f4a542020-10-21 00:29:17 -0700929TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
930 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
931
932 ASSERT_NO_FATAL_FAILURE(Init());
933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
934
935 m_commandBuffer->begin();
936 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
937
938 VkClearAttachment color_attachment;
939 color_attachment.clearValue.color.float32[0] = 0;
940 color_attachment.clearValue.color.float32[1] = 0;
941 color_attachment.clearValue.color.float32[2] = 0;
942 color_attachment.clearValue.color.float32[3] = 0;
943 color_attachment.colorAttachment = 0;
944 VkClearRect clear_rect = {};
945 clear_rect.rect.offset = {0, 0};
946 clear_rect.rect.extent = {1, 1};
947 clear_rect.baseArrayLayer = 0;
948 clear_rect.layerCount = 1;
949
950 color_attachment.aspectMask = 0;
951 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
952 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
953 m_errorMonitor->VerifyFound();
954
955 color_attachment.aspectMask = 0xffffffff;
956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
957 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
958 m_errorMonitor->VerifyFound();
959}
960
sfricke-samsung87b09512020-10-26 03:35:42 -0700961TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
962 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
963
964 ASSERT_NO_FATAL_FAILURE(Init());
965 // Creates a color attachment
966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
967
968 m_commandBuffer->begin();
969 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
970
971 VkClearAttachment attachment;
972 attachment.clearValue.color.float32[0] = 0;
973 attachment.clearValue.color.float32[1] = 0;
974 attachment.clearValue.color.float32[2] = 0;
975 attachment.clearValue.color.float32[3] = 0;
976 attachment.colorAttachment = 0;
977 VkClearRect clear_rect = {};
978 clear_rect.rect.offset = {0, 0};
979 clear_rect.rect.extent = {1, 1};
980 clear_rect.baseArrayLayer = 0;
981 clear_rect.layerCount = 1;
982
983 m_errorMonitor->ExpectSuccess();
984 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
985 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
986 m_errorMonitor->VerifyNotFound();
987
988 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
989 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
990 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
991 m_errorMonitor->VerifyFound();
992
993 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
994 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
995 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
996 m_errorMonitor->VerifyFound();
997}
998
unknown088160a2019-05-23 17:43:13 -0600999TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1000 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1001
1002 ASSERT_NO_FATAL_FAILURE(Init());
1003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1004
1005 // An empty primary command buffer
1006 VkCommandBufferObj cb(m_device, m_commandPool);
1007 cb.begin();
1008 cb.end();
1009
1010 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001011 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001012 VkCommandBuffer handle = cb.handle();
1013
Mark Lobodzinski20310782020-02-28 14:25:17 -07001014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001015 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001016 m_errorMonitor->VerifyFound();
1017
1018 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1019
1020 m_commandBuffer->EndRenderPass();
1021 m_commandBuffer->end();
1022}
1023
Petr Kraus8e53cf02020-01-03 05:30:04 +01001024TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1025 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1026
1027 ASSERT_NO_FATAL_FAILURE(Init());
1028
1029 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1030 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1031 secondary_cb.begin();
1032 secondary_cb.end();
1033
1034 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001036 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1037 m_errorMonitor->VerifyFound();
1038}
1039
unknown088160a2019-05-23 17:43:13 -06001040TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1041 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1042
1043 ASSERT_NO_FATAL_FAILURE(Init());
1044 ASSERT_NO_FATAL_FAILURE(InitViewport());
1045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1046
1047 const VkPipelineLayoutObj pipeline_layout(m_device);
1048
1049 struct VboEntry {
1050 uint16_t input0[2];
1051 uint32_t input1;
1052 float input2[4];
1053 };
1054
1055 const unsigned vbo_entry_count = 3;
1056 const VboEntry vbo_data[vbo_entry_count] = {};
1057
1058 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1059 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1060
1061 VkVertexInputBindingDescription input_binding;
1062 input_binding.binding = 0;
1063 input_binding.stride = sizeof(VboEntry);
1064 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1065
1066 VkVertexInputAttributeDescription input_attribs[3];
1067
1068 input_attribs[0].binding = 0;
1069 // Location switch between attrib[0] and attrib[1] is intentional
1070 input_attribs[0].location = 1;
1071 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1072 input_attribs[0].offset = offsetof(VboEntry, input1);
1073
1074 input_attribs[1].binding = 0;
1075 input_attribs[1].location = 0;
1076 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1077 input_attribs[1].offset = offsetof(VboEntry, input0);
1078
1079 input_attribs[2].binding = 0;
1080 input_attribs[2].location = 2;
1081 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1082 input_attribs[2].offset = offsetof(VboEntry, input2);
1083
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001084 char const *vsSource = R"glsl(
1085 #version 450
1086 layout(location = 0) in vec2 input0;
1087 layout(location = 1) in vec4 input1;
1088 layout(location = 2) in vec4 input2;
1089 void main(){
1090 gl_Position = input1 + input2;
1091 gl_Position.xy += input0;
1092 }
1093 )glsl";
unknown088160a2019-05-23 17:43:13 -06001094
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001095 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
1096 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001097
1098 VkPipelineObj pipe1(m_device);
1099 pipe1.AddDefaultColorAttachment();
1100 pipe1.AddShader(&vs);
1101 pipe1.AddShader(&fs);
1102 pipe1.AddVertexInputBindings(&input_binding, 1);
1103 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1104 pipe1.SetViewport(m_viewports);
1105 pipe1.SetScissor(m_scissors);
1106 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1107
1108 input_binding.stride = 6;
1109
1110 VkPipelineObj pipe2(m_device);
1111 pipe2.AddDefaultColorAttachment();
1112 pipe2.AddShader(&vs);
1113 pipe2.AddShader(&fs);
1114 pipe2.AddVertexInputBindings(&input_binding, 1);
1115 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1116 pipe2.SetViewport(m_viewports);
1117 pipe2.SetScissor(m_scissors);
1118 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1119
1120 m_commandBuffer->begin();
1121 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1122
1123 // Test with invalid buffer offset
1124 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001125 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1126 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
1128 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 1
1129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001130 m_commandBuffer->Draw(1, 0, 0, 0);
1131 m_errorMonitor->VerifyFound();
1132
1133 // Test with invalid buffer stride
1134 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001135 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1136 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001137 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 0
unknown088160a2019-05-23 17:43:13 -06001138 // Attribute[1] is aligned properly even with a wrong stride
sfricke-samsung0cb6c4e2022-02-08 14:49:23 -08001139 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02721"); // attribute 2
unknown088160a2019-05-23 17:43:13 -06001140 m_commandBuffer->Draw(1, 0, 0, 0);
1141 m_errorMonitor->VerifyFound();
1142
1143 m_commandBuffer->EndRenderPass();
1144 m_commandBuffer->end();
1145}
1146
1147TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1148 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001149 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001150
1151 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1152
1153 secondary.begin();
1154 secondary.end();
1155
1156 VkCommandBufferBeginInfo cbbi = {
1157 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1158 nullptr,
1159 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1160 nullptr,
1161 };
1162
1163 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001164 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001165 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001166 m_errorMonitor->VerifyFound();
1167 m_commandBuffer->end();
1168}
1169
1170TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1171 ASSERT_NO_FATAL_FAILURE(Init());
1172
John Zulauff1640d12019-08-13 15:39:58 -06001173 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001174
1175 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1176
sfricke-samsung1c61f192021-12-31 01:53:03 -06001177 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001178 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1179
1180 secondary.begin(&cbbi);
1181 secondary.end();
1182
1183 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001184 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001186 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001187 m_errorMonitor->VerifyFound();
1188 m_commandBuffer->end();
1189}
1190
1191TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1192 ASSERT_NO_FATAL_FAILURE(Init());
1193
1194 // variation on previous test executing the same CB twice in the same
1195 // CmdExecuteCommands call
1196
John Zulauff1640d12019-08-13 15:39:58 -06001197 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001198
1199 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1200
sfricke-samsung1c61f192021-12-31 01:53:03 -06001201 VkCommandBufferInheritanceInfo inh = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06001202 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1203
1204 secondary.begin(&cbbi);
1205 secondary.end();
1206
1207 m_commandBuffer->begin();
1208 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001210 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001211 m_errorMonitor->VerifyFound();
1212 m_commandBuffer->end();
1213}
1214
1215TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1216 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1217 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1218 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1219 ASSERT_NO_FATAL_FAILURE(Init());
1220
1221 VkCommandBuffer cmd_bufs[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06001222 VkCommandBufferAllocateInfo alloc_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06001223 alloc_info.commandBufferCount = 2;
1224 alloc_info.commandPool = m_commandPool->handle();
1225 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001226 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001227
sfricke-samsung1c61f192021-12-31 01:53:03 -06001228 VkCommandBufferBeginInfo cb_binfo = LvlInitStruct<VkCommandBufferBeginInfo>();
unknown088160a2019-05-23 17:43:13 -06001229 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1230 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001231 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001232 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001233 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1234 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001235 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1236
sfricke-samsung1c61f192021-12-31 01:53:03 -06001237 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06001238 submit_info.commandBufferCount = 2;
1239 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001241 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001242 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001243 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001244
1245 // Set one time use and now look for one time submit
1246 duplicates[0] = duplicates[1] = cmd_bufs[1];
1247 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 -06001248 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1249 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1250 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001251 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001252 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001253 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001254 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001255}
1256
1257TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1258 TEST_DESCRIPTION(
1259 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1260
Mark Lobodzinski20310782020-02-28 14:25:17 -07001261 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001262
1263 ASSERT_NO_FATAL_FAILURE(Init());
1264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1265
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001266 char const *fsSource = R"glsl(
1267 #version 450
1268 layout(set=0, binding=0) uniform sampler3D s;
1269 layout(location=0) out vec4 color;
1270 void main() {
1271 color = texture(s, vec3(0));
1272 }
1273 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001274 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1275 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001276
1277 VkPipelineObj pipe(m_device);
1278 pipe.AddShader(&vs);
1279 pipe.AddShader(&fs);
1280 pipe.AddDefaultColorAttachment();
1281
1282 VkTextureObj texture(m_device, nullptr);
1283 VkSamplerObj sampler(m_device);
1284
1285 VkDescriptorSetObj descriptorSet(m_device);
1286 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1287 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1288
1289 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1290 ASSERT_VK_SUCCESS(err);
1291
1292 m_commandBuffer->begin();
1293 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1294
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001295 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001296 m_commandBuffer->BindDescriptorSet(descriptorSet);
1297
1298 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001299 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001300 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001301 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001302
1303 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001304 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001305
1306 m_errorMonitor->VerifyFound();
1307
1308 m_commandBuffer->EndRenderPass();
1309 m_commandBuffer->end();
1310}
1311
1312TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1313 TEST_DESCRIPTION(
1314 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1315 "vice versa.");
1316
Mark Lobodzinski20310782020-02-28 14:25:17 -07001317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001318
1319 ASSERT_NO_FATAL_FAILURE(Init());
1320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1321
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001322 char const *fsSource = R"glsl(
1323 #version 450
1324 layout(set=0, binding=0) uniform sampler2DMS s;
1325 layout(location=0) out vec4 color;
1326 void main() {
1327 color = texelFetch(s, ivec2(0), 0);
1328 }
1329 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001330 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1331 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001332
1333 VkPipelineObj pipe(m_device);
1334 pipe.AddShader(&vs);
1335 pipe.AddShader(&fs);
1336 pipe.AddDefaultColorAttachment();
1337
1338 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1339 VkSamplerObj sampler(m_device);
1340
1341 VkDescriptorSetObj descriptorSet(m_device);
1342 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1343 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1344
1345 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1346 ASSERT_VK_SUCCESS(err);
1347
1348 m_commandBuffer->begin();
1349 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1350
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001351 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001352 m_commandBuffer->BindDescriptorSet(descriptorSet);
1353
1354 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001355 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001356 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001357 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001358
1359 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001360 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001361
1362 m_errorMonitor->VerifyFound();
1363
1364 m_commandBuffer->EndRenderPass();
1365 m_commandBuffer->end();
1366}
1367
1368TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1369 TEST_DESCRIPTION(
1370 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1371
Mark Lobodzinski20310782020-02-28 14:25:17 -07001372 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001373
1374 ASSERT_NO_FATAL_FAILURE(Init());
1375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1376
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001377 char const *fsSource = R"glsl(
1378 #version 450
1379 layout(set=0, binding=0) uniform isampler2D s;
1380 layout(location=0) out vec4 color;
1381 void main() {
1382 color = texelFetch(s, ivec2(0), 0);
1383 }
1384 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08001385 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
1386 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06001387
1388 VkPipelineObj pipe(m_device);
1389 pipe.AddShader(&vs);
1390 pipe.AddShader(&fs);
1391 pipe.AddDefaultColorAttachment();
1392
1393 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1394 VkSamplerObj sampler(m_device);
1395
1396 VkDescriptorSetObj descriptorSet(m_device);
1397 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1398 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1399
1400 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1401 ASSERT_VK_SUCCESS(err);
1402
1403 m_commandBuffer->begin();
1404 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1405
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001406 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001407 m_commandBuffer->BindDescriptorSet(descriptorSet);
1408
1409 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001410 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001411 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001412 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001413
1414 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001415 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001416
1417 m_errorMonitor->VerifyFound();
1418
1419 m_commandBuffer->EndRenderPass();
1420 m_commandBuffer->end();
1421}
1422
unknown088160a2019-05-23 17:43:13 -06001423TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1424 TEST_DESCRIPTION(
1425 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001426 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1427 bool maintenance1 = false;
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001428 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
1429 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung30b094c2020-05-30 11:42:11 -07001430 maintenance1 = true;
1431 }
1432 ASSERT_NO_FATAL_FAILURE(InitState());
1433
1434 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1435 VkFormatProperties format_props;
1436 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1437 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1438 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1439 return;
1440 }
unknown088160a2019-05-23 17:43:13 -06001441
1442 // Create two images to copy between
1443 VkImageObj src_image_obj(m_device);
1444 VkImageObj dst_image_obj(m_device);
1445
sfricke-samsung1c61f192021-12-31 01:53:03 -06001446 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001447 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001448 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001449 image_create_info.extent.width = 32;
1450 image_create_info.extent.height = 32;
1451 image_create_info.extent.depth = 1;
1452 image_create_info.mipLevels = 1;
1453 image_create_info.arrayLayers = 4;
1454 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1455 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1456 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1457 image_create_info.flags = 0;
1458
1459 src_image_obj.init(&image_create_info);
1460 ASSERT_TRUE(src_image_obj.initialized());
1461
1462 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1463 dst_image_obj.init(&image_create_info);
1464 ASSERT_TRUE(dst_image_obj.initialized());
1465
1466 m_commandBuffer->begin();
1467 VkImageCopy copyRegion;
1468 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1469 copyRegion.srcSubresource.mipLevel = 0;
1470 copyRegion.srcSubresource.baseArrayLayer = 0;
1471 copyRegion.srcSubresource.layerCount = 1;
1472 copyRegion.srcOffset.x = 0;
1473 copyRegion.srcOffset.y = 0;
1474 copyRegion.srcOffset.z = 0;
1475 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1476 copyRegion.dstSubresource.mipLevel = 0;
1477 copyRegion.dstSubresource.baseArrayLayer = 0;
1478 // Introduce failure by forcing the dst layerCount to differ from src
1479 copyRegion.dstSubresource.layerCount = 3;
1480 copyRegion.dstOffset.x = 0;
1481 copyRegion.dstOffset.y = 0;
1482 copyRegion.dstOffset.z = 0;
1483 copyRegion.extent.width = 1;
1484 copyRegion.extent.height = 1;
1485 copyRegion.extent.depth = 1;
1486
sfricke-samsung30b094c2020-05-30 11:42:11 -07001487 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1488 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001489 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1490 &copyRegion);
1491 m_errorMonitor->VerifyFound();
1492}
1493
1494TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1495 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1496
Jeff Leger465acf52020-10-12 18:07:16 -04001497 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1498
1499 bool copy_commands2 = false;
1500 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1501 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1502 copy_commands2 = true;
1503 }
1504 ASSERT_NO_FATAL_FAILURE(InitState());
1505
1506 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001507 if (copy_commands2) {
1508 vkCmdCopyBufferToImage2Function =
1509 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001510 }
unknown088160a2019-05-23 17:43:13 -06001511
1512 VkPhysicalDeviceFeatures device_features = {};
1513 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1514 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1515 if (device_features.textureCompressionBC) {
1516 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1517 } else if (device_features.textureCompressionETC2) {
1518 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1519 } else if (device_features.textureCompressionASTC_LDR) {
1520 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1521 } else {
1522 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1523 return;
1524 }
1525
sfricke-samsung1c61f192021-12-31 01:53:03 -06001526 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06001527 ci.flags = 0;
1528 ci.imageType = VK_IMAGE_TYPE_2D;
1529 ci.format = compressed_format;
1530 ci.extent = {32, 32, 1};
1531 ci.mipLevels = 6;
1532 ci.arrayLayers = 1;
1533 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1534 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1535 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1536 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1537 ci.queueFamilyIndexCount = 0;
1538 ci.pQueueFamilyIndices = NULL;
1539 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1540
1541 VkImageObj image(m_device);
1542 image.init(&ci);
1543 ASSERT_TRUE(image.initialized());
1544
1545 VkImageObj odd_image(m_device);
1546 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1547 odd_image.init(&ci);
1548 ASSERT_TRUE(odd_image.initialized());
1549
1550 // Allocate buffers
1551 VkMemoryPropertyFlags reqs = 0;
1552 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1553 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1554 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1555 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1556 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1557
1558 VkBufferImageCopy region = {};
1559 region.bufferRowLength = 0;
1560 region.bufferImageHeight = 0;
1561 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1562 region.imageSubresource.layerCount = 1;
1563 region.imageOffset = {0, 0, 0};
1564 region.bufferOffset = 0;
1565
1566 // start recording
1567 m_commandBuffer->begin();
1568
locke-lunargdf00db02020-03-04 19:00:57 -07001569 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001570 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001571 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1572 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001573 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001574 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1575 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001576 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001577 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1578 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1579
unknown088160a2019-05-23 17:43:13 -06001580 // Mip level copies that work - 5 levels
1581 m_errorMonitor->ExpectSuccess();
1582
1583 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1584 region.imageExtent = {32, 32, 1};
1585 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001586 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001587
1588 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1589 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001590 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001591
1592 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1593 region.imageExtent = {8, 8, 1};
1594 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001595 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001596
1597 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1598 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001599 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001600
1601 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1602 region.imageExtent = {4, 4, 1};
1603 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001604 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001605
1606 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1607 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001608 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001609
1610 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1611 region.imageExtent = {2, 2, 1};
1612 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001613
1614 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1615 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001616 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001617
1618 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1619 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001620 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001621
1622 region.imageExtent = {1, 1, 1};
1623 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001624
1625 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1626 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001627 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001628
1629 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1630 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001631 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001632 m_errorMonitor->VerifyNotFound();
1633
1634 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001636 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001637 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001638 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001639 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001640 m_errorMonitor->VerifyFound();
1641
1642 // Copy width < compressed block size, but not the full mip width
1643 region.imageExtent = {1, 2, 1};
1644 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001645 // width not a multiple of compressed block width
1646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001648 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001649 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001650 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001651
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001652 m_errorMonitor->SetDesiredFailureMsg(
1653 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001655 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001656 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001657 m_errorMonitor->VerifyFound();
1658
1659 // Copy height < compressed block size but not the full mip height
1660 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001661 m_errorMonitor->SetDesiredFailureMsg(
1662 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
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-00208"); // height 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 // Offsets must be multiple of compressed block size
1676 region.imageOffset = {1, 1, 0};
1677 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001678 // imageOffset not a multiple of block size
1679 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001681 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001682 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001683 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001684
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001685 m_errorMonitor->SetDesiredFailureMsg(
1686 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001688 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001689 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001690 m_errorMonitor->VerifyFound();
1691
Jeff Leger465acf52020-10-12 18:07:16 -04001692 // Equivalent test using KHR_copy_commands2
1693 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1694 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1695 NULL,
1696 region.bufferOffset,
1697 region.bufferRowLength,
1698 region.bufferImageHeight,
1699 region.imageSubresource,
1700 region.imageOffset,
1701 region.imageExtent};
1702 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1703 NULL,
1704 buffer_16.handle(),
1705 image.handle(),
1706 VK_IMAGE_LAYOUT_GENERAL,
1707 1,
1708 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001709 m_errorMonitor->SetDesiredFailureMsg(
Tony-LunarG953d55a2021-11-11 14:20:25 -07001710 kErrorBit, "VUID-VkCopyBufferToImageInfo2-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Tony-LunarG953d55a2021-11-11 14:20:25 -07001712 "VUID-VkCopyBufferToImageInfo2-imageOffset-01793"); // image transfer granularity
Jeff Leger465acf52020-10-12 18:07:16 -04001713 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1714 m_errorMonitor->VerifyFound();
1715 }
1716
unknown088160a2019-05-23 17:43:13 -06001717 // Offset + extent width = mip width - should succeed
1718 region.imageOffset = {4, 4, 0};
1719 region.imageExtent = {3, 4, 1};
1720 region.imageSubresource.mipLevel = 2;
1721 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001722
1723 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1724 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001725 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1726 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001727
1728 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1729 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001730 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1731 &region);
unknown088160a2019-05-23 17:43:13 -06001732 m_errorMonitor->VerifyNotFound();
1733
unknown088160a2019-05-23 17:43:13 -06001734 // Offset + extent width < mip width and not a multiple of block width - should fail
1735 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001736 m_errorMonitor->SetDesiredFailureMsg(
1737 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001739 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001740 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1741 &region);
unknown088160a2019-05-23 17:43:13 -06001742 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001743 m_errorMonitor->SetDesiredFailureMsg(
1744 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001746 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001747 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1748 &region);
unknown088160a2019-05-23 17:43:13 -06001749 m_errorMonitor->VerifyFound();
1750}
1751
1752TEST_F(VkLayerTest, ImageBufferCopyTests) {
1753 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001754
1755 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1756 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1757 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1758 if (mp_extensions) {
1759 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1760 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001761 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001762 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001763 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1764 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1765 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1766 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07001767 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001768 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1769 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1770 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1771 }
1772 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001773
1774 // Bail if any dimension of transfer granularity is 0.
1775 auto index = m_device->graphics_queue_node_index_;
1776 auto queue_family_properties = m_device->phy().queue_properties();
1777 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1778 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1779 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1780 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1781 return;
1782 }
1783
sfricke-samsung6d97e562020-01-07 22:01:00 -08001784 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1785 // 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 -07001786 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1787 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001788 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001789 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1790 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1791 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1792 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1793 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001794 // compression
1795 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1796 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1797 // multi-planar
1798 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 -06001799
sfricke-samsung6d97e562020-01-07 22:01:00 -08001800 // Verify R8G8B8A8_UINT format is supported for transfer
1801 bool missing_rgba_support = false;
1802 VkFormatProperties props = {0, 0, 0};
1803 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1804 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1805 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1806 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1807
1808 if (!missing_rgba_support) {
1809 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1810 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1811 VK_IMAGE_TILING_OPTIMAL, 0);
1812 ASSERT_TRUE(image_64k.initialized());
1813
1814 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1815 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1816 VK_IMAGE_TILING_OPTIMAL, 0);
1817 ASSERT_TRUE(image_16k.initialized());
1818 }
unknown088160a2019-05-23 17:43:13 -06001819
1820 // Verify all needed Depth/Stencil formats are supported
1821 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001822 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001823 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1824 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1825 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001826 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001827 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1828 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1829 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001830 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001831 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1832 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1833 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001834 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001835 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1836 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1837 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1838
1839 if (!missing_ds_support) {
1840 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1841 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1842 ASSERT_TRUE(image_16k_depth.initialized());
1843
1844 ds_image_4D_1S.Init(
1845 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1846 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1847 VK_IMAGE_TILING_OPTIMAL, 0);
1848 ASSERT_TRUE(ds_image_4D_1S.initialized());
1849
1850 ds_image_3D_1S.Init(
1851 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1852 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1853 VK_IMAGE_TILING_OPTIMAL, 0);
1854 ASSERT_TRUE(ds_image_3D_1S.initialized());
1855
1856 ds_image_2D.Init(
1857 256, 256, 1, VK_FORMAT_D16_UNORM,
1858 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1859 VK_IMAGE_TILING_OPTIMAL, 0);
1860 ASSERT_TRUE(ds_image_2D.initialized());
1861
1862 ds_image_1S.Init(
1863 256, 256, 1, VK_FORMAT_S8_UINT,
1864 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1865 VK_IMAGE_TILING_OPTIMAL, 0);
1866 ASSERT_TRUE(ds_image_1S.initialized());
1867 }
1868
1869 // Allocate buffers
1870 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1871 VkMemoryPropertyFlags reqs = 0;
1872 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1873 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1874 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1875 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1876
1877 VkBufferImageCopy region = {};
1878 region.bufferRowLength = 0;
1879 region.bufferImageHeight = 0;
1880 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1881 region.imageSubresource.layerCount = 1;
1882 region.imageOffset = {0, 0, 0};
1883 region.imageExtent = {64, 64, 1};
1884 region.bufferOffset = 0;
1885
locke-lunargdf00db02020-03-04 19:00:57 -07001886 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001887 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001888 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1889 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001890 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001891 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1892 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001893 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001894 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1895 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1896
sfricke-samsung6d97e562020-01-07 22:01:00 -08001897 if (missing_rgba_support) {
1898 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001899
sfricke-samsung6d97e562020-01-07 22:01:00 -08001900 // start recording for future tests
1901 m_commandBuffer->begin();
1902 } else {
1903 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001905 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1906 &region);
unknown088160a2019-05-23 17:43:13 -06001907 m_errorMonitor->VerifyFound();
1908
Mark Lobodzinski20310782020-02-28 14:25:17 -07001909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001910 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1911 &region);
1912 m_errorMonitor->VerifyFound();
1913
1914 // start recording
1915 m_commandBuffer->begin();
1916
1917 // successful copies
1918 m_errorMonitor->ExpectSuccess();
1919 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1920 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001921
1922 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1923 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001924 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1925 &region);
1926 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001927
1928 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1929 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001930 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1931 &region);
1932 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001933
1934 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1935 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001936 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1937 &region);
1938 region.imageOffset.x = 0;
1939 region.imageExtent.height = 64;
1940 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001941
1942 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1943 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001944 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1945 &region);
1946 m_errorMonitor->VerifyNotFound();
1947
1948 // image/buffer too small (extent too large) on copy to image
1949 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001951 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1952 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1953 &region);
1954 m_errorMonitor->VerifyFound();
1955
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001956 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001958 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001959 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1960 &region);
1961 m_errorMonitor->VerifyFound();
1962
1963 // image/buffer too small (offset) on copy to image
1964 region.imageExtent = {64, 64, 1};
1965 region.imageOffset = {0, 4, 0};
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");
1973 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001974 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001975 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001976 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1977 &region);
1978 m_errorMonitor->VerifyFound();
1979
1980 // image/buffer too small on copy to buffer
1981 region.imageExtent = {64, 64, 1};
1982 region.imageOffset = {0, 0, 0};
1983 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001985 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
1986 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1987 &region);
1988 m_errorMonitor->VerifyFound();
1989
1990 region.imageExtent = {64, 65, 1};
1991 region.bufferOffset = 0;
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001992 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001993 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07001994 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // image too small
sfricke-samsung6d97e562020-01-07 22:01:00 -08001995 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1996 &region);
1997 m_errorMonitor->VerifyFound();
1998
1999 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002001 region.imageExtent = {64, 64, 1};
2002 region.bufferRowLength = 68;
2003 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2004 &region);
2005 m_errorMonitor->VerifyFound();
2006
2007 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002008 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002009 region.imageExtent.width = 0;
2010 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2011 &region);
2012 m_errorMonitor->VerifyFound();
2013
2014 // aspect bits
2015 region.imageExtent = {64, 64, 1};
2016 region.bufferRowLength = 0;
2017 region.bufferImageHeight = 0;
2018 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002020 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2021 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2022 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2023 buffer_16k.handle(), 1, &region);
2024 m_errorMonitor->VerifyFound();
2025
Mark Lobodzinski20310782020-02-28 14:25:17 -07002026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002027 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002028 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2029 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2030 buffer_16k.handle(), 1, &region);
2031 m_errorMonitor->VerifyFound();
2032 }
2033
Mark Lobodzinski20310782020-02-28 14:25:17 -07002034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002035 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002036 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2037 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2038 &region);
2039 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002040 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002041
2042 // Out-of-range mip levels should fail
2043 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002045 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06221");
2046 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002047 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002048 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002049 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002050 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002051 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2052 &region);
2053 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002055 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2056 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002057 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002058 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002059 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002060 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002061 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2062 &region);
2063 m_errorMonitor->VerifyFound();
2064 region.imageSubresource.mipLevel = 0;
2065
2066 // Out-of-range array layers should fail
2067 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2068 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002069 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002070 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2071 &region);
2072 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002073 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002074 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2075 &region);
2076 m_errorMonitor->VerifyFound();
2077 region.imageSubresource.baseArrayLayer = 0;
2078
2079 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002080 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002081 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2082 buffer_16k.handle(), 1, &region);
2083 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002085 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2086 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002087 m_errorMonitor->VerifyFound();
2088 }
2089
unknown088160a2019-05-23 17:43:13 -06002090 // Test Depth/Stencil copies
2091 if (missing_ds_support) {
2092 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2093 } else {
2094 VkBufferImageCopy ds_region = {};
2095 ds_region.bufferOffset = 0;
2096 ds_region.bufferRowLength = 0;
2097 ds_region.bufferImageHeight = 0;
2098 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2099 ds_region.imageSubresource.mipLevel = 0;
2100 ds_region.imageSubresource.baseArrayLayer = 0;
2101 ds_region.imageSubresource.layerCount = 1;
2102 ds_region.imageOffset = {0, 0, 0};
2103 ds_region.imageExtent = {256, 256, 1};
2104
2105 // Depth copies that should succeed
2106 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002107 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2108 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002109 m_errorMonitor->VerifyNotFound();
2110
2111 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002112 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2113 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002114 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2115 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002116 m_errorMonitor->VerifyNotFound();
2117
2118 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002119 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2120 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002121 m_errorMonitor->VerifyNotFound();
2122
2123 // Depth copies that should fail
2124 ds_region.bufferOffset = 4;
2125 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002126 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002127 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002128 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2129 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002130 m_errorMonitor->VerifyFound();
2131
2132 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002133 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002134 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002135 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002136 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002137 m_errorMonitor->VerifyFound();
2138
2139 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002140 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002141 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002142 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2143 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002144 m_errorMonitor->VerifyFound();
2145
sfricke-samsung5a019492021-01-25 10:32:08 -08002146 ds_region.bufferOffset = 5;
2147 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2148 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2149 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2150 buffer_128k.handle(), 1, &ds_region);
2151 m_errorMonitor->VerifyFound();
2152 ds_region.imageExtent = {256, 256, 1};
2153
unknown088160a2019-05-23 17:43:13 -06002154 // Stencil copies that should succeed
2155 ds_region.bufferOffset = 0;
2156 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2157 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002158 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2159 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002160 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2161 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002162 m_errorMonitor->VerifyNotFound();
2163
2164 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002165 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2166 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002167 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2168 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002169 m_errorMonitor->VerifyNotFound();
2170
2171 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002172 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2173 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002174 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2175 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002176 m_errorMonitor->VerifyNotFound();
2177
2178 // Stencil copies that should fail
2179 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002180 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002181 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002182 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2183 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002184 m_errorMonitor->VerifyFound();
2185
2186 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002187 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002188 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2189 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002190 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2191 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002192 m_errorMonitor->VerifyFound();
2193
2194 ds_region.bufferRowLength = 0;
2195 ds_region.bufferOffset = 4;
2196 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002197 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002198 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002199 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2200 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002201 m_errorMonitor->VerifyFound();
2202 }
2203
2204 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002205 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002206 VkPhysicalDeviceFeatures device_features = {};
2207 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2208 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2209 device_features.textureCompressionASTC_LDR)) {
2210 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2211 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002212 // Verify transfer support for each compression format used blow
2213 bool missing_bc_support = false;
2214 bool missing_etc_support = false;
2215 bool missing_astc_support = false;
2216 bool missing_compression_support = false;
2217
2218 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2219 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2220 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2221 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2222
2223 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2224 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2225 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2226 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2227
2228 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2229 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2230 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2231 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2232
2233 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002234 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2235 0);
2236 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2237 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002238 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002239 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2240 VK_IMAGE_TILING_OPTIMAL, 0);
2241 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2242 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002243 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002244 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2245 VK_IMAGE_TILING_OPTIMAL, 0);
2246 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2247 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002248 } else {
2249 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002250 }
unknown088160a2019-05-23 17:43:13 -06002251
sfricke-samsung6d97e562020-01-07 22:01:00 -08002252 if (missing_compression_support) {
2253 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2254 } else {
2255 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002256 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002257 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002258 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2259 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002260 m_errorMonitor->ExpectSuccess();
2261 region.imageExtent = {128, 128, 1};
2262 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2263 buffer_16k.handle(), 1, &region);
2264 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002265
sfricke-samsung6d97e562020-01-07 22:01:00 -08002266 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002267 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002268 region.bufferOffset = 16;
2269 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2270 buffer_16k.handle(), 1, &region);
2271 m_errorMonitor->VerifyFound();
2272 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002273
sfricke-samsung6d97e562020-01-07 22:01:00 -08002274 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002275 m_errorMonitor->SetDesiredFailureMsg(
2276 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002277 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002278 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2279 region.imageExtent.width = 66;
2280 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2281 buffer_16k.handle(), 1, &region);
2282 m_errorMonitor->VerifyFound();
2283 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002284
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002285 m_errorMonitor->SetDesiredFailureMsg(
2286 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002287 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002288 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2289 region.imageExtent.height = 2;
2290 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2291 buffer_16k.handle(), 1, &region);
2292 m_errorMonitor->VerifyFound();
2293 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002294
sfricke-samsung6d97e562020-01-07 22:01:00 -08002295 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002296
sfricke-samsung6d97e562020-01-07 22:01:00 -08002297 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2298 m_errorMonitor->ExpectSuccess();
2299 region.imageExtent.width = 66;
2300 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002301 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2302 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002303 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2304 buffer_16k.handle(), 1, &region);
2305 region.imageExtent.width = 16;
2306 region.imageOffset.x = 0;
2307 region.imageExtent.height = 2;
2308 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002309 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2310 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002311 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2312 buffer_16k.handle(), 1, &region);
2313 m_errorMonitor->VerifyNotFound();
2314 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002315
sfricke-samsung6d97e562020-01-07 22:01:00 -08002316 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002318 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002319 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002320 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002321 region.imageExtent = {64, 64, 1};
2322 region.bufferOffset = 24;
2323 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2324 buffer_16k.handle(), 1, &region);
2325 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002326
sfricke-samsung6d97e562020-01-07 22:01:00 -08002327 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002328 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002329 region.bufferOffset = 0;
2330 region.bufferRowLength = 130;
2331 region.bufferImageHeight = 0;
2332 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2333 buffer_64k.handle(), 1, &region);
2334 m_errorMonitor->VerifyFound();
2335
2336 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002338 region.bufferRowLength = 0;
2339 region.bufferImageHeight = 130;
2340 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2341 buffer_64k.handle(), 1, &region);
2342 m_errorMonitor->VerifyFound();
2343 }
2344 }
2345
2346 // Test multi-planar formats, if supported
2347 if (!mp_extensions) {
2348 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2349 } else {
2350 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2351 // being required with samplerYcbcrConversion feature
2352 bool missing_mp_support = false;
2353 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2354 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2355 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2356 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2357
2358 if (missing_mp_support) {
2359 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2360 } else {
2361 VkBufferImageCopy mp_region = {};
2362 mp_region.bufferOffset = 0;
2363 mp_region.bufferRowLength = 0;
2364 mp_region.bufferImageHeight = 0;
2365 mp_region.imageSubresource.mipLevel = 0;
2366 mp_region.imageSubresource.baseArrayLayer = 0;
2367 mp_region.imageSubresource.layerCount = 1;
2368 mp_region.imageOffset = {0, 0, 0};
2369 mp_region.imageExtent = {128, 128, 1};
2370
2371 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2372 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2373 VK_IMAGE_TILING_OPTIMAL, 0);
2374 ASSERT_TRUE(image_multi_planar.initialized());
2375
2376 // Copies into a mutli-planar image aspect properly
2377 m_errorMonitor->ExpectSuccess();
2378 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002379 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2380 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002381 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2382 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2383 m_errorMonitor->VerifyNotFound();
2384
2385 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002387 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2388 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2389 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2390 m_errorMonitor->VerifyFound();
2391
2392 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002393 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002394 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2395 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2396 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2397 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002398
2399 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002401 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2402 mp_region.bufferOffset = 5;
2403 mp_region.imageExtent = {8, 8, 1};
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();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002407 }
unknown088160a2019-05-23 17:43:13 -06002408 }
2409}
2410
2411TEST_F(VkLayerTest, MiscImageLayerTests) {
2412 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2413
2414 ASSERT_NO_FATAL_FAILURE(Init());
2415
2416 // TODO: Ideally we should check if a format is supported, before using it.
2417 VkImageObj image(m_device);
2418 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2419 ASSERT_TRUE(image.initialized());
2420 VkBufferObj buffer;
2421 VkMemoryPropertyFlags reqs = 0;
2422 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2423 VkBufferImageCopy region = {};
2424 region.bufferRowLength = 128;
2425 region.bufferImageHeight = 128;
2426 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2427 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2428 region.imageSubresource.layerCount = 1;
2429 region.imageExtent.height = 4;
2430 region.imageExtent.width = 4;
2431 region.imageExtent.depth = 1;
2432
2433 VkImageObj image2(m_device);
2434 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2435 ASSERT_TRUE(image2.initialized());
2436 VkBufferObj buffer2;
2437 VkMemoryPropertyFlags reqs2 = 0;
2438 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002439 m_commandBuffer->begin();
2440
2441 // Image must have offset.z of 0 and extent.depth of 1
2442 // Introduce failure by setting imageExtent.depth to 0
2443 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002444 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002445 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2446 &region);
unknown088160a2019-05-23 17:43:13 -06002447 m_errorMonitor->VerifyFound();
2448
2449 region.imageExtent.depth = 1;
2450
2451 // Image must have offset.z of 0 and extent.depth of 1
2452 // Introduce failure by setting imageOffset.z to 4
2453 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2454 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002455 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2456 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002457 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-06217");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002458 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2459 &region);
unknown088160a2019-05-23 17:43:13 -06002460 m_errorMonitor->VerifyFound();
2461
2462 region.imageOffset.z = 0;
2463 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2464 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2465 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002467 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2468 &region);
unknown088160a2019-05-23 17:43:13 -06002469 m_errorMonitor->VerifyFound();
2470
unknown088160a2019-05-23 17:43:13 -06002471 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2472 region.bufferOffset = 0;
2473 region.imageExtent.height = 128;
2474 region.imageExtent.width = 128;
2475 // Introduce failure by setting bufferRowLength > 0 but less than width
2476 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002478 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2479 &region);
unknown088160a2019-05-23 17:43:13 -06002480 m_errorMonitor->VerifyFound();
2481
2482 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2483 region.bufferRowLength = 128;
2484 // Introduce failure by setting bufferRowHeight > 0 but less than height
2485 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002486 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002487 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2488 &region);
unknown088160a2019-05-23 17:43:13 -06002489 m_errorMonitor->VerifyFound();
2490
2491 region.bufferImageHeight = 128;
2492 VkImageObj intImage1(m_device);
2493 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2494 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2495 VkImageObj intImage2(m_device);
2496 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2497 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2498 VkImageBlit blitRegion = {};
2499 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2500 blitRegion.srcSubresource.baseArrayLayer = 0;
2501 blitRegion.srcSubresource.layerCount = 1;
2502 blitRegion.srcSubresource.mipLevel = 0;
2503 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2504 blitRegion.dstSubresource.baseArrayLayer = 0;
2505 blitRegion.dstSubresource.layerCount = 1;
2506 blitRegion.dstSubresource.mipLevel = 0;
2507 blitRegion.srcOffsets[0] = {128, 0, 0};
2508 blitRegion.srcOffsets[1] = {128, 128, 1};
2509 blitRegion.dstOffsets[0] = {0, 128, 0};
2510 blitRegion.dstOffsets[1] = {128, 128, 1};
2511
2512 // Look for NULL-blit warning
sfricke-samsung85584a72021-09-30 21:43:38 -07002513 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
2514 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002515 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2516 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002517 m_errorMonitor->VerifyFound();
2518}
2519
2520TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2521 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002522 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2523
2524 bool copy_commands2 = false;
2525 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2526 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2527 copy_commands2 = true;
2528 }
2529 ASSERT_NO_FATAL_FAILURE(InitState());
2530
2531 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2532 if (copy_commands2) {
2533 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2534 }
unknown088160a2019-05-23 17:43:13 -06002535
sfricke-samsung30b094c2020-05-30 11:42:11 -07002536 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2537 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2538 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2539 return;
2540 }
2541
sfricke-samsung1c61f192021-12-31 01:53:03 -06002542 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002543 ci.flags = 0;
2544 ci.imageType = VK_IMAGE_TYPE_1D;
2545 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2546 ci.extent = {32, 1, 1};
2547 ci.mipLevels = 1;
2548 ci.arrayLayers = 1;
2549 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2550 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2551 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2552 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2553 ci.queueFamilyIndexCount = 0;
2554 ci.pQueueFamilyIndices = NULL;
2555 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2556
2557 // Create 1D image
2558 VkImageObj image_1D(m_device);
2559 image_1D.init(&ci);
2560 ASSERT_TRUE(image_1D.initialized());
2561
2562 // 2D image
2563 ci.imageType = VK_IMAGE_TYPE_2D;
2564 ci.extent = {32, 32, 1};
2565 VkImageObj image_2D(m_device);
2566 image_2D.init(&ci);
2567 ASSERT_TRUE(image_2D.initialized());
2568
2569 // 3D image
2570 ci.imageType = VK_IMAGE_TYPE_3D;
2571 ci.extent = {32, 32, 8};
2572 VkImageObj image_3D(m_device);
2573 image_3D.init(&ci);
2574 ASSERT_TRUE(image_3D.initialized());
2575
2576 // 2D image array
2577 ci.imageType = VK_IMAGE_TYPE_2D;
2578 ci.extent = {32, 32, 1};
2579 ci.arrayLayers = 8;
2580 VkImageObj image_2D_array(m_device);
2581 image_2D_array.init(&ci);
2582 ASSERT_TRUE(image_2D_array.initialized());
2583
2584 m_commandBuffer->begin();
2585
2586 VkImageCopy copy_region;
2587 copy_region.extent = {32, 1, 1};
2588 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2589 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2590 copy_region.srcSubresource.mipLevel = 0;
2591 copy_region.dstSubresource.mipLevel = 0;
2592 copy_region.srcSubresource.baseArrayLayer = 0;
2593 copy_region.dstSubresource.baseArrayLayer = 0;
2594 copy_region.srcSubresource.layerCount = 1;
2595 copy_region.dstSubresource.layerCount = 1;
2596 copy_region.srcOffset = {0, 0, 0};
2597 copy_region.dstOffset = {0, 0, 0};
2598
2599 // Sanity check
2600 m_errorMonitor->ExpectSuccess();
2601 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2602 &copy_region);
2603 m_errorMonitor->VerifyNotFound();
2604
Jeff Leger465acf52020-10-12 18:07:16 -04002605 // Equivalent sanity check using KHR_copy_commands2
2606 if (copy_commands2 && vkCmdCopyImage2Function) {
2607 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2608 NULL,
2609 copy_region.srcSubresource,
2610 copy_region.srcOffset,
2611 copy_region.dstSubresource,
2612 copy_region.dstOffset,
2613 copy_region.extent};
2614 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2615 NULL,
2616 image_1D.image(),
2617 VK_IMAGE_LAYOUT_GENERAL,
2618 image_2D.image(),
2619 VK_IMAGE_LAYOUT_GENERAL,
2620 1,
2621 &region2};
2622 m_errorMonitor->ExpectSuccess();
2623 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2624 m_errorMonitor->VerifyNotFound();
2625 }
2626
unknown088160a2019-05-23 17:43:13 -06002627 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2628 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002629 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002631 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2632 &copy_region);
2633 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002634
2635 // Equivalent test using KHR_copy_commands2
2636 if (copy_commands2 && vkCmdCopyImage2Function) {
2637 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2638 NULL,
2639 copy_region.srcSubresource,
2640 copy_region.srcOffset,
2641 copy_region.dstSubresource,
2642 copy_region.dstOffset,
2643 copy_region.extent};
2644 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2645 NULL,
2646 image_1D.image(),
2647 VK_IMAGE_LAYOUT_GENERAL,
2648 image_2D.image(),
2649 VK_IMAGE_LAYOUT_GENERAL,
2650 1,
2651 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2653 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002654 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2655 m_errorMonitor->VerifyFound();
2656 }
2657
unknown088160a2019-05-23 17:43:13 -06002658 copy_region.srcOffset.y = 0;
2659 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2661 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002662 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2663 &copy_region);
2664 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002665
2666 // Equivalent test using KHR_copy_commands2
2667 if (copy_commands2 && vkCmdCopyImage2Function) {
2668 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2669 NULL,
2670 copy_region.srcSubresource,
2671 copy_region.srcOffset,
2672 copy_region.dstSubresource,
2673 copy_region.dstOffset,
2674 copy_region.extent};
2675 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2676 NULL,
2677 image_2D.image(),
2678 VK_IMAGE_LAYOUT_GENERAL,
2679 image_1D.image(),
2680 VK_IMAGE_LAYOUT_GENERAL,
2681 1,
2682 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002685 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2686 m_errorMonitor->VerifyFound();
2687 }
2688
unknown088160a2019-05-23 17:43:13 -06002689 copy_region.dstOffset.y = 0;
2690
2691 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2692 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002695 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2696 &copy_region);
2697 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002698
2699 // Equivalent test using KHR_copy_commands2
2700 if (copy_commands2 && vkCmdCopyImage2Function) {
2701 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2702 NULL,
2703 copy_region.srcSubresource,
2704 copy_region.srcOffset,
2705 copy_region.dstSubresource,
2706 copy_region.dstOffset,
2707 copy_region.extent};
2708 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2709 NULL,
2710 image_1D.image(),
2711 VK_IMAGE_LAYOUT_GENERAL,
2712 image_2D.image(),
2713 VK_IMAGE_LAYOUT_GENERAL,
2714 1,
2715 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002718 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2719 m_errorMonitor->VerifyFound();
2720 }
2721
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002724 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2725 &copy_region);
2726 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002727
2728 // Equivalent test using KHR_copy_commands2
2729 if (copy_commands2 && vkCmdCopyImage2Function) {
2730 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2731 NULL,
2732 copy_region.srcSubresource,
2733 copy_region.srcOffset,
2734 copy_region.dstSubresource,
2735 copy_region.dstOffset,
2736 copy_region.extent};
2737 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2738 NULL,
2739 image_2D.image(),
2740 VK_IMAGE_LAYOUT_GENERAL,
2741 image_1D.image(),
2742 VK_IMAGE_LAYOUT_GENERAL,
2743 1,
2744 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002747 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2748 m_errorMonitor->VerifyFound();
2749 }
2750
unknown088160a2019-05-23 17:43:13 -06002751 copy_region.extent.height = 1;
2752
2753 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2754 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2756 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002757 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2758 &copy_region);
2759 m_errorMonitor->VerifyFound();
2760 copy_region.srcOffset.z = 0;
2761 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002764 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2765 &copy_region);
2766 m_errorMonitor->VerifyFound();
2767 copy_region.dstOffset.z = 0;
2768
2769 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2770 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002773 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002774 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002775 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002776 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002777 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002778 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2779 &copy_region);
2780 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002781 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002783 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002784 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002785 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002787 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002788 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2789 &copy_region);
2790 m_errorMonitor->VerifyFound();
2791 copy_region.extent.depth = 1;
2792
2793 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2794 copy_region.extent = {16, 16, 1};
2795 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002798 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002799 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2800 &copy_region);
2801 m_errorMonitor->VerifyFound();
2802 copy_region.srcOffset.z = 0;
2803 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002805 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002806 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002807 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2808 &copy_region);
2809 m_errorMonitor->VerifyFound();
2810 copy_region.dstOffset.z = 0;
2811
2812 // 3D texture accessing an array layer other than 0. VU 09c0011a
2813 copy_region.extent = {4, 4, 1};
2814 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002817 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2818 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2819 &copy_region);
2820 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002821 copy_region.srcSubresource.baseArrayLayer = 0;
2822
unknown088160a2019-05-23 17:43:13 -06002823 m_commandBuffer->end();
2824}
2825
2826TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2827 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002828 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07002829 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
2830 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06002831 } else {
2832 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2833 return;
2834 }
2835 ASSERT_NO_FATAL_FAILURE(InitState());
2836
2837 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2838 VkFormatProperties format_props;
2839 // TODO: Remove this check if or when devsim handles extensions.
2840 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2841 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002842 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002843 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2844 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2845 return;
2846 }
2847
sfricke-samsung1c61f192021-12-31 01:53:03 -06002848 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002849 ci.flags = 0;
2850 ci.imageType = VK_IMAGE_TYPE_1D;
2851 ci.format = image_format;
2852 ci.extent = {32, 1, 1};
2853 ci.mipLevels = 1;
2854 ci.arrayLayers = 1;
2855 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2856 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2857 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2858 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2859 ci.queueFamilyIndexCount = 0;
2860 ci.pQueueFamilyIndices = NULL;
2861 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2862
2863 // Create 1D image
2864 VkImageObj image_1D(m_device);
2865 image_1D.init(&ci);
2866 ASSERT_TRUE(image_1D.initialized());
2867
2868 // 2D image
2869 ci.imageType = VK_IMAGE_TYPE_2D;
2870 ci.extent = {32, 32, 1};
2871 VkImageObj image_2D(m_device);
2872 image_2D.init(&ci);
2873 ASSERT_TRUE(image_2D.initialized());
2874
2875 // 3D image
2876 ci.imageType = VK_IMAGE_TYPE_3D;
2877 ci.extent = {32, 32, 8};
2878 VkImageObj image_3D(m_device);
2879 image_3D.init(&ci);
2880 ASSERT_TRUE(image_3D.initialized());
2881
2882 // 2D image array
2883 ci.imageType = VK_IMAGE_TYPE_2D;
2884 ci.extent = {32, 32, 1};
2885 ci.arrayLayers = 8;
2886 VkImageObj image_2D_array(m_device);
2887 image_2D_array.init(&ci);
2888 ASSERT_TRUE(image_2D_array.initialized());
2889
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002890 // second 2D image array
2891 ci.imageType = VK_IMAGE_TYPE_2D;
2892 ci.extent = {32, 32, 1};
2893 ci.arrayLayers = 8;
2894 VkImageObj image_2D_array_2(m_device);
2895 image_2D_array_2.init(&ci);
2896 ASSERT_TRUE(image_2D_array_2.initialized());
2897
unknown088160a2019-05-23 17:43:13 -06002898 m_commandBuffer->begin();
2899
2900 VkImageCopy copy_region;
2901 copy_region.extent = {32, 1, 1};
2902 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2903 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2904 copy_region.srcSubresource.mipLevel = 0;
2905 copy_region.dstSubresource.mipLevel = 0;
2906 copy_region.srcSubresource.baseArrayLayer = 0;
2907 copy_region.dstSubresource.baseArrayLayer = 0;
2908 copy_region.srcSubresource.layerCount = 1;
2909 copy_region.dstSubresource.layerCount = 1;
2910 copy_region.srcOffset = {0, 0, 0};
2911 copy_region.dstOffset = {0, 0, 0};
2912
2913 // Copy from layer not present
2914 copy_region.srcSubresource.baseArrayLayer = 4;
2915 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002916 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002917 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2918 &copy_region);
2919 m_errorMonitor->VerifyFound();
2920 copy_region.srcSubresource.baseArrayLayer = 0;
2921 copy_region.srcSubresource.layerCount = 1;
2922
2923 // Copy to layer not present
2924 copy_region.dstSubresource.baseArrayLayer = 1;
2925 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002927 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2928 &copy_region);
2929 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002930 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002931 copy_region.dstSubresource.layerCount = 1;
2932
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002933 // both 2D and extent.depth not 1
2934 // Need two 2D array images to prevent other errors
2935 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002936 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002937 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2938 1, &copy_region);
2939 m_errorMonitor->VerifyFound();
2940 copy_region.extent = {32, 1, 1};
2941
2942 // 2D src / 3D dst and depth not equal to src layerCount
2943 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002945 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002946 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2947 &copy_region);
2948 m_errorMonitor->VerifyFound();
2949 copy_region.extent = {32, 1, 1};
2950
2951 // 3D src / 2D dst and depth not equal to dst layerCount
2952 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002953 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002954 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002955 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2956 &copy_region);
2957 m_errorMonitor->VerifyFound();
2958 copy_region.extent = {32, 1, 1};
2959
unknown088160a2019-05-23 17:43:13 -06002960 m_commandBuffer->end();
2961}
2962
2963TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2964 // Image copy tests on compressed images with block alignment errors
2965 SetTargetApiVersion(VK_API_VERSION_1_1);
2966 ASSERT_NO_FATAL_FAILURE(Init());
2967
2968 // Select a compressed format and verify support
2969 VkPhysicalDeviceFeatures device_features = {};
2970 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2971 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2972 if (device_features.textureCompressionBC) {
2973 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2974 } else if (device_features.textureCompressionETC2) {
2975 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2976 } else if (device_features.textureCompressionASTC_LDR) {
2977 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2978 }
2979
sfricke-samsung1c61f192021-12-31 01:53:03 -06002980 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002981 ci.flags = 0;
2982 ci.imageType = VK_IMAGE_TYPE_2D;
2983 ci.format = compressed_format;
2984 ci.extent = {64, 64, 1};
2985 ci.mipLevels = 1;
2986 ci.arrayLayers = 1;
2987 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2988 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2989 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2990 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2991 ci.queueFamilyIndexCount = 0;
2992 ci.pQueueFamilyIndices = NULL;
2993 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2994
2995 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002996 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2997 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002998 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2999 return;
3000 }
3001
3002 // Create images
3003 VkImageObj image_1(m_device);
3004 image_1.init(&ci);
3005 ASSERT_TRUE(image_1.initialized());
3006
3007 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3008 VkImageObj image_2(m_device);
3009 image_2.init(&ci);
3010 ASSERT_TRUE(image_2.initialized());
3011
3012 m_commandBuffer->begin();
3013
3014 VkImageCopy copy_region;
3015 copy_region.extent = {48, 48, 1};
3016 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3017 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3018 copy_region.srcSubresource.mipLevel = 0;
3019 copy_region.dstSubresource.mipLevel = 0;
3020 copy_region.srcSubresource.baseArrayLayer = 0;
3021 copy_region.dstSubresource.baseArrayLayer = 0;
3022 copy_region.srcSubresource.layerCount = 1;
3023 copy_region.dstSubresource.layerCount = 1;
3024 copy_region.srcOffset = {0, 0, 0};
3025 copy_region.dstOffset = {0, 0, 0};
3026
3027 // Sanity check
3028 m_errorMonitor->ExpectSuccess();
3029 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3030 m_errorMonitor->VerifyNotFound();
3031
3032 std::string vuid;
3033 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3034 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3035
3036 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3037 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003038 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003039 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3041 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003042 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3043 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3044 m_errorMonitor->VerifyFound();
3045 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003048 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3049 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3050 m_errorMonitor->VerifyFound();
3051 copy_region.srcOffset = {0, 0, 0};
3052
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003053 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003054 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003057 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3058 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3059 m_errorMonitor->VerifyFound();
3060 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003063 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3064 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3065 m_errorMonitor->VerifyFound();
3066 copy_region.dstOffset = {0, 0, 0};
3067
3068 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003069 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003070 copy_region.extent = {62, 60, 1}; // source 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-srcOffset-01783"); // src extent 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();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003076 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003077 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003080 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3081 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3082 m_errorMonitor->VerifyFound();
3083
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003084 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003085 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003086 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3087 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003088 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3089 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3090 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003091 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003092 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003095 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3096 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3097 m_errorMonitor->VerifyFound();
3098
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003099 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3100 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003101 // There are currently no supported compressed formats with a block depth other than 1,
3102 // so impossible to create a 'not a multiple' condition for depth.
3103 m_commandBuffer->end();
3104}
3105
3106TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3107 // Image copy tests on single-plane _422 formats with block alignment errors
3108
3109 // Enable KHR multiplane req'd extensions
3110 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3111 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3112 if (mp_extensions) {
3113 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3114 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003115 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003116 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003117 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3118 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3119 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3120 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003121 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003122 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3123 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3124 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3125 } else {
3126 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3127 return;
3128 }
3129 ASSERT_NO_FATAL_FAILURE(InitState());
3130
3131 // Select a _422 format and verify support
sfricke-samsung1c61f192021-12-31 01:53:03 -06003132 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003133 ci.flags = 0;
3134 ci.imageType = VK_IMAGE_TYPE_2D;
3135 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3136 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3137 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3138 ci.mipLevels = 1;
3139 ci.arrayLayers = 1;
3140 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3141 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3142 ci.queueFamilyIndexCount = 0;
3143 ci.pQueueFamilyIndices = NULL;
3144 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3145
3146 // Verify formats
3147 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3148 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3149 if (!supported) {
3150 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3151 return; // Assume there's low ROI on searching for different mp formats
3152 }
3153
3154 // Create images
3155 ci.extent = {64, 64, 1};
3156 VkImageObj image_422(m_device);
3157 image_422.init(&ci);
3158 ASSERT_TRUE(image_422.initialized());
3159
3160 ci.extent = {64, 64, 1};
3161 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3162 VkImageObj image_ucmp(m_device);
3163 image_ucmp.init(&ci);
3164 ASSERT_TRUE(image_ucmp.initialized());
3165
3166 m_commandBuffer->begin();
3167
3168 VkImageCopy copy_region;
3169 copy_region.extent = {48, 48, 1};
3170 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3171 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3172 copy_region.srcSubresource.mipLevel = 0;
3173 copy_region.dstSubresource.mipLevel = 0;
3174 copy_region.srcSubresource.baseArrayLayer = 0;
3175 copy_region.dstSubresource.baseArrayLayer = 0;
3176 copy_region.srcSubresource.layerCount = 1;
3177 copy_region.dstSubresource.layerCount = 1;
3178 copy_region.srcOffset = {0, 0, 0};
3179 copy_region.dstOffset = {0, 0, 0};
3180
3181 // Src offsets must be multiples of compressed block sizes
3182 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003183 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003184 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003185 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3186 &copy_region);
3187 m_errorMonitor->VerifyFound();
3188 copy_region.srcOffset = {0, 0, 0};
3189
3190 // Dst offsets must be multiples of compressed block sizes
3191 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003192 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003193 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003194 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003195 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3196 &copy_region);
3197 m_errorMonitor->VerifyFound();
3198 copy_region.dstOffset = {0, 0, 0};
3199
3200 // Copy extent must be multiples of compressed block sizes if not full width/height
3201 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003202 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003203 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003204 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3205 &copy_region);
3206 m_errorMonitor->VerifyFound();
3207
unknown357e1782019-09-25 17:57:40 -06003208 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003209 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3210 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003211 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003212 copy_region.dstOffset = {0, 0, 0};
3213
3214 m_commandBuffer->end();
3215}
3216
3217TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3218 // Image copy tests on multiplane images with aspect errors
3219
3220 // Enable KHR multiplane req'd extensions
3221 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3222 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3223 if (mp_extensions) {
3224 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3225 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003226 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003227 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003228 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3229 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3230 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3231 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003232 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003233 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3234 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3235 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3236 } else {
3237 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3238 return;
3239 }
3240 ASSERT_NO_FATAL_FAILURE(InitState());
3241
3242 // Select multi-plane formats and verify support
3243 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3244 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3245
sfricke-samsung1c61f192021-12-31 01:53:03 -06003246 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003247 ci.flags = 0;
3248 ci.imageType = VK_IMAGE_TYPE_2D;
3249 ci.format = mp2_format;
3250 ci.extent = {256, 256, 1};
3251 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3252 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3253 ci.mipLevels = 1;
3254 ci.arrayLayers = 1;
3255 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3256 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3257 ci.queueFamilyIndexCount = 0;
3258 ci.pQueueFamilyIndices = NULL;
3259 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3260
3261 // Verify formats
3262 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3263 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3264 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3265 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3266 ci.format = mp3_format;
3267 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3268 if (!supported) {
3269 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3270 kSkipPrefix);
3271 return; // Assume there's low ROI on searching for different mp formats
3272 }
3273
3274 // Create images
3275 VkImageObj mp3_image(m_device);
3276 mp3_image.init(&ci);
3277 ASSERT_TRUE(mp3_image.initialized());
3278
3279 ci.format = mp2_format;
3280 VkImageObj mp2_image(m_device);
3281 mp2_image.init(&ci);
3282 ASSERT_TRUE(mp2_image.initialized());
3283
3284 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3285 VkImageObj sp_image(m_device);
3286 sp_image.init(&ci);
3287 ASSERT_TRUE(sp_image.initialized());
3288
3289 m_commandBuffer->begin();
3290
3291 VkImageCopy copy_region;
3292 copy_region.extent = {128, 128, 1};
3293 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3294 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3295 copy_region.srcSubresource.mipLevel = 0;
3296 copy_region.dstSubresource.mipLevel = 0;
3297 copy_region.srcSubresource.baseArrayLayer = 0;
3298 copy_region.dstSubresource.baseArrayLayer = 0;
3299 copy_region.srcSubresource.layerCount = 1;
3300 copy_region.dstSubresource.layerCount = 1;
3301 copy_region.srcOffset = {0, 0, 0};
3302 copy_region.dstOffset = {0, 0, 0};
3303
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003304 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003305 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3306 &copy_region);
3307 m_errorMonitor->VerifyFound();
3308
unknown088160a2019-05-23 17:43:13 -06003309 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3310 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003311 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003312 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3313 &copy_region);
3314 m_errorMonitor->VerifyFound();
3315
3316 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3317 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003319 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3320 &copy_region);
3321 m_errorMonitor->VerifyFound();
3322
3323 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003325 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3326 &copy_region);
3327 m_errorMonitor->VerifyFound();
3328
3329 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003331 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003332 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3333 &copy_region);
3334 m_errorMonitor->VerifyFound();
3335
3336 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3337 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003338 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003340 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3341 &copy_region);
3342 m_errorMonitor->VerifyFound();
3343
3344 m_commandBuffer->end();
3345}
3346
3347TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3348 // Image copy with source region specified greater than src image size
3349 ASSERT_NO_FATAL_FAILURE(Init());
3350
3351 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003352 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003353 ci.flags = 0;
3354 ci.imageType = VK_IMAGE_TYPE_3D;
3355 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3356 ci.extent = {32, 32, 8};
3357 ci.mipLevels = 6;
3358 ci.arrayLayers = 1;
3359 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3360 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3361 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3362 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3363 ci.queueFamilyIndexCount = 0;
3364 ci.pQueueFamilyIndices = NULL;
3365 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3366
3367 VkImageObj src_image(m_device);
3368 src_image.init(&ci);
3369 ASSERT_TRUE(src_image.initialized());
3370
3371 // Dest image with one more mip level
3372 ci.extent = {64, 64, 16};
3373 ci.mipLevels = 7;
3374 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3375 VkImageObj dst_image(m_device);
3376 dst_image.init(&ci);
3377 ASSERT_TRUE(dst_image.initialized());
3378
3379 m_commandBuffer->begin();
3380
3381 VkImageCopy copy_region;
3382 copy_region.extent = {32, 32, 8};
3383 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3384 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3385 copy_region.srcSubresource.mipLevel = 0;
3386 copy_region.dstSubresource.mipLevel = 0;
3387 copy_region.srcSubresource.baseArrayLayer = 0;
3388 copy_region.dstSubresource.baseArrayLayer = 0;
3389 copy_region.srcSubresource.layerCount = 1;
3390 copy_region.dstSubresource.layerCount = 1;
3391 copy_region.srcOffset = {0, 0, 0};
3392 copy_region.dstOffset = {0, 0, 0};
3393
3394 m_errorMonitor->ExpectSuccess();
3395 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3396 &copy_region);
3397 m_errorMonitor->VerifyNotFound();
3398
3399 // Source exceeded in x-dim, VU 01202
3400 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003401 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003402 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3403 &copy_region);
3404 m_errorMonitor->VerifyFound();
3405
3406 // Source exceeded in y-dim, VU 01203
3407 copy_region.srcOffset.x = 0;
3408 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003409 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003410 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3411 &copy_region);
3412 m_errorMonitor->VerifyFound();
3413
3414 // Source exceeded in z-dim, VU 01204
3415 copy_region.extent = {4, 4, 4};
3416 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
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 m_commandBuffer->end();
3423}
3424
3425TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3426 // Image copy with dest region specified greater than dest image size
3427 ASSERT_NO_FATAL_FAILURE(Init());
3428
3429 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003430 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003431 ci.flags = 0;
3432 ci.imageType = VK_IMAGE_TYPE_3D;
3433 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3434 ci.extent = {32, 32, 8};
3435 ci.mipLevels = 6;
3436 ci.arrayLayers = 1;
3437 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3438 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3439 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3440 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3441 ci.queueFamilyIndexCount = 0;
3442 ci.pQueueFamilyIndices = NULL;
3443 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3444
3445 VkImageObj dst_image(m_device);
3446 dst_image.init(&ci);
3447 ASSERT_TRUE(dst_image.initialized());
3448
3449 // Src image with one more mip level
3450 ci.extent = {64, 64, 16};
3451 ci.mipLevels = 7;
3452 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3453 VkImageObj src_image(m_device);
3454 src_image.init(&ci);
3455 ASSERT_TRUE(src_image.initialized());
3456
3457 m_commandBuffer->begin();
3458
3459 VkImageCopy copy_region;
3460 copy_region.extent = {32, 32, 8};
3461 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3462 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3463 copy_region.srcSubresource.mipLevel = 0;
3464 copy_region.dstSubresource.mipLevel = 0;
3465 copy_region.srcSubresource.baseArrayLayer = 0;
3466 copy_region.dstSubresource.baseArrayLayer = 0;
3467 copy_region.srcSubresource.layerCount = 1;
3468 copy_region.dstSubresource.layerCount = 1;
3469 copy_region.srcOffset = {0, 0, 0};
3470 copy_region.dstOffset = {0, 0, 0};
3471
3472 m_errorMonitor->ExpectSuccess();
3473 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3474 &copy_region);
3475 m_errorMonitor->VerifyNotFound();
3476
3477 // Dest exceeded in x-dim, VU 01205
3478 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003479 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003480 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3481 &copy_region);
3482 m_errorMonitor->VerifyFound();
3483
3484 // Dest exceeded in y-dim, VU 01206
3485 copy_region.dstOffset.x = 0;
3486 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003487 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003488 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3489 &copy_region);
3490 m_errorMonitor->VerifyFound();
3491
3492 // Dest exceeded in z-dim, VU 01207
3493 copy_region.extent = {4, 4, 4};
3494 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003495 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
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 m_commandBuffer->end();
3501}
3502
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003503TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3504 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3505
3506 // Enable KHR multiplane req'd extensions
3507 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3508 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3509 if (mp_extensions == true) {
3510 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3511 }
3512 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003513 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003514 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3515 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3516 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3517 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003518 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003519 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3520 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3521 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3522 } else {
3523 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3524 return;
3525 }
3526 ASSERT_NO_FATAL_FAILURE(InitState());
3527
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003528 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3529 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003530 VkFormatProperties props = {0, 0, 0};
3531 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003532 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003533 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3534 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3535 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3536
3537 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003538 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003539 return;
3540 }
3541
3542 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3543 VkImageObj src_image(m_device);
3544 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003545 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 -08003546 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003547 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 -08003548 ASSERT_TRUE(dst_image.initialized());
3549
3550 VkImageCopy copy_region = {};
3551 copy_region.extent = {64, 64, 1}; // Size of plane 1
3552 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3553 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3554 copy_region.srcSubresource.mipLevel = 0;
3555 copy_region.dstSubresource.mipLevel = 0;
3556 copy_region.srcSubresource.baseArrayLayer = 0;
3557 copy_region.dstSubresource.baseArrayLayer = 0;
3558 copy_region.srcSubresource.layerCount = 1;
3559 copy_region.dstSubresource.layerCount = 1;
3560 copy_region.srcOffset = {0, 0, 0};
3561 copy_region.dstOffset = {0, 0, 0};
3562 VkImageCopy original_region = copy_region;
3563
3564 m_commandBuffer->begin();
3565
3566 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3567 m_errorMonitor->ExpectSuccess();
3568 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3569 &copy_region);
3570 m_errorMonitor->VerifyNotFound();
3571
3572 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3573 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3574 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3575 m_errorMonitor->ExpectSuccess();
3576 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3577 &copy_region);
3578 m_errorMonitor->VerifyNotFound();
3579
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003580 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003581 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3582 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3583
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003584 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3585 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3586 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3587 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003588 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3589 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003590 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3591 &copy_region);
3592 m_errorMonitor->VerifyNotFound();
3593
3594 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3595 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3596 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3597 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003598 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3599 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003600 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3601 &copy_region);
3602 m_errorMonitor->VerifyNotFound();
3603
3604 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3605 copy_region.extent = {128, 64, 1};
3606 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3607 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3608 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003609 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3610 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003611 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3612 &copy_region);
3613 m_errorMonitor->VerifyNotFound();
3614
3615 // 128x64 copy from plane 0 -> Plane 1
3616 copy_region.extent = {128, 64, 1};
3617 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3618 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003619 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003620 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3621 &copy_region);
3622 m_errorMonitor->VerifyFound();
3623
3624 // 128x64 copy from plane 1 -> Plane 0
3625 copy_region.extent = {128, 64, 1};
3626 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3627 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003629 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3630 &copy_region);
3631 m_errorMonitor->VerifyFound();
3632
3633 // src exceeded in y-dim from offset
3634 copy_region = original_region;
3635 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003637 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3638 &copy_region);
3639 m_errorMonitor->VerifyFound();
3640
3641 // dst exceeded in y-dim from offset
3642 copy_region = original_region;
3643 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003644 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
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 m_commandBuffer->end();
3650}
3651
unknown088160a2019-05-23 17:43:13 -06003652TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003653 if (!EnableDeviceProfileLayer()) {
3654 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3655 return;
3656 }
unknown088160a2019-05-23 17:43:13 -06003657
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003658 // Enable KHR multiplane req'd extensions
3659 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3660 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3661 if (mp_extensions == true) {
3662 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3663 }
3664 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003665 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003666 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3667 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3668 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3669 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003670 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003671 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3672 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3673 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3674 }
3675 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003676
sfricke-samsung51067b22020-04-30 21:41:17 -07003677 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3678 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003679
sfricke-samsung51067b22020-04-30 21:41:17 -07003680 // Load required functions
3681 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3682 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3683 return;
3684 }
3685
3686 // Set transfer for all potential used formats
3687 VkFormatProperties format_props;
3688 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3689 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3690 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3691
3692 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3693 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3694 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003695
sfricke-samsung1c61f192021-12-31 01:53:03 -06003696 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003697 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003698 image_create_info.extent.width = 32;
3699 image_create_info.extent.height = 32;
3700 image_create_info.extent.depth = 1;
3701 image_create_info.mipLevels = 1;
3702 image_create_info.arrayLayers = 1;
3703 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003704 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3705 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003706 image_create_info.flags = 0;
3707
sfricke-samsung51067b22020-04-30 21:41:17 -07003708 image_create_info.format = VK_FORMAT_R8_UNORM;
3709 VkImageObj image_8b_unorm(m_device);
3710 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003711
sfricke-samsung51067b22020-04-30 21:41:17 -07003712 image_create_info.format = VK_FORMAT_R8_UINT;
3713 VkImageObj image_8b_uint(m_device);
3714 image_8b_uint.init(&image_create_info);
3715
3716 // First try to test two single plane mismatch
3717 {
3718 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3719 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3720 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3721
3722 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3723 VkImageObj image_32b_unorm(m_device);
3724 image_32b_unorm.init(&image_create_info);
3725
3726 m_commandBuffer->begin();
3727 VkImageCopy copyRegion;
3728 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3729 copyRegion.srcSubresource.mipLevel = 0;
3730 copyRegion.srcSubresource.baseArrayLayer = 0;
3731 copyRegion.srcSubresource.layerCount = 1;
3732 copyRegion.srcOffset.x = 0;
3733 copyRegion.srcOffset.y = 0;
3734 copyRegion.srcOffset.z = 0;
3735 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3736 copyRegion.dstSubresource.mipLevel = 0;
3737 copyRegion.dstSubresource.baseArrayLayer = 0;
3738 copyRegion.dstSubresource.layerCount = 1;
3739 copyRegion.dstOffset.x = 0;
3740 copyRegion.dstOffset.y = 0;
3741 copyRegion.dstOffset.z = 0;
3742 copyRegion.extent.width = 1;
3743 copyRegion.extent.height = 1;
3744 copyRegion.extent.depth = 1;
3745
3746 // Sanity check between two 8bit formats
3747 m_errorMonitor->ExpectSuccess();
3748 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3749 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3750 m_errorMonitor->VerifyNotFound();
3751
3752 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3754 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3755 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3756 m_errorMonitor->VerifyFound();
3757
3758 // Swap src and dst
3759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3760 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3761 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3762 m_errorMonitor->VerifyFound();
3763
3764 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003765 }
3766
sfricke-samsung51067b22020-04-30 21:41:17 -07003767 // DstImage is a mismatched plane of a multi-planar format
3768 if (mp_extensions == false) {
3769 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3770 } else {
3771 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3772 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3773 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003774
sfricke-samsung51067b22020-04-30 21:41:17 -07003775 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3776 VkImageObj image_8b_16b_420_unorm(m_device);
3777 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003778
sfricke-samsung51067b22020-04-30 21:41:17 -07003779 m_commandBuffer->begin();
3780 VkImageCopy copyRegion;
3781 copyRegion.srcSubresource.mipLevel = 0;
3782 copyRegion.srcSubresource.baseArrayLayer = 0;
3783 copyRegion.srcSubresource.layerCount = 1;
3784 copyRegion.srcOffset.x = 0;
3785 copyRegion.srcOffset.y = 0;
3786 copyRegion.srcOffset.z = 0;
3787 copyRegion.dstSubresource.mipLevel = 0;
3788 copyRegion.dstSubresource.baseArrayLayer = 0;
3789 copyRegion.dstSubresource.layerCount = 1;
3790 copyRegion.dstOffset.x = 0;
3791 copyRegion.dstOffset.y = 0;
3792 copyRegion.dstOffset.z = 0;
3793 copyRegion.extent.width = 1;
3794 copyRegion.extent.height = 1;
3795 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003796
sfricke-samsung51067b22020-04-30 21:41:17 -07003797 // First test single-plane -> multi-plan
3798 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3799 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003800
sfricke-samsung51067b22020-04-30 21:41:17 -07003801 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3802 m_errorMonitor->ExpectSuccess();
3803 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3804 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3805 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003806
locke-lunargdf00db02020-03-04 19:00:57 -07003807 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3808 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3809
sfricke-samsung51067b22020-04-30 21:41:17 -07003810 // Make sure no false postiives if Compatible format
3811 m_errorMonitor->ExpectSuccess();
3812 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3813 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3814 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003815
sfricke-samsung51067b22020-04-30 21:41:17 -07003816 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3817 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
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->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003822
sfricke-samsung51067b22020-04-30 21:41:17 -07003823 // Same tests but swap src and dst
3824 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3825 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003826
locke-lunargdf00db02020-03-04 19:00:57 -07003827 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3828 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3829 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3830 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3831
sfricke-samsung51067b22020-04-30 21:41:17 -07003832 m_errorMonitor->ExpectSuccess();
3833 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3834 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3835 m_errorMonitor->VerifyNotFound();
3836
locke-lunargdf00db02020-03-04 19:00:57 -07003837 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3838 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3839
sfricke-samsung51067b22020-04-30 21:41:17 -07003840 m_errorMonitor->ExpectSuccess();
3841 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3842 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3843 m_errorMonitor->VerifyNotFound();
3844
3845 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3847 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3848 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3849 m_errorMonitor->VerifyFound();
3850
3851 m_commandBuffer->end();
3852 }
unknown088160a2019-05-23 17:43:13 -06003853}
3854
3855TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3856 ASSERT_NO_FATAL_FAILURE(Init());
3857 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3858 if (!depth_format) {
3859 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3860 return;
3861 }
3862
3863 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003864 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003865 if (properties.optimalTilingFeatures == 0) {
3866 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3867 return;
3868 }
3869
3870 VkImageObj srcImage(m_device);
3871 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3872 ASSERT_TRUE(srcImage.initialized());
3873 VkImageObj dstImage(m_device);
3874 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3875 ASSERT_TRUE(dstImage.initialized());
3876
3877 // Create two images of different types and try to copy between them
3878
3879 m_commandBuffer->begin();
3880 VkImageCopy copyRegion;
3881 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3882 copyRegion.srcSubresource.mipLevel = 0;
3883 copyRegion.srcSubresource.baseArrayLayer = 0;
3884 copyRegion.srcSubresource.layerCount = 1;
3885 copyRegion.srcOffset.x = 0;
3886 copyRegion.srcOffset.y = 0;
3887 copyRegion.srcOffset.z = 0;
3888 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3889 copyRegion.dstSubresource.mipLevel = 0;
3890 copyRegion.dstSubresource.baseArrayLayer = 0;
3891 copyRegion.dstSubresource.layerCount = 1;
3892 copyRegion.dstOffset.x = 0;
3893 copyRegion.dstOffset.y = 0;
3894 copyRegion.dstOffset.z = 0;
3895 copyRegion.extent.width = 1;
3896 copyRegion.extent.height = 1;
3897 copyRegion.extent.depth = 1;
3898
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003900 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3901 &copyRegion);
3902 m_commandBuffer->end();
3903
3904 m_errorMonitor->VerifyFound();
3905}
3906
3907TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3908 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3909
3910 ASSERT_NO_FATAL_FAILURE(Init());
3911
3912 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003913 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3914 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3915 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003916
3917 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3918 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3919 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3920 return;
3921 }
3922
sfricke-samsung1c61f192021-12-31 01:53:03 -06003923 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003924 ci.flags = 0;
3925 ci.imageType = VK_IMAGE_TYPE_2D;
3926 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3927 ci.extent = {128, 128, 1};
3928 ci.mipLevels = 1;
3929 ci.arrayLayers = 1;
3930 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3931 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3932 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3933 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3934 ci.queueFamilyIndexCount = 0;
3935 ci.pQueueFamilyIndices = NULL;
3936 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3937
3938 VkImageObj image1(m_device);
3939 image1.init(&ci);
3940 ASSERT_TRUE(image1.initialized());
3941
3942 ci.samples = VK_SAMPLE_COUNT_2_BIT;
3943 VkImageObj image2(m_device);
3944 image2.init(&ci);
3945 ASSERT_TRUE(image2.initialized());
3946
3947 ci.samples = VK_SAMPLE_COUNT_4_BIT;
3948 VkImageObj image4(m_device);
3949 image4.init(&ci);
3950 ASSERT_TRUE(image4.initialized());
3951
3952 m_commandBuffer->begin();
3953
3954 VkImageCopy copyRegion;
3955 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3956 copyRegion.srcSubresource.mipLevel = 0;
3957 copyRegion.srcSubresource.baseArrayLayer = 0;
3958 copyRegion.srcSubresource.layerCount = 1;
3959 copyRegion.srcOffset = {0, 0, 0};
3960 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3961 copyRegion.dstSubresource.mipLevel = 0;
3962 copyRegion.dstSubresource.baseArrayLayer = 0;
3963 copyRegion.dstSubresource.layerCount = 1;
3964 copyRegion.dstOffset = {0, 0, 0};
3965 copyRegion.extent = {128, 128, 1};
3966
3967 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07003968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003969 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3970 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003971 m_errorMonitor->VerifyFound();
3972
Mark Lobodzinski20310782020-02-28 14:25:17 -07003973 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003974 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
3975 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003976 m_errorMonitor->VerifyFound();
3977
3978 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07003979 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003980 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3981 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003982 m_errorMonitor->VerifyFound();
3983
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(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
3986 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003987 m_errorMonitor->VerifyFound();
3988
3989 m_commandBuffer->end();
3990}
3991
3992TEST_F(VkLayerTest, CopyImageAspectMismatch) {
3993 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003994
3995 if (!EnableDeviceProfileLayer()) {
3996 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3997 return;
3998 }
3999
4000 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4001 if (mp_extensions) {
4002 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4003 }
4004
4005 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004006 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004007 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4008 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4009 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4010 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004011 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004012 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4013 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4014 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4015 }
4016 ASSERT_NO_FATAL_FAILURE(InitState());
4017
4018 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4019 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4020
4021 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4022 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4023 return;
4024 }
4025
unknown088160a2019-05-23 17:43:13 -06004026 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4027 if (!ds_format) {
4028 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4029 return;
4030 }
4031
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004032 // Add Transfer support for all used formats
4033 VkFormatProperties formatProps;
4034 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4035 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4036 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4037 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4038 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4039 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4040 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4041 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4042 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4043
unknown088160a2019-05-23 17:43:13 -06004044 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4045 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4046 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4047 VK_IMAGE_TILING_OPTIMAL, 0);
4048 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4049 VK_IMAGE_TILING_OPTIMAL, 0);
4050 ASSERT_TRUE(color_image.initialized());
4051 ASSERT_TRUE(depth_image.initialized());
4052 ASSERT_TRUE(ds_image.initialized());
4053
4054 VkImageCopy copyRegion;
4055 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4056 copyRegion.srcSubresource.mipLevel = 0;
4057 copyRegion.srcSubresource.baseArrayLayer = 0;
4058 copyRegion.srcSubresource.layerCount = 1;
4059 copyRegion.srcOffset = {0, 0, 0};
4060 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4061 copyRegion.dstSubresource.mipLevel = 0;
4062 copyRegion.dstSubresource.baseArrayLayer = 0;
4063 copyRegion.dstSubresource.layerCount = 1;
4064 copyRegion.dstOffset = {64, 0, 0};
4065 copyRegion.extent = {64, 128, 1};
4066
4067 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004069 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004070 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4071 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004072 m_errorMonitor->VerifyFound();
4073
4074 m_commandBuffer->begin();
4075
4076 // Src and dest aspect masks don't match
4077 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004078 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004080 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4081 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004082 m_errorMonitor->VerifyFound();
4083 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4084
4085 // Illegal combinations of aspect bits
4086 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4087 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004088 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004089 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004091 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004092 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4093 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004094 m_errorMonitor->VerifyFound();
4095 // same test for dstSubresource
4096 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4097 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004098 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004099 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004102 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4103 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004104 m_errorMonitor->VerifyFound();
4105
4106 // Metadata aspect is illegal
4107 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4108 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004110 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004111 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004112 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4113 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004114 m_errorMonitor->VerifyFound();
4115 // same test for dstSubresource
4116 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4117 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004118 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004119 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004120 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004121 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4122 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004123 m_errorMonitor->VerifyFound();
4124
sfricke-samsung6141db32020-10-26 03:31:38 -07004125 // Aspect Memory Plane mask is illegal
4126 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4127 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4128 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4129 // These aspect/format mismatches are redundant but unavoidable here
4130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4131 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4132 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4133 m_errorMonitor->VerifyFound();
4134
unknown088160a2019-05-23 17:43:13 -06004135 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4136 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004137 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004138
4139 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004140 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004141 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004143 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4144 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004145 m_errorMonitor->VerifyFound();
4146
4147 // Aspect mask doesn't match dest image format
4148 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4149 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004151 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004152 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004153 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4154 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004155 m_errorMonitor->VerifyFound();
4156
aitor-lunarg54c295b2022-01-28 17:02:32 +01004157 // Check no performance warnings regarding layout are thrown when copying from and to the same image
4158 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4159 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4160 m_errorMonitor->ExpectSuccess(kPerformanceWarningBit);
4161 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4162 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4163 m_errorMonitor->VerifyNotFound();
4164
unknown088160a2019-05-23 17:43:13 -06004165 m_commandBuffer->end();
4166}
4167
4168TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004169 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004170
4171 ASSERT_NO_FATAL_FAILURE(Init());
4172
4173 // Create two images of sample count 1 and try to Resolve between them
4174
sfricke-samsung1c61f192021-12-31 01:53:03 -06004175 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004176 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4177 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4178 image_create_info.extent.width = 32;
4179 image_create_info.extent.height = 1;
4180 image_create_info.extent.depth = 1;
4181 image_create_info.mipLevels = 1;
4182 image_create_info.arrayLayers = 1;
4183 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4184 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4185 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4186 image_create_info.flags = 0;
4187
4188 VkImageObj srcImage(m_device);
4189 srcImage.init(&image_create_info);
4190 ASSERT_TRUE(srcImage.initialized());
4191
4192 VkImageObj dstImage(m_device);
4193 dstImage.init(&image_create_info);
4194 ASSERT_TRUE(dstImage.initialized());
4195
4196 m_commandBuffer->begin();
4197 VkImageResolve resolveRegion;
4198 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4199 resolveRegion.srcSubresource.mipLevel = 0;
4200 resolveRegion.srcSubresource.baseArrayLayer = 0;
4201 resolveRegion.srcSubresource.layerCount = 1;
4202 resolveRegion.srcOffset.x = 0;
4203 resolveRegion.srcOffset.y = 0;
4204 resolveRegion.srcOffset.z = 0;
4205 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4206 resolveRegion.dstSubresource.mipLevel = 0;
4207 resolveRegion.dstSubresource.baseArrayLayer = 0;
4208 resolveRegion.dstSubresource.layerCount = 1;
4209 resolveRegion.dstOffset.x = 0;
4210 resolveRegion.dstOffset.y = 0;
4211 resolveRegion.dstOffset.z = 0;
4212 resolveRegion.extent.width = 1;
4213 resolveRegion.extent.height = 1;
4214 resolveRegion.extent.depth = 1;
4215 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4216 &resolveRegion);
4217 m_commandBuffer->end();
4218
4219 m_errorMonitor->VerifyFound();
4220}
4221
4222TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004223 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004224
4225 ASSERT_NO_FATAL_FAILURE(Init());
4226
4227 // Create two images of sample count 4 and try to Resolve between them
4228
sfricke-samsung1c61f192021-12-31 01:53:03 -06004229 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004230 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4231 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4232 image_create_info.extent.width = 32;
4233 image_create_info.extent.height = 1;
4234 image_create_info.extent.depth = 1;
4235 image_create_info.mipLevels = 1;
4236 image_create_info.arrayLayers = 1;
4237 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4238 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4239 // Note: Some implementations expect color attachment usage for any
4240 // multisample surface
4241 image_create_info.usage =
4242 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4243 image_create_info.flags = 0;
4244
4245 VkImageObj srcImage(m_device);
4246 srcImage.init(&image_create_info);
4247 ASSERT_TRUE(srcImage.initialized());
4248
4249 VkImageObj dstImage(m_device);
4250 dstImage.init(&image_create_info);
4251 ASSERT_TRUE(dstImage.initialized());
4252
4253 m_commandBuffer->begin();
4254 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4255 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4256 // VK_IMAGE_LAYOUT_GENERAL = 1,
4257 VkImageResolve resolveRegion;
4258 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4259 resolveRegion.srcSubresource.mipLevel = 0;
4260 resolveRegion.srcSubresource.baseArrayLayer = 0;
4261 resolveRegion.srcSubresource.layerCount = 1;
4262 resolveRegion.srcOffset.x = 0;
4263 resolveRegion.srcOffset.y = 0;
4264 resolveRegion.srcOffset.z = 0;
4265 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4266 resolveRegion.dstSubresource.mipLevel = 0;
4267 resolveRegion.dstSubresource.baseArrayLayer = 0;
4268 resolveRegion.dstSubresource.layerCount = 1;
4269 resolveRegion.dstOffset.x = 0;
4270 resolveRegion.dstOffset.y = 0;
4271 resolveRegion.dstOffset.z = 0;
4272 resolveRegion.extent.width = 1;
4273 resolveRegion.extent.height = 1;
4274 resolveRegion.extent.depth = 1;
4275 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4276 &resolveRegion);
4277 m_commandBuffer->end();
4278
4279 m_errorMonitor->VerifyFound();
4280}
4281
4282TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004284
4285 ASSERT_NO_FATAL_FAILURE(Init());
4286
4287 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004288 VkImageObj srcImage(m_device);
4289 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004290
sfricke-samsung1c61f192021-12-31 01:53:03 -06004291 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004292 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4293 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4294 image_create_info.extent.width = 32;
4295 image_create_info.extent.height = 1;
4296 image_create_info.extent.depth = 1;
4297 image_create_info.mipLevels = 1;
4298 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004299 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004300 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4301 // Note: Some implementations expect color attachment usage for any
4302 // multisample surface
4303 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4304 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004305 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004306
4307 // Set format to something other than source image
4308 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4309 // Note: Some implementations expect color attachment usage for any
4310 // multisample surface
4311 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4312 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004313 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004314
4315 m_commandBuffer->begin();
4316 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4317 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4318 // VK_IMAGE_LAYOUT_GENERAL = 1,
4319 VkImageResolve resolveRegion;
4320 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4321 resolveRegion.srcSubresource.mipLevel = 0;
4322 resolveRegion.srcSubresource.baseArrayLayer = 0;
4323 resolveRegion.srcSubresource.layerCount = 1;
4324 resolveRegion.srcOffset.x = 0;
4325 resolveRegion.srcOffset.y = 0;
4326 resolveRegion.srcOffset.z = 0;
4327 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4328 resolveRegion.dstSubresource.mipLevel = 0;
4329 resolveRegion.dstSubresource.baseArrayLayer = 0;
4330 resolveRegion.dstSubresource.layerCount = 1;
4331 resolveRegion.dstOffset.x = 0;
4332 resolveRegion.dstOffset.y = 0;
4333 resolveRegion.dstOffset.z = 0;
4334 resolveRegion.extent.width = 1;
4335 resolveRegion.extent.height = 1;
4336 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004337 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4338 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004339 m_commandBuffer->end();
4340
4341 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004342}
4343
4344TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004345 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004346
4347 ASSERT_NO_FATAL_FAILURE(Init());
4348
4349 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004350 VkImageObj srcImage(m_device);
4351 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004352
sfricke-samsung1c61f192021-12-31 01:53:03 -06004353 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004354 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4355 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4356 image_create_info.extent.width = 32;
4357 image_create_info.extent.height = 1;
4358 image_create_info.extent.depth = 1;
4359 image_create_info.mipLevels = 1;
4360 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004361 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004362 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4363 // Note: Some implementations expect color attachment usage for any
4364 // multisample surface
4365 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4366 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004367 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004368
4369 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4370 // Note: Some implementations expect color attachment usage for any
4371 // multisample surface
4372 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004374 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004375
4376 m_commandBuffer->begin();
4377 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4378 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4379 // VK_IMAGE_LAYOUT_GENERAL = 1,
4380 VkImageResolve resolveRegion;
4381 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4382 resolveRegion.srcSubresource.mipLevel = 0;
4383 resolveRegion.srcSubresource.baseArrayLayer = 0;
4384 resolveRegion.srcSubresource.layerCount = 1;
4385 resolveRegion.srcOffset.x = 0;
4386 resolveRegion.srcOffset.y = 0;
4387 resolveRegion.srcOffset.z = 0;
4388 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4389 resolveRegion.dstSubresource.mipLevel = 0;
4390 resolveRegion.dstSubresource.baseArrayLayer = 0;
4391 resolveRegion.dstSubresource.layerCount = 1;
4392 resolveRegion.dstOffset.x = 0;
4393 resolveRegion.dstOffset.y = 0;
4394 resolveRegion.dstOffset.z = 0;
4395 resolveRegion.extent.width = 1;
4396 resolveRegion.extent.height = 1;
4397 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004398 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4399 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004400 m_commandBuffer->end();
4401
4402 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004403}
4404
4405TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4406 ASSERT_NO_FATAL_FAILURE(Init());
4407
4408 // Create two images of different types and try to copy between them
4409 VkImageObj srcImage(m_device);
4410 VkImageObj dstImage(m_device);
4411
sfricke-samsung1c61f192021-12-31 01:53:03 -06004412 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4414 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4415 image_create_info.extent.width = 32;
4416 image_create_info.extent.height = 32;
4417 image_create_info.extent.depth = 1;
4418 image_create_info.mipLevels = 1;
4419 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004420 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004421 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4422 image_create_info.usage =
4423 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4424 // Note: Some implementations expect color attachment usage for any
4425 // multisample surface
4426 image_create_info.flags = 0;
4427 srcImage.init(&image_create_info);
4428 ASSERT_TRUE(srcImage.initialized());
4429
4430 // Note: Some implementations expect color attachment usage for any
4431 // multisample surface
4432 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4433 dstImage.init(&image_create_info);
4434 ASSERT_TRUE(dstImage.initialized());
4435
4436 m_commandBuffer->begin();
4437 // source image must have valid contents before resolve
4438 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4439 VkImageSubresourceRange subresource = {};
4440 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4441 subresource.layerCount = 1;
4442 subresource.levelCount = 1;
4443 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4444 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4445 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4446 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4447
4448 VkImageResolve resolveRegion;
4449 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4450 resolveRegion.srcSubresource.mipLevel = 0;
4451 resolveRegion.srcSubresource.baseArrayLayer = 0;
4452 resolveRegion.srcSubresource.layerCount = 1;
4453 resolveRegion.srcOffset.x = 0;
4454 resolveRegion.srcOffset.y = 0;
4455 resolveRegion.srcOffset.z = 0;
4456 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4457 resolveRegion.dstSubresource.mipLevel = 0;
4458 resolveRegion.dstSubresource.baseArrayLayer = 0;
4459 resolveRegion.dstSubresource.layerCount = 1;
4460 resolveRegion.dstOffset.x = 0;
4461 resolveRegion.dstOffset.y = 0;
4462 resolveRegion.dstOffset.z = 0;
4463 resolveRegion.extent.width = 1;
4464 resolveRegion.extent.height = 1;
4465 resolveRegion.extent.depth = 1;
4466 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004467 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004468 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4469 1, &resolveRegion);
4470 m_errorMonitor->VerifyFound();
4471 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004472 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004473 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4474 1, &resolveRegion);
4475 m_errorMonitor->VerifyFound();
4476 m_commandBuffer->end();
4477}
4478
4479TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004480 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4481
4482 bool copy_commands2 = false;
4483 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4484 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4485 copy_commands2 = true;
4486 }
4487 ASSERT_NO_FATAL_FAILURE(InitState());
4488
4489 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4490 if (copy_commands2) {
4491 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4492 }
unknown088160a2019-05-23 17:43:13 -06004493
4494 // Create two images of different types and try to copy between them
4495 VkImageObj srcImage(m_device);
4496 VkImageObj dstImage(m_device);
4497
sfricke-samsung1c61f192021-12-31 01:53:03 -06004498 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004499 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4500 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4501 image_create_info.extent.width = 32;
4502 image_create_info.extent.height = 32;
4503 image_create_info.extent.depth = 1;
4504 image_create_info.mipLevels = 1;
4505 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004506 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004507 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4508 image_create_info.usage =
4509 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4510 // Note: Some implementations expect color attachment usage for any
4511 // multisample surface
4512 image_create_info.flags = 0;
4513 srcImage.init(&image_create_info);
4514 ASSERT_TRUE(srcImage.initialized());
4515
4516 // Note: Some implementations expect color attachment usage for any
4517 // multisample surface
4518 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4519 dstImage.init(&image_create_info);
4520 ASSERT_TRUE(dstImage.initialized());
4521
4522 m_commandBuffer->begin();
4523 // source image must have valid contents before resolve
4524 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4525 VkImageSubresourceRange subresource = {};
4526 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4527 subresource.layerCount = 1;
4528 subresource.levelCount = 1;
4529 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4530 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4531 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4532 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4533
4534 VkImageResolve resolveRegion;
4535 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4536 resolveRegion.srcSubresource.mipLevel = 0;
4537 resolveRegion.srcSubresource.baseArrayLayer = 0;
4538 resolveRegion.srcSubresource.layerCount = 1;
4539 resolveRegion.srcOffset.x = 0;
4540 resolveRegion.srcOffset.y = 0;
4541 resolveRegion.srcOffset.z = 0;
4542 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4543 resolveRegion.dstSubresource.mipLevel = 0;
4544 resolveRegion.dstSubresource.baseArrayLayer = 0;
4545 resolveRegion.dstSubresource.layerCount = 1;
4546 resolveRegion.dstOffset.x = 0;
4547 resolveRegion.dstOffset.y = 0;
4548 resolveRegion.dstOffset.z = 0;
4549 resolveRegion.extent.width = 1;
4550 resolveRegion.extent.height = 1;
4551 resolveRegion.extent.depth = 1;
4552 // invalid source mip level
4553 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004554 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004555 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4556 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4557 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004558
4559 // Equivalent test using KHR_copy_commands2
4560 if (copy_commands2 && vkCmdResolveImage2Function) {
4561 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4562 NULL,
4563 resolveRegion.srcSubresource,
4564 resolveRegion.srcOffset,
4565 resolveRegion.dstSubresource,
4566 resolveRegion.dstOffset,
4567 resolveRegion.extent};
4568 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4569 NULL,
4570 srcImage.image(),
4571 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4572 dstImage.image(),
4573 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4574 1,
4575 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004576 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01709");
Jeff Leger465acf52020-10-12 18:07:16 -04004577 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4578 m_errorMonitor->VerifyFound();
4579 }
4580
unknown088160a2019-05-23 17:43:13 -06004581 resolveRegion.srcSubresource.mipLevel = 0;
4582 // invalid dest mip level
4583 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004584 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004585 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4586 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4587 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004588
4589 // Equivalent test using KHR_copy_commands2
4590 if (copy_commands2 && vkCmdResolveImage2Function) {
4591 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4592 NULL,
4593 resolveRegion.srcSubresource,
4594 resolveRegion.srcOffset,
4595 resolveRegion.dstSubresource,
4596 resolveRegion.dstOffset,
4597 resolveRegion.extent};
4598 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4599 NULL,
4600 srcImage.image(),
4601 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4602 dstImage.image(),
4603 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4604 1,
4605 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004606 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01710");
Jeff Leger465acf52020-10-12 18:07:16 -04004607 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4608 m_errorMonitor->VerifyFound();
4609 }
4610
unknown088160a2019-05-23 17:43:13 -06004611 resolveRegion.dstSubresource.mipLevel = 0;
4612 // invalid source array layer range
4613 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004614 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004615 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4616 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4617 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004618
4619 // Equivalent test using KHR_copy_commands2
4620 if (copy_commands2 && vkCmdResolveImage2Function) {
4621 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4622 NULL,
4623 resolveRegion.srcSubresource,
4624 resolveRegion.srcOffset,
4625 resolveRegion.dstSubresource,
4626 resolveRegion.dstOffset,
4627 resolveRegion.extent};
4628 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4629 NULL,
4630 srcImage.image(),
4631 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4632 dstImage.image(),
4633 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4634 1,
4635 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01711");
Jeff Leger465acf52020-10-12 18:07:16 -04004637 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4638 m_errorMonitor->VerifyFound();
4639 }
4640
unknown088160a2019-05-23 17:43:13 -06004641 resolveRegion.srcSubresource.baseArrayLayer = 0;
4642 // invalid dest array layer range
4643 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004644 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004645 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4646 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4647 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004648
4649 // Equivalent test using KHR_copy_commands2
4650 if (copy_commands2 && vkCmdResolveImage2Function) {
4651 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4652 NULL,
4653 resolveRegion.srcSubresource,
4654 resolveRegion.srcOffset,
4655 resolveRegion.dstSubresource,
4656 resolveRegion.dstOffset,
4657 resolveRegion.extent};
4658 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4659 NULL,
4660 srcImage.image(),
4661 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4662 dstImage.image(),
4663 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4664 1,
4665 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01712");
Jeff Leger465acf52020-10-12 18:07:16 -04004667 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4668 m_errorMonitor->VerifyFound();
4669 }
4670
unknown088160a2019-05-23 17:43:13 -06004671 resolveRegion.dstSubresource.baseArrayLayer = 0;
4672
4673 m_commandBuffer->end();
4674}
4675
sfricke-samsungf78d0592020-06-11 21:34:44 -07004676TEST_F(VkLayerTest, ResolveImageImageType) {
4677 ASSERT_NO_FATAL_FAILURE(Init());
4678 // Create images of different types and try to resolve between them
4679 VkImageObj srcImage2D(m_device);
4680 VkImageObj dstImage1D(m_device);
4681 VkImageObj dstImage3D(m_device);
4682
sfricke-samsung1c61f192021-12-31 01:53:03 -06004683 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungf78d0592020-06-11 21:34:44 -07004684 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4685 image_create_info.extent.width = 32;
4686 image_create_info.extent.height = 1;
4687 image_create_info.extent.depth = 1;
4688 image_create_info.mipLevels = 1;
4689 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004690 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004691 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4692 image_create_info.usage =
4693 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4694 // Note: Some implementations expect color attachment usage for any
4695 // multisample surface
4696 image_create_info.flags = 0;
4697
4698 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4699 srcImage2D.init(&image_create_info);
4700 ASSERT_TRUE(srcImage2D.initialized());
4701
4702 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4703 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4704 dstImage1D.init(&image_create_info);
4705 ASSERT_TRUE(dstImage1D.initialized());
4706
4707 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4708 image_create_info.extent.height = 16;
4709 image_create_info.extent.depth = 16;
4710 image_create_info.arrayLayers = 1;
4711 dstImage3D.init(&image_create_info);
4712 ASSERT_TRUE(dstImage3D.initialized());
4713
4714 m_commandBuffer->begin();
4715
4716 VkImageResolve resolveRegion;
4717 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4718 resolveRegion.srcSubresource.mipLevel = 0;
4719 resolveRegion.srcSubresource.baseArrayLayer = 0;
4720 resolveRegion.srcSubresource.layerCount = 1;
4721 resolveRegion.srcOffset.x = 0;
4722 resolveRegion.srcOffset.y = 0;
4723 resolveRegion.srcOffset.z = 0;
4724 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4725 resolveRegion.dstSubresource.mipLevel = 0;
4726 resolveRegion.dstSubresource.baseArrayLayer = 0;
4727 resolveRegion.dstSubresource.layerCount = 1;
4728 resolveRegion.dstOffset.x = 0;
4729 resolveRegion.dstOffset.y = 0;
4730 resolveRegion.dstOffset.z = 0;
4731 resolveRegion.extent.width = 1;
4732 resolveRegion.extent.height = 1;
4733 resolveRegion.extent.depth = 1;
4734
4735 // non-zero value baseArrayLayer
4736 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004738 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4739 &resolveRegion);
4740 m_errorMonitor->VerifyFound();
4741 resolveRegion.srcSubresource.baseArrayLayer = 0;
4742
4743 // Set height with 1D dstImage
4744 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004746 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004749 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4750 &resolveRegion);
4751 m_errorMonitor->VerifyFound();
4752 resolveRegion.extent.height = 1;
4753
4754 // Set depth with 1D dstImage and 2D srcImage
4755 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004756 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4757 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004758 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4759 &resolveRegion);
4760 m_errorMonitor->VerifyFound();
4761 resolveRegion.extent.depth = 1;
4762
4763 m_commandBuffer->end();
4764}
4765
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004766TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4767 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4768 ASSERT_NO_FATAL_FAILURE(Init());
4769
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004770 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004771 VkImageObj srcImage2D(m_device);
4772 VkImageObj dstImage2D(m_device);
4773
sfricke-samsung1c61f192021-12-31 01:53:03 -06004774 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004775 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4776 image_create_info.extent.width = 32;
4777 image_create_info.extent.height = 32;
4778 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004779 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004780 image_create_info.arrayLayers = 1;
4781 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4782 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4783 image_create_info.usage =
4784 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4785 // Note: Some implementations expect color attachment usage for any
4786 // multisample surface
4787 image_create_info.flags = 0;
4788
4789 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4790 srcImage2D.init(&image_create_info);
4791 ASSERT_TRUE(srcImage2D.initialized());
4792
4793 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4794 dstImage2D.init(&image_create_info);
4795 ASSERT_TRUE(dstImage2D.initialized());
4796
4797 m_commandBuffer->begin();
4798
4799 VkImageResolve resolveRegion = {};
4800 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4801 resolveRegion.srcSubresource.mipLevel = 0;
4802 resolveRegion.srcSubresource.baseArrayLayer = 0;
4803 resolveRegion.srcSubresource.layerCount = 1;
4804 resolveRegion.srcOffset.x = 0;
4805 resolveRegion.srcOffset.y = 0;
4806 resolveRegion.srcOffset.z = 0;
4807 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4808 resolveRegion.dstSubresource.mipLevel = 0;
4809 resolveRegion.dstSubresource.baseArrayLayer = 0;
4810 resolveRegion.dstSubresource.layerCount = 1;
4811 resolveRegion.dstOffset.x = 0;
4812 resolveRegion.dstOffset.y = 0;
4813 resolveRegion.dstOffset.z = 0;
4814 resolveRegion.extent.width = 32;
4815 resolveRegion.extent.height = 32;
4816 resolveRegion.extent.depth = 1;
4817
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004818 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4819 &resolveRegion);
4820 m_errorMonitor->VerifyNotFound();
4821
4822 // srcImage exceeded in x-dim
4823 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004825 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4826 &resolveRegion);
4827 m_errorMonitor->VerifyFound();
4828 resolveRegion.srcOffset.x = 0;
4829
4830 // dstImage exceeded in x-dim
4831 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004833 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4834 &resolveRegion);
4835 m_errorMonitor->VerifyFound();
4836 resolveRegion.dstOffset.x = 0;
4837
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004838 // both image exceeded in y-dim
4839 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004840 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
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();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004844 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004845
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004846 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004848 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4849 &resolveRegion);
4850 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004851 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004852
4853 // srcImage exceeded in z-dim
4854 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
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();
4860 resolveRegion.srcOffset.z = 0;
4861
4862 // dstImage exceeded in z-dim
4863 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004864 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004866 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4867 &resolveRegion);
4868 m_errorMonitor->VerifyFound();
4869 resolveRegion.dstOffset.z = 0;
4870
4871 m_commandBuffer->end();
4872}
4873
unknown088160a2019-05-23 17:43:13 -06004874TEST_F(VkLayerTest, ClearImageErrors) {
4875 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4876
4877 ASSERT_NO_FATAL_FAILURE(Init());
4878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4879
4880 m_commandBuffer->begin();
4881
4882 // Color image
4883 VkClearColorValue clear_color;
4884 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4885 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4886 const int32_t img_width = 32;
4887 const int32_t img_height = 32;
sfricke-samsung1c61f192021-12-31 01:53:03 -06004888 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004889 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4890 image_create_info.format = color_format;
4891 image_create_info.extent.width = img_width;
4892 image_create_info.extent.height = img_height;
4893 image_create_info.extent.depth = 1;
4894 image_create_info.mipLevels = 1;
4895 image_create_info.arrayLayers = 1;
4896 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4897 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4898
4899 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4900 vk_testing::Image color_image_no_transfer;
4901 color_image_no_transfer.init(*m_device, image_create_info);
4902
4903 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4904 vk_testing::Image color_image;
4905 color_image.init(*m_device, image_create_info);
4906
4907 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4908
4909 // Depth/Stencil image
4910 VkClearDepthStencilValue clear_value = {0};
4911 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4912 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4913 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4914 ds_image_create_info.extent.width = 64;
4915 ds_image_create_info.extent.height = 64;
4916 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4917 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4918
4919 vk_testing::Image ds_image;
4920 ds_image.init(*m_device, ds_image_create_info);
4921
4922 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4923
sfricke-samsungcd924d92020-05-20 23:51:17 -07004924 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06004925
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004926 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06004927
4928 m_errorMonitor->VerifyFound();
4929
sfricke-samsungcd924d92020-05-20 23:51:17 -07004930 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06004931
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004932 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
4933 &color_range);
unknown088160a2019-05-23 17:43:13 -06004934
4935 m_errorMonitor->VerifyFound();
4936
4937 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07004938 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07004939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06004940
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004941 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4942 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06004943
4944 m_errorMonitor->VerifyFound();
4945}
4946
4947TEST_F(VkLayerTest, CommandQueueFlags) {
4948 TEST_DESCRIPTION(
4949 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
4950
4951 ASSERT_NO_FATAL_FAILURE(Init());
4952
4953 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4954 if (queueFamilyIndex == UINT32_MAX) {
4955 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4956 return;
4957 } else {
4958 // Create command pool on a non-graphics queue
4959 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4960
4961 // Setup command buffer on pool
4962 VkCommandBufferObj command_buffer(m_device, &command_pool);
4963 command_buffer.begin();
4964
4965 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07004966 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06004967 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4968 command_buffer.SetViewport(0, 1, &viewport);
4969 m_errorMonitor->VerifyFound();
4970 }
4971}
4972
sfricke-samsung674ba102020-08-18 22:38:49 -07004973TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
4974 TEST_DESCRIPTION(
4975 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
4976 "buffer");
4977
4978 ASSERT_NO_FATAL_FAILURE(Init());
4979
4980 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4981 if (queueFamilyIndex == UINT32_MAX) {
4982 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4983 return;
4984 } else {
4985 // Create Depth image
4986 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
4987 if (ds_format == VK_FORMAT_UNDEFINED) {
4988 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
4989 return;
4990 }
4991
4992 VkImageObj ds_image(m_device);
4993 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
4994 VK_IMAGE_TILING_OPTIMAL, 0);
4995 ASSERT_TRUE(ds_image.initialized());
4996
4997 // Allocate buffers
4998 VkBufferObj buffer;
4999 VkMemoryPropertyFlags reqs = 0;
5000 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5001
5002 VkBufferImageCopy region = {};
5003 region.bufferRowLength = 0;
5004 region.bufferImageHeight = 0;
5005 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5006 region.imageSubresource.layerCount = 1;
5007 region.imageOffset = {0, 0, 0};
5008 region.imageExtent = {64, 64, 1};
5009 region.bufferOffset = 0;
5010
5011 // Create command pool on a non-graphics queue
5012 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5013
5014 // Setup command buffer on pool
5015 VkCommandBufferObj command_buffer(m_device, &command_pool);
5016 command_buffer.begin();
5017
sfricke-samsungea4fd142020-10-17 23:51:59 -07005018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005019 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5020 1, &region);
5021 m_errorMonitor->VerifyFound();
5022 }
5023}
5024
sfricke-samsung5a019492021-01-25 10:32:08 -08005025TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5026 TEST_DESCRIPTION(
5027 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5028 "buffer");
5029
5030 ASSERT_NO_FATAL_FAILURE(Init());
5031
5032 // Should be left with a tranfser queue
5033 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5034 if (queueFamilyIndex == UINT32_MAX) {
5035 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5036 return;
5037 }
5038
5039 VkImageObj image(m_device);
5040 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5041 VK_IMAGE_TILING_OPTIMAL, 0);
5042 ASSERT_TRUE(image.initialized());
5043
5044 // Allocate buffers
5045 VkBufferObj buffer;
5046 VkMemoryPropertyFlags reqs = 0;
5047 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5048
5049 VkBufferImageCopy region = {};
5050 region.bufferRowLength = 0;
5051 region.bufferImageHeight = 0;
5052 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5053 region.imageSubresource.layerCount = 1;
5054 region.imageOffset = {0, 0, 0};
5055 region.imageExtent = {16, 16, 1};
5056 region.bufferOffset = 5;
5057
5058 // Create command pool on a non-graphics queue
5059 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5060
5061 // Setup command buffer on pool
5062 VkCommandBufferObj command_buffer(m_device, &command_pool);
5063 command_buffer.begin();
5064
5065 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5066 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5067 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5068 &region);
5069 m_errorMonitor->VerifyFound();
5070}
5071
sfricke-samsungcb467672020-11-25 00:09:28 -08005072TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5073 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5074
5075 ASSERT_NO_FATAL_FAILURE(Init());
5076
5077 if (m_device->queue_props.size() < 2) {
5078 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5079 return;
5080 }
5081
5082 // First two queue families
5083 uint32_t queue_index_A = 0;
5084 uint32_t queue_index_B = 1;
5085
sfricke-samsung1c61f192021-12-31 01:53:03 -06005086 VkCommandPoolCreateInfo pool_create_info = LvlInitStruct<VkCommandPoolCreateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005087 pool_create_info.flags = 0;
5088
5089 VkCommandPool command_pool_A;
5090 pool_create_info.queueFamilyIndex = queue_index_A;
5091 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5092
5093 VkCommandPool command_pool_B;
5094 pool_create_info.queueFamilyIndex = queue_index_B;
5095 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5096
5097 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
sfricke-samsung1c61f192021-12-31 01:53:03 -06005098 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005099 command_buffer_allocate_info.commandBufferCount = 1;
5100 command_buffer_allocate_info.commandPool = command_pool_A;
5101 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5102 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5103
5104 command_buffer_allocate_info.commandPool = command_pool_B;
5105 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5106 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5107
sfricke-samsung1c61f192021-12-31 01:53:03 -06005108 VkCommandBufferBeginInfo begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005109
5110 // secondary
5111 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5112 vk::EndCommandBuffer(command_buffer[1]);
5113
5114 // Try using different pool's command buffer as secondary
5115 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5117 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5118 m_errorMonitor->VerifyFound();
5119 vk::EndCommandBuffer(command_buffer[0]);
5120
5121 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5122 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5123}
5124
unknown088160a2019-05-23 17:43:13 -06005125TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5126 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5127 ASSERT_NO_FATAL_FAILURE(Init());
5128 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5129 // never record secondary
5130
Mark Lobodzinski20310782020-02-28 14:25:17 -07005131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005132 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005133 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005134 m_errorMonitor->VerifyFound();
5135 m_commandBuffer->end();
5136}
5137
5138TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5139 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5140
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005141 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005142 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5143
sfricke-samsung1c61f192021-12-31 01:53:03 -06005144 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005145 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5146 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5147 image_create_info.extent.width = 32;
5148 image_create_info.extent.height = 1;
5149 image_create_info.extent.depth = 1;
5150 image_create_info.mipLevels = 1;
5151 image_create_info.arrayLayers = 1;
5152 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5153 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5154 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5155 image_create_info.flags = 0;
5156
5157 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5158 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5159
5160 VkImageObj image(m_device);
5161 image.init(&image_create_info);
5162 ASSERT_TRUE(image.initialized());
5163 VkImageMemoryBarrier image_barrier =
5164 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5165
5166 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5167 image_barrier.oldLayout = old_layout;
5168 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005169 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5170 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005171 };
5172
5173 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5174 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5175 secondary.begin();
5176 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5177 secondary.end();
5178
Mark Lobodzinski20310782020-02-28 14:25:17 -07005179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005180 m_commandBuffer->begin();
5181 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005182 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005183 m_errorMonitor->VerifyFound();
5184
unknown088160a2019-05-23 17:43:13 -06005185 m_commandBuffer->reset();
5186 secondary.reset();
5187
5188 // Validate that UNDEFINED doesn't false positive on us
5189 secondary.begin();
5190 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5191 secondary.end();
5192 m_commandBuffer->begin();
5193 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5194 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005195 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005196 m_errorMonitor->VerifyNotFound();
5197 m_commandBuffer->end();
5198}
5199
5200TEST_F(VkLayerTest, SetDynViewportParamTests) {
5201 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5202
5203 SetTargetApiVersion(VK_API_VERSION_1_1);
5204 VkPhysicalDeviceFeatures features{};
5205 ASSERT_NO_FATAL_FAILURE(Init(&features));
5206
5207 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5208 const VkViewport viewports[] = {vp, vp};
5209
5210 m_commandBuffer->begin();
5211
5212 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005213 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005214 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005215 m_errorMonitor->VerifyFound();
5216
Mark Lobodzinski20310782020-02-28 14:25:17 -07005217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005218 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005219 m_errorMonitor->VerifyFound();
5220
Mark Lobodzinski20310782020-02-28 14:25:17 -07005221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005222 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005223 m_errorMonitor->VerifyFound();
5224
Mark Lobodzinski20310782020-02-28 14:25:17 -07005225 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005227 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005228 m_errorMonitor->VerifyFound();
5229
Mark Lobodzinski20310782020-02-28 14:25:17 -07005230 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005231 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005232 m_errorMonitor->VerifyFound();
5233
5234 // core viewport tests
5235 using std::vector;
5236 struct TestCase {
5237 VkViewport vp;
5238 std::string veid;
5239 };
5240
5241 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5242 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5243 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5244
5245 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5246 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5247 const auto one_before_min_bounds = NearestSmaller(min_bound);
5248 const auto one_past_max_bounds = NearestGreater(max_bound);
5249
5250 const auto below_zero = NearestSmaller(0.0f);
5251 const auto past_one = NearestGreater(1.0f);
5252
5253 vector<TestCase> test_cases = {
5254 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5255 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5256 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5257 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5258 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5259 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5260 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5261 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5262 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5263 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5264 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5265 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5266 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5267 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5268 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5269 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5270 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5271 };
5272
5273 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5274 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5275 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5276 } else {
5277 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5278 }
5279
5280 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005282 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005283 m_errorMonitor->VerifyFound();
5284 }
5285}
5286
5287TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5288 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5289
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005290 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005291
Mike Schuchardt7cc57842021-09-15 10:49:59 -07005292 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
5293 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005294 } else {
5295 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5296 return;
5297 }
5298 ASSERT_NO_FATAL_FAILURE(InitState());
5299
5300 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5301}
5302
5303TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5304 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5305
5306 ASSERT_NO_FATAL_FAILURE(Init());
5307
5308 if (!m_device->phy().features().multiViewport) {
5309 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5310 return;
5311 }
5312
unknown088160a2019-05-23 17:43:13 -06005313 m_commandBuffer->begin();
5314
Mark Lobodzinski20310782020-02-28 14:25:17 -07005315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005316 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005317 m_errorMonitor->VerifyFound();
5318
Petr Kraus14e49492019-09-09 20:13:29 +02005319 const auto max_viewports = m_device->props.limits.maxViewports;
5320
Mark Lobodzinski20310782020-02-28 14:25:17 -07005321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005322 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005323 m_errorMonitor->VerifyFound();
5324
Petr Kraus14e49492019-09-09 20:13:29 +02005325 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5326 if (max_viewports >= too_big_max_viewports) {
5327 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5328 kSkipPrefix);
5329 } else {
5330 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5331 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5332
Mark Lobodzinski20310782020-02-28 14:25:17 -07005333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005334 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005335 m_errorMonitor->VerifyFound();
5336
Mark Lobodzinski20310782020-02-28 14:25:17 -07005337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005338 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005339 m_errorMonitor->VerifyFound();
5340
Mark Lobodzinski20310782020-02-28 14:25:17 -07005341 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005342 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005343 m_errorMonitor->VerifyFound();
5344
Mark Lobodzinski20310782020-02-28 14:25:17 -07005345 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005346 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005347 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005348 }
unknown088160a2019-05-23 17:43:13 -06005349}
5350
5351TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5352 TEST_DESCRIPTION(
5353 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5354
5355 ASSERT_NO_FATAL_FAILURE(Init());
5356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5357
5358 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5359 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5360
5361 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5362 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5363 nullptr, // pNext
5364 m_renderPass,
5365 0, // subpass
5366 m_framebuffer,
5367 };
5368 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5369 nullptr, // pNext
5370 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5371
5372 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5373 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5374 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5375 sec_cmdbuff_inside_rp.end();
5376
5377 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5378 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5379 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5380 sec_cmdbuff_outside_rp.end();
5381
5382 m_commandBuffer->begin();
5383
Mark Lobodzinski20310782020-02-28 14:25:17 -07005384 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005385 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005386 m_errorMonitor->VerifyFound();
5387
5388 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5389 nullptr, // pNext
5390 m_renderPass,
5391 m_framebuffer,
5392 {{0, 0}, {32, 32}},
5393 static_cast<uint32_t>(m_renderPassClearValues.size()),
5394 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005395 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005396
Mark Lobodzinski20310782020-02-28 14:25:17 -07005397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005398 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005399 m_errorMonitor->VerifyFound();
5400}
5401
5402TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5403 TEST_DESCRIPTION(
5404 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5405 ASSERT_NO_FATAL_FAILURE(Init());
5406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5407
sfricke-samsung1c61f192021-12-31 01:53:03 -06005408 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06005409 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5410 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5411 command_buffer_allocate_info.commandBufferCount = 1;
5412
5413 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005414 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
sfricke-samsung1c61f192021-12-31 01:53:03 -06005415 VkCommandBufferBeginInfo command_buffer_begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5416 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06005417 command_buffer_inheritance_info.renderPass = m_renderPass;
5418 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5419
unknown088160a2019-05-23 17:43:13 -06005420 command_buffer_begin_info.flags =
5421 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5422 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5423
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005424 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005425 VkClearAttachment color_attachment;
5426 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5427 color_attachment.clearValue.color.float32[0] = 0;
5428 color_attachment.clearValue.color.float32[1] = 0;
5429 color_attachment.clearValue.color.float32[2] = 0;
5430 color_attachment.clearValue.color.float32[3] = 0;
5431 color_attachment.colorAttachment = 0;
5432 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005433 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005434 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5435 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005436 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005437 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005438
Mark Lobodzinski20310782020-02-28 14:25:17 -07005439 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005440 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005441 m_errorMonitor->VerifyFound();
5442
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005443 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005444 m_commandBuffer->end();
5445}
5446
5447TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5448 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5449 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5450 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5451 } else {
5452 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5453 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5454 return;
5455 }
5456
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005457 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005458 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5459 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5460 } else {
5461 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5462 return;
5463 }
5464 ASSERT_NO_FATAL_FAILURE(InitState());
5465
5466 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5467 if (push_descriptor_prop.maxPushDescriptors < 1) {
5468 // Some implementations report an invalid maxPushDescriptors of 0
5469 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5470 return;
5471 }
5472
5473 // Create ordinary and push descriptor set layout
5474 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5475 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5476 ASSERT_TRUE(ds_layout.initialized());
5477 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5478 ASSERT_TRUE(push_ds_layout.initialized());
5479
5480 // Now use the descriptor set layouts to create a pipeline layout
5481 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5482 ASSERT_TRUE(pipeline_layout.initialized());
5483
5484 // Create a descriptor to push
5485 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5486 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5487 ASSERT_TRUE(buffer_obj.initialized());
5488
5489 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5490 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5491 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5492
5493 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5494 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5495
5496 // Find address of extension call and make the call
5497 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005498 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005499 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5500
5501 // Section 1: Queue family matching/capabilities.
5502 // Create command pool on a non-graphics queue
5503 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5504 const uint32_t transfer_only_qfi =
5505 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5506 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005507 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005508 } else {
5509 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5510
5511 VkCommandPoolObj command_pool(m_device, err_qfi);
5512 ASSERT_TRUE(command_pool.initialized());
5513 VkCommandBufferObj command_buffer(m_device, &command_pool);
5514 ASSERT_TRUE(command_buffer.initialized());
5515 command_buffer.begin();
5516
Mark Lobodzinski20310782020-02-28 14:25:17 -07005517 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5518 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005519 if (err_qfi == transfer_only_qfi) {
5520 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005521 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005522 }
5523 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5524 &descriptor_write);
5525 m_errorMonitor->VerifyFound();
5526 command_buffer.end();
5527
5528 // If we succeed in testing only one condition above, we need to test the other below.
5529 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5530 // Need to test the neither compute/gfx supported case separately.
5531 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5532 ASSERT_TRUE(tran_command_pool.initialized());
5533 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5534 ASSERT_TRUE(tran_command_buffer.initialized());
5535 tran_command_buffer.begin();
5536
5537 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5540 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005541 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5542 &descriptor_write);
5543 m_errorMonitor->VerifyFound();
5544 tran_command_buffer.end();
5545 }
5546 }
5547
5548 // Push to the non-push binding
5549 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005550 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005551 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5552 &descriptor_write);
5553 m_errorMonitor->VerifyFound();
5554
5555 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005556 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005557 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5558 &descriptor_write);
5559 m_errorMonitor->VerifyFound();
5560 m_commandBuffer->end();
5561
5562 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5563 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005564 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung85584a72021-09-30 21:43:38 -07005565 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005567 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5568 &descriptor_write);
5569 m_errorMonitor->VerifyFound();
5570}
5571
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005572TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5573 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5574 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5575 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5576 } else {
5577 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5578 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5579 return;
5580 }
5581
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005582 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005583 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5584 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5585 } else {
5586 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5587 return;
5588 }
5589 ASSERT_NO_FATAL_FAILURE(InitState());
5590
5591 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5592 if (push_descriptor_prop.maxPushDescriptors < 1) {
5593 // Some implementations report an invalid maxPushDescriptors of 0.
5594 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5595 return;
5596 }
5597
5598 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5599 if (min_alignment == 0) {
5600 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5601 return;
5602 }
5603
5604 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5605 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5606 ASSERT_TRUE(push_ds_layout.initialized());
5607
5608 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5609 ASSERT_TRUE(pipeline_layout.initialized());
5610
5611 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5612 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5613 ASSERT_TRUE(buffer_obj.initialized());
5614
5615 // Use an invalid alignment.
5616 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5617 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5618 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5619
5620 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5621 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5622 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5623
5624 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005626 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5627 &descriptor_write);
5628 m_errorMonitor->VerifyFound();
5629
5630 m_commandBuffer->end();
5631}
5632
unknown088160a2019-05-23 17:43:13 -06005633TEST_F(VkLayerTest, SetDynScissorParamTests) {
5634 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5635
5636 VkPhysicalDeviceFeatures features{};
5637 ASSERT_NO_FATAL_FAILURE(Init(&features));
5638
5639 const VkRect2D scissor = {{0, 0}, {16, 16}};
5640 const VkRect2D scissors[] = {scissor, scissor};
5641
5642 m_commandBuffer->begin();
5643
5644 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005645 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005646 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005647 m_errorMonitor->VerifyFound();
5648
Mark Lobodzinski20310782020-02-28 14:25:17 -07005649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005650 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005651 m_errorMonitor->VerifyFound();
5652
Mark Lobodzinski20310782020-02-28 14:25:17 -07005653 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005654 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005655 m_errorMonitor->VerifyFound();
5656
Mark Lobodzinski20310782020-02-28 14:25:17 -07005657 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005659 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005660 m_errorMonitor->VerifyFound();
5661
Mark Lobodzinski20310782020-02-28 14:25:17 -07005662 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005663 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005664 m_errorMonitor->VerifyFound();
5665
5666 struct TestCase {
5667 VkRect2D scissor;
5668 std::string vuid;
5669 };
5670
5671 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5672 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5673 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5674 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5675 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5676 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5677 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5678 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5679
5680 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005682 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005683 m_errorMonitor->VerifyFound();
5684 }
5685
5686 m_commandBuffer->end();
5687}
5688
5689TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5690 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5691
5692 ASSERT_NO_FATAL_FAILURE(Init());
5693
5694 if (!m_device->phy().features().multiViewport) {
5695 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5696 return;
5697 }
5698
unknown088160a2019-05-23 17:43:13 -06005699 m_commandBuffer->begin();
5700
Mark Lobodzinski20310782020-02-28 14:25:17 -07005701 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005702 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005703 m_errorMonitor->VerifyFound();
5704
Petr Kraus14e49492019-09-09 20:13:29 +02005705 const auto max_scissors = m_device->props.limits.maxViewports;
5706
Mark Lobodzinski20310782020-02-28 14:25:17 -07005707 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005708 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005709 m_errorMonitor->VerifyFound();
5710
Petr Kraus14e49492019-09-09 20:13:29 +02005711 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5712 if (max_scissors >= too_big_max_scissors) {
5713 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5714 kSkipPrefix);
5715 } else {
5716 const VkRect2D scissor = {{0, 0}, {16, 16}};
5717 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5718
Mark Lobodzinski20310782020-02-28 14:25:17 -07005719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005720 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005721 m_errorMonitor->VerifyFound();
5722
Mark Lobodzinski20310782020-02-28 14:25:17 -07005723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005724 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005725 m_errorMonitor->VerifyFound();
5726
Mark Lobodzinski20310782020-02-28 14:25:17 -07005727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005728 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005729 m_errorMonitor->VerifyFound();
5730
Mark Lobodzinski20310782020-02-28 14:25:17 -07005731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005732 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005733 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005734 }
unknown088160a2019-05-23 17:43:13 -06005735}
5736
Tony-LunarG667cc022021-06-25 10:11:17 -06005737TEST_F(VkLayerTest, MultiDrawTests) {
5738 TEST_DESCRIPTION("Test validation of multi_draw extension");
5739 SetTargetApiVersion(VK_API_VERSION_1_2);
5740 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5741 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5742 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5743 return;
5744 }
5745
5746 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
5747 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multi_draw_features);
5748 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
5749 if (!multi_draw_features.multiDraw) {
5750 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5751 return;
5752 }
5753 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5754 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5755 } else {
5756 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5757 return;
5758 }
5759 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5760 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
5761 vk::GetPhysicalDeviceProperties2(gpu(), &properties2);
5762
5763 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5764 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5765
5766 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5767 auto vkCmdDrawMultiIndexedEXT =
5768 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5769 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5770
5771 VkMultiDrawInfoEXT multi_draws[3] = {};
5772 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5773
5774 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5775 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5776
5777 CreatePipelineHelper pipe(*this);
5778 pipe.InitInfo();
5779 pipe.InitState();
5780 pipe.CreateGraphicsPipeline();
5781
5782 // Try existing VUID checks
5783 m_commandBuffer->begin();
5784 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5785
5786 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5787 &pipe.descriptor_set_->set_, 0, NULL);
5788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5789 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5790 m_errorMonitor->VerifyFound();
5791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5792 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5793 m_errorMonitor->VerifyFound();
5794
5795 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5796
5797 // New VUIDs added with multi_draw (also see GPU-AV)
5798 VkBufferObj buffer;
5799 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5800 multi_draw_indices[2].indexCount = 513;
5801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5802 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5803 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5804 m_errorMonitor->VerifyFound();
5805 multi_draw_indices[2].indexCount = 1;
5806
5807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5808 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5809 m_errorMonitor->VerifyFound();
5810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5811 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5812 m_errorMonitor->VerifyFound();
5813
5814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5815 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5816 m_errorMonitor->VerifyFound();
5817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5818 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5819 m_errorMonitor->VerifyFound();
5820
5821 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5822 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5823 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5824 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5825 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5826 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5827 m_errorMonitor->VerifyFound();
5828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5829 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5830 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5831 m_errorMonitor->VerifyFound();
5832 }
5833}
5834
5835TEST_F(VkLayerTest, MultiDrawFeatures) {
5836 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5837 SetTargetApiVersion(VK_API_VERSION_1_2);
5838 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5839 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5840 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5841 return;
5842 }
5843 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5844 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5845 } else {
5846 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5847 return;
5848 }
5849 ASSERT_NO_FATAL_FAILURE(InitState());
5850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5851
sfricke-samsungca162082022-02-10 08:53:41 -08005852 auto multi_draw_props = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5853 auto pd_props2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_props);
5854 vk::GetPhysicalDeviceProperties2(gpu(), &pd_props2);
5855 if (multi_draw_props.maxMultiDrawCount == 0) {
5856 // If using MockICD and devsim the value might be zero'ed and cause false errors
5857 return;
5858 }
5859
Tony-LunarG667cc022021-06-25 10:11:17 -06005860 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5861 auto vkCmdDrawMultiIndexedEXT =
5862 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5863 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5864
5865 VkMultiDrawInfoEXT multi_draws[3] = {};
5866 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5867
5868 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5869 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5870
5871 CreatePipelineHelper pipe(*this);
5872 pipe.InitInfo();
5873 pipe.InitState();
5874 pipe.CreateGraphicsPipeline();
5875
5876 m_commandBuffer->begin();
5877 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5878 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5879 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5880 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5881 m_errorMonitor->VerifyFound();
5882 VkBufferObj buffer;
5883 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5884 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5885 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5886 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5887 m_errorMonitor->VerifyFound();
5888}
5889
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005890TEST_F(VkLayerTest, IndirectDrawTests) {
5891 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005892
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005893 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5894 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5895 } else {
5896 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5897 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5898 return;
5899 }
5900 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5901
5902 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5903 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5904 return;
5905 }
5906
Aaron Hagand1a61212021-12-22 11:53:49 -05005907 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06005908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5909
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005910 CreatePipelineHelper pipe(*this);
5911 pipe.InitInfo();
5912 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06005913 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005914 dyn_state_ci.dynamicStateCount = size(dyn_states);
5915 dyn_state_ci.pDynamicStates = dyn_states;
5916 pipe.dyn_state_ci_ = dyn_state_ci;
5917 pipe.InitState();
5918 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005919
5920 m_commandBuffer->begin();
5921 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5922
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005923 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5924 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5925 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005926
5927 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005928 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005929 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005930 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005931
sfricke-samsung1c61f192021-12-31 01:53:03 -06005932 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005933 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5934 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005935 VkBufferObj draw_buffer;
5936 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005937
Aaron Hagand1a61212021-12-22 11:53:49 -05005938 VkBufferObj draw_buffer_correct;
5939 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5940 draw_buffer_correct.init(*m_device, buffer_create_info);
5941
unknown088160a2019-05-23 17:43:13 -06005942 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005944 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005945 m_errorMonitor->VerifyFound();
5946
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005947 // VUID-vkCmdDrawIndirect-drawCount-02718
Aaron Hagand1a61212021-12-22 11:53:49 -05005948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-00488");
5949 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005950 m_errorMonitor->VerifyFound();
5951
Aaron Hagand1a61212021-12-22 11:53:49 -05005952 // VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701
5953 // VUID-vkCmdDrawIndexedIndirect-drawCount-00540
5954 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
5955 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
5956 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005957 m_errorMonitor->VerifyFound();
5958
unknown088160a2019-05-23 17:43:13 -06005959 m_commandBuffer->EndRenderPass();
5960 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005961}
5962
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005963TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5964 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5965
5966 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5967 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5968 } else {
5969 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5970 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5971 return;
5972 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005973 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005974
5975 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5976 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5977 } else {
5978 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005979 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005980 }
5981
5982 ASSERT_NO_FATAL_FAILURE(InitState());
5983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5984
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005985 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
5986 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005987 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
5988
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005989 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5990 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5991
5992 m_commandBuffer->begin();
5993 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
sfricke-samsung1c61f192021-12-31 01:53:03 -06005994 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005995 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5996 buffer_create_info.size = 1024;
5997 VkBufferObj counter_buffer;
5998 counter_buffer.init(*m_device, buffer_create_info);
5999
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006000 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006001 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006002 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006003 m_errorMonitor->VerifyFound();
6004
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006005 // some mock ICD json files are missing a valid stride value
6006 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6007 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006008 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006009 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6010 m_errorMonitor->VerifyFound();
6011 }
6012
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006013 m_commandBuffer->EndRenderPass();
6014 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006015
6016 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6017 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6018 return;
6019 }
6020
6021 std::vector<const char *> device_extension_names;
6022 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6023 VkDeviceObj test_device(0, gpu(), device_extension_names);
6024 VkCommandPoolObj commandPool(&test_device, 0);
6025 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6026 VkBufferObj counter_buffer2;
6027 counter_buffer2.init(test_device, buffer_create_info);
6028 VkPipelineLayoutObj pipelineLayout(&test_device);
6029 VkRenderPass renderpass;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006030 VkRenderPassCreateInfo rp_info = LvlInitStruct<VkRenderPassCreateInfo>();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006031 VkSubpassDescription subpass = {};
Tony-LunarG983bbc52020-11-06 11:04:59 -07006032 rp_info.pSubpasses = &subpass;
6033 rp_info.subpassCount = 1;
6034 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6035 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006036 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
6037 vs.InitFromGLSLTry(bindStateVertShaderText, false, SPV_ENV_VULKAN_1_0, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006038 pipeline.AddShader(&vs);
6039 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6040 m_renderPassBeginInfo.renderPass = renderpass;
6041 VkFramebuffer fb;
6042 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6043 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6044 m_renderPassBeginInfo.framebuffer = fb;
6045 m_renderPassBeginInfo.renderPass = renderpass;
6046 commandBuffer.begin();
6047 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6048 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6049 VkRect2D scissor = {{0, 0}, {16, 16}};
6050 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6051 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6052 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6053 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006055 }
6056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6057 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6058 m_errorMonitor->VerifyFound();
6059 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6060 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006061}
6062
unknown088160a2019-05-23 17:43:13 -06006063TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6064 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6065
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006066 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006067 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6068 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6069 } else {
6070 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6071 return;
6072 }
6073 ASSERT_NO_FATAL_FAILURE(InitState());
6074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6075
6076 VkMemoryRequirements memory_requirements;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006077 VkMemoryAllocateInfo memory_allocate_info = LvlInitStruct<VkMemoryAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06006078
6079 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006080 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006081
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006082 CreatePipelineHelper pipe(*this);
6083 pipe.InitInfo();
6084 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006085 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006086 dyn_state_ci.dynamicStateCount = size(dyn_states);
6087 dyn_state_ci.pDynamicStates = dyn_states;
6088 pipe.dyn_state_ci_ = dyn_state_ci;
6089 pipe.InitState();
6090 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006091
6092 m_commandBuffer->begin();
6093 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6094
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006095 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6096 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6097 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006098
6099 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006100 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006101 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006102 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006103
sfricke-samsung1c61f192021-12-31 01:53:03 -06006104 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006105 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6106 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6107 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006108 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006109
sfricke-samsung1c61f192021-12-31 01:53:03 -06006110 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006111 count_buffer_create_info.size = sizeof(uint32_t);
6112 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006113 VkBufferObj count_buffer;
6114 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006115
Mike Schuchardt65847d92019-12-20 13:50:47 -08006116 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006118 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6119 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006120 m_errorMonitor->VerifyFound();
6121
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006122 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006123 memory_allocate_info.allocationSize = memory_requirements.size;
6124 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6125 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006126 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6127 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006128
6129 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006130 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006131
Mike Schuchardt65847d92019-12-20 13:50:47 -08006132 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006134 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6135 m_errorMonitor->VerifyFound();
6136
Mike Schuchardt65847d92019-12-20 13:50:47 -08006137 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006138 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006139 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6140 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006141 m_errorMonitor->VerifyFound();
6142
Mike Schuchardt65847d92019-12-20 13:50:47 -08006143 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006145 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6146 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006147 m_errorMonitor->VerifyFound();
6148
Mike Schuchardt65847d92019-12-20 13:50:47 -08006149 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006151 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006152 m_errorMonitor->VerifyFound();
6153
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006154 // 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 -06006155 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006156 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6157 // VUID-vkCmdDrawIndirectCount-subpass-02685
6158 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006159
6160 m_commandBuffer->EndRenderPass();
6161 m_commandBuffer->end();
6162
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006163 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6164 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006165
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006166 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006167}
6168
6169TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6170 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6171
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006172 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006173 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6174 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6175 } else {
6176 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6177 return;
6178 }
6179 ASSERT_NO_FATAL_FAILURE(InitState());
6180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6181
unknown088160a2019-05-23 17:43:13 -06006182 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006183 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006184
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006185 CreatePipelineHelper pipe(*this);
6186 pipe.InitInfo();
6187 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006188 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006189 dyn_state_ci.dynamicStateCount = size(dyn_states);
6190 dyn_state_ci.pDynamicStates = dyn_states;
6191 pipe.dyn_state_ci_ = dyn_state_ci;
6192 pipe.InitState();
6193 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006194
6195 m_commandBuffer->begin();
6196 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6197
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006198 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6199 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6200 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006201
6202 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006203 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006204 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006205 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006206
sfricke-samsung1c61f192021-12-31 01:53:03 -06006207 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006208 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6209 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006210 VkBufferObj draw_buffer;
6211 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006212
sfricke-samsung1c61f192021-12-31 01:53:03 -06006213 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006214 count_buffer_create_info.size = sizeof(uint32_t);
6215 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006216 VkBufferObj count_buffer;
6217 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006218
sfricke-samsung1c61f192021-12-31 01:53:03 -06006219 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006220 index_buffer_create_info.size = sizeof(uint32_t);
6221 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006222 VkBufferObj index_buffer;
6223 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006224
Mike Schuchardt65847d92019-12-20 13:50:47 -08006225 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006227 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006228 sizeof(VkDrawIndexedIndirectCommand));
6229 m_errorMonitor->VerifyFound();
6230
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006231 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006232
6233 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006234 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006235
Mike Schuchardt65847d92019-12-20 13:50:47 -08006236 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006237 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006238 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006239 sizeof(VkDrawIndexedIndirectCommand));
6240 m_errorMonitor->VerifyFound();
6241
6242 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006243 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006244
Mike Schuchardt65847d92019-12-20 13:50:47 -08006245 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006246 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006247 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006248 sizeof(VkDrawIndexedIndirectCommand));
6249 m_errorMonitor->VerifyFound();
6250
Mike Schuchardt65847d92019-12-20 13:50:47 -08006251 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006253 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006254 sizeof(VkDrawIndexedIndirectCommand));
6255 m_errorMonitor->VerifyFound();
6256
Mike Schuchardt65847d92019-12-20 13:50:47 -08006257 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006259 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006260 sizeof(VkDrawIndexedIndirectCommand));
6261 m_errorMonitor->VerifyFound();
6262
Mike Schuchardt65847d92019-12-20 13:50:47 -08006263 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006264 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006265 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006266 m_errorMonitor->VerifyFound();
6267
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006268 // 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 -06006269 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006270 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6271 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6272 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006273
6274 m_commandBuffer->EndRenderPass();
6275 m_commandBuffer->end();
6276
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006277 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6278 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006279}
6280
sfricke-samsung860d3b22020-05-04 21:08:29 -07006281TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6282 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6283
6284 SetTargetApiVersion(VK_API_VERSION_1_2);
6285 ASSERT_NO_FATAL_FAILURE(Init());
6286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6287 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6288 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6289 return;
6290 }
6291
6292 VkBufferObj indirect_buffer;
6293 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6294 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6295
6296 VkBufferObj indexed_indirect_buffer;
6297 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6298 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6299
6300 VkBufferObj count_buffer;
6301 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6302
6303 VkBufferObj index_buffer;
6304 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6305
6306 CreatePipelineHelper pipe(*this);
6307 pipe.InitInfo();
6308 pipe.InitState();
6309 pipe.CreateGraphicsPipeline();
6310
6311 // Make calls to valid commands but without the drawIndirectCount feature set
6312 m_commandBuffer->begin();
6313 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6314
6315 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6316
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006318 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6319 sizeof(VkDrawIndirectCommand));
6320 m_errorMonitor->VerifyFound();
6321
6322 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6323
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006325 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6326 sizeof(VkDrawIndexedIndirectCommand));
6327 m_errorMonitor->VerifyFound();
6328
6329 m_commandBuffer->EndRenderPass();
6330 m_commandBuffer->end();
6331}
6332
unknown088160a2019-05-23 17:43:13 -06006333TEST_F(VkLayerTest, ExclusiveScissorNV) {
6334 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6335
6336 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6337 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6338 } else {
6339 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6340 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6341 return;
6342 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006343 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006344 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6345 for (auto device_extension : required_device_extensions) {
6346 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6347 m_device_extension_names.push_back(device_extension);
6348 } else {
6349 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6350 return;
6351 }
6352 }
6353
6354 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006355 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006356 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6357
6358 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006359 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6360 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006361 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6362
6363 features2.features.multiViewport = VK_FALSE;
6364
6365 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6367
6368 if (m_device->phy().properties().limits.maxViewports) {
6369 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6370 return;
6371 }
6372
6373 // Based on PSOViewportStateTests
6374 {
6375 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6376 VkViewport viewports[] = {viewport, viewport};
6377 VkRect2D scissor = {{0, 0}, {64, 64}};
6378 VkRect2D scissors[100] = {scissor, scissor};
6379
6380 using std::vector;
6381 struct TestCase {
6382 uint32_t viewport_count;
6383 VkViewport *viewports;
6384 uint32_t scissor_count;
6385 VkRect2D *scissors;
6386 uint32_t exclusive_scissor_count;
6387 VkRect2D *exclusive_scissors;
6388
6389 vector<std::string> vuids;
6390 };
6391
6392 vector<TestCase> test_cases = {
6393 {1,
6394 viewports,
6395 1,
6396 scissors,
6397 2,
6398 scissors,
6399 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6400 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6401 {1,
6402 viewports,
6403 1,
6404 scissors,
6405 100,
6406 scissors,
6407 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6408 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6409 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006410 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006411 };
6412
6413 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006414 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6415 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006416
6417 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6418 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6419 helper.vp_state_ci_.pViewports = test_case.viewports;
6420 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6421 helper.vp_state_ci_.pScissors = test_case.scissors;
6422 helper.vp_state_ci_.pNext = &exc;
6423
6424 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6425 exc.pExclusiveScissors = test_case.exclusive_scissors;
6426 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006427 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006428 }
6429 }
6430
6431 // Based on SetDynScissorParamTests
6432 {
6433 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006434 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006435
6436 const VkRect2D scissor = {{0, 0}, {16, 16}};
6437 const VkRect2D scissors[] = {scissor, scissor};
6438
6439 m_commandBuffer->begin();
6440
Mark Lobodzinski20310782020-02-28 14:25:17 -07006441 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006442 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6443 m_errorMonitor->VerifyFound();
6444
Mark Lobodzinski20310782020-02-28 14:25:17 -07006445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006446 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6447 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6448 m_errorMonitor->VerifyFound();
6449
Mark Lobodzinski20310782020-02-28 14:25:17 -07006450 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006451 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6452 m_errorMonitor->VerifyFound();
6453
Mark Lobodzinski20310782020-02-28 14:25:17 -07006454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006455 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006456 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006457 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6458 m_errorMonitor->VerifyFound();
6459
Mark Lobodzinski20310782020-02-28 14:25:17 -07006460 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006462 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6463 m_errorMonitor->VerifyFound();
6464
Mark Lobodzinski20310782020-02-28 14:25:17 -07006465 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006466 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6467 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6468 m_errorMonitor->VerifyFound();
6469
6470 struct TestCase {
6471 VkRect2D scissor;
6472 std::string vuid;
6473 };
6474
6475 std::vector<TestCase> test_cases = {
6476 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6477 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6478 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6479 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6480 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6481 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6482 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6483 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6484
6485 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006486 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006487 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6488 m_errorMonitor->VerifyFound();
6489 }
6490
6491 m_commandBuffer->end();
6492 }
6493}
6494
6495TEST_F(VkLayerTest, MeshShaderNV) {
6496 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6497
6498 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6499 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6500 } else {
6501 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6502 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6503 return;
6504 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006505 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006506 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6507 for (auto device_extension : required_device_extensions) {
6508 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6509 m_device_extension_names.push_back(device_extension);
6510 } else {
6511 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6512 return;
6513 }
6514 }
6515
Tony-LunarG048f5012020-04-29 16:55:11 -06006516 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006517 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6518 return;
6519 }
6520
6521 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006522 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006523 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6524
6525 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006526 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6527 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006528 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6529 features2.features.multiDrawIndirect = VK_FALSE;
6530
6531 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6533
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006534 static const char vertShaderText[] = R"glsl(
6535 #version 450
6536 vec2 vertices[3];
6537 void main() {
6538 vertices[0] = vec2(-1.0, -1.0);
6539 vertices[1] = vec2( 1.0, -1.0);
6540 vertices[2] = vec2( 0.0, 1.0);
6541 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6542 gl_PointSize = 1.0f;
6543 }
6544 )glsl";
unknown088160a2019-05-23 17:43:13 -06006545
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006546 static const char meshShaderText[] = R"glsl(
6547 #version 450
6548 #extension GL_NV_mesh_shader : require
6549 layout(local_size_x = 1) in;
6550 layout(max_vertices = 3) out;
6551 layout(max_primitives = 1) out;
6552 layout(triangles) out;
6553 void main() {
6554 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6555 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6556 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6557 gl_PrimitiveIndicesNV[0] = 0;
6558 gl_PrimitiveIndicesNV[1] = 1;
6559 gl_PrimitiveIndicesNV[2] = 2;
6560 gl_PrimitiveCountNV = 1;
6561 }
6562 )glsl";
unknown088160a2019-05-23 17:43:13 -06006563
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006564 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6565 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6566 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006567
6568 // Test pipeline creation
6569 {
6570 // can't mix mesh with vertex
6571 const auto break_vp = [&](CreatePipelineHelper &helper) {
6572 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6573 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006574 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006575 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6576
6577 // vertex or mesh must be present
6578 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006579 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006580 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6581
6582 // vertexinput and inputassembly must be valid when vertex stage is present
6583 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6584 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6585 helper.gp_ci_.pVertexInputState = nullptr;
6586 helper.gp_ci_.pInputAssemblyState = nullptr;
6587 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006588 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006589 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6590 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6591 }
6592
6593 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006594 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006595
sfricke-samsung1c61f192021-12-31 01:53:03 -06006596 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006597 buffer_create_info.size = sizeof(uint32_t);
6598 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6599 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006600 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006601 ASSERT_VK_SUCCESS(result);
6602
6603 m_commandBuffer->begin();
6604
Mark Lobodzinski20310782020-02-28 14:25:17 -07006605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6606 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006607 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6608 m_errorMonitor->VerifyFound();
6609
6610 m_commandBuffer->end();
6611
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006612 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006613}
6614
6615TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6616 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6617 ASSERT_NO_FATAL_FAILURE(Init());
6618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6619
6620 VkEvent event;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006621 VkEventCreateInfo event_create_info = LvlInitStruct<VkEventCreateInfo>();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006622 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006623
6624 m_commandBuffer->begin();
6625
Shannon McPherson93970b12020-06-12 14:34:35 -06006626 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006627 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006628 m_errorMonitor->VerifyFound();
6629
Shannon McPherson93970b12020-06-12 14:34:35 -06006630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006631 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006632 m_errorMonitor->VerifyFound();
6633
Shannon McPherson93970b12020-06-12 14:34:35 -06006634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006635 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006636 m_errorMonitor->VerifyFound();
6637
Shannon McPherson93970b12020-06-12 14:34:35 -06006638 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006639 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006640 m_errorMonitor->VerifyFound();
6641
Shannon McPherson93970b12020-06-12 14:34:35 -06006642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6643 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006644 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6645 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006646 m_errorMonitor->VerifyFound();
6647
Shannon McPherson93970b12020-06-12 14:34:35 -06006648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006650 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6651 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006652 m_errorMonitor->VerifyFound();
6653
Shannon McPherson93970b12020-06-12 14:34:35 -06006654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006656 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6657 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006658 m_errorMonitor->VerifyFound();
6659
Shannon McPherson93970b12020-06-12 14:34:35 -06006660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6661 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006662 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6663 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006664 m_errorMonitor->VerifyFound();
6665
6666 m_commandBuffer->end();
6667
sfricke-samsung1c61f192021-12-31 01:53:03 -06006668 VkSemaphoreCreateInfo semaphore_create_info = LvlInitStruct<VkSemaphoreCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006669 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006670 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006671
6672 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006673 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006674
6675 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006676 submit_info.signalSemaphoreCount = 1;
6677 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006678 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006679 m_errorMonitor->VerifyNotFound();
6680
unknown088160a2019-05-23 17:43:13 -06006681 submit_info.signalSemaphoreCount = 0;
6682 submit_info.pSignalSemaphores = nullptr;
6683 submit_info.waitSemaphoreCount = 1;
6684 submit_info.pWaitSemaphores = &semaphore;
6685 submit_info.pWaitDstStageMask = &stage_flags;
6686
sfricke-samsung1ac64842021-09-23 14:11:17 -07006687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6688 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006689 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006690 m_errorMonitor->VerifyFound();
6691
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006692 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006693
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006694 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
sfricke-samsung1c61f192021-12-31 01:53:03 -06006695 VkPipelineShaderStageCreateInfo meshStage = LvlInitStruct<VkPipelineShaderStageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006696 meshStage = vs.GetStageCreateInfo();
6697 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006698 VkPipelineShaderStageCreateInfo taskStage = LvlInitStruct<VkPipelineShaderStageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006699 taskStage = vs.GetStageCreateInfo();
6700 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6701
6702 // mesh and task shaders not supported
6703 const auto break_vp = [&](CreatePipelineHelper &helper) {
6704 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6705 };
6706 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006707 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006708 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6709 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6710 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6711
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006712 vk::DestroyEvent(m_device->device(), event, nullptr);
6713 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006714}
Chris Mayerc93536f2019-09-19 16:34:49 +02006715
6716TEST_F(VkLayerTest, ViewportWScalingNV) {
6717 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6718
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006719 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006720
6721 VkPhysicalDeviceFeatures device_features = {};
6722 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6723
6724 if (!device_features.multiViewport) {
6725 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6726 return;
6727 }
6728
6729 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6730 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6731 } else {
6732 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6733 return;
6734 }
6735
6736 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6738
6739 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006740 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006741
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006742 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006743 #version 450
6744 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6745 vec2( 1.0f, 1.0f),
6746 vec2(-1.0f, -1.0f),
6747 vec2( 1.0f, -1.0f) };
6748 out gl_PerVertex {
6749 vec4 gl_Position;
6750 };
6751
6752 void main() {
6753 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006754 }
6755 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006756
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006757 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006758 #version 450
6759 layout(location = 0) out vec4 outColor;
6760
6761 void main() {
6762 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006763 }
6764 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006765
6766 const std::vector<VkViewport> vp = {
6767 {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}};
6768 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6769 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6770
6771 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6772
sfricke-samsung1c61f192021-12-31 01:53:03 -06006773 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006774 vpsi.viewportWScalingEnable = VK_TRUE;
6775 vpsi.viewportCount = vp_count;
6776 vpsi.pViewportWScalings = scale.data();
6777
sfricke-samsung1c61f192021-12-31 01:53:03 -06006778 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006779 vpci.viewportCount = vp_count;
6780 vpci.pViewports = vp.data();
6781 vpci.scissorCount = vp_count;
6782 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006783
6784 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6785
6786 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006787 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006788
6789 // Create pipeline with w-scaling enabled but without a valid scaling array
6790 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006791 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006792 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6793
6794 vpsi.pViewportWScalings = scale.data();
6795
6796 // Create pipeline with w-scaling enabled but without matching viewport counts
6797 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006798 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006799 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6800
6801 const VkPipelineLayoutObj pl(m_device);
6802
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006803 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6804 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006805
6806 VkPipelineObj pipe(m_device);
6807 pipe.AddDefaultColorAttachment();
6808 pipe.AddShader(&vs);
6809 pipe.AddShader(&fs);
6810 pipe.SetViewport(vp);
6811 pipe.SetScissor(sc);
6812 pipe.CreateVKPipeline(pl.handle(), renderPass());
6813
6814 VkPipelineObj pipeDynWScale(m_device);
6815 pipeDynWScale.AddDefaultColorAttachment();
6816 pipeDynWScale.AddShader(&vs);
6817 pipeDynWScale.AddShader(&fs);
6818 pipeDynWScale.SetViewport(vp);
6819 pipeDynWScale.SetScissor(sc);
6820 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6821 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6822
6823 m_commandBuffer->begin();
6824
6825 // Bind pipeline without dynamic w scaling enabled
6826 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006827 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006828 m_errorMonitor->VerifyNotFound();
6829
Chris Mayerc93536f2019-09-19 16:34:49 +02006830 // Bind pipeline that has dynamic w-scaling enabled
6831 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006832 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006833 m_errorMonitor->VerifyNotFound();
6834
6835 const auto max_vps = m_device->props.limits.maxViewports;
6836
Mark Lobodzinski20310782020-02-28 14:25:17 -07006837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006838 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6839 m_errorMonitor->VerifyFound();
6840
6841 m_errorMonitor->ExpectSuccess();
6842 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6843 m_errorMonitor->VerifyNotFound();
6844
6845 m_commandBuffer->end();
6846}
sfricke-samsung914e8002020-01-07 22:26:18 -08006847
6848TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6849 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6850
6851 // Enable Sampler YCbCr Conversion req'd extensions
6852 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6853 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6854 if (mp_extensions) {
6855 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6856 }
6857 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006858 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006859 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006860 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6861 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6862 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6863 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07006864 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08006865 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6866 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6867 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6868 } else {
6869 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6870 return;
6871 }
6872
6873 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06006874 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08006875 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6876 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6877
6878 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6879 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6880 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6881 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6882 return;
6883 }
6884
6885 // Create Ycbcr conversion
6886 VkSamplerYcbcrConversion conversions;
6887 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6888 NULL,
6889 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6890 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6891 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6892 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6893 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6894 VK_CHROMA_LOCATION_COSITED_EVEN,
6895 VK_CHROMA_LOCATION_COSITED_EVEN,
6896 VK_FILTER_NEAREST,
6897 false};
6898
Mark Lobodzinski20310782020-02-28 14:25:17 -07006899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006900 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6901 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006902}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006903
6904TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6905 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6906
6907 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6908 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6909 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6910 return;
6911 }
6912 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6913
6914 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6915
6916 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6917 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6918 return;
6919 }
6920 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6921
6922 {
6923 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6924 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6925 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6926
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006927 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6928 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006929 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6930
6931 if (!tf_features.transformFeedback) {
6932 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6933 return;
6934 }
6935 }
6936
6937 ASSERT_NO_FATAL_FAILURE(InitState());
6938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6939
6940 {
6941 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6942 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6943 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6944
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006945 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006946 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6947 info.size = 4;
6948 VkBufferObj buffer;
6949 buffer.init(*m_device, info);
6950 VkDeviceSize offsets[1]{};
6951
6952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6953 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6954 m_errorMonitor->VerifyFound();
6955 }
6956
6957 {
6958 auto vkCmdBeginTransformFeedbackEXT =
6959 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6960 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6961
6962 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6963 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6964 m_errorMonitor->VerifyFound();
6965 }
6966
6967 {
6968 auto vkCmdEndTransformFeedbackEXT =
6969 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6970 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6971
6972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6973 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6974 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6975 m_errorMonitor->VerifyFound();
6976 }
6977}
6978
6979TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6980 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6981
6982 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6983 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6984 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6985 return;
6986 }
6987 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6988
6989 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6990
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06006991 if (IsPlatform(kGalaxyS10)) {
6992 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
6993 return;
6994 }
6995
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006996 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6997 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6998 return;
6999 }
7000 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7001
7002 {
7003 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7004 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7005 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7006
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007007 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7008 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007009 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7010
7011 if (!tf_features.transformFeedback) {
7012 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7013 return;
7014 }
7015
7016 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7017 }
7018
7019 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7020
7021 auto vkCmdBindTransformFeedbackBuffersEXT =
7022 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7023 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7024
7025 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007026 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7027 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007028 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7029
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007030 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007031 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7032 info.size = 8;
7033 VkBufferObj const buffer_obj(*m_device, info);
7034
7035 // Request a firstBinding that is too large.
7036 {
7037 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7038 VkDeviceSize const offsets[1]{};
7039
7040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7041 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7042 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7043 nullptr);
7044 m_errorMonitor->VerifyFound();
7045 }
7046
7047 // Request too many bindings.
7048 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7049 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7050 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7051
7052 std::vector<VkDeviceSize> offsets(bindingCount);
7053
7054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7055 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7056 nullptr);
7057 m_errorMonitor->VerifyFound();
7058 }
7059
7060 // Request a size that is larger than the maximum size.
7061 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7062 VkDeviceSize const offsets[1]{};
7063 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7064
7065 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7066 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7067 m_errorMonitor->VerifyFound();
7068 }
7069 }
7070
7071 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007072 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007073 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7074 info.size = 8;
7075 VkBufferObj const buffer_obj(*m_device, info);
7076
7077 // Request an offset that is too large.
7078 {
7079 VkDeviceSize const offsets[1]{info.size + 4};
7080
7081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7082 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7083 m_errorMonitor->VerifyFound();
7084 }
7085
7086 // Request an offset that is not a multiple of 4.
7087 {
7088 VkDeviceSize const offsets[1]{1};
7089
7090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7091 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7092 m_errorMonitor->VerifyFound();
7093 }
7094
7095 // Request a size that is larger than the buffer's size.
7096 {
7097 VkDeviceSize const offsets[1]{};
7098 VkDeviceSize const sizes[1]{info.size + 1};
7099
7100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007101 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7102 m_errorMonitor->VerifyFound();
7103 }
7104
7105 // Request an offset and size whose sum is larger than the buffer's size.
7106 {
7107 VkDeviceSize const offsets[1]{4};
7108 VkDeviceSize const sizes[1]{info.size - 3};
7109
7110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7111 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7112 m_errorMonitor->VerifyFound();
7113 }
7114
7115 // Bind while transform feedback is active.
7116 {
7117 auto vkCmdBeginTransformFeedbackEXT =
7118 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7119 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7120 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7121
7122 VkDeviceSize const offsets[1]{};
7123
7124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7125 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7126 m_errorMonitor->VerifyFound();
7127
7128 auto vkCmdEndTransformFeedbackEXT =
7129 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7130 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7131 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7132 }
7133 }
7134
7135 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7136 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007137 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007138 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7139 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007140 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007141 VkBufferObj const buffer_obj(*m_device, info);
7142
7143 VkDeviceSize const offsets[1]{};
7144
7145 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7146 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7147 m_errorMonitor->VerifyFound();
7148 }
7149
7150 // Don't bind memory.
7151 {
7152 VkBuffer buffer{};
7153 {
7154 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7155 ASSERT_TRUE(vkCreateBuffer != nullptr);
7156
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007157 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007158 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7159 info.size = 4;
7160 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7161 }
7162
7163 VkDeviceSize const offsets[1]{};
7164
7165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7166 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7167 m_errorMonitor->VerifyFound();
7168 }
7169}
7170
7171TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7172 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7173
7174 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7175 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7176 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7177 return;
7178 }
7179 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7180
7181 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7182
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007183 if (IsPlatform(kGalaxyS10)) {
7184 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7185 return;
7186 }
7187
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007188 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7189 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7190 return;
7191 }
7192 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7193
7194 {
7195 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7196 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7197 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7198
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007199 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7200 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007201 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7202
7203 if (!tf_features.transformFeedback) {
7204 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7205 return;
7206 }
7207
7208 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7209 }
7210
7211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7212
7213 auto vkCmdBeginTransformFeedbackEXT =
7214 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7215 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7216
7217 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007218 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7219 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007220 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7221
7222 // Request a firstCounterBuffer that is too large.
7223 {
7224 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7225
7226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7227 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7228 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7229 m_errorMonitor->VerifyFound();
7230 }
7231
7232 // Request too many buffers.
7233 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7234 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7235
7236 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7237 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7238 m_errorMonitor->VerifyFound();
7239 }
7240 }
7241
7242 // Request an out-of-bounds location.
7243 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007244 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007245 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7246 info.size = 4;
7247 VkBufferObj const buffer_obj(*m_device, info);
7248
7249 VkDeviceSize const offsets[1]{1};
7250
7251 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7252 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7253 m_errorMonitor->VerifyFound();
7254 }
7255
7256 // Request specific offsets without specifying buffers.
7257 {
7258 VkDeviceSize const offsets[1]{};
7259
7260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7261 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7262 m_errorMonitor->VerifyFound();
7263 }
7264
7265 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7266 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007267 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007268 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7269 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007270 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007271 VkBufferObj const buffer_obj(*m_device, info);
7272
7273 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7274 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7275 m_errorMonitor->VerifyFound();
7276 }
7277
7278 // Begin while transform feedback is active.
7279 {
7280 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7281
7282 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7283 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7284 m_errorMonitor->VerifyFound();
7285
7286 auto vkCmdEndTransformFeedbackEXT =
7287 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7288 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7289
7290 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7291 }
7292}
7293
7294TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7295 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7296
7297 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7298 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7299 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7300 return;
7301 }
7302 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7303
7304 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7305
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007306 if (IsPlatform(kGalaxyS10)) {
7307 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7308 return;
7309 }
7310
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007311 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7312 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7313 return;
7314 }
7315 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7316
7317 {
7318 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7319 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7320 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7321
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007322 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7323 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007324 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7325
7326 if (!tf_features.transformFeedback) {
7327 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7328 return;
7329 }
7330
7331 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7332 }
7333
7334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7335
7336 auto vkCmdEndTransformFeedbackEXT =
7337 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7338 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7339
7340 {
7341 // Activate transform feedback.
7342 auto vkCmdBeginTransformFeedbackEXT =
7343 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7344 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7345 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7346
7347 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007348 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7349 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007350 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7351
7352 // Request a firstCounterBuffer that is too large.
7353 {
7354 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7355
7356 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7357 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7358 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7359 m_errorMonitor->VerifyFound();
7360 }
7361
7362 // Request too many buffers.
7363 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7364 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7365
7366 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7367 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7368 m_errorMonitor->VerifyFound();
7369 }
7370 }
7371
7372 // Request an out-of-bounds location.
7373 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007374 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007375 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7376 info.size = 4;
7377 VkBufferObj const buffer_obj(*m_device, info);
7378
7379 VkDeviceSize const offsets[1]{1};
7380
7381 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7382 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7383 m_errorMonitor->VerifyFound();
7384 }
7385
7386 // Request specific offsets without specifying buffers.
7387 {
7388 VkDeviceSize const offsets[1]{};
7389
7390 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7391 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7392 m_errorMonitor->VerifyFound();
7393 }
7394
7395 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7396 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007397 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007398 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7399 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007400 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007401 VkBufferObj const buffer_obj(*m_device, info);
7402
7403 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7404 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7405 m_errorMonitor->VerifyFound();
7406 }
7407 }
7408
7409 // End while transform feedback is inactive.
7410 {
7411 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7412
7413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7414 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7415 m_errorMonitor->VerifyFound();
7416 }
7417}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007418
sfricke-samsung39ee2442020-07-22 21:21:15 -07007419TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7420 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007421
7422 // protect memory added in VK 1.1
7423 SetTargetApiVersion(VK_API_VERSION_1_1);
7424
7425 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7426 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7427 } else {
7428 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7429 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7430 return;
7431 }
7432 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7433
7434 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7435 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7436 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7437
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007438 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7439 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007440 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7441
7442 if (protected_memory_features.protectedMemory == VK_FALSE) {
7443 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7444 return;
7445 };
7446
7447 // Turns m_commandBuffer into a protected command buffer
7448 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7449
7450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7451 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7452 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7453 return;
7454 }
7455
7456 VkBufferObj indirect_buffer;
7457 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7458 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7459
7460 VkBufferObj indexed_indirect_buffer;
7461 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7462 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7463
7464 VkBufferObj index_buffer;
7465 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7466
7467 CreatePipelineHelper pipe(*this);
7468 pipe.InitInfo();
7469 pipe.InitState();
7470 pipe.CreateGraphicsPipeline();
7471
sfricke-samsung39ee2442020-07-22 21:21:15 -07007472 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007473 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007474 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7475 query_pool_create_info.queryCount = 1;
7476 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7477
sfricke-samsung071af2d2020-07-02 10:37:22 -07007478 m_commandBuffer->begin();
7479 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7480
7481 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7482
7483 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7484 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7485 m_errorMonitor->VerifyFound();
7486
7487 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7488
7489 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7490 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7491 sizeof(VkDrawIndexedIndirectCommand));
7492 m_errorMonitor->VerifyFound();
7493
7494 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007495
7496 // Query should be outside renderpass
7497 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7498
7499 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7500 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7501 m_errorMonitor->VerifyFound();
7502
7503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7504 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7505 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7506 m_errorMonitor->VerifyFound();
7507
sfricke-samsung071af2d2020-07-02 10:37:22 -07007508 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007509
7510 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007511}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007512
7513TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7514 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7515
7516 SetTargetApiVersion(VK_API_VERSION_1_1);
7517
7518 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7519 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7520 } else {
7521 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7522 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7523 return;
7524 }
7525 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7526
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007527 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7528 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7529 return;
7530 }
7531
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007532 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7533 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7534 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007535 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7536 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7537 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007538
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007539 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7540 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007541 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7542
7543 if (protected_memory_features.protectedMemory == VK_FALSE) {
7544 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7545 return;
7546 };
7547
sfricke-samsung21286f82021-11-16 08:21:46 -08007548 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7549 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7550 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7551 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7552
7553 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
7554 ASSERT_NO_FATAL_FAILURE(InitState());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007555
7556 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7557 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7558
7559 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7560 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7561 return;
7562 }
7563
7564 // Create actual protected and unprotected buffers
7565 VkBuffer buffer_protected = VK_NULL_HANDLE;
7566 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007567 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007568 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007569 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7570 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7571 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007572 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7573
7574 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7575 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7576 buffer_create_info.flags = 0;
7577 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7578
7579 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007580 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007581 VkImageObj image_protected(m_device);
7582 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007583 VkImageObj image_protected_descriptor(m_device);
7584 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007585 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007586 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007587 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007588 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007589 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007590 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7591 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007592 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7593 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007594 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7595 image_create_info.arrayLayers = 1;
7596 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007597 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7598 image_protected.init_no_mem(*m_device, image_create_info);
7599 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7600
locke-lunarg0de02522020-10-27 22:55:17 -06007601 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7602 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007603
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007604 image_create_info.flags = 0;
7605 image_unprotected.init_no_mem(*m_device, image_create_info);
7606 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7607
locke-lunarg0de02522020-10-27 22:55:17 -06007608 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7609 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007610
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007611 // Create protected and unproteced memory
7612 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7613 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7614
sfricke-samsung1c61f192021-12-31 01:53:03 -06007615 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007616 alloc_info.allocationSize = 0;
7617
7618 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7619 VkMemoryRequirements mem_reqs_protected;
7620 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7621 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7622 VkMemoryRequirements mem_reqs_unprotected;
7623 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7624 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7625
7626 // Get memory index for a protected and unprotected memory
7627 VkPhysicalDeviceMemoryProperties phys_mem_props;
7628 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7629 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7630 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7631 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7632 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7633 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7634 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7635 memory_type_unprotected = i;
7636 }
7637 // Check just protected bit is in type at all
7638 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7639 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7640 memory_type_protected = i;
7641 }
7642 }
7643 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7644 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7645 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7646 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7647 return;
7648 }
7649
7650 alloc_info.memoryTypeIndex = memory_type_protected;
7651 alloc_info.allocationSize = mem_reqs_protected.size;
7652 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7653
7654 alloc_info.allocationSize = mem_reqs_unprotected.size;
7655 alloc_info.memoryTypeIndex = memory_type_unprotected;
7656 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7657
7658 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7659 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7660 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7661 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007662 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7663 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7664
7665 // need memory bound at image view creation time
7666 image_views[0] = image_protected.targetView(image_format);
7667 image_views[1] = image_unprotected.targetView(image_format);
7668 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7669 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007670
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007671 // A renderpass and framebuffer that contains a protected and unprotected image view
7672 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007673 {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 -07007674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7675 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007676 {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 -07007677 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7678 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7679 };
7680 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7681 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7682 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7683 VkSubpassDependency dependency = {0,
7684 0,
7685 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7686 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7687 VK_ACCESS_SHADER_WRITE_BIT,
7688 VK_ACCESS_SHADER_WRITE_BIT,
7689 VK_DEPENDENCY_BY_REGION_BIT};
7690 VkRenderPassCreateInfo render_pass_create_info = {
7691 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7692 VkRenderPass render_pass;
7693 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7694 VkFramebufferCreateInfo framebuffer_create_info = {
7695 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7696 VkFramebuffer framebuffer;
7697 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7698
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007699 // Various structs used for commands
7700 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7701 VkImageBlit blit_region = {};
7702 blit_region.srcSubresource = image_subresource;
7703 blit_region.dstSubresource = image_subresource;
7704 blit_region.srcOffsets[0] = {0, 0, 0};
7705 blit_region.srcOffsets[1] = {8, 8, 1};
7706 blit_region.dstOffsets[0] = {0, 8, 0};
7707 blit_region.dstOffsets[1] = {8, 8, 1};
7708 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7709 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7710 VkBufferCopy buffer_copy = {0, 0, 64};
7711 VkBufferImageCopy buffer_image_copy = {};
7712 buffer_image_copy.bufferRowLength = 0;
7713 buffer_image_copy.bufferImageHeight = 0;
7714 buffer_image_copy.imageSubresource = image_subresource;
7715 buffer_image_copy.imageOffset = {0, 0, 0};
7716 buffer_image_copy.imageExtent = {1, 1, 1};
7717 buffer_image_copy.bufferOffset = 0;
7718 VkImageCopy image_copy = {};
7719 image_copy.srcSubresource = image_subresource;
7720 image_copy.srcOffset = {0, 0, 0};
7721 image_copy.dstSubresource = image_subresource;
7722 image_copy.dstOffset = {0, 0, 0};
7723 image_copy.extent = {1, 1, 1};
7724 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007725 VkRect2D render_area = {{0, 0}, {8, 8}};
7726 VkRenderPassBeginInfo render_pass_begin = {
7727 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7728 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7729 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7730 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007731
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007732 const char fsSource[] = R"glsl(
7733 #version 450
7734 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7735 layout(set=0, binding=1, rgba8) uniform image2D si1;
7736 layout(location=0) out vec4 x;
7737 void main(){
7738 x = vec4(bar.y);
7739 imageStore(si1, ivec2(0), vec4(0));
7740 }
7741 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007742 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007743
aitor-lunargf15acd52022-03-09 22:13:25 +01007744 CreatePipelineHelper g_pipe(*this, 2u);
locke-lunarg0de02522020-10-27 22:55:17 -06007745 g_pipe.InitInfo();
7746 g_pipe.gp_ci_.renderPass = render_pass;
7747 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7748 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7749 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg0de02522020-10-27 22:55:17 -06007750 g_pipe.InitState();
7751 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7752
7753 VkSampler sampler;
7754 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7755 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7756 ASSERT_VK_SUCCESS(err);
7757
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007758 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007759 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007760 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7761 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7762 g_pipe.descriptor_set_->UpdateDescriptorSets();
7763
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007764 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007765 // will get undefined values, but not invalid if protectedNoFault is supported
7766 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7767 if (!protected_memory_properties.protectedNoFault) {
7768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7769 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7770 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7771 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007772
sfricke-samsung21286f82021-11-16 08:21:46 -08007773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7774 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7775 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7776 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007777
sfricke-samsung21286f82021-11-16 08:21:46 -08007778 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7779 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7780 &subresource_range);
7781 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007782
sfricke-samsung21286f82021-11-16 08:21:46 -08007783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7784 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7785 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007786
sfricke-samsung21286f82021-11-16 08:21:46 -08007787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7788 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7789 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007790
sfricke-samsung21286f82021-11-16 08:21:46 -08007791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7792 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7793 1, &buffer_image_copy);
7794 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007795
sfricke-samsung21286f82021-11-16 08:21:46 -08007796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7797 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7798 1, &buffer_image_copy);
7799 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007800
sfricke-samsung21286f82021-11-16 08:21:46 -08007801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7802 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7803 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7804 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007805
sfricke-samsung21286f82021-11-16 08:21:46 -08007806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7807 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7808 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7809 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007810
sfricke-samsung21286f82021-11-16 08:21:46 -08007811 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7812 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7813 1, &buffer_image_copy);
7814 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007815
sfricke-samsung21286f82021-11-16 08:21:46 -08007816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7817 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7818 1, &buffer_image_copy);
7819 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007820
sfricke-samsung21286f82021-11-16 08:21:46 -08007821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7822 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7823 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007824
sfricke-samsung21286f82021-11-16 08:21:46 -08007825 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7826 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7827 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007828
sfricke-samsung21286f82021-11-16 08:21:46 -08007829 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007830
sfricke-samsung21286f82021-11-16 08:21:46 -08007831 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7832 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7833 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007834
sfricke-samsung21286f82021-11-16 08:21:46 -08007835 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7836 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7837 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7838 VkDeviceSize offset = 0;
7839 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7840 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007841
sfricke-samsung21286f82021-11-16 08:21:46 -08007842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7843 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7844 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7845 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06007847
sfricke-samsung21286f82021-11-16 08:21:46 -08007848 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7849 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007850
sfricke-samsung21286f82021-11-16 08:21:46 -08007851 vk::CmdEndRenderPass(m_commandBuffer->handle());
7852 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007853 m_commandBuffer->end();
7854
7855 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007856 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007857 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7858 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007859 g_pipe.descriptor_set_->UpdateDescriptorSets();
7860
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007861 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007862 if (!protected_memory_properties.protectedNoFault) {
7863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7864 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7865 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7866 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007867
sfricke-samsung21286f82021-11-16 08:21:46 -08007868 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7869 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
7870 1, &subresource_range);
7871 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007872
sfricke-samsung21286f82021-11-16 08:21:46 -08007873 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7874 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7875 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007876
sfricke-samsung21286f82021-11-16 08:21:46 -08007877 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7878 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
7879 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
7880 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007881
sfricke-samsung21286f82021-11-16 08:21:46 -08007882 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7883 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7884 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7885 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007886
sfricke-samsung21286f82021-11-16 08:21:46 -08007887 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7888 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7889 buffer_unprotected, 1, &buffer_image_copy);
7890 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007891
sfricke-samsung21286f82021-11-16 08:21:46 -08007892 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7893 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7894 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007895
sfricke-samsung21286f82021-11-16 08:21:46 -08007896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7897 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7898 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007899
sfricke-samsung21286f82021-11-16 08:21:46 -08007900 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007901
sfricke-samsung21286f82021-11-16 08:21:46 -08007902 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7903 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7904 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007905
sfricke-samsung21286f82021-11-16 08:21:46 -08007906 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7907 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7908 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7909 VkDeviceSize offset = 0;
7910 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7911 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007912
sfricke-samsung21286f82021-11-16 08:21:46 -08007913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7915 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7916 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06007917
sfricke-samsung21286f82021-11-16 08:21:46 -08007918 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
7919 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007920 protectedCommandBuffer.end();
7921
sfricke-samsung96cd9932020-08-23 20:57:11 -07007922 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7923 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7924
sfricke-samsung1c61f192021-12-31 01:53:03 -06007925 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
7926 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07007927 submit_info.commandBufferCount = 2;
7928 submit_info.pCommandBuffers = comman_buffers;
7929
7930 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08007931 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007933 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7934 m_errorMonitor->VerifyFound();
7935
7936 protected_submit_info.protectedSubmit = VK_FALSE;
7937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7938 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7939 m_errorMonitor->VerifyFound();
7940
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007941 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7942 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7943 vk::FreeMemory(device(), memory_protected, nullptr);
7944 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007945 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7946 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007947}
locke-lunarg6b0de702020-08-07 17:42:13 -06007948
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007949TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007950 TEST_DESCRIPTION(
7951 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7952 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7953
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07007954 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7955 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7956 } else {
7957 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7958 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7959 return;
7960 }
7961 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7962 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)) {
7963 m_device_extension_names.push_back(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
7964 } else {
7965 printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
7966 return;
7967 }
7968
7969 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7970 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7971 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7972
7973 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
7974 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
7975 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7976 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7977
7978 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
7979 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
7980 return;
7981 }
locke-lunarg6b0de702020-08-07 17:42:13 -06007982
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007983 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06007984 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7985 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7986 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7987 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7988
7989 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7990 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7991 return;
7992 }
7993
7994 VkFormat buffer_view_format =
7995 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7996 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7997 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7998 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7999 return;
8000 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008001 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8003
8004 VkPhysicalDeviceFeatures device_features = {};
8005 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8006 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8007 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8008 return;
8009 }
8010
8011 VkImageObj image(m_device);
8012 image.Init(image_ci);
8013 VkImageView image_view = image.targetView(image_format);
8014
8015 VkSampler sampler = VK_NULL_HANDLE;
8016 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8017 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8018
8019 VkBufferObj buffer;
8020 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8021
sfricke-samsung1c61f192021-12-31 01:53:03 -06008022 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06008023 bvci.buffer = buffer.handle();
8024 bvci.format = buffer_view_format;
8025 bvci.range = VK_WHOLE_SIZE;
8026 VkBufferView buffer_view;
8027 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8028
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008029 char const *fsSource = R"glsl(
8030 #version 450
8031 layout(set=0, binding=3, r32f) uniform image2D si0;
8032 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8033 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8034 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8035 void main() {
8036 imageAtomicExchange(si0, ivec2(0), 1);
8037 imageAtomicExchange(si1[0], ivec2(0), 1);
8038 imageAtomicExchange(si1[1], ivec2(0), 1);
8039 imageAtomicExchange(stb2, 0, 1);
8040 imageAtomicExchange(stb3[0], 0, 1);
8041 imageAtomicExchange(stb3[1], 0, 1);
8042 }
8043 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008044
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008045 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
8046 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06008047
8048 CreatePipelineHelper g_pipe(*this);
8049 g_pipe.InitInfo();
8050 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008051 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8052 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8053 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8054 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008055 g_pipe.InitState();
8056 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8057
locke-lunarg76e8dee2020-08-21 13:20:02 -06008058 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008059 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008060 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008061 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008062 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008063 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008064 g_pipe.descriptor_set_->UpdateDescriptorSets();
8065
8066 m_commandBuffer->begin();
8067 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8068 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8069 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8070 &g_pipe.descriptor_set_->set_, 0, nullptr);
8071
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008072 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8077 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8078 m_errorMonitor->VerifyFound();
8079
8080 m_commandBuffer->EndRenderPass();
8081 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008082 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8083 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008084}
locke-lunargae1bbab2020-09-10 11:55:56 -06008085
8086TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8087 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8088
8089 ASSERT_NO_FATAL_FAILURE(Init());
8090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8091
8092 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008093 char const *const vsSource = R"glsl(
8094 #version 450
8095 layout(push_constant, std430) uniform foo {
8096 bool b;
8097 float f2[3];
8098 vec3 v;
8099 vec4 v2[2];
8100 mat3 m;
8101 } constants;
8102 void func1( float f ){
8103 // use the whole v2[1]. byte: 48-63.
8104 vec2 v2 = constants.v2[1].yz;
8105 }
8106 void main(){
8107 // use only v2[0].z. byte: 40-43.
8108 func1( constants.v2[0].z);
8109 // index of m is variable. The all m is used. byte: 64-99.
8110 for(int i=1;i<2;++i) {
8111 vec3 v3 = constants.m[i];
8112 }
8113 }
8114 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008115
8116 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008117 char const *const fsSource = R"glsl(
8118 #version 450
8119 struct foo1{
8120 int i[4];
8121 }f;
8122 layout(push_constant, std430) uniform foo {
8123 float x[2][2][2];
8124 foo1 s;
8125 foo1 ss[3];
8126 } constants;
8127 void main(){
8128 // use s. byte: 32-47.
8129 f = constants.s;
8130 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8131 for(int i=1;i<2;++i) {
8132 int ii = constants.ss[i].i[3];
8133 }
8134 }
8135 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008136
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008137 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8138 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008139
8140 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8141 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8142
8143 VkPipelineLayoutCreateInfo pipeline_layout_info{
8144 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8145
8146 VkPipelineLayout pipeline_layout;
8147 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8148
8149 CreatePipelineHelper g_pipe(*this);
8150 g_pipe.InitInfo();
8151 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8152 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8153 g_pipe.InitState();
8154 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8155
8156 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8157 VkPipelineLayout pipeline_layout_small;
8158 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8159
8160 CreatePipelineHelper g_pipe_small_range(*this);
8161 g_pipe_small_range.InitInfo();
8162 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8163 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8164 g_pipe_small_range.InitState();
8165
sfricke-samsung7699b912021-04-12 23:01:51 -07008166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008168 g_pipe_small_range.CreateGraphicsPipeline();
8169 m_errorMonitor->VerifyFound();
8170
8171 m_commandBuffer->begin();
8172 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8173
Piers Daniella7f93b62021-11-20 12:32:04 -07008174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008175 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8176 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8177 &g_pipe.descriptor_set_->set_, 0, nullptr);
8178 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8179 m_errorMonitor->VerifyFound();
8180
locke-lunargae1bbab2020-09-10 11:55:56 -06008181 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008182
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008183 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8184 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8185 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8186 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008187 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008188 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8189 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8190 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8191 // m_errorMonitor->VerifyFound();
8192
Piers Daniella7f93b62021-11-20 12:32:04 -07008193 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008194 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8195 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8196 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008197
8198 m_errorMonitor->ExpectSuccess();
8199 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8200 68, dummy_values);
8201 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8202 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008203}
8204
8205TEST_F(VkLayerTest, VerifyVertextBinding) {
8206 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8207
8208 ASSERT_NO_FATAL_FAILURE(Init());
8209 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8210
8211 VkBufferObj vtx_buf;
8212 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8213 vtx_buf.init(*m_device, info);
8214
8215 CreatePipelineHelper pipe(*this);
8216 pipe.InitInfo();
8217 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8218 VkVertexInputBindingDescription vtx_binding_des[3] = {
8219 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8220
8221 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8222 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8223 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8224 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8225 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8226 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8227 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8228 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8229 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8230 pipe.InitState();
8231 pipe.CreateGraphicsPipeline();
8232
8233 m_commandBuffer->begin();
8234 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8235 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8236 VkDeviceSize offset = 0;
8237 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8238
8239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8244 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8245 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008246
8247 m_commandBuffer->EndRenderPass();
8248 m_commandBuffer->end();
8249}
locke-lunargd7a08e92020-10-21 00:24:00 -06008250
8251TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8252 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8253 ASSERT_NO_FATAL_FAILURE(Init());
8254 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8255
8256 CreatePipelineHelper pipe(*this);
8257 pipe.InitInfo();
8258
8259 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8260
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008261 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008262 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8263 dyn_state_ci.pDynamicStates = dyn_states.data();
8264 pipe.dyn_state_ci_ = dyn_state_ci;
8265 pipe.InitState();
8266 pipe.CreateGraphicsPipeline();
8267
8268 m_commandBuffer->begin();
8269 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8270 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8271
8272 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8273 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8274 VkRect2D scissor = {{0, 0}, {16, 16}};
8275 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8276 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8277
8278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8279 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8280 m_errorMonitor->VerifyFound();
8281
8282 m_commandBuffer->EndRenderPass();
8283 m_commandBuffer->end();
8284}
locke-lunarg0de02522020-10-27 22:55:17 -06008285
8286TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8287 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8288 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8289 if (version < VK_API_VERSION_1_1) {
8290 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8291 return;
8292 }
8293 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8294
8295 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8296 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8297 } else {
8298 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8299 return;
8300 }
8301
8302 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8304
8305 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8306 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008307
8308 VkFormatProperties format_props;
8309 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8310 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8311 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8312 return;
8313 }
8314
locke-lunarg0de02522020-10-27 22:55:17 -06008315 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8316 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8317
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008318 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008319 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008320 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008321 image_format_info.type = image_ci.imageType;
8322 image_format_info.format = image_ci.format;
8323 image_format_info.tiling = image_ci.tiling;
8324 image_format_info.usage = image_ci.usage;
8325 image_format_info.flags = image_ci.flags;
8326
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008327 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8328 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008329
8330 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8331
8332 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8333 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8334 return;
8335 }
8336
8337 VkImageObj image(m_device);
8338 image.Init(image_ci);
8339 VkImageView imageView = image.targetView(format, imageViewType);
8340
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008341 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008342 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8343 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8344 VkSampler sampler;
8345 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8346
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008347 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008348 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8349 sampler_ci.pNext = &reduction_mode_ci;
8350 VkSampler sampler_rediction;
8351 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8352
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008353 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008354
8355 CreatePipelineHelper g_pipe(*this);
8356 g_pipe.InitInfo();
8357 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8358 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8359 g_pipe.InitState();
8360 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8361
8362 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8363 g_pipe.descriptor_set_->UpdateDescriptorSets();
8364
8365 m_commandBuffer->begin();
8366 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8367 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8368 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8369 &g_pipe.descriptor_set_->set_, 0, nullptr);
8370
8371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8372 m_commandBuffer->Draw(1, 0, 0, 0);
8373 m_errorMonitor->VerifyFound();
8374
8375 m_commandBuffer->EndRenderPass();
8376 m_commandBuffer->end();
8377 m_commandBuffer->reset();
8378
8379 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8380 g_pipe.descriptor_set_->UpdateDescriptorSets();
8381
8382 m_commandBuffer->begin();
8383 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8384 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8385 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8386 &g_pipe.descriptor_set_->set_, 0, nullptr);
8387
8388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8389 m_commandBuffer->Draw(1, 0, 0, 0);
8390 m_errorMonitor->VerifyFound();
8391
8392 m_commandBuffer->EndRenderPass();
8393 m_commandBuffer->end();
8394}
8395
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008396TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008397 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 -07008398
Clemens Kern5a42ea62021-09-29 16:30:23 +02008399 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8400 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8401 if (!AreRequestedExtensionsEnabled()) {
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008402 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8403 return;
8404 }
8405
8406 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8408
8409 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8410 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008411 auto image_ci = vk_testing::Image::create_info();
8412 image_ci.imageType = VK_IMAGE_TYPE_3D;
8413 image_ci.format = format;
8414 image_ci.extent.width = 128;
8415 image_ci.extent.height = 128;
8416 image_ci.mipLevels = 1;
8417 image_ci.arrayLayers = 1;
8418 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8419 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8420 image_ci.usage = usage;
8421 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008422
8423 VkImageObj image(m_device);
8424 image.Init(image_ci);
8425 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8426 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8427
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008428 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008429 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8430 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8431 VkSampler sampler;
8432 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8433
Clemens Kern5a42ea62021-09-29 16:30:23 +02008434 static const char fs_src[] = R"glsl(
8435 #version 450
8436 layout(set=0, binding=0) uniform sampler3D s;
8437 layout(location=0) out vec4 x;
8438 void main(){
8439 x = texture(s, vec3(1));
8440 }
8441 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008442 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008443
8444 CreatePipelineHelper g_pipe(*this);
8445 g_pipe.InitInfo();
8446 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8447 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8448 g_pipe.InitState();
8449 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8450
8451 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8452 g_pipe.descriptor_set_->UpdateDescriptorSets();
8453
8454 m_commandBuffer->begin();
8455 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8456 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8457 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8458 &g_pipe.descriptor_set_->set_, 0, nullptr);
8459
8460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8461 m_commandBuffer->Draw(1, 0, 0, 0);
8462 m_errorMonitor->VerifyFound();
8463
8464 m_commandBuffer->EndRenderPass();
8465 m_commandBuffer->end();
8466}
8467
locke-lunarg0de02522020-10-27 22:55:17 -06008468TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8469 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8470 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8471 if (version < VK_API_VERSION_1_1) {
8472 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8473 return;
8474 }
8475 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8476 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8477 } else {
8478 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8479 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8480 return;
8481 }
8482 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8483
8484 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8485 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8486 } else {
8487 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8488 return;
8489 }
8490
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008491 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008492 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008493 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008494
8495 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8497
8498 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8499 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8500 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008501 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8502 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008503 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8504 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8505 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8506 return;
8507 }
8508 CreatePipelineHelper pipe(*this);
8509 pipe.InitInfo();
8510 pipe.InitState();
8511 pipe.CreateGraphicsPipeline();
8512
8513 m_commandBuffer->begin();
8514 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8515 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8516
8517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8518 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8519 m_errorMonitor->VerifyFound();
8520
8521 m_commandBuffer->EndRenderPass();
8522 m_commandBuffer->end();
8523}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008524
8525TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8526 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8527
8528 // Enable KHR_fragment_shading_rate and all of its required extensions
8529 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8530 if (fsr_extensions) {
8531 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8532 }
8533 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8534
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008535 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8536 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008537 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8538 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8539 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8540 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008541 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8542 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008543 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8544 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8545 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8546 } else {
8547 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8548 return;
8549 }
8550
sfricke-samsung1c61f192021-12-31 01:53:03 -06008551 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008552 fsr_features.pipelineFragmentShadingRate = true;
8553
sfricke-samsung1c61f192021-12-31 01:53:03 -06008554 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008555
8556 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8557
8558 // Find address of extension call and make the call
8559 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8560 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8561 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8562
8563 VkExtent2D fragmentSize = {1, 1};
8564 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8565 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8566
8567 m_commandBuffer->begin();
8568 fragmentSize.width = 0;
8569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8570 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8571 m_errorMonitor->VerifyFound();
8572 fragmentSize.width = 1;
8573
8574 fragmentSize.height = 0;
8575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8576 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8577 m_errorMonitor->VerifyFound();
8578 fragmentSize.height = 1;
8579
8580 fragmentSize.width = 3;
8581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8582 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8583 m_errorMonitor->VerifyFound();
8584 fragmentSize.width = 1;
8585
8586 fragmentSize.height = 3;
8587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8588 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8589 m_errorMonitor->VerifyFound();
8590 fragmentSize.height = 1;
8591
8592 fragmentSize.width = 8;
8593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8594 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8595 m_errorMonitor->VerifyFound();
8596 fragmentSize.width = 1;
8597
8598 fragmentSize.height = 8;
8599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8600 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8601 m_errorMonitor->VerifyFound();
8602 fragmentSize.height = 1;
8603 m_commandBuffer->end();
8604}
8605
8606TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8607 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8608
8609 // Enable KHR_fragment_shading_rate and all of its required extensions
8610 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8611 if (fsr_extensions) {
8612 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8613 }
8614 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8615
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008616 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8617 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008618 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8619 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8620 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8621 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008622 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8623 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008624 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8625 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8626 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8627 } else {
8628 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8629 return;
8630 }
8631
8632 ASSERT_NO_FATAL_FAILURE(InitState());
8633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8634
8635 // Find address of extension call and make the call
8636 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8637 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8638 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8639
8640 VkExtent2D fragmentSize = {1, 1};
8641 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8642 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8643
8644 m_commandBuffer->begin();
8645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8646 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8647 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8648 m_errorMonitor->VerifyFound();
8649 m_commandBuffer->end();
8650}
8651
8652TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8653 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8654
8655 // Enable KHR_fragment_shading_rate and all of its required extensions
8656 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8657 if (fsr_extensions) {
8658 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8659 }
8660 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8661
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008662 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8663 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008664 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8665 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8666 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8667 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008668 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8669 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008670 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8671 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8672 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8673 } else {
8674 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8675 return;
8676 }
8677
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008678 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8679 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008680
8681 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8682 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8683 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8684
8685 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8687
8688 // Find address of extension call and make the call
8689 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8690 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8691 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8692
8693 VkExtent2D fragmentSize = {1, 1};
8694 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8695 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8696
8697 m_commandBuffer->begin();
8698
8699 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8701 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8702 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8703 m_errorMonitor->VerifyFound();
8704 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8705
8706 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8708 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8709 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8710 m_errorMonitor->VerifyFound();
8711 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8712
8713 m_commandBuffer->end();
8714}
8715
8716TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8717 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8718
8719 // Enable KHR_fragment_shading_rate and all of its required extensions
8720 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8721 if (fsr_extensions) {
8722 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8723 }
8724 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8725
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008726 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8727 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008728 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8729 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8730 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8731 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008732 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8733 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008734 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8735 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8736 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8737 } else {
8738 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8739 return;
8740 }
8741
8742 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8743 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8744 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008745 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8746 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008747 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8748
8749 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8750 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8751 return;
8752 }
8753
8754 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8755
8756 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8758
8759 // Find address of extension call and make the call
8760 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8761 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8762 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8763
8764 VkExtent2D fragmentSize = {1, 1};
8765 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8766 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8767
8768 m_commandBuffer->begin();
8769 fragmentSize.width = 2;
8770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8771 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8772 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8773 m_errorMonitor->VerifyFound();
8774 fragmentSize.width = 1;
8775
8776 fragmentSize.height = 2;
8777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8778 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8779 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8780 m_errorMonitor->VerifyFound();
8781 fragmentSize.height = 1;
8782}
8783
8784TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8785 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8786
8787 // Enable KHR_fragment_shading_rate and all of its required extensions
8788 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8789 if (fsr_extensions) {
8790 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8791 }
8792 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8793
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008794 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8795 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008796 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8797 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8798 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8799 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008800 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8801 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008802 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8803 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8804 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8805 } else {
8806 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8807 return;
8808 }
8809
8810 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8811 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8812 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8813 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008814 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8815 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008816 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8817
8818 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8819 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8820 return;
8821 }
8822
8823 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8824 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8825 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008826 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8827 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008828 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8829
8830 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8831 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8832 return;
8833 }
8834
8835 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8836 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8837
8838 // Find address of extension call and make the call
8839 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8840 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8841 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8842
8843 VkExtent2D fragmentSize = {1, 1};
8844 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8845 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8846
8847 m_commandBuffer->begin();
8848 if (fsr_features.primitiveFragmentShadingRate) {
8849 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8851 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8852 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8853 m_errorMonitor->VerifyFound();
8854 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8855 }
8856
8857 if (fsr_features.attachmentFragmentShadingRate) {
8858 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8860 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8861 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8862 m_errorMonitor->VerifyFound();
8863 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8864 }
8865 m_commandBuffer->end();
8866}
8867
8868TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8869 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8870
8871 // Enable KHR_fragment_shading_rate and all of its required extensions
8872 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8873 if (fsr_extensions) {
8874 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8875 }
8876 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8877
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008878 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8879 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008880 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8881 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8882 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8883 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008884 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8885 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008886 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8887 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8888 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8889 } else {
8890 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8891 return;
8892 }
8893
8894 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8895 if (eds_extension) {
8896 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8897 } else {
8898 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8899 return;
8900 }
8901
8902 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8903 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8904 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8905 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008906 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8907 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008908 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8909
8910 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8911 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8912 return;
8913 }
8914
8915 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8916 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8917 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008918 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008919 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008920 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8921 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008922 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8923
8924 if (!fsr_features.primitiveFragmentShadingRate) {
8925 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8926 return;
8927 }
8928
8929 if (!features2.features.multiViewport) {
8930 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8931 return;
8932 }
8933
8934 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8936
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008937 char const *vsSource = R"glsl(
8938 #version 450
8939 #extension GL_EXT_fragment_shading_rate : enable
8940 void main() {
8941 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8942 }
8943 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008944
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008945 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008946
8947 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008948 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8949 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008950 pipe.AddShader(&fs);
8951 pipe.AddDefaultColorAttachment();
8952 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008953 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008954 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008955 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008956 pipe.AddShader(&vs);
8957 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8958 ASSERT_VK_SUCCESS(err);
8959 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008960 m_commandBuffer->begin();
8961 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8962
8963 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8964
8965 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8966 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8967 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8968 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8969
8970 // error produced here.
8971 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
8972
8973 m_errorMonitor->VerifyFound();
8974
8975 m_commandBuffer->EndRenderPass();
8976 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008977}
ziga-lunargdada63d2021-07-13 22:10:11 +02008978
8979TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
8980 TEST_DESCRIPTION("Update buffer with invalid dataSize");
8981
8982 ASSERT_NO_FATAL_FAILURE(Init());
8983
8984 uint32_t update_data[4] = {0, 0, 0, 0};
8985 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
8986 VkMemoryPropertyFlags reqs = 0;
8987 VkBufferObj buffer;
8988 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
8989
8990 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
8991 m_commandBuffer->begin();
8992 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
8993 m_commandBuffer->end();
8994 m_errorMonitor->VerifyFound();
8995}
ziga-lunargc08456d2021-07-16 21:40:13 +02008996
8997TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
8998 TEST_DESCRIPTION("Update buffer with invalid dst offset");
8999
9000 ASSERT_NO_FATAL_FAILURE(Init());
9001
9002 uint32_t update_data[4] = {0, 0, 0, 0};
9003 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9004 VkMemoryPropertyFlags reqs = 0;
9005 VkBufferObj buffer;
9006 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9007
9008 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
9009 m_commandBuffer->begin();
9010 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
9011 m_commandBuffer->end();
9012 m_errorMonitor->VerifyFound();
9013}
ziga-lunarg4e31a752021-07-22 14:35:03 +02009014
9015TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
9016 TEST_DESCRIPTION(
9017 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
9018
9019 ASSERT_NO_FATAL_FAILURE(Init());
9020
9021 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
9022 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
9023 if (INVALID_QUEUE == no_gfx_qfi) {
9024 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
9025 return;
9026 }
9027
9028 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
9029 ASSERT_TRUE(command_pool.initialized());
9030 VkCommandBufferObj command_buffer(m_device, &command_pool);
9031
9032 VkDescriptorPoolSize ds_type_count = {};
9033 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9034 ds_type_count.descriptorCount = 1;
9035
9036 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
9037 ds_pool_ci.maxSets = 1;
9038 ds_pool_ci.poolSizeCount = 1;
9039 ds_pool_ci.flags = 0;
9040 ds_pool_ci.pPoolSizes = &ds_type_count;
9041
9042 VkDescriptorPool ds_pool;
9043 vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, nullptr, &ds_pool);
9044
9045 VkDescriptorSetLayoutBinding dsl_binding = {};
9046 dsl_binding.binding = 0;
9047 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9048 dsl_binding.descriptorCount = 1;
9049 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9050 dsl_binding.pImmutableSamplers = nullptr;
9051
9052 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9053
9054 VkDescriptorSet descriptorSet;
9055 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9056 alloc_info.descriptorSetCount = 1;
9057 alloc_info.descriptorPool = ds_pool;
9058 alloc_info.pSetLayouts = &ds_layout.handle();
9059 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9060
9061 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9062 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9063
9064 command_buffer.begin();
9065 // Set invalid set
9066 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9067 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9068 &descriptorSet, 0, nullptr);
9069 m_errorMonitor->VerifyFound();
9070 command_buffer.end();
9071}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009072
9073TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9074 TEST_DESCRIPTION(
9075 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9076 "occlusion query is active.");
9077 ASSERT_NO_FATAL_FAILURE(Init());
9078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9079
9080 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9081 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9082 qpci.queryCount = 1;
9083
9084 VkQueryPool query_pool;
9085 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9086
9087 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9088
9089 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9090 cbii.renderPass = m_renderPass;
9091 cbii.framebuffer = m_framebuffer;
9092 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9093
9094 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9095 cbbi.pInheritanceInfo = &cbii;
9096
9097 VkCommandBuffer secondary_handle = secondary.handle();
9098 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9099 vk::EndCommandBuffer(secondary_handle);
9100
9101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9102 m_commandBuffer->begin();
9103 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9104 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9105 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9106 m_commandBuffer->end();
9107 m_errorMonitor->VerifyFound();
9108
9109 vk::DestroyQueryPool(device(), query_pool, nullptr);
9110}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009111
9112TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9113 TEST_DESCRIPTION("Test invalid null entries for clear color");
9114
9115 ASSERT_NO_FATAL_FAILURE(InitFramework());
9116 ASSERT_NO_FATAL_FAILURE(InitState());
9117
9118 VkImageObj image(m_device);
9119 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9120
9121 VkImageSubresourceRange isr = {};
9122 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9123 isr.baseArrayLayer = 0;
9124 isr.baseMipLevel = 0;
9125 isr.layerCount = 1;
9126 isr.levelCount = 1;
9127
9128 m_commandBuffer->begin();
9129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9130 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9131 m_errorMonitor->VerifyFound();
9132 m_commandBuffer->end();
9133}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009134
9135TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9136 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9137
9138 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9139 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9140 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9141 return;
9142 }
9143 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9144 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9145 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9146 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9147 return;
9148 }
9149 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9150 ASSERT_NO_FATAL_FAILURE(InitState());
9151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9152
9153 VkAttachmentDescription attachmentDescription = {};
9154 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9155 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9156 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9157
9158 VkAttachmentReference colorAttachmentReference = {};
9159 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9160 colorAttachmentReference.attachment = 0;
9161
9162 VkSubpassDescription subpassDescription = {};
9163 subpassDescription.colorAttachmentCount = 1;
9164 subpassDescription.pColorAttachments = &colorAttachmentReference;
9165
9166 uint32_t viewMask = 0x1u;
9167 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9168 renderPassMultiviewCreateInfo.subpassCount = 1;
9169 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9170
9171 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9172 renderPassCreateInfo.attachmentCount = 1;
9173 renderPassCreateInfo.pAttachments = &attachmentDescription;
9174 renderPassCreateInfo.subpassCount = 1;
9175 renderPassCreateInfo.pSubpasses = &subpassDescription;
9176
9177 VkRenderPass renderPass;
9178 vk::CreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
9179
9180 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9181 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9182 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9183 image_create_info.extent.width = 32;
9184 image_create_info.extent.height = 32;
9185 image_create_info.extent.depth = 1;
9186 image_create_info.mipLevels = 1;
9187 image_create_info.arrayLayers = 4;
9188 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9189 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9190 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9191 image_create_info.flags = 0;
9192
9193 VkImageObj image(m_device);
9194 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009195 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9196 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009197
9198 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9199 framebufferCreateInfo.width = 32;
9200 framebufferCreateInfo.height = 32;
9201 framebufferCreateInfo.layers = 1;
9202 framebufferCreateInfo.renderPass = renderPass;
9203 framebufferCreateInfo.attachmentCount = 1;
9204 framebufferCreateInfo.pAttachments = &imageView;
9205
9206 VkFramebuffer framebuffer = VK_NULL_HANDLE;
9207 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
9208
9209 // Start no RenderPass
9210 m_commandBuffer->begin();
9211
9212 VkClearAttachment color_attachment;
9213 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9214 color_attachment.clearValue.color.float32[0] = 0;
9215 color_attachment.clearValue.color.float32[1] = 0;
9216 color_attachment.clearValue.color.float32[2] = 0;
9217 color_attachment.clearValue.color.float32[3] = 0;
9218 color_attachment.colorAttachment = 0;
9219
9220 VkClearRect clear_rect = {};
9221 clear_rect.rect.extent.width = 32;
9222 clear_rect.rect.extent.height = 32;
9223
9224 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9225 render_pass_begin_info.renderPass = renderPass;
9226 render_pass_begin_info.framebuffer = framebuffer;
9227 render_pass_begin_info.renderArea.extent.width = 32;
9228 render_pass_begin_info.renderArea.extent.height = 32;
9229
9230 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9231 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9232 clear_rect.layerCount = 2;
9233 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9234 m_errorMonitor->VerifyFound();
9235
9236 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9237 clear_rect.baseArrayLayer = 1;
9238 clear_rect.layerCount = 1;
9239 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9240 m_errorMonitor->VerifyFound();
9241}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009242
9243TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9244 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9245
9246 ASSERT_NO_FATAL_FAILURE(InitFramework());
9247 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9248 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9249 } else {
9250 printf("%s %s not supported, skipping test\n", kSkipPrefix, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9251 return;
9252 }
9253 ASSERT_NO_FATAL_FAILURE(InitState());
9254
9255 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9256 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9257
9258 VkBufferObj buffer;
9259 VkMemoryPropertyFlags reqs = 0;
9260 buffer.init_as_storage(*m_device, 32, reqs);
9261
9262 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9263 conditional_rendering_begin.buffer = buffer.handle();
9264
9265 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9266
9267 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9268 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9269 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9270 vk::EndCommandBuffer(m_commandBuffer->handle());
9271 m_errorMonitor->VerifyFound();
9272}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009273
9274TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9275 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9276
9277 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9278 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9279 } else {
9280 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9281 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9282 return;
9283 }
9284 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9285
9286 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9287 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9288 } else {
9289 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
9290 return;
9291 }
9292
9293 ASSERT_NO_FATAL_FAILURE(InitState());
9294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9295
9296 CreatePipelineHelper pipe_one(*this);
9297 pipe_one.InitInfo();
9298 pipe_one.InitState();
9299 pipe_one.CreateGraphicsPipeline();
9300
9301 CreatePipelineHelper pipe_two(*this);
9302 pipe_two.InitInfo();
9303 pipe_two.InitState();
9304 pipe_two.CreateGraphicsPipeline();
9305
9306 auto vkCmdBeginTransformFeedbackEXT =
9307 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9308 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9309 auto vkCmdEndTransformFeedbackEXT =
9310 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9311 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9312
9313 m_commandBuffer->begin();
9314 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9315 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9317 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9318 m_errorMonitor->VerifyFound();
9319 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9320 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009321}
9322
9323TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9324 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9325
9326 ASSERT_NO_FATAL_FAILURE(Init());
9327
9328 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9329 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9330
9331 // Load required functions
9332 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9333 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9334 return;
9335 }
9336
9337 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9338
9339 // Set format features from being found
9340 VkFormatProperties formatProps;
9341 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9342 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9343 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9344 return;
9345 }
9346 // Gets pass pipeline creation but not the actual tiling used
9347 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9348 // will be caught at draw time that feature for optimal image is not set
9349 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9350 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9351 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9352
9353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9354
9355 CreatePipelineHelper pipe(*this);
9356 pipe.InitInfo();
9357 pipe.InitState();
aitor-lunargf15acd52022-03-09 22:13:25 +01009358 pipe.cb_attachments_[0].blendEnable = VK_TRUE;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009359 pipe.CreateGraphicsPipeline();
9360
9361 m_commandBuffer->begin();
9362 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9363 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9364
9365 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9366 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9367 m_errorMonitor->VerifyFound();
9368
9369 m_commandBuffer->EndRenderPass();
9370 m_commandBuffer->end();
9371}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009372
9373TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9374 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9375
9376 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9377 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9378 printf("%s Did not find required device extension %s; test skipped.\n", kSkipPrefix, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
9379 return;
9380 }
9381 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9382 ASSERT_NO_FATAL_FAILURE(InitState());
9383
9384 VkAttachmentDescription attach[] = {
9385 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9386 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9387 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9388 };
9389 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9390 VkSubpassDescription subpasses[] = {
9391 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9392 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9393 };
9394
9395 VkSubpassDependency dep = {0,
9396 1,
9397 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9398 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9399 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9400 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9401 VK_DEPENDENCY_BY_REGION_BIT};
9402
9403 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9404 rpci.attachmentCount = 1;
9405 rpci.pAttachments = attach;
9406 rpci.subpassCount = 2;
9407 rpci.pSubpasses = subpasses;
9408 rpci.dependencyCount = 1;
9409 rpci.pDependencies = &dep;
9410
9411 vk_testing::RenderPass render_pass;
9412 render_pass.init(*m_device, rpci);
9413
9414 VkImageObj image(m_device);
9415 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9416 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9417
9418 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9419 fbci.renderPass = render_pass.handle();
9420 fbci.attachmentCount = 1;
9421 fbci.pAttachments = &imageView;
9422 fbci.width = 32;
9423 fbci.height = 32;
9424 fbci.layers = 1;
9425 VkFramebuffer framebuffer;
9426 vk::CreateFramebuffer(device(), &fbci, nullptr, &framebuffer);
9427
9428 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9429 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9430 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9431 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9432
9433 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9434 buffer_create_info.size = 32;
9435 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9436 VkBufferObj buffer;
9437 buffer.init(*m_device, buffer_create_info);
9438
9439 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9440 conditional_rendering_begin.buffer = buffer.handle();
9441
9442 VkClearValue clear_value;
9443 clear_value.color = m_clear_color;
9444
9445 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9446 rpbi.renderPass = render_pass.handle();
9447 rpbi.framebuffer = framebuffer;
9448 rpbi.renderArea = {{0, 0}, {32, 32}};
9449 rpbi.clearValueCount = 1;
9450 rpbi.pClearValues = &clear_value;
9451
9452 m_commandBuffer->begin();
9453
9454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9455 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9456 m_errorMonitor->VerifyFound();
9457
9458 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
9459 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9460 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9461 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9462 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9463 vk::CmdEndRenderPass(m_commandBuffer->handle());
9464 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9465 m_errorMonitor->VerifyFound();
9466
9467 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
9468 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9469 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9470 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9471 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9472 vk::CmdEndRenderPass(m_commandBuffer->handle());
9473 m_errorMonitor->VerifyFound();
9474
9475 m_commandBuffer->end();
9476}
ziga-lunarg58255142021-09-12 13:25:17 +02009477
9478TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9479 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9480
9481 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9482 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9483 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9484 return;
9485 }
9486 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9487
9488 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9489 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9490 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9491 return;
9492 }
9493 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9494 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9495 return;
9496 }
9497 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9498 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9499
9500 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9501 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
9502
9503 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
9504 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
9505 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
9506 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
9507
9508 if (!tf_features.transformFeedback) {
9509 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
9510 return;
9511 }
9512
9513 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9515
9516 VkAttachmentDescription attachmentDescription = {};
9517 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9518 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9519 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9520
9521 VkAttachmentReference colorAttachmentReference = {};
9522 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9523 colorAttachmentReference.attachment = 0;
9524
9525 VkSubpassDescription subpassDescription = {};
9526 subpassDescription.colorAttachmentCount = 1;
9527 subpassDescription.pColorAttachments = &colorAttachmentReference;
9528
9529 uint32_t viewMask = 0x1u;
9530 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9531 renderPassMultiviewCreateInfo.subpassCount = 1;
9532 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9533
9534 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9535 renderPassCreateInfo.attachmentCount = 1;
9536 renderPassCreateInfo.pAttachments = &attachmentDescription;
9537 renderPassCreateInfo.subpassCount = 1;
9538 renderPassCreateInfo.pSubpasses = &subpassDescription;
9539
9540 vk_testing::RenderPass render_pass;
9541 render_pass.init(*m_device, renderPassCreateInfo);
9542
9543 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9544 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9545 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9546 image_create_info.extent.width = 32;
9547 image_create_info.extent.height = 32;
9548 image_create_info.extent.depth = 1;
9549 image_create_info.mipLevels = 1;
9550 image_create_info.arrayLayers = 4;
9551 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9552 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9553 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9554 image_create_info.flags = 0;
9555
9556 VkImageObj image(m_device);
9557 image.Init(image_create_info);
9558 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9559
9560 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9561 framebufferCreateInfo.width = 32;
9562 framebufferCreateInfo.height = 32;
9563 framebufferCreateInfo.layers = 1;
9564 framebufferCreateInfo.renderPass = render_pass.handle();
9565 framebufferCreateInfo.attachmentCount = 1;
9566 framebufferCreateInfo.pAttachments = &imageView;
9567
9568 vk_testing::Framebuffer framebuffer;
9569 framebuffer.init(*m_device, framebufferCreateInfo);
9570
9571 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9572 render_pass_begin_info.renderPass = render_pass.handle();
9573 render_pass_begin_info.framebuffer = framebuffer.handle();
9574 render_pass_begin_info.renderArea.extent.width = 32;
9575 render_pass_begin_info.renderArea.extent.height = 32;
9576
9577 auto vkCmdBeginTransformFeedbackEXT =
9578 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9579 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9580
9581 m_commandBuffer->begin();
9582 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9583
9584 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9585 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9586 m_errorMonitor->VerifyFound();
9587
9588 m_commandBuffer->EndRenderPass();
9589 m_commandBuffer->end();
9590}
stusmithd2f36832021-11-26 11:44:11 +00009591
9592TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9593 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9594
9595 SetTargetApiVersion(VK_API_VERSION_1_1);
9596
stusmithab8e2a22021-12-17 11:20:03 +00009597 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9598
stusmithd2f36832021-11-26 11:44:11 +00009599 ASSERT_NO_FATAL_FAILURE(InitFramework());
9600
stusmithab8e2a22021-12-17 11:20:03 +00009601 if (!AreRequestedExtensionsEnabled()) {
9602 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9603 return;
9604 }
9605
9606 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
9607 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +00009608 return;
9609 }
9610
9611 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9612 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9613 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9614 if (!dynamic_rendering_features.dynamicRendering) {
9615 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9616 return;
9617 }
9618
9619 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9620
sfricke-samsung1c61f192021-12-31 01:53:03 -06009621 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009622 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9623
sfricke-samsung1c61f192021-12-31 01:53:03 -06009624 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009625 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9626 begin_rendering_info.colorAttachmentCount = 1;
9627 begin_rendering_info.pColorAttachments = &color_attachment;
9628
9629 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9630
9631 secondary.begin();
9632
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009634 secondary.BeginRendering(begin_rendering_info);
9635 m_errorMonitor->VerifyFound();
9636
9637 secondary.end();
9638}
9639
9640TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9641 TEST_DESCRIPTION(
9642 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9643 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9644
9645 ASSERT_NO_FATAL_FAILURE(Init());
9646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9647
9648 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9649
9650 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9651 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9652 nullptr, // pNext
9653 m_renderPass,
9654 0, // subpass
9655 m_framebuffer,
9656 };
9657
9658 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9659 nullptr, // pNext
9660 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9661 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9662 secondary.begin(&cmdbuff__bi);
9663 secondary.end();
9664
9665 m_commandBuffer->begin();
9666
9667 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9668 nullptr, // pNext
9669 m_renderPass,
9670 m_framebuffer,
9671 {{0, 0}, {32, 32}},
9672 static_cast<uint32_t>(m_renderPassClearValues.size()),
9673 m_renderPassClearValues.data()};
9674
9675 m_commandBuffer->BeginRenderPass(rp_bi);
9676
9677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
9678 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9679 m_errorMonitor->VerifyFound();
9680
9681 m_commandBuffer->EndRenderPass();
9682 m_commandBuffer->end();
9683}
9684
9685TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9686 TEST_DESCRIPTION(
9687 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9688 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9689
9690 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009691
stusmithab8e2a22021-12-17 11:20:03 +00009692 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9693
stusmithd2f36832021-11-26 11:44:11 +00009694 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009695
9696 if (!AreRequestedExtensionsEnabled()) {
9697 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
stusmithd2f36832021-11-26 11:44:11 +00009698 return;
9699 }
stusmithab8e2a22021-12-17 11:20:03 +00009700
9701 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
9702 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
9703 return;
9704 }
9705
stusmithd2f36832021-11-26 11:44:11 +00009706 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9707 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9708 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9709 if (!dynamic_rendering_features.dynamicRendering) {
9710 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9711 return;
9712 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009713
stusmithd2f36832021-11-26 11:44:11 +00009714 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9715
9716 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009717
9718 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009719 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9720
sfricke-samsung1c61f192021-12-31 01:53:03 -06009721 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9722 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009723 inheritance_rendering_info.colorAttachmentCount = 1;
9724 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009725 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009726
sfricke-samsung1c61f192021-12-31 01:53:03 -06009727 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009728 begin_rendering_info.colorAttachmentCount = 1;
9729 begin_rendering_info.pColorAttachments = &color_attachment;
9730
9731 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9732
9733 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9734 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9735 &inheritance_rendering_info, // pNext
9736 VK_NULL_HANDLE,
9737 0, // subpass
9738 VK_NULL_HANDLE,
9739 };
9740
9741 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9742 nullptr, // pNext
9743 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9744 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9745 secondary.begin(&cmdbuff__bi);
9746 secondary.end();
9747
9748 m_commandBuffer->begin();
9749
9750 m_commandBuffer->BeginRendering(begin_rendering_info);
9751
9752 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9753 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9754 m_errorMonitor->VerifyFound();
9755
9756 m_commandBuffer->EndRendering();
9757 m_commandBuffer->end();
9758}
9759
9760TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9761 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9762
9763 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9764 ASSERT_NO_FATAL_FAILURE(InitState());
9765
9766 // A renderpass with two subpasses, both writing the same attachment.
9767 VkAttachmentDescription attach[] = {
9768 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9769 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9770 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9771 };
9772 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9773 VkSubpassDescription subpasses[] = {
9774 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9775 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9776 };
9777
9778 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9779 VkRenderPass render_pass;
9780 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9781 ASSERT_VK_SUCCESS(err);
9782
9783 VkImageObj image(m_device);
9784 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9785 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9786
9787 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 1, &imageView, 32, 32, 1};
9788 VkFramebuffer framebuffer;
9789 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9790 ASSERT_VK_SUCCESS(err);
9791
9792 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9793
9794 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9795 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9796 nullptr, // pNext
9797 render_pass,
9798 1, // subpass
9799 framebuffer,
9800 };
9801
9802 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9803 nullptr, // pNext
9804 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9805 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9806 secondary.begin(&cmdbuff__bi);
9807 secondary.end();
9808
9809 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9810 nullptr, // pNext
9811 render_pass,
9812 framebuffer,
9813 {{0, 0}, {32, 32}},
9814 0,
9815 nullptr};
9816
9817 m_commandBuffer->begin();
9818 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9819
9820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
9821 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9822 m_errorMonitor->VerifyFound();
9823
9824 m_commandBuffer->EndRenderPass();
9825 m_commandBuffer->end();
9826
9827 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9828 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9829}
9830
9831TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9832 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9833
9834 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9835 ASSERT_NO_FATAL_FAILURE(InitState());
9836
9837 // A renderpass with two subpasses, both writing the same attachment.
9838 VkAttachmentDescription attach[] = {
9839 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9840 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9841 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9842 };
9843 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9844 VkSubpassDescription subpasses[] = {
9845 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9846 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9847 };
9848
9849 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
9850 VkRenderPass render_pass_1;
9851 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
9852 ASSERT_VK_SUCCESS(err);
9853
9854 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9855 VkRenderPass render_pass_2;
9856 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
9857 ASSERT_VK_SUCCESS(err);
9858
9859 VkImageObj image(m_device);
9860 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9861 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9862
9863 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
9864 VkFramebuffer framebuffer;
9865 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9866 ASSERT_VK_SUCCESS(err);
9867
9868 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9869
9870 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9871 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9872 nullptr, // pNext
9873 render_pass_2,
9874 0, // subpass
9875 VK_NULL_HANDLE,
9876 };
9877
9878 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9879 nullptr, // pNext
9880 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9881 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9882 secondary.begin(&cmdbuff__bi);
9883 secondary.end();
9884
9885 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9886 nullptr, // pNext
9887 render_pass_1,
9888 framebuffer,
9889 {{0, 0}, {32, 32}},
9890 0,
9891 nullptr};
9892
9893 m_commandBuffer->begin();
9894 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9895
9896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
9897 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9898 m_errorMonitor->VerifyFound();
9899
9900 m_commandBuffer->EndRenderPass();
9901 m_commandBuffer->end();
9902
9903 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9904 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
9905 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
9906}
9907
9908TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
9909 TEST_DESCRIPTION(
9910 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9911 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
9912
9913 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009914
stusmithab8e2a22021-12-17 11:20:03 +00009915 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9916
stusmithd2f36832021-11-26 11:44:11 +00009917 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009918
9919 if (!AreRequestedExtensionsEnabled()) {
9920 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
stusmithd2f36832021-11-26 11:44:11 +00009921 return;
9922 }
stusmithab8e2a22021-12-17 11:20:03 +00009923
9924 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
9925 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
9926 return;
9927 }
9928
stusmithd2f36832021-11-26 11:44:11 +00009929 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9930 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9931 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9932 if (!dynamic_rendering_features.dynamicRendering) {
9933 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9934 return;
9935 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009936
stusmithd2f36832021-11-26 11:44:11 +00009937 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9938
9939 VkAttachmentDescription attach[] = {
9940 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9941 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9942 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9943 };
9944 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9945 VkSubpassDescription subpasses[] = {
9946 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9947 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9948 };
9949
9950 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9951 VkRenderPass render_pass;
9952 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9953 ASSERT_VK_SUCCESS(err);
9954
9955 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009956
9957 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009958 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9959
sfricke-samsung1c61f192021-12-31 01:53:03 -06009960 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9961 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009962 inheritance_rendering_info.colorAttachmentCount = 1;
9963 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009964 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009965
sfricke-samsung1c61f192021-12-31 01:53:03 -06009966 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009967 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
9968 begin_rendering_info.colorAttachmentCount = 1;
9969 begin_rendering_info.pColorAttachments = &color_attachment;
9970
9971 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9972
9973 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9974 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9975 &inheritance_rendering_info, // pNext
9976 render_pass,
9977 0, // subpass
9978 VK_NULL_HANDLE,
9979 };
9980
9981 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9982 nullptr, // pNext
9983 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9984 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9985 secondary.begin(&cmdbuff__bi);
9986 secondary.end();
9987
9988 m_commandBuffer->begin();
9989
9990 m_commandBuffer->BeginRendering(begin_rendering_info);
9991
9992 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
9993 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9994 m_errorMonitor->VerifyFound();
9995
9996 m_commandBuffer->EndRendering();
9997 m_commandBuffer->end();
9998
9999 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
10000}
10001
10002TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
10003 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
10004
10005 SetTargetApiVersion(VK_API_VERSION_1_1);
10006
stusmithab8e2a22021-12-17 11:20:03 +000010007 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10008
stusmithd2f36832021-11-26 11:44:11 +000010009 ASSERT_NO_FATAL_FAILURE(InitFramework());
10010
stusmithab8e2a22021-12-17 11:20:03 +000010011 if (!AreRequestedExtensionsEnabled()) {
10012 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10013 return;
10014 }
10015
10016 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10017 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010018 return;
10019 }
10020
10021 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10022 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10023 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10024 if (!dynamic_rendering_features.dynamicRendering) {
10025 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10026 return;
10027 }
10028
10029 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10030
10031 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10032
sfricke-samsung1c61f192021-12-31 01:53:03 -060010033 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010034 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10035
sfricke-samsung1c61f192021-12-31 01:53:03 -060010036 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10037 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010038 inheritance_rendering_info.colorAttachmentCount = 1;
10039 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010040 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010041
sfricke-samsung1c61f192021-12-31 01:53:03 -060010042 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010043 begin_rendering_info.flags =
10044 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
10045 begin_rendering_info.colorAttachmentCount = 1;
10046 begin_rendering_info.pColorAttachments = &color_attachment;
10047
10048 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10049
10050 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10051 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10052 &inheritance_rendering_info, // pNext
10053 VK_NULL_HANDLE,
10054 0, // subpass
10055 VK_NULL_HANDLE,
10056 };
10057
10058 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10059 nullptr, // pNext
10060 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10061 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10062 secondary.begin(&cmdbuff__bi);
10063 secondary.end();
10064
10065 m_commandBuffer->begin();
10066
10067 m_commandBuffer->BeginRendering(begin_rendering_info);
10068
10069 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10070 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10071 m_errorMonitor->VerifyFound();
10072
10073 m_commandBuffer->EndRendering();
10074 m_commandBuffer->end();
10075}
10076
10077TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10078 TEST_DESCRIPTION(
10079 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
10080
10081 SetTargetApiVersion(VK_API_VERSION_1_1);
10082
stusmithab8e2a22021-12-17 11:20:03 +000010083 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10084
stusmithd2f36832021-11-26 11:44:11 +000010085 ASSERT_NO_FATAL_FAILURE(InitFramework());
10086
stusmithab8e2a22021-12-17 11:20:03 +000010087 if (!AreRequestedExtensionsEnabled()) {
10088 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10089 return;
10090 }
10091
10092 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10093 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010094 return;
10095 }
10096
10097 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10098 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10099 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10100 if (!dynamic_rendering_features.dynamicRendering) {
10101 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10102 return;
10103 }
10104
10105 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10106
10107 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10108
sfricke-samsung1c61f192021-12-31 01:53:03 -060010109 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010110 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10111
sfricke-samsung1c61f192021-12-31 01:53:03 -060010112 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10113 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010114 inheritance_rendering_info.colorAttachmentCount = 0;
10115 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010116 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010117
sfricke-samsung1c61f192021-12-31 01:53:03 -060010118 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010119 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10120 begin_rendering_info.colorAttachmentCount = 1;
10121 begin_rendering_info.pColorAttachments = &color_attachment;
10122
10123 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10124
10125 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10126 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10127 &inheritance_rendering_info, // pNext
10128 VK_NULL_HANDLE,
10129 0, // subpass
10130 VK_NULL_HANDLE,
10131 };
10132
10133 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10134 nullptr, // pNext
10135 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10136 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10137 secondary.begin(&cmdbuff__bi);
10138 secondary.end();
10139
10140 m_commandBuffer->begin();
10141
10142 m_commandBuffer->BeginRendering(begin_rendering_info);
10143
10144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10145 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10146 m_errorMonitor->VerifyFound();
10147
10148 m_commandBuffer->EndRendering();
10149 m_commandBuffer->end();
10150}
10151
10152TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10153 TEST_DESCRIPTION(
10154 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10155
10156 SetTargetApiVersion(VK_API_VERSION_1_1);
10157
stusmithab8e2a22021-12-17 11:20:03 +000010158 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10159
stusmithd2f36832021-11-26 11:44:11 +000010160 ASSERT_NO_FATAL_FAILURE(InitFramework());
10161
stusmithab8e2a22021-12-17 11:20:03 +000010162 if (!AreRequestedExtensionsEnabled()) {
10163 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10164 return;
10165 }
10166
10167 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10168 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010169 return;
10170 }
10171
10172 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10173 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10174 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10175 if (!dynamic_rendering_features.dynamicRendering) {
10176 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10177 return;
10178 }
10179
10180 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10181
10182 VkImageObj image(m_device);
10183 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10184 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10185
sfricke-samsung1c61f192021-12-31 01:53:03 -060010186 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010187 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10188 color_attachment.imageView = imageView;
10189
10190 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10191
sfricke-samsung1c61f192021-12-31 01:53:03 -060010192 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10193 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010194 inheritance_rendering_info.colorAttachmentCount = 1;
10195 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010196 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010197
sfricke-samsung1c61f192021-12-31 01:53:03 -060010198 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010199 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10200 begin_rendering_info.colorAttachmentCount = 1;
10201 begin_rendering_info.pColorAttachments = &color_attachment;
10202
10203 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10204
10205 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10206 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10207 &inheritance_rendering_info, // pNext
10208 VK_NULL_HANDLE,
10209 0, // subpass
10210 VK_NULL_HANDLE,
10211 };
10212
10213 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10214 nullptr, // pNext
10215 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10216 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10217 secondary.begin(&cmdbuff__bi);
10218 secondary.end();
10219
10220 m_commandBuffer->begin();
10221
10222 m_commandBuffer->BeginRendering(begin_rendering_info);
10223
10224 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10225 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10226 m_errorMonitor->VerifyFound();
10227
10228 m_commandBuffer->EndRendering();
10229 m_commandBuffer->end();
10230}
10231
10232TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10233 TEST_DESCRIPTION(
10234 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10235 "format");
10236
10237 SetTargetApiVersion(VK_API_VERSION_1_1);
10238
stusmithab8e2a22021-12-17 11:20:03 +000010239 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10240
stusmithd2f36832021-11-26 11:44:11 +000010241 ASSERT_NO_FATAL_FAILURE(InitFramework());
10242
stusmithab8e2a22021-12-17 11:20:03 +000010243 if (!AreRequestedExtensionsEnabled()) {
10244 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10245 return;
10246 }
10247
10248 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10249 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010250 return;
10251 }
10252
10253 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10254 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10255 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10256 if (!dynamic_rendering_features.dynamicRendering) {
10257 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10258 return;
10259 }
10260
10261 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10262
10263 VkImageObj image(m_device);
10264 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10265 if (!depth_stencil_format) {
10266 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10267 return;
10268 }
10269 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10270 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10271
sfricke-samsung1c61f192021-12-31 01:53:03 -060010272 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010273 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10274 depth_stencil_attachment.imageView = imageView;
10275
sfricke-samsung1c61f192021-12-31 01:53:03 -060010276 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10277 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010278 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT;
10279 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010280 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010281
sfricke-samsung1c61f192021-12-31 01:53:03 -060010282 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010283 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10284 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10285 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10286
10287 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10288
10289 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10290 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10291 &inheritance_rendering_info, // pNext
10292 VK_NULL_HANDLE,
10293 0, // subpass
10294 VK_NULL_HANDLE,
10295 };
10296
10297 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10298 nullptr, // pNext
10299 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10300 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10301 secondary.begin(&cmdbuff__bi);
10302 secondary.end();
10303
10304 m_commandBuffer->begin();
10305
10306 m_commandBuffer->BeginRendering(begin_rendering_info);
10307
10308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10310 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10311 m_errorMonitor->VerifyFound();
10312
10313 m_commandBuffer->EndRendering();
10314 m_commandBuffer->end();
10315}
10316
10317TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10318 TEST_DESCRIPTION(
10319 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10320
10321 SetTargetApiVersion(VK_API_VERSION_1_1);
10322
stusmithab8e2a22021-12-17 11:20:03 +000010323 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10324
stusmithd2f36832021-11-26 11:44:11 +000010325 ASSERT_NO_FATAL_FAILURE(InitFramework());
10326
stusmithab8e2a22021-12-17 11:20:03 +000010327 if (!AreRequestedExtensionsEnabled()) {
10328 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10329 return;
10330 }
10331
10332 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10333 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
stusmithd2f36832021-11-26 11:44:11 +000010334 return;
10335 }
10336
10337 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10338 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10339 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10340 if (!dynamic_rendering_features.dynamicRendering) {
10341 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10342 return;
10343 }
10344
10345 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10346
sfricke-samsung1c61f192021-12-31 01:53:03 -060010347 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010348 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10349
10350 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10351
sfricke-samsung1c61f192021-12-31 01:53:03 -060010352 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10353 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010354 inheritance_rendering_info.viewMask = 0;
10355 inheritance_rendering_info.colorAttachmentCount = 1;
10356 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010357 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010358
sfricke-samsung1c61f192021-12-31 01:53:03 -060010359 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010360 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10361 begin_rendering_info.viewMask = 1;
10362 begin_rendering_info.colorAttachmentCount = 1;
10363 begin_rendering_info.pColorAttachments = &color_attachment;
10364
10365 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10366
10367 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10368 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10369 &inheritance_rendering_info, // pNext
10370 VK_NULL_HANDLE,
10371 0, // subpass
10372 VK_NULL_HANDLE,
10373 };
10374
10375 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10376 nullptr, // pNext
10377 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10378 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10379 secondary.begin(&cmdbuff__bi);
10380 secondary.end();
10381
10382 m_commandBuffer->begin();
10383
10384 m_commandBuffer->BeginRendering(begin_rendering_info);
10385
10386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10387 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10388 m_errorMonitor->VerifyFound();
10389
10390 m_commandBuffer->EndRendering();
10391 m_commandBuffer->end();
10392}
stusmithcba0c502021-12-21 17:16:28 +000010393
10394TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10395 TEST_DESCRIPTION(
10396 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10397
10398 SetTargetApiVersion(VK_API_VERSION_1_1);
10399
10400 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10401
10402 ASSERT_NO_FATAL_FAILURE(InitFramework());
10403
10404 if (!AreRequestedExtensionsEnabled()) {
10405 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10406 return;
10407 }
10408
10409 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10410 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
10411 return;
10412 }
10413
10414 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10415 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10416 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10417 if (!dynamic_rendering_features.dynamicRendering) {
10418 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10419 return;
10420 }
10421
10422 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10423
10424 VkImageObj image(m_device);
10425 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10426 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10427
sfricke-samsung1c61f192021-12-31 01:53:03 -060010428 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010429 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10430 color_attachment.imageView = imageView;
10431
10432 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10433
sfricke-samsung1c61f192021-12-31 01:53:03 -060010434 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10435 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010436 inheritance_rendering_info.colorAttachmentCount = 1;
10437 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10438 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10439
sfricke-samsung1c61f192021-12-31 01:53:03 -060010440 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010441 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10442 begin_rendering_info.colorAttachmentCount = 1;
10443 begin_rendering_info.pColorAttachments = &color_attachment;
10444
10445 // A pool we can reset in.
10446 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10447 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10448
10449 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10450 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10451 &inheritance_rendering_info, // pNext
10452 VK_NULL_HANDLE,
10453 0, // subpass
10454 VK_NULL_HANDLE,
10455 };
10456
10457 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10458 nullptr, // pNext
10459 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10460 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10461 secondary.begin(&cmdbuff__bi);
10462 secondary.end();
10463
10464 m_commandBuffer->begin();
10465
10466 // color samples mismatch
10467 m_commandBuffer->BeginRendering(begin_rendering_info);
10468 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10469 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10470 m_errorMonitor->VerifyFound();
10471 m_commandBuffer->EndRendering();
10472
10473 VkImageObj depthStencilImage(m_device);
10474 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10475 if (!depth_stencil_format) {
10476 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10477 return;
10478 }
10479 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10480 0);
10481 VkImageView depthStencilImageView =
10482 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10483
sfricke-samsung1c61f192021-12-31 01:53:03 -060010484 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010485 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10486 depth_stencil_attachment.imageView = depthStencilImageView;
10487
10488 begin_rendering_info.colorAttachmentCount = 0;
10489 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10490 inheritance_rendering_info.colorAttachmentCount = 0;
10491 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10492
10493 secondary.begin(&cmdbuff__bi);
10494 secondary.end();
10495
10496 // depth samples mismatch
10497 m_commandBuffer->BeginRendering(begin_rendering_info);
10498 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10499 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10500 m_errorMonitor->VerifyFound();
10501 m_commandBuffer->EndRendering();
10502
10503 begin_rendering_info.pDepthAttachment = nullptr;
10504 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10505 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10506 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10507
10508 secondary.begin(&cmdbuff__bi);
10509 secondary.end();
10510
10511 // stencil samples mismatch
10512 m_commandBuffer->BeginRendering(begin_rendering_info);
10513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10514 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10515 m_errorMonitor->VerifyFound();
10516 m_commandBuffer->EndRendering();
10517
10518 m_commandBuffer->end();
10519}
10520
10521TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10522 TEST_DESCRIPTION(
10523 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10524 "attachment samples");
10525
10526 SetTargetApiVersion(VK_API_VERSION_1_1);
10527
10528 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10529
10530 ASSERT_NO_FATAL_FAILURE(InitFramework());
10531
10532 if (!AreRequestedExtensionsEnabled()) {
10533 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10534 return;
10535 }
10536
10537 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10538 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
10539 return;
10540 }
10541
10542 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10543 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10544 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10545 if (!dynamic_rendering_features.dynamicRendering) {
10546 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10547 return;
10548 }
10549
10550 bool amd_samples = false;
10551 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10552 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10553 amd_samples = true;
10554 }
10555
10556 bool nv_samples = false;
10557 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10558 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10559 nv_samples = true;
10560 }
10561
10562 if (!amd_samples && !nv_samples) {
10563 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10564 kSkipPrefix);
10565 return;
10566 }
10567
10568 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10569
10570 VkImageObj image(m_device);
10571 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10572 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10573
sfricke-samsung1c61f192021-12-31 01:53:03 -060010574 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010575 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10576 color_attachment.imageView = imageView;
10577
10578 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10579
10580 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10581 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10582 samples_info.colorAttachmentCount = 1;
10583 samples_info.pColorAttachmentSamples = &counts;
10584
10585 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010586 inheritance_rendering_info.colorAttachmentCount = 1;
10587 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10588 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10589
sfricke-samsung1c61f192021-12-31 01:53:03 -060010590 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010591 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10592 begin_rendering_info.colorAttachmentCount = 1;
10593 begin_rendering_info.pColorAttachments = &color_attachment;
10594
10595 // A pool we can reset in.
10596 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10597 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10598
10599 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10600 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10601 &inheritance_rendering_info, // pNext
10602 VK_NULL_HANDLE,
10603 0, // subpass
10604 VK_NULL_HANDLE,
10605 };
10606
10607 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10608 nullptr, // pNext
10609 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10610 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10611 secondary.begin(&cmdbuff__bi);
10612 secondary.end();
10613
10614 m_commandBuffer->begin();
10615
10616 // color samples mismatch
10617 m_commandBuffer->BeginRendering(begin_rendering_info);
10618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10619 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10620 m_errorMonitor->VerifyFound();
10621 m_commandBuffer->EndRendering();
10622
10623 VkImageObj depthStencilImage(m_device);
10624 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10625 if (!depth_stencil_format) {
10626 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10627 return;
10628 }
10629 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10630 0);
10631 VkImageView depthStencilImageView =
10632 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10633
sfricke-samsung1c61f192021-12-31 01:53:03 -060010634 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010635 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10636 depth_stencil_attachment.imageView = depthStencilImageView;
10637
10638 samples_info.colorAttachmentCount = 0;
10639 samples_info.pColorAttachmentSamples = nullptr;
10640 begin_rendering_info.colorAttachmentCount = 0;
10641 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10642 inheritance_rendering_info.colorAttachmentCount = 0;
10643 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10644 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10645
10646 secondary.begin(&cmdbuff__bi);
10647 secondary.end();
10648
10649 // depth samples mismatch
10650 m_commandBuffer->BeginRendering(begin_rendering_info);
10651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10652 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10653 m_errorMonitor->VerifyFound();
10654 m_commandBuffer->EndRendering();
10655
10656 begin_rendering_info.pDepthAttachment = nullptr;
10657 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10658 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10659 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10660
10661 secondary.begin(&cmdbuff__bi);
10662 secondary.end();
10663
10664 // stencil samples mismatch
10665 m_commandBuffer->BeginRendering(begin_rendering_info);
10666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10667 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10668 m_errorMonitor->VerifyFound();
10669 m_commandBuffer->EndRendering();
10670
10671 m_commandBuffer->end();
10672}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010673
10674TEST_F(VkLayerTest, CopyCommands2V13) {
10675 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10676
10677 SetTargetApiVersion(VK_API_VERSION_1_3);
10678 ASSERT_NO_FATAL_FAILURE(Init());
10679 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
10680 printf("%s CopyCommands2V13 test requires Vulkan 1.3+.\n", kSkipPrefix);
10681 return;
10682 }
10683 VkImageObj image(m_device);
10684 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10685 ASSERT_TRUE(image.initialized());
10686 VkBufferObj dst_buffer;
10687 VkMemoryPropertyFlags reqs = 0;
10688 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10689 VkBufferObj src_buffer;
10690 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10691 auto copy_region = LvlInitStruct<VkImageCopy2>();
10692 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10693 copy_region.srcSubresource.layerCount = 1;
10694 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10695 copy_region.dstSubresource.layerCount = 1;
10696 copy_region.dstOffset = {4, 4, 0};
10697 copy_region.extent.width = 1;
10698 copy_region.extent.height = 1;
10699 copy_region.extent.depth = 1;
10700 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10701 copy_image_info.srcImage = image.handle();
10702 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10703 copy_image_info.dstImage = image.handle();
10704 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10705 copy_image_info.regionCount = 1;
10706 copy_image_info.pRegions = &copy_region;
10707 m_commandBuffer->begin();
10708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10709 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10710 m_errorMonitor->VerifyFound();
10711 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
ziga-lunarg852187f2022-03-16 21:21:33 +010010712 copy_buffer.dstOffset = 4;
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010713 copy_buffer.size = 4;
10714 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10715 copy_buffer_info.srcBuffer = dst_buffer.handle();
10716 copy_buffer_info.dstBuffer = dst_buffer.handle();
10717 copy_buffer_info.regionCount = 1;
10718 copy_buffer_info.pRegions = &copy_buffer;
10719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10720 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10721 m_errorMonitor->VerifyFound();
10722 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10723 bic_region.bufferRowLength = 128;
10724 bic_region.bufferImageHeight = 128;
10725 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10726 bic_region.imageSubresource.layerCount = 1;
10727 bic_region.imageExtent.height = 4;
10728 bic_region.imageExtent.width = 4;
10729 bic_region.imageExtent.depth = 1;
10730 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10731 buffer_image_info.srcBuffer = src_buffer.handle();
10732 buffer_image_info.dstImage = image.handle();
10733 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10734 buffer_image_info.regionCount = 1;
10735 buffer_image_info.pRegions = &bic_region;
10736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10737 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10738 m_errorMonitor->VerifyFound();
10739 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10740 image_buffer_info.dstBuffer = src_buffer.handle();
10741 image_buffer_info.srcImage = image.handle();
10742 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10743 image_buffer_info.regionCount = 1;
10744 image_buffer_info.pRegions = &bic_region;
10745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10746 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10747 m_errorMonitor->VerifyFound();
10748 auto blit_region = LvlInitStruct<VkImageBlit2>();
10749 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10750 blit_region.srcSubresource.baseArrayLayer = 0;
10751 blit_region.srcSubresource.layerCount = 1;
10752 blit_region.srcSubresource.mipLevel = 0;
10753 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10754 blit_region.dstSubresource.baseArrayLayer = 0;
10755 blit_region.dstSubresource.layerCount = 1;
10756 blit_region.dstSubresource.mipLevel = 0;
10757 blit_region.srcOffsets[0] = {0, 0, 0};
10758 blit_region.srcOffsets[1] = {64, 64, 1};
10759 blit_region.dstOffsets[0] = {0, 0, 0};
10760 blit_region.dstOffsets[1] = {32, 32, 1};
10761 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10762 blit_image_info.srcImage = image.handle();
10763 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10764 blit_image_info.dstImage = image.handle();
10765 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10766 blit_image_info.regionCount = 1;
10767 blit_image_info.pRegions = &blit_region;
10768 blit_image_info.filter = VK_FILTER_NEAREST;
10769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10770 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10771 m_errorMonitor->VerifyFound();
10772 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10773 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10774 resolve_region.srcSubresource.mipLevel = 0;
10775 resolve_region.srcSubresource.baseArrayLayer = 0;
10776 resolve_region.srcSubresource.layerCount = 1;
10777 resolve_region.srcOffset.x = 0;
10778 resolve_region.srcOffset.y = 0;
10779 resolve_region.srcOffset.z = 0;
10780 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10781 resolve_region.dstSubresource.mipLevel = 0;
10782 resolve_region.dstSubresource.baseArrayLayer = 0;
10783 resolve_region.dstSubresource.layerCount = 1;
10784 resolve_region.dstOffset.x = 0;
10785 resolve_region.dstOffset.y = 0;
10786 resolve_region.dstOffset.z = 0;
10787 resolve_region.extent.width = 1;
10788 resolve_region.extent.height = 1;
10789 resolve_region.extent.depth = 1;
10790 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10791 resolve_image_info.srcImage = image.handle();
10792 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10793 resolve_image_info.dstImage = image.handle();
10794 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10795 resolve_image_info.regionCount = 1;
10796 resolve_image_info.pRegions = &resolve_region;
10797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10798 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10799 m_errorMonitor->VerifyFound();
10800}
aitor-lunarga131fca2022-02-17 22:55:55 +010010801
10802TEST_F(VkLayerTest, ValidateMultiviewUnboundResourcesAfterBeginRenderPassAndNextSubpass) {
10803 TEST_DESCRIPTION(
10804 "Validate all required resources are bound if multiview is enabled after vkCmdBeginRenderPass and vkCmdNextSubpass");
10805
10806 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
10807 if (version < VK_API_VERSION_1_1) {
10808 if (!AddRequiredInstanceExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
10809 printf("%s At least Vulkan version 1.1 is required or instance extension %s, skipping test.\n", kSkipPrefix,
10810 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
10811 return;
10812 }
10813 }
10814 ASSERT_NO_FATAL_FAILURE(InitFramework());
10815
10816 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
10817 if (!AddRequiredDeviceExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
10818 printf("%s At least Vulkan version 1.1 is required or device extension %s, skipping test.\n", kSkipPrefix,
10819 VK_KHR_MULTIVIEW_EXTENSION_NAME);
10820 return;
10821 }
10822 }
10823
10824 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
10825 multiview_features.multiview = VK_TRUE;
10826 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
10827
10828 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
10829
10830 VkAttachmentDescription attachmentDescription = {};
10831 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
10832 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
10833 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
10834
10835 VkAttachmentReference colorAttachmentReference = {};
10836 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
10837 colorAttachmentReference.attachment = 0;
10838
10839 m_renderPass_subpasses.resize(2);
10840 m_renderPass_subpasses[0].colorAttachmentCount = 1;
10841 m_renderPass_subpasses[0].pColorAttachments = &colorAttachmentReference;
10842 m_renderPass_subpasses[1].colorAttachmentCount = 1;
10843 m_renderPass_subpasses[1].pColorAttachments = &colorAttachmentReference;
10844
10845 uint32_t viewMasks[] = {0x1u, 0x2u};
10846 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
10847 renderPassMultiviewCreateInfo.subpassCount = 2;
10848 renderPassMultiviewCreateInfo.pViewMasks = viewMasks;
10849
10850 m_renderPass_info = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
10851 m_renderPass_info.attachmentCount = 1;
10852 m_renderPass_info.pAttachments = &attachmentDescription;
10853 m_renderPass_info.subpassCount = m_renderPass_subpasses.size();
10854 m_renderPass_info.pSubpasses = m_renderPass_subpasses.data();
10855
10856 m_renderPass_dependencies.resize(1);
10857 VkSubpassDependency &subpass_dep = m_renderPass_dependencies[0];
10858 subpass_dep.srcSubpass = 0;
10859 subpass_dep.dstSubpass = 1;
10860 // Just using all framebuffer-space pipeline stages in order to get a reasonably large
10861 // set of bits that can be used for both src & dst
10862 subpass_dep.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10863 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10864 subpass_dep.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10865 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10866 // Add all of the gfx mem access bits that correlate to the fb-space pipeline stages
10867 subpass_dep.srcAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10868 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10869 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10870 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10871 subpass_dep.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
10872 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
10873 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
10874 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
10875 // Must include dep_by_region bit when src & dst both include framebuffer-space stages
10876 subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
10877
10878 m_renderPass_info.dependencyCount = static_cast<uint32_t>(m_renderPass_dependencies.size());
10879 m_renderPass_info.pDependencies = m_renderPass_dependencies.data();
10880
10881 vk::CreateRenderPass(m_device->handle(), &m_renderPass_info, nullptr, &m_renderPass);
10882
10883 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
10884 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10885 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
10886 image_create_info.extent.width = static_cast<uint32_t>(m_width);
10887 image_create_info.extent.height = static_cast<uint32_t>(m_height);
10888 image_create_info.extent.depth = 1;
10889 image_create_info.mipLevels = 1;
10890 image_create_info.arrayLayers = 2;
10891 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10892 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10893 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
10894 image_create_info.flags = 0;
10895
10896 VkImageObj image(m_device);
10897 image.Init(image_create_info);
10898 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
10899 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
10900
10901 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
10902 framebufferCreateInfo.width = static_cast<uint32_t>(m_width);
10903 framebufferCreateInfo.height = static_cast<uint32_t>(m_height);
10904 framebufferCreateInfo.layers = 1;
10905 framebufferCreateInfo.renderPass = m_renderPass;
10906 framebufferCreateInfo.attachmentCount = 1;
10907 framebufferCreateInfo.pAttachments = &imageView;
10908
10909 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &m_framebuffer);
10910
10911 VkClearValue clear{};
10912 clear.color = m_clear_color;
10913 m_renderPassClearValues.emplace_back(clear);
10914 m_renderPassBeginInfo.renderPass = m_renderPass;
10915 m_renderPassBeginInfo.framebuffer = m_framebuffer;
10916 m_renderPassBeginInfo.renderArea.extent.width = static_cast<uint32_t>(m_width);
10917 m_renderPassBeginInfo.renderArea.extent.height = static_cast<uint32_t>(m_height);
10918 m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size();
10919 m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data();
10920
10921 CreatePipelineHelper pipe(*this);
10922 pipe.InitInfo();
10923 pipe.InitState();
10924 pipe.CreateGraphicsPipeline();
10925
10926 // This bind should not be valid after we begin the renderpass
10927 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10928
10929 m_commandBuffer->begin();
10930 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10931 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
10932 m_commandBuffer->Draw(1, 0, 0, 0);
10933 m_errorMonitor->VerifyFound();
10934
10935 // This bind should not be valid for next subpass
10936 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
10937
10938 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
10939 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
10940 m_commandBuffer->Draw(1, 0, 0, 0);
10941 m_errorMonitor->VerifyFound();
10942
10943 m_commandBuffer->EndRenderPass();
10944 m_commandBuffer->end();
10945}