blob: 0284ad1c3bf2649d259a4ec03f8de21da1e03e8c [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
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05002007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06659");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002008 region.imageExtent.width = 0;
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05002009 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002010 &region);
2011 m_errorMonitor->VerifyFound();
2012
2013 // aspect bits
2014 region.imageExtent = {64, 64, 1};
2015 region.bufferRowLength = 0;
2016 region.bufferImageHeight = 0;
2017 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002019 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2020 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2021 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2022 buffer_16k.handle(), 1, &region);
2023 m_errorMonitor->VerifyFound();
2024
Mark Lobodzinski20310782020-02-28 14:25:17 -07002025 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002026 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002027 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2028 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2029 buffer_16k.handle(), 1, &region);
2030 m_errorMonitor->VerifyFound();
2031 }
2032
Mark Lobodzinski20310782020-02-28 14:25:17 -07002033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002034 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002035 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2036 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2037 &region);
2038 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002039 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002040
2041 // Out-of-range mip levels should fail
2042 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002044 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06221");
2045 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-pRegions-06222");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002046 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002047 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002048 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002049 "VUID-vkCmdCopyImageToBuffer-pRegions-06220"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002050 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2051 &region);
2052 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002053 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002054 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06218");
2055 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-pRegions-06219");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002056 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002057 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002058 kErrorBit,
Mike Schuchardt7b152fa2021-08-03 16:30:27 -07002059 "VUID-vkCmdCopyBufferToImage-pRegions-06217"); // unavoidable "region exceeds image bounds" for non-existent mip
sfricke-samsung6d97e562020-01-07 22:01:00 -08002060 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2061 &region);
2062 m_errorMonitor->VerifyFound();
2063 region.imageSubresource.mipLevel = 0;
2064
2065 // Out-of-range array layers should fail
2066 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2067 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002069 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2070 &region);
2071 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002072 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002073 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2074 &region);
2075 m_errorMonitor->VerifyFound();
2076 region.imageSubresource.baseArrayLayer = 0;
2077
2078 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002080 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2081 buffer_16k.handle(), 1, &region);
2082 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002084 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2085 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002086 m_errorMonitor->VerifyFound();
2087 }
2088
unknown088160a2019-05-23 17:43:13 -06002089 // Test Depth/Stencil copies
2090 if (missing_ds_support) {
2091 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2092 } else {
2093 VkBufferImageCopy ds_region = {};
2094 ds_region.bufferOffset = 0;
2095 ds_region.bufferRowLength = 0;
2096 ds_region.bufferImageHeight = 0;
2097 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2098 ds_region.imageSubresource.mipLevel = 0;
2099 ds_region.imageSubresource.baseArrayLayer = 0;
2100 ds_region.imageSubresource.layerCount = 1;
2101 ds_region.imageOffset = {0, 0, 0};
2102 ds_region.imageExtent = {256, 256, 1};
2103
2104 // Depth copies that should succeed
2105 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002106 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2107 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002108 m_errorMonitor->VerifyNotFound();
2109
2110 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002111 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2112 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002113 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2114 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002115 m_errorMonitor->VerifyNotFound();
2116
2117 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002118 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2119 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002120 m_errorMonitor->VerifyNotFound();
2121
2122 // Depth copies that should fail
2123 ds_region.bufferOffset = 4;
2124 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002125 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002126 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002127 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2128 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002129 m_errorMonitor->VerifyFound();
2130
2131 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002132 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002133 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002134 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002135 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002136 m_errorMonitor->VerifyFound();
2137
2138 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002139 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002140 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002141 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2142 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002143 m_errorMonitor->VerifyFound();
2144
sfricke-samsung5a019492021-01-25 10:32:08 -08002145 ds_region.bufferOffset = 5;
2146 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2147 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2148 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2149 buffer_128k.handle(), 1, &ds_region);
2150 m_errorMonitor->VerifyFound();
2151 ds_region.imageExtent = {256, 256, 1};
2152
unknown088160a2019-05-23 17:43:13 -06002153 // Stencil copies that should succeed
2154 ds_region.bufferOffset = 0;
2155 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2156 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002157 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2158 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002159 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2160 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002161 m_errorMonitor->VerifyNotFound();
2162
2163 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002164 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2165 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002166 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2167 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002168 m_errorMonitor->VerifyNotFound();
2169
2170 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002171 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2172 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002173 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2174 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002175 m_errorMonitor->VerifyNotFound();
2176
2177 // Stencil copies that should fail
2178 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002179 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002180 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002181 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2182 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002183 m_errorMonitor->VerifyFound();
2184
2185 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002186 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002187 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2188 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002189 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2190 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002191 m_errorMonitor->VerifyFound();
2192
2193 ds_region.bufferRowLength = 0;
2194 ds_region.bufferOffset = 4;
2195 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002196 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002197 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002198 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2199 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002200 m_errorMonitor->VerifyFound();
2201 }
2202
2203 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002204 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002205 VkPhysicalDeviceFeatures device_features = {};
2206 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2207 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2208 device_features.textureCompressionASTC_LDR)) {
2209 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2210 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002211 // Verify transfer support for each compression format used blow
2212 bool missing_bc_support = false;
2213 bool missing_etc_support = false;
2214 bool missing_astc_support = false;
2215 bool missing_compression_support = false;
2216
2217 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2218 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2219 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2220 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2221
2222 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2223 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2224 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2225 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2226
2227 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2228 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2229 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2230 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2231
2232 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002233 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2234 0);
2235 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2236 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002237 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002238 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2239 VK_IMAGE_TILING_OPTIMAL, 0);
2240 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2241 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002242 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002243 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2244 VK_IMAGE_TILING_OPTIMAL, 0);
2245 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2246 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002247 } else {
2248 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002249 }
unknown088160a2019-05-23 17:43:13 -06002250
sfricke-samsung6d97e562020-01-07 22:01:00 -08002251 if (missing_compression_support) {
2252 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2253 } else {
2254 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002255 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002256 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002257 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2258 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002259 m_errorMonitor->ExpectSuccess();
2260 region.imageExtent = {128, 128, 1};
2261 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2262 buffer_16k.handle(), 1, &region);
2263 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002264
sfricke-samsung6d97e562020-01-07 22:01:00 -08002265 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002266 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002267 region.bufferOffset = 16;
2268 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2269 buffer_16k.handle(), 1, &region);
2270 m_errorMonitor->VerifyFound();
2271 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002272
sfricke-samsung6d97e562020-01-07 22:01:00 -08002273 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002274 m_errorMonitor->SetDesiredFailureMsg(
2275 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002276 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002277 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2278 region.imageExtent.width = 66;
2279 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2280 buffer_16k.handle(), 1, &region);
2281 m_errorMonitor->VerifyFound();
2282 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002283
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002284 m_errorMonitor->SetDesiredFailureMsg(
2285 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002286 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002287 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2288 region.imageExtent.height = 2;
2289 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2290 buffer_16k.handle(), 1, &region);
2291 m_errorMonitor->VerifyFound();
2292 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002293
sfricke-samsung6d97e562020-01-07 22:01:00 -08002294 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002295
sfricke-samsung6d97e562020-01-07 22:01:00 -08002296 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2297 m_errorMonitor->ExpectSuccess();
2298 region.imageExtent.width = 66;
2299 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002300 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2301 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002302 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2303 buffer_16k.handle(), 1, &region);
2304 region.imageExtent.width = 16;
2305 region.imageOffset.x = 0;
2306 region.imageExtent.height = 2;
2307 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002308 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2309 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002310 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2311 buffer_16k.handle(), 1, &region);
2312 m_errorMonitor->VerifyNotFound();
2313 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002314
sfricke-samsung6d97e562020-01-07 22:01:00 -08002315 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002317 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002318 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002320 region.imageExtent = {64, 64, 1};
2321 region.bufferOffset = 24;
2322 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2323 buffer_16k.handle(), 1, &region);
2324 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002325
sfricke-samsung6d97e562020-01-07 22:01:00 -08002326 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002328 region.bufferOffset = 0;
2329 region.bufferRowLength = 130;
2330 region.bufferImageHeight = 0;
2331 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2332 buffer_64k.handle(), 1, &region);
2333 m_errorMonitor->VerifyFound();
2334
2335 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002337 region.bufferRowLength = 0;
2338 region.bufferImageHeight = 130;
2339 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2340 buffer_64k.handle(), 1, &region);
2341 m_errorMonitor->VerifyFound();
2342 }
2343 }
2344
2345 // Test multi-planar formats, if supported
2346 if (!mp_extensions) {
2347 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2348 } else {
2349 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2350 // being required with samplerYcbcrConversion feature
2351 bool missing_mp_support = false;
2352 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2353 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2354 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2355 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2356
2357 if (missing_mp_support) {
2358 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2359 } else {
2360 VkBufferImageCopy mp_region = {};
2361 mp_region.bufferOffset = 0;
2362 mp_region.bufferRowLength = 0;
2363 mp_region.bufferImageHeight = 0;
2364 mp_region.imageSubresource.mipLevel = 0;
2365 mp_region.imageSubresource.baseArrayLayer = 0;
2366 mp_region.imageSubresource.layerCount = 1;
2367 mp_region.imageOffset = {0, 0, 0};
2368 mp_region.imageExtent = {128, 128, 1};
2369
2370 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2371 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2372 VK_IMAGE_TILING_OPTIMAL, 0);
2373 ASSERT_TRUE(image_multi_planar.initialized());
2374
2375 // Copies into a mutli-planar image aspect properly
2376 m_errorMonitor->ExpectSuccess();
2377 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002378 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2379 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002380 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2381 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2382 m_errorMonitor->VerifyNotFound();
2383
2384 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002385 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002386 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2387 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2388 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2389 m_errorMonitor->VerifyFound();
2390
2391 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002392 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002393 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2394 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2395 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2396 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002397
2398 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002400 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2401 mp_region.bufferOffset = 5;
2402 mp_region.imageExtent = {8, 8, 1};
2403 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2404 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2405 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002406 }
unknown088160a2019-05-23 17:43:13 -06002407 }
2408}
2409
2410TEST_F(VkLayerTest, MiscImageLayerTests) {
2411 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2412
2413 ASSERT_NO_FATAL_FAILURE(Init());
2414
2415 // TODO: Ideally we should check if a format is supported, before using it.
2416 VkImageObj image(m_device);
2417 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2418 ASSERT_TRUE(image.initialized());
2419 VkBufferObj buffer;
2420 VkMemoryPropertyFlags reqs = 0;
2421 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2422 VkBufferImageCopy region = {};
2423 region.bufferRowLength = 128;
2424 region.bufferImageHeight = 128;
2425 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2426 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2427 region.imageSubresource.layerCount = 1;
2428 region.imageExtent.height = 4;
2429 region.imageExtent.width = 4;
2430 region.imageExtent.depth = 1;
2431
2432 VkImageObj image2(m_device);
2433 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2434 ASSERT_TRUE(image2.initialized());
2435 VkBufferObj buffer2;
2436 VkMemoryPropertyFlags reqs2 = 0;
2437 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002438 m_commandBuffer->begin();
2439
2440 // Image must have offset.z of 0 and extent.depth of 1
2441 // Introduce failure by setting imageExtent.depth to 0
2442 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002443 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
sfricke-samsung5f11b0e2022-03-22 14:12:15 -05002444 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
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) {
sjfricke50955f32022-06-05 10:12:52 +09002538 GTEST_SKIP() << "Tests for 1.0 only";
sfricke-samsung30b094c2020-05-30 11:42:11 -07002539 }
2540
sfricke-samsung1c61f192021-12-31 01:53:03 -06002541 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002542 ci.flags = 0;
2543 ci.imageType = VK_IMAGE_TYPE_1D;
2544 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2545 ci.extent = {32, 1, 1};
2546 ci.mipLevels = 1;
2547 ci.arrayLayers = 1;
2548 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2549 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2550 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2551 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2552 ci.queueFamilyIndexCount = 0;
2553 ci.pQueueFamilyIndices = NULL;
2554 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2555
2556 // Create 1D image
2557 VkImageObj image_1D(m_device);
2558 image_1D.init(&ci);
2559 ASSERT_TRUE(image_1D.initialized());
2560
2561 // 2D image
2562 ci.imageType = VK_IMAGE_TYPE_2D;
2563 ci.extent = {32, 32, 1};
2564 VkImageObj image_2D(m_device);
2565 image_2D.init(&ci);
2566 ASSERT_TRUE(image_2D.initialized());
2567
2568 // 3D image
2569 ci.imageType = VK_IMAGE_TYPE_3D;
2570 ci.extent = {32, 32, 8};
2571 VkImageObj image_3D(m_device);
2572 image_3D.init(&ci);
2573 ASSERT_TRUE(image_3D.initialized());
2574
2575 // 2D image array
2576 ci.imageType = VK_IMAGE_TYPE_2D;
2577 ci.extent = {32, 32, 1};
2578 ci.arrayLayers = 8;
2579 VkImageObj image_2D_array(m_device);
2580 image_2D_array.init(&ci);
2581 ASSERT_TRUE(image_2D_array.initialized());
2582
2583 m_commandBuffer->begin();
2584
2585 VkImageCopy copy_region;
2586 copy_region.extent = {32, 1, 1};
2587 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2588 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2589 copy_region.srcSubresource.mipLevel = 0;
2590 copy_region.dstSubresource.mipLevel = 0;
2591 copy_region.srcSubresource.baseArrayLayer = 0;
2592 copy_region.dstSubresource.baseArrayLayer = 0;
2593 copy_region.srcSubresource.layerCount = 1;
2594 copy_region.dstSubresource.layerCount = 1;
2595 copy_region.srcOffset = {0, 0, 0};
2596 copy_region.dstOffset = {0, 0, 0};
2597
2598 // Sanity check
2599 m_errorMonitor->ExpectSuccess();
2600 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2601 &copy_region);
2602 m_errorMonitor->VerifyNotFound();
2603
Jeff Leger465acf52020-10-12 18:07:16 -04002604 // Equivalent sanity check using KHR_copy_commands2
2605 if (copy_commands2 && vkCmdCopyImage2Function) {
2606 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2607 NULL,
2608 copy_region.srcSubresource,
2609 copy_region.srcOffset,
2610 copy_region.dstSubresource,
2611 copy_region.dstOffset,
2612 copy_region.extent};
2613 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2614 NULL,
2615 image_1D.image(),
2616 VK_IMAGE_LAYOUT_GENERAL,
2617 image_2D.image(),
2618 VK_IMAGE_LAYOUT_GENERAL,
2619 1,
2620 &region2};
2621 m_errorMonitor->ExpectSuccess();
2622 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2623 m_errorMonitor->VerifyNotFound();
2624 }
2625
unknown088160a2019-05-23 17:43:13 -06002626 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2627 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2629 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002630 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2631 &copy_region);
2632 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002633
2634 // Equivalent test using KHR_copy_commands2
2635 if (copy_commands2 && vkCmdCopyImage2Function) {
2636 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2637 NULL,
2638 copy_region.srcSubresource,
2639 copy_region.srcOffset,
2640 copy_region.dstSubresource,
2641 copy_region.dstOffset,
2642 copy_region.extent};
2643 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2644 NULL,
2645 image_1D.image(),
2646 VK_IMAGE_LAYOUT_GENERAL,
2647 image_2D.image(),
2648 VK_IMAGE_LAYOUT_GENERAL,
2649 1,
2650 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002653 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2654 m_errorMonitor->VerifyFound();
2655 }
2656
unknown088160a2019-05-23 17:43:13 -06002657 copy_region.srcOffset.y = 0;
2658 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002659 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002661 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2662 &copy_region);
2663 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002664
2665 // Equivalent test using KHR_copy_commands2
2666 if (copy_commands2 && vkCmdCopyImage2Function) {
2667 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2668 NULL,
2669 copy_region.srcSubresource,
2670 copy_region.srcOffset,
2671 copy_region.dstSubresource,
2672 copy_region.dstOffset,
2673 copy_region.extent};
2674 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2675 NULL,
2676 image_2D.image(),
2677 VK_IMAGE_LAYOUT_GENERAL,
2678 image_1D.image(),
2679 VK_IMAGE_LAYOUT_GENERAL,
2680 1,
2681 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002684 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2685 m_errorMonitor->VerifyFound();
2686 }
2687
unknown088160a2019-05-23 17:43:13 -06002688 copy_region.dstOffset.y = 0;
2689
2690 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2691 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002692 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002694 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2695 &copy_region);
2696 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002697
2698 // Equivalent test using KHR_copy_commands2
2699 if (copy_commands2 && vkCmdCopyImage2Function) {
2700 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2701 NULL,
2702 copy_region.srcSubresource,
2703 copy_region.srcOffset,
2704 copy_region.dstSubresource,
2705 copy_region.dstOffset,
2706 copy_region.extent};
2707 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2708 NULL,
2709 image_1D.image(),
2710 VK_IMAGE_LAYOUT_GENERAL,
2711 image_2D.image(),
2712 VK_IMAGE_LAYOUT_GENERAL,
2713 1,
2714 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcImage-00146");
2716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-srcOffset-00145"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002717 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2718 m_errorMonitor->VerifyFound();
2719 }
2720
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002721 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002723 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2724 &copy_region);
2725 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002726
2727 // Equivalent test using KHR_copy_commands2
2728 if (copy_commands2 && vkCmdCopyImage2Function) {
2729 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2730 NULL,
2731 copy_region.srcSubresource,
2732 copy_region.srcOffset,
2733 copy_region.dstSubresource,
2734 copy_region.dstOffset,
2735 copy_region.extent};
2736 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2737 NULL,
2738 image_2D.image(),
2739 VK_IMAGE_LAYOUT_GENERAL,
2740 image_1D.image(),
2741 VK_IMAGE_LAYOUT_GENERAL,
2742 1,
2743 &region2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07002744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00152");
2745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstOffset-00151"); // also y-dim overrun
Jeff Leger465acf52020-10-12 18:07:16 -04002746 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2747 m_errorMonitor->VerifyFound();
2748 }
2749
unknown088160a2019-05-23 17:43:13 -06002750 copy_region.extent.height = 1;
2751
2752 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2753 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002754 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002756 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2757 &copy_region);
2758 m_errorMonitor->VerifyFound();
2759 copy_region.srcOffset.z = 0;
2760 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002763 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2764 &copy_region);
2765 m_errorMonitor->VerifyFound();
2766 copy_region.dstOffset.z = 0;
2767
2768 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2769 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002770 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002772 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002774 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002775 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002776 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002777 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2778 &copy_region);
2779 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002780 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002781 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002782 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002784 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002786 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002787 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2788 &copy_region);
2789 m_errorMonitor->VerifyFound();
2790 copy_region.extent.depth = 1;
2791
2792 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2793 copy_region.extent = {16, 16, 1};
2794 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002797 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002798 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2799 &copy_region);
2800 m_errorMonitor->VerifyFound();
2801 copy_region.srcOffset.z = 0;
2802 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002803 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002805 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002806 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2807 &copy_region);
2808 m_errorMonitor->VerifyFound();
2809 copy_region.dstOffset.z = 0;
2810
2811 // 3D texture accessing an array layer other than 0. VU 09c0011a
2812 copy_region.extent = {4, 4, 1};
2813 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002816 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2817 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2818 &copy_region);
2819 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002820 copy_region.srcSubresource.baseArrayLayer = 0;
2821
unknown088160a2019-05-23 17:43:13 -06002822 m_commandBuffer->end();
2823}
2824
2825TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2826 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002827 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07002828 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
2829 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06002830 } else {
2831 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2832 return;
2833 }
2834 ASSERT_NO_FATAL_FAILURE(InitState());
2835
2836 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2837 VkFormatProperties format_props;
2838 // TODO: Remove this check if or when devsim handles extensions.
2839 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2840 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002841 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002842 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2843 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2844 return;
2845 }
2846
sfricke-samsung1c61f192021-12-31 01:53:03 -06002847 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002848 ci.flags = 0;
2849 ci.imageType = VK_IMAGE_TYPE_1D;
2850 ci.format = image_format;
2851 ci.extent = {32, 1, 1};
2852 ci.mipLevels = 1;
2853 ci.arrayLayers = 1;
2854 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2855 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2856 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2857 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2858 ci.queueFamilyIndexCount = 0;
2859 ci.pQueueFamilyIndices = NULL;
2860 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2861
2862 // Create 1D image
2863 VkImageObj image_1D(m_device);
2864 image_1D.init(&ci);
2865 ASSERT_TRUE(image_1D.initialized());
2866
2867 // 2D image
2868 ci.imageType = VK_IMAGE_TYPE_2D;
2869 ci.extent = {32, 32, 1};
2870 VkImageObj image_2D(m_device);
2871 image_2D.init(&ci);
2872 ASSERT_TRUE(image_2D.initialized());
2873
2874 // 3D image
2875 ci.imageType = VK_IMAGE_TYPE_3D;
2876 ci.extent = {32, 32, 8};
2877 VkImageObj image_3D(m_device);
2878 image_3D.init(&ci);
2879 ASSERT_TRUE(image_3D.initialized());
2880
2881 // 2D image array
2882 ci.imageType = VK_IMAGE_TYPE_2D;
2883 ci.extent = {32, 32, 1};
2884 ci.arrayLayers = 8;
2885 VkImageObj image_2D_array(m_device);
2886 image_2D_array.init(&ci);
2887 ASSERT_TRUE(image_2D_array.initialized());
2888
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002889 // second 2D image array
2890 ci.imageType = VK_IMAGE_TYPE_2D;
2891 ci.extent = {32, 32, 1};
2892 ci.arrayLayers = 8;
2893 VkImageObj image_2D_array_2(m_device);
2894 image_2D_array_2.init(&ci);
2895 ASSERT_TRUE(image_2D_array_2.initialized());
2896
unknown088160a2019-05-23 17:43:13 -06002897 m_commandBuffer->begin();
2898
2899 VkImageCopy copy_region;
2900 copy_region.extent = {32, 1, 1};
2901 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2902 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2903 copy_region.srcSubresource.mipLevel = 0;
2904 copy_region.dstSubresource.mipLevel = 0;
2905 copy_region.srcSubresource.baseArrayLayer = 0;
2906 copy_region.dstSubresource.baseArrayLayer = 0;
2907 copy_region.srcSubresource.layerCount = 1;
2908 copy_region.dstSubresource.layerCount = 1;
2909 copy_region.srcOffset = {0, 0, 0};
2910 copy_region.dstOffset = {0, 0, 0};
2911
2912 // Copy from layer not present
2913 copy_region.srcSubresource.baseArrayLayer = 4;
2914 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002916 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2917 &copy_region);
2918 m_errorMonitor->VerifyFound();
2919 copy_region.srcSubresource.baseArrayLayer = 0;
2920 copy_region.srcSubresource.layerCount = 1;
2921
2922 // Copy to layer not present
2923 copy_region.dstSubresource.baseArrayLayer = 1;
2924 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002926 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2927 &copy_region);
2928 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002929 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002930 copy_region.dstSubresource.layerCount = 1;
2931
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002932 // both 2D and extent.depth not 1
2933 // Need two 2D array images to prevent other errors
2934 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002935 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002936 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2937 1, &copy_region);
2938 m_errorMonitor->VerifyFound();
2939 copy_region.extent = {32, 1, 1};
2940
2941 // 2D src / 3D dst and depth not equal to src layerCount
2942 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002945 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2946 &copy_region);
2947 m_errorMonitor->VerifyFound();
2948 copy_region.extent = {32, 1, 1};
2949
2950 // 3D src / 2D dst and depth not equal to dst layerCount
2951 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002953 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002954 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2955 &copy_region);
2956 m_errorMonitor->VerifyFound();
2957 copy_region.extent = {32, 1, 1};
2958
unknown088160a2019-05-23 17:43:13 -06002959 m_commandBuffer->end();
2960}
2961
2962TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2963 // Image copy tests on compressed images with block alignment errors
2964 SetTargetApiVersion(VK_API_VERSION_1_1);
2965 ASSERT_NO_FATAL_FAILURE(Init());
2966
2967 // Select a compressed format and verify support
2968 VkPhysicalDeviceFeatures device_features = {};
2969 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2970 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2971 if (device_features.textureCompressionBC) {
2972 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2973 } else if (device_features.textureCompressionETC2) {
2974 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2975 } else if (device_features.textureCompressionASTC_LDR) {
2976 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2977 }
2978
sfricke-samsung1c61f192021-12-31 01:53:03 -06002979 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06002980 ci.flags = 0;
2981 ci.imageType = VK_IMAGE_TYPE_2D;
2982 ci.format = compressed_format;
2983 ci.extent = {64, 64, 1};
2984 ci.mipLevels = 1;
2985 ci.arrayLayers = 1;
2986 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2987 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2988 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2989 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2990 ci.queueFamilyIndexCount = 0;
2991 ci.pQueueFamilyIndices = NULL;
2992 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2993
2994 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002995 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2996 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002997 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2998 return;
2999 }
3000
3001 // Create images
3002 VkImageObj image_1(m_device);
3003 image_1.init(&ci);
3004 ASSERT_TRUE(image_1.initialized());
3005
3006 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3007 VkImageObj image_2(m_device);
3008 image_2.init(&ci);
3009 ASSERT_TRUE(image_2.initialized());
3010
3011 m_commandBuffer->begin();
3012
3013 VkImageCopy copy_region;
3014 copy_region.extent = {48, 48, 1};
3015 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3016 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3017 copy_region.srcSubresource.mipLevel = 0;
3018 copy_region.dstSubresource.mipLevel = 0;
3019 copy_region.srcSubresource.baseArrayLayer = 0;
3020 copy_region.dstSubresource.baseArrayLayer = 0;
3021 copy_region.srcSubresource.layerCount = 1;
3022 copy_region.dstSubresource.layerCount = 1;
3023 copy_region.srcOffset = {0, 0, 0};
3024 copy_region.dstOffset = {0, 0, 0};
3025
3026 // Sanity check
3027 m_errorMonitor->ExpectSuccess();
3028 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3029 m_errorMonitor->VerifyNotFound();
3030
3031 std::string vuid;
3032 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3033 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3034
3035 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3036 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003037 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003038 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003039 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003041 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3042 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3043 m_errorMonitor->VerifyFound();
3044 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003047 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3048 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3049 m_errorMonitor->VerifyFound();
3050 copy_region.srcOffset = {0, 0, 0};
3051
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003052 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003053 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003056 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3057 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3058 m_errorMonitor->VerifyFound();
3059 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003060 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003062 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3063 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3064 m_errorMonitor->VerifyFound();
3065 copy_region.dstOffset = {0, 0, 0};
3066
3067 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003068 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003069 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003072 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3073 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3074 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003075 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003076 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003077 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003079 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3080 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3081 m_errorMonitor->VerifyFound();
3082
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003083 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003084 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003085 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3086 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003087 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3088 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3089 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003090 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003091 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003094 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3095 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3096 m_errorMonitor->VerifyFound();
3097
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003098 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3099 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003100 // There are currently no supported compressed formats with a block depth other than 1,
3101 // so impossible to create a 'not a multiple' condition for depth.
3102 m_commandBuffer->end();
3103}
3104
3105TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3106 // Image copy tests on single-plane _422 formats with block alignment errors
3107
3108 // Enable KHR multiplane req'd extensions
3109 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3110 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3111 if (mp_extensions) {
3112 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3113 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003114 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003115 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003116 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3117 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3118 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3119 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003120 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003121 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3122 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3123 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3124 } else {
3125 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3126 return;
3127 }
3128 ASSERT_NO_FATAL_FAILURE(InitState());
3129
3130 // Select a _422 format and verify support
sfricke-samsung1c61f192021-12-31 01:53:03 -06003131 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003132 ci.flags = 0;
3133 ci.imageType = VK_IMAGE_TYPE_2D;
3134 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3135 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3136 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3137 ci.mipLevels = 1;
3138 ci.arrayLayers = 1;
3139 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3140 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3141 ci.queueFamilyIndexCount = 0;
3142 ci.pQueueFamilyIndices = NULL;
3143 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3144
3145 // Verify formats
3146 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3147 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3148 if (!supported) {
3149 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3150 return; // Assume there's low ROI on searching for different mp formats
3151 }
3152
3153 // Create images
3154 ci.extent = {64, 64, 1};
3155 VkImageObj image_422(m_device);
3156 image_422.init(&ci);
3157 ASSERT_TRUE(image_422.initialized());
3158
3159 ci.extent = {64, 64, 1};
3160 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3161 VkImageObj image_ucmp(m_device);
3162 image_ucmp.init(&ci);
3163 ASSERT_TRUE(image_ucmp.initialized());
3164
3165 m_commandBuffer->begin();
3166
3167 VkImageCopy copy_region;
3168 copy_region.extent = {48, 48, 1};
3169 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3170 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3171 copy_region.srcSubresource.mipLevel = 0;
3172 copy_region.dstSubresource.mipLevel = 0;
3173 copy_region.srcSubresource.baseArrayLayer = 0;
3174 copy_region.dstSubresource.baseArrayLayer = 0;
3175 copy_region.srcSubresource.layerCount = 1;
3176 copy_region.dstSubresource.layerCount = 1;
3177 copy_region.srcOffset = {0, 0, 0};
3178 copy_region.dstOffset = {0, 0, 0};
3179
3180 // Src offsets must be multiples of compressed block sizes
3181 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003182 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003183 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003184 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3185 &copy_region);
3186 m_errorMonitor->VerifyFound();
3187 copy_region.srcOffset = {0, 0, 0};
3188
3189 // Dst offsets must be multiples of compressed block sizes
3190 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003191 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003192 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003193 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003194 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3195 &copy_region);
3196 m_errorMonitor->VerifyFound();
3197 copy_region.dstOffset = {0, 0, 0};
3198
3199 // Copy extent must be multiples of compressed block sizes if not full width/height
3200 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003202 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003203 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3204 &copy_region);
3205 m_errorMonitor->VerifyFound();
3206
unknown357e1782019-09-25 17:57:40 -06003207 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003208 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3209 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003210 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003211 copy_region.dstOffset = {0, 0, 0};
3212
3213 m_commandBuffer->end();
3214}
3215
3216TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3217 // Image copy tests on multiplane images with aspect errors
3218
3219 // Enable KHR multiplane req'd extensions
3220 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3221 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3222 if (mp_extensions) {
3223 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3224 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003225 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003226 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003227 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3228 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3229 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3230 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003231 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06003232 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3233 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3234 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3235 } else {
3236 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3237 return;
3238 }
3239 ASSERT_NO_FATAL_FAILURE(InitState());
3240
3241 // Select multi-plane formats and verify support
3242 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3243 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3244
sfricke-samsung1c61f192021-12-31 01:53:03 -06003245 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003246 ci.flags = 0;
3247 ci.imageType = VK_IMAGE_TYPE_2D;
3248 ci.format = mp2_format;
3249 ci.extent = {256, 256, 1};
3250 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3251 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3252 ci.mipLevels = 1;
3253 ci.arrayLayers = 1;
3254 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3255 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3256 ci.queueFamilyIndexCount = 0;
3257 ci.pQueueFamilyIndices = NULL;
3258 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3259
3260 // Verify formats
3261 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3262 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3263 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3264 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3265 ci.format = mp3_format;
3266 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3267 if (!supported) {
3268 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3269 kSkipPrefix);
3270 return; // Assume there's low ROI on searching for different mp formats
3271 }
3272
3273 // Create images
3274 VkImageObj mp3_image(m_device);
3275 mp3_image.init(&ci);
3276 ASSERT_TRUE(mp3_image.initialized());
3277
3278 ci.format = mp2_format;
3279 VkImageObj mp2_image(m_device);
3280 mp2_image.init(&ci);
3281 ASSERT_TRUE(mp2_image.initialized());
3282
3283 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3284 VkImageObj sp_image(m_device);
3285 sp_image.init(&ci);
3286 ASSERT_TRUE(sp_image.initialized());
3287
3288 m_commandBuffer->begin();
3289
3290 VkImageCopy copy_region;
3291 copy_region.extent = {128, 128, 1};
3292 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3293 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3294 copy_region.srcSubresource.mipLevel = 0;
3295 copy_region.dstSubresource.mipLevel = 0;
3296 copy_region.srcSubresource.baseArrayLayer = 0;
3297 copy_region.dstSubresource.baseArrayLayer = 0;
3298 copy_region.srcSubresource.layerCount = 1;
3299 copy_region.dstSubresource.layerCount = 1;
3300 copy_region.srcOffset = {0, 0, 0};
3301 copy_region.dstOffset = {0, 0, 0};
3302
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003304 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3305 &copy_region);
3306 m_errorMonitor->VerifyFound();
3307
unknown088160a2019-05-23 17:43:13 -06003308 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3309 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003311 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3312 &copy_region);
3313 m_errorMonitor->VerifyFound();
3314
3315 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3316 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003318 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3319 &copy_region);
3320 m_errorMonitor->VerifyFound();
3321
3322 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003323 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003324 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3325 &copy_region);
3326 m_errorMonitor->VerifyFound();
3327
3328 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003329 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003331 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3332 &copy_region);
3333 m_errorMonitor->VerifyFound();
3334
3335 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3336 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003338 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003339 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3340 &copy_region);
3341 m_errorMonitor->VerifyFound();
3342
3343 m_commandBuffer->end();
3344}
3345
3346TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3347 // Image copy with source region specified greater than src image size
3348 ASSERT_NO_FATAL_FAILURE(Init());
3349
3350 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003351 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003352 ci.flags = 0;
3353 ci.imageType = VK_IMAGE_TYPE_3D;
3354 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3355 ci.extent = {32, 32, 8};
3356 ci.mipLevels = 6;
3357 ci.arrayLayers = 1;
3358 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3359 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3360 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3361 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3362 ci.queueFamilyIndexCount = 0;
3363 ci.pQueueFamilyIndices = NULL;
3364 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3365
3366 VkImageObj src_image(m_device);
3367 src_image.init(&ci);
3368 ASSERT_TRUE(src_image.initialized());
3369
3370 // Dest image with one more mip level
3371 ci.extent = {64, 64, 16};
3372 ci.mipLevels = 7;
3373 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3374 VkImageObj dst_image(m_device);
3375 dst_image.init(&ci);
3376 ASSERT_TRUE(dst_image.initialized());
3377
3378 m_commandBuffer->begin();
3379
3380 VkImageCopy copy_region;
3381 copy_region.extent = {32, 32, 8};
3382 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3383 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3384 copy_region.srcSubresource.mipLevel = 0;
3385 copy_region.dstSubresource.mipLevel = 0;
3386 copy_region.srcSubresource.baseArrayLayer = 0;
3387 copy_region.dstSubresource.baseArrayLayer = 0;
3388 copy_region.srcSubresource.layerCount = 1;
3389 copy_region.dstSubresource.layerCount = 1;
3390 copy_region.srcOffset = {0, 0, 0};
3391 copy_region.dstOffset = {0, 0, 0};
3392
3393 m_errorMonitor->ExpectSuccess();
3394 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3395 &copy_region);
3396 m_errorMonitor->VerifyNotFound();
3397
sfricke-samsung066e0c72022-03-15 23:35:23 -05003398 // Source exceeded in x-dim
unknown088160a2019-05-23 17:43:13 -06003399 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003401 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3402 &copy_region);
3403 m_errorMonitor->VerifyFound();
3404
sfricke-samsung066e0c72022-03-15 23:35:23 -05003405 // Dest exceeded in x-dim in negative direction (since offset is a signed in)
3406 copy_region.extent.width = 4;
3407 copy_region.srcOffset.x = -8;
3408 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
3409 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3410 &copy_region);
3411 m_errorMonitor->VerifyFound();
3412 copy_region.extent.width = 32;
3413
3414 // Source exceeded in y-dim
unknown088160a2019-05-23 17:43:13 -06003415 copy_region.srcOffset.x = 0;
3416 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
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
sfricke-samsung066e0c72022-03-15 23:35:23 -05003422 // Source exceeded in z-dim
unknown088160a2019-05-23 17:43:13 -06003423 copy_region.extent = {4, 4, 4};
3424 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003426 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3427 &copy_region);
3428 m_errorMonitor->VerifyFound();
3429
3430 m_commandBuffer->end();
3431}
3432
3433TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3434 // Image copy with dest region specified greater than dest image size
3435 ASSERT_NO_FATAL_FAILURE(Init());
3436
3437 // Create images with full mip chain
sfricke-samsung1c61f192021-12-31 01:53:03 -06003438 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003439 ci.flags = 0;
3440 ci.imageType = VK_IMAGE_TYPE_3D;
3441 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3442 ci.extent = {32, 32, 8};
3443 ci.mipLevels = 6;
3444 ci.arrayLayers = 1;
3445 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3446 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3447 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3448 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3449 ci.queueFamilyIndexCount = 0;
3450 ci.pQueueFamilyIndices = NULL;
3451 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3452
3453 VkImageObj dst_image(m_device);
3454 dst_image.init(&ci);
3455 ASSERT_TRUE(dst_image.initialized());
3456
3457 // Src image with one more mip level
3458 ci.extent = {64, 64, 16};
3459 ci.mipLevels = 7;
3460 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3461 VkImageObj src_image(m_device);
3462 src_image.init(&ci);
3463 ASSERT_TRUE(src_image.initialized());
3464
3465 m_commandBuffer->begin();
3466
3467 VkImageCopy copy_region;
3468 copy_region.extent = {32, 32, 8};
3469 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3470 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3471 copy_region.srcSubresource.mipLevel = 0;
3472 copy_region.dstSubresource.mipLevel = 0;
3473 copy_region.srcSubresource.baseArrayLayer = 0;
3474 copy_region.dstSubresource.baseArrayLayer = 0;
3475 copy_region.srcSubresource.layerCount = 1;
3476 copy_region.dstSubresource.layerCount = 1;
3477 copy_region.srcOffset = {0, 0, 0};
3478 copy_region.dstOffset = {0, 0, 0};
3479
3480 m_errorMonitor->ExpectSuccess();
3481 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3482 &copy_region);
3483 m_errorMonitor->VerifyNotFound();
3484
sfricke-samsung066e0c72022-03-15 23:35:23 -05003485 // Dest exceeded in x-dim
unknown088160a2019-05-23 17:43:13 -06003486 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003487 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
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
sfricke-samsung066e0c72022-03-15 23:35:23 -05003492 // Dest exceeded in x-dim in negative direction (since offset is a signed in)
3493 copy_region.extent.width = 4;
3494 copy_region.dstOffset.x = -8;
3495 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
3496 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 copy_region.extent.width = 32;
3500
unknown088160a2019-05-23 17:43:13 -06003501 copy_region.dstOffset.x = 0;
3502 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003504 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3505 &copy_region);
3506 m_errorMonitor->VerifyFound();
3507
sfricke-samsung066e0c72022-03-15 23:35:23 -05003508 // Dest exceeded in z-dim
unknown088160a2019-05-23 17:43:13 -06003509 copy_region.extent = {4, 4, 4};
3510 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003511 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003512 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3513 &copy_region);
3514 m_errorMonitor->VerifyFound();
3515
3516 m_commandBuffer->end();
3517}
3518
sfricke-samsungea1154b2022-03-31 22:29:34 -05003519TEST_F(VkLayerTest, CopyImageZeroSize) {
3520 TEST_DESCRIPTION("Image Copy with empty regions");
3521 ASSERT_NO_FATAL_FAILURE(Init());
3522
3523 // Create images with full mip chain
3524 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
3525 ci.flags = 0;
3526 ci.imageType = VK_IMAGE_TYPE_3D;
3527 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3528 ci.extent = {32, 32, 8};
3529 ci.mipLevels = 6;
3530 ci.arrayLayers = 1;
3531 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3532 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3533 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3534 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3535 ci.queueFamilyIndexCount = 0;
3536 ci.pQueueFamilyIndices = NULL;
3537 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3538
3539 VkImageObj src_image(m_device);
3540 src_image.init(&ci);
3541 ASSERT_TRUE(src_image.initialized());
3542
3543 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3544 VkImageObj dst_image(m_device);
3545 dst_image.init(&ci);
3546 ASSERT_TRUE(dst_image.initialized());
3547
3548 VkBufferObj buffer;
3549 VkMemoryPropertyFlags reqs = 0;
3550 buffer.init_as_src_and_dst(*m_device, 16384, reqs); // large enough for image
3551
3552 m_commandBuffer->begin();
3553
3554 VkImageCopy copy_region;
3555 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3556 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3557 copy_region.srcSubresource.mipLevel = 0;
3558 copy_region.dstSubresource.mipLevel = 0;
3559 copy_region.srcSubresource.baseArrayLayer = 0;
3560 copy_region.dstSubresource.baseArrayLayer = 0;
3561 copy_region.srcSubresource.layerCount = 1;
3562 copy_region.dstSubresource.layerCount = 1;
3563 copy_region.srcOffset = {0, 0, 0};
3564 copy_region.dstOffset = {0, 0, 0};
3565
3566 copy_region.extent = {4, 4, 0};
3567 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06670");
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->VerifyFound();
3571
3572 copy_region.extent = {0, 0, 4};
3573 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06668"); // width
3574 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-06669"); // height
3575 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3576 &copy_region);
3577 m_errorMonitor->VerifyFound();
3578
3579 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
3580 VkBufferImageCopy buffer_image_copy;
3581 buffer_image_copy.bufferRowLength = 0;
3582 buffer_image_copy.bufferImageHeight = 0;
3583 buffer_image_copy.imageSubresource = image_subresource;
3584 buffer_image_copy.imageOffset = {0, 0, 0};
3585 buffer_image_copy.bufferOffset = 0;
3586
3587 buffer_image_copy.imageExtent = {4, 0, 1};
3588 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06660");
3589 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer.handle(), 1,
3590 &buffer_image_copy);
3591 m_errorMonitor->VerifyFound();
3592
3593 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06660");
3594 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3595 &buffer_image_copy);
3596 m_errorMonitor->VerifyFound();
3597
3598 // depth is now zero
3599 buffer_image_copy.imageExtent = {4, 1, 0};
3600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
3601 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer.handle(), 1,
3602 &buffer_image_copy);
3603 m_errorMonitor->VerifyFound();
3604
3605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-imageExtent-06661");
3606 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3607 &buffer_image_copy);
3608 m_errorMonitor->VerifyFound();
3609
3610 m_commandBuffer->end();
3611}
3612
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003613TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3614 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3615
3616 // Enable KHR multiplane req'd extensions
3617 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3618 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3619 if (mp_extensions == true) {
3620 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3621 }
3622 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003623 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003624 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3625 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3626 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3627 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003628 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003629 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3630 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3631 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3632 } else {
3633 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3634 return;
3635 }
3636 ASSERT_NO_FATAL_FAILURE(InitState());
3637
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003638 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3639 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003640 VkFormatProperties props = {0, 0, 0};
3641 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003642 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003643 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3644 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3645 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3646
3647 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003648 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003649 return;
3650 }
3651
3652 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3653 VkImageObj src_image(m_device);
3654 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003655 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 -08003656 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003657 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 -08003658 ASSERT_TRUE(dst_image.initialized());
3659
3660 VkImageCopy copy_region = {};
3661 copy_region.extent = {64, 64, 1}; // Size of plane 1
3662 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3663 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3664 copy_region.srcSubresource.mipLevel = 0;
3665 copy_region.dstSubresource.mipLevel = 0;
3666 copy_region.srcSubresource.baseArrayLayer = 0;
3667 copy_region.dstSubresource.baseArrayLayer = 0;
3668 copy_region.srcSubresource.layerCount = 1;
3669 copy_region.dstSubresource.layerCount = 1;
3670 copy_region.srcOffset = {0, 0, 0};
3671 copy_region.dstOffset = {0, 0, 0};
3672 VkImageCopy original_region = copy_region;
3673
3674 m_commandBuffer->begin();
3675
3676 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3677 m_errorMonitor->ExpectSuccess();
3678 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3679 &copy_region);
3680 m_errorMonitor->VerifyNotFound();
3681
3682 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3683 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3684 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3685 m_errorMonitor->ExpectSuccess();
3686 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3687 &copy_region);
3688 m_errorMonitor->VerifyNotFound();
3689
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003690 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003691 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3692 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3693
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003694 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3695 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3696 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3697 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003698 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3699 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003700 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3701 &copy_region);
3702 m_errorMonitor->VerifyNotFound();
3703
3704 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3705 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3706 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3707 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003708 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3709 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003710 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3711 &copy_region);
3712 m_errorMonitor->VerifyNotFound();
3713
3714 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3715 copy_region.extent = {128, 64, 1};
3716 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3717 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3718 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003719 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3720 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003721 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3722 &copy_region);
3723 m_errorMonitor->VerifyNotFound();
3724
3725 // 128x64 copy from plane 0 -> Plane 1
3726 copy_region.extent = {128, 64, 1};
3727 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3728 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003730 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3731 &copy_region);
3732 m_errorMonitor->VerifyFound();
3733
3734 // 128x64 copy from plane 1 -> Plane 0
3735 copy_region.extent = {128, 64, 1};
3736 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3737 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003739 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3740 &copy_region);
3741 m_errorMonitor->VerifyFound();
3742
3743 // src exceeded in y-dim from offset
3744 copy_region = original_region;
3745 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003747 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3748 &copy_region);
3749 m_errorMonitor->VerifyFound();
3750
3751 // dst exceeded in y-dim from offset
3752 copy_region = original_region;
3753 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003754 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003755 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3756 &copy_region);
3757 m_errorMonitor->VerifyFound();
3758
3759 m_commandBuffer->end();
3760}
3761
unknown088160a2019-05-23 17:43:13 -06003762TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003763 if (!EnableDeviceProfileLayer()) {
3764 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3765 return;
3766 }
unknown088160a2019-05-23 17:43:13 -06003767
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003768 // Enable KHR multiplane req'd extensions
3769 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3770 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3771 if (mp_extensions == true) {
3772 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3773 }
3774 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003775 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003776 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3777 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3778 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3779 if (mp_extensions == true) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07003780 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003781 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3782 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3783 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3784 }
3785 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003786
sfricke-samsung51067b22020-04-30 21:41:17 -07003787 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3788 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003789
sfricke-samsung51067b22020-04-30 21:41:17 -07003790 // Load required functions
3791 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3792 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3793 return;
3794 }
3795
3796 // Set transfer for all potential used formats
3797 VkFormatProperties format_props;
3798 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3799 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3800 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3801
3802 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3803 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3804 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003805
sfricke-samsung1c61f192021-12-31 01:53:03 -06003806 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06003807 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003808 image_create_info.extent.width = 32;
3809 image_create_info.extent.height = 32;
3810 image_create_info.extent.depth = 1;
3811 image_create_info.mipLevels = 1;
3812 image_create_info.arrayLayers = 1;
3813 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003814 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3815 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003816 image_create_info.flags = 0;
3817
sfricke-samsung51067b22020-04-30 21:41:17 -07003818 image_create_info.format = VK_FORMAT_R8_UNORM;
3819 VkImageObj image_8b_unorm(m_device);
3820 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003821
sfricke-samsung51067b22020-04-30 21:41:17 -07003822 image_create_info.format = VK_FORMAT_R8_UINT;
3823 VkImageObj image_8b_uint(m_device);
3824 image_8b_uint.init(&image_create_info);
3825
3826 // First try to test two single plane mismatch
3827 {
3828 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3829 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3830 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3831
3832 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3833 VkImageObj image_32b_unorm(m_device);
3834 image_32b_unorm.init(&image_create_info);
3835
3836 m_commandBuffer->begin();
3837 VkImageCopy copyRegion;
3838 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3839 copyRegion.srcSubresource.mipLevel = 0;
3840 copyRegion.srcSubresource.baseArrayLayer = 0;
3841 copyRegion.srcSubresource.layerCount = 1;
3842 copyRegion.srcOffset.x = 0;
3843 copyRegion.srcOffset.y = 0;
3844 copyRegion.srcOffset.z = 0;
3845 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3846 copyRegion.dstSubresource.mipLevel = 0;
3847 copyRegion.dstSubresource.baseArrayLayer = 0;
3848 copyRegion.dstSubresource.layerCount = 1;
3849 copyRegion.dstOffset.x = 0;
3850 copyRegion.dstOffset.y = 0;
3851 copyRegion.dstOffset.z = 0;
3852 copyRegion.extent.width = 1;
3853 copyRegion.extent.height = 1;
3854 copyRegion.extent.depth = 1;
3855
3856 // Sanity check between two 8bit formats
3857 m_errorMonitor->ExpectSuccess();
3858 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3859 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3860 m_errorMonitor->VerifyNotFound();
3861
3862 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3864 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3865 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3866 m_errorMonitor->VerifyFound();
3867
3868 // Swap src and dst
3869 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3870 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3871 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3872 m_errorMonitor->VerifyFound();
3873
3874 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003875 }
3876
sfricke-samsung51067b22020-04-30 21:41:17 -07003877 // DstImage is a mismatched plane of a multi-planar format
3878 if (mp_extensions == false) {
3879 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3880 } else {
3881 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3882 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3883 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003884
sfricke-samsung51067b22020-04-30 21:41:17 -07003885 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3886 VkImageObj image_8b_16b_420_unorm(m_device);
3887 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003888
sfricke-samsung51067b22020-04-30 21:41:17 -07003889 m_commandBuffer->begin();
3890 VkImageCopy copyRegion;
3891 copyRegion.srcSubresource.mipLevel = 0;
3892 copyRegion.srcSubresource.baseArrayLayer = 0;
3893 copyRegion.srcSubresource.layerCount = 1;
3894 copyRegion.srcOffset.x = 0;
3895 copyRegion.srcOffset.y = 0;
3896 copyRegion.srcOffset.z = 0;
3897 copyRegion.dstSubresource.mipLevel = 0;
3898 copyRegion.dstSubresource.baseArrayLayer = 0;
3899 copyRegion.dstSubresource.layerCount = 1;
3900 copyRegion.dstOffset.x = 0;
3901 copyRegion.dstOffset.y = 0;
3902 copyRegion.dstOffset.z = 0;
3903 copyRegion.extent.width = 1;
3904 copyRegion.extent.height = 1;
3905 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003906
sfricke-samsung51067b22020-04-30 21:41:17 -07003907 // First test single-plane -> multi-plan
3908 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3909 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003910
sfricke-samsung51067b22020-04-30 21:41:17 -07003911 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3912 m_errorMonitor->ExpectSuccess();
3913 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3914 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3915 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003916
locke-lunargdf00db02020-03-04 19:00:57 -07003917 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3918 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3919
sfricke-samsung51067b22020-04-30 21:41:17 -07003920 // Make sure no false postiives if Compatible format
3921 m_errorMonitor->ExpectSuccess();
3922 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3923 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3924 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003925
sfricke-samsung51067b22020-04-30 21:41:17 -07003926 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3927 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3929 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3930 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3931 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003932
sfricke-samsung51067b22020-04-30 21:41:17 -07003933 // Same tests but swap src and dst
3934 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3935 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003936
locke-lunargdf00db02020-03-04 19:00:57 -07003937 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3938 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3939 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3940 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3941
sfricke-samsung51067b22020-04-30 21:41:17 -07003942 m_errorMonitor->ExpectSuccess();
3943 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3944 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3945 m_errorMonitor->VerifyNotFound();
3946
locke-lunargdf00db02020-03-04 19:00:57 -07003947 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3948 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3949
sfricke-samsung51067b22020-04-30 21:41:17 -07003950 m_errorMonitor->ExpectSuccess();
3951 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3952 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3953 m_errorMonitor->VerifyNotFound();
3954
3955 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3957 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3958 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3959 m_errorMonitor->VerifyFound();
3960
3961 m_commandBuffer->end();
3962 }
unknown088160a2019-05-23 17:43:13 -06003963}
3964
3965TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3966 ASSERT_NO_FATAL_FAILURE(Init());
3967 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3968 if (!depth_format) {
3969 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3970 return;
3971 }
3972
3973 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003974 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003975 if (properties.optimalTilingFeatures == 0) {
3976 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3977 return;
3978 }
3979
3980 VkImageObj srcImage(m_device);
3981 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3982 ASSERT_TRUE(srcImage.initialized());
3983 VkImageObj dstImage(m_device);
3984 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3985 ASSERT_TRUE(dstImage.initialized());
3986
3987 // Create two images of different types and try to copy between them
3988
3989 m_commandBuffer->begin();
3990 VkImageCopy copyRegion;
3991 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3992 copyRegion.srcSubresource.mipLevel = 0;
3993 copyRegion.srcSubresource.baseArrayLayer = 0;
3994 copyRegion.srcSubresource.layerCount = 1;
3995 copyRegion.srcOffset.x = 0;
3996 copyRegion.srcOffset.y = 0;
3997 copyRegion.srcOffset.z = 0;
3998 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3999 copyRegion.dstSubresource.mipLevel = 0;
4000 copyRegion.dstSubresource.baseArrayLayer = 0;
4001 copyRegion.dstSubresource.layerCount = 1;
4002 copyRegion.dstOffset.x = 0;
4003 copyRegion.dstOffset.y = 0;
4004 copyRegion.dstOffset.z = 0;
4005 copyRegion.extent.width = 1;
4006 copyRegion.extent.height = 1;
4007 copyRegion.extent.depth = 1;
4008
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06004010 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4011 &copyRegion);
4012 m_commandBuffer->end();
4013
4014 m_errorMonitor->VerifyFound();
4015}
4016
4017TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
4018 TEST_DESCRIPTION("Image copies with sample count mis-matches");
4019
4020 ASSERT_NO_FATAL_FAILURE(Init());
4021
4022 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004023 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
4024 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
4025 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06004026
4027 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
4028 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
4029 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
4030 return;
4031 }
4032
sfricke-samsung1c61f192021-12-31 01:53:03 -06004033 VkImageCreateInfo ci = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004034 ci.flags = 0;
4035 ci.imageType = VK_IMAGE_TYPE_2D;
4036 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
4037 ci.extent = {128, 128, 1};
4038 ci.mipLevels = 1;
4039 ci.arrayLayers = 1;
4040 ci.samples = VK_SAMPLE_COUNT_1_BIT;
4041 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
4042 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4043 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4044 ci.queueFamilyIndexCount = 0;
4045 ci.pQueueFamilyIndices = NULL;
4046 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4047
4048 VkImageObj image1(m_device);
4049 image1.init(&ci);
4050 ASSERT_TRUE(image1.initialized());
4051
4052 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4053 VkImageObj image2(m_device);
4054 image2.init(&ci);
4055 ASSERT_TRUE(image2.initialized());
4056
4057 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4058 VkImageObj image4(m_device);
4059 image4.init(&ci);
4060 ASSERT_TRUE(image4.initialized());
4061
4062 m_commandBuffer->begin();
4063
4064 VkImageCopy copyRegion;
4065 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4066 copyRegion.srcSubresource.mipLevel = 0;
4067 copyRegion.srcSubresource.baseArrayLayer = 0;
4068 copyRegion.srcSubresource.layerCount = 1;
4069 copyRegion.srcOffset = {0, 0, 0};
4070 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4071 copyRegion.dstSubresource.mipLevel = 0;
4072 copyRegion.dstSubresource.baseArrayLayer = 0;
4073 copyRegion.dstSubresource.layerCount = 1;
4074 copyRegion.dstOffset = {0, 0, 0};
4075 copyRegion.extent = {128, 128, 1};
4076
4077 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07004078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004079 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4080 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004081 m_errorMonitor->VerifyFound();
4082
Mark Lobodzinski20310782020-02-28 14:25:17 -07004083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004084 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4085 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004086 m_errorMonitor->VerifyFound();
4087
4088 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004090 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4091 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004092 m_errorMonitor->VerifyFound();
4093
Mark Lobodzinski20310782020-02-28 14:25:17 -07004094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004095 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4096 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004097 m_errorMonitor->VerifyFound();
4098
4099 m_commandBuffer->end();
4100}
4101
4102TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4103 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004104
4105 if (!EnableDeviceProfileLayer()) {
4106 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4107 return;
4108 }
4109
4110 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4111 if (mp_extensions) {
4112 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4113 }
4114
4115 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004116 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004117 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4118 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4119 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4120 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07004121 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004122 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4123 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4124 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4125 }
4126 ASSERT_NO_FATAL_FAILURE(InitState());
4127
4128 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4129 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4130
4131 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4132 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4133 return;
4134 }
4135
unknown088160a2019-05-23 17:43:13 -06004136 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4137 if (!ds_format) {
4138 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4139 return;
4140 }
4141
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004142 // Add Transfer support for all used formats
4143 VkFormatProperties formatProps;
4144 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4145 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4146 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4147 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4148 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4149 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4150 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4151 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4152 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4153
unknown088160a2019-05-23 17:43:13 -06004154 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4155 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4156 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4157 VK_IMAGE_TILING_OPTIMAL, 0);
4158 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4159 VK_IMAGE_TILING_OPTIMAL, 0);
4160 ASSERT_TRUE(color_image.initialized());
4161 ASSERT_TRUE(depth_image.initialized());
4162 ASSERT_TRUE(ds_image.initialized());
4163
4164 VkImageCopy copyRegion;
4165 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4166 copyRegion.srcSubresource.mipLevel = 0;
4167 copyRegion.srcSubresource.baseArrayLayer = 0;
4168 copyRegion.srcSubresource.layerCount = 1;
4169 copyRegion.srcOffset = {0, 0, 0};
4170 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4171 copyRegion.dstSubresource.mipLevel = 0;
4172 copyRegion.dstSubresource.baseArrayLayer = 0;
4173 copyRegion.dstSubresource.layerCount = 1;
4174 copyRegion.dstOffset = {64, 0, 0};
4175 copyRegion.extent = {64, 128, 1};
4176
4177 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004179 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004180 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4181 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004182 m_errorMonitor->VerifyFound();
4183
4184 m_commandBuffer->begin();
4185
4186 // Src and dest aspect masks don't match
4187 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004188 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004189 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004190 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4191 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004192 m_errorMonitor->VerifyFound();
4193 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4194
4195 // Illegal combinations of aspect bits
4196 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4197 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004198 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004199 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004200 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004202 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4203 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004204 m_errorMonitor->VerifyFound();
4205 // same test for dstSubresource
4206 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4207 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004208 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004209 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004210 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004211 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004212 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4213 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004214 m_errorMonitor->VerifyFound();
4215
4216 // Metadata aspect is illegal
4217 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4218 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004219 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004220 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004222 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4223 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004224 m_errorMonitor->VerifyFound();
4225 // same test for dstSubresource
4226 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4227 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004229 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004230 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004231 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4232 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004233 m_errorMonitor->VerifyFound();
4234
sfricke-samsung6141db32020-10-26 03:31:38 -07004235 // Aspect Memory Plane mask is illegal
4236 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4237 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4238 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4239 // These aspect/format mismatches are redundant but unavoidable here
4240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4241 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4242 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4243 m_errorMonitor->VerifyFound();
4244
unknown088160a2019-05-23 17:43:13 -06004245 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4246 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004247 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004248
4249 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004251 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004253 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4254 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004255 m_errorMonitor->VerifyFound();
4256
4257 // Aspect mask doesn't match dest image format
4258 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4259 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004261 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004262 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004263 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4264 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004265 m_errorMonitor->VerifyFound();
4266
aitor-lunarg54c295b2022-01-28 17:02:32 +01004267 // Check no performance warnings regarding layout are thrown when copying from and to the same image
4268 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4269 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4270 m_errorMonitor->ExpectSuccess(kPerformanceWarningBit);
4271 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4272 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4273 m_errorMonitor->VerifyNotFound();
4274
unknown088160a2019-05-23 17:43:13 -06004275 m_commandBuffer->end();
4276}
4277
4278TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004279 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004280
4281 ASSERT_NO_FATAL_FAILURE(Init());
4282
4283 // Create two images of sample count 1 and try to Resolve between them
4284
sfricke-samsung1c61f192021-12-31 01:53:03 -06004285 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004286 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4287 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4288 image_create_info.extent.width = 32;
4289 image_create_info.extent.height = 1;
4290 image_create_info.extent.depth = 1;
4291 image_create_info.mipLevels = 1;
4292 image_create_info.arrayLayers = 1;
4293 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4294 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4295 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4296 image_create_info.flags = 0;
4297
4298 VkImageObj srcImage(m_device);
4299 srcImage.init(&image_create_info);
4300 ASSERT_TRUE(srcImage.initialized());
4301
4302 VkImageObj dstImage(m_device);
4303 dstImage.init(&image_create_info);
4304 ASSERT_TRUE(dstImage.initialized());
4305
4306 m_commandBuffer->begin();
4307 VkImageResolve resolveRegion;
4308 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4309 resolveRegion.srcSubresource.mipLevel = 0;
4310 resolveRegion.srcSubresource.baseArrayLayer = 0;
4311 resolveRegion.srcSubresource.layerCount = 1;
4312 resolveRegion.srcOffset.x = 0;
4313 resolveRegion.srcOffset.y = 0;
4314 resolveRegion.srcOffset.z = 0;
4315 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4316 resolveRegion.dstSubresource.mipLevel = 0;
4317 resolveRegion.dstSubresource.baseArrayLayer = 0;
4318 resolveRegion.dstSubresource.layerCount = 1;
4319 resolveRegion.dstOffset.x = 0;
4320 resolveRegion.dstOffset.y = 0;
4321 resolveRegion.dstOffset.z = 0;
4322 resolveRegion.extent.width = 1;
4323 resolveRegion.extent.height = 1;
4324 resolveRegion.extent.depth = 1;
4325 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4326 &resolveRegion);
4327 m_commandBuffer->end();
4328
4329 m_errorMonitor->VerifyFound();
4330}
4331
4332TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004334
4335 ASSERT_NO_FATAL_FAILURE(Init());
4336
4337 // Create two images of sample count 4 and try to Resolve between them
4338
sfricke-samsung1c61f192021-12-31 01:53:03 -06004339 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004340 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4341 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4342 image_create_info.extent.width = 32;
4343 image_create_info.extent.height = 1;
4344 image_create_info.extent.depth = 1;
4345 image_create_info.mipLevels = 1;
4346 image_create_info.arrayLayers = 1;
4347 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4348 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4349 // Note: Some implementations expect color attachment usage for any
4350 // multisample surface
4351 image_create_info.usage =
4352 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4353 image_create_info.flags = 0;
4354
4355 VkImageObj srcImage(m_device);
4356 srcImage.init(&image_create_info);
4357 ASSERT_TRUE(srcImage.initialized());
4358
4359 VkImageObj dstImage(m_device);
4360 dstImage.init(&image_create_info);
4361 ASSERT_TRUE(dstImage.initialized());
4362
4363 m_commandBuffer->begin();
4364 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4365 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4366 // VK_IMAGE_LAYOUT_GENERAL = 1,
4367 VkImageResolve resolveRegion;
4368 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4369 resolveRegion.srcSubresource.mipLevel = 0;
4370 resolveRegion.srcSubresource.baseArrayLayer = 0;
4371 resolveRegion.srcSubresource.layerCount = 1;
4372 resolveRegion.srcOffset.x = 0;
4373 resolveRegion.srcOffset.y = 0;
4374 resolveRegion.srcOffset.z = 0;
4375 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4376 resolveRegion.dstSubresource.mipLevel = 0;
4377 resolveRegion.dstSubresource.baseArrayLayer = 0;
4378 resolveRegion.dstSubresource.layerCount = 1;
4379 resolveRegion.dstOffset.x = 0;
4380 resolveRegion.dstOffset.y = 0;
4381 resolveRegion.dstOffset.z = 0;
4382 resolveRegion.extent.width = 1;
4383 resolveRegion.extent.height = 1;
4384 resolveRegion.extent.depth = 1;
4385 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4386 &resolveRegion);
4387 m_commandBuffer->end();
4388
4389 m_errorMonitor->VerifyFound();
4390}
4391
4392TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004393 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004394
4395 ASSERT_NO_FATAL_FAILURE(Init());
4396
4397 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004398 VkImageObj srcImage(m_device);
4399 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004400
sfricke-samsung1c61f192021-12-31 01:53:03 -06004401 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004402 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4403 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4404 image_create_info.extent.width = 32;
4405 image_create_info.extent.height = 1;
4406 image_create_info.extent.depth = 1;
4407 image_create_info.mipLevels = 1;
4408 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004409 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004410 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4411 // Note: Some implementations expect color attachment usage for any
4412 // multisample surface
4413 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4414 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004415 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004416
4417 // Set format to something other than source image
4418 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4419 // Note: Some implementations expect color attachment usage for any
4420 // multisample surface
4421 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4422 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004423 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004424
4425 m_commandBuffer->begin();
4426 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4427 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4428 // VK_IMAGE_LAYOUT_GENERAL = 1,
4429 VkImageResolve resolveRegion;
4430 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4431 resolveRegion.srcSubresource.mipLevel = 0;
4432 resolveRegion.srcSubresource.baseArrayLayer = 0;
4433 resolveRegion.srcSubresource.layerCount = 1;
4434 resolveRegion.srcOffset.x = 0;
4435 resolveRegion.srcOffset.y = 0;
4436 resolveRegion.srcOffset.z = 0;
4437 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4438 resolveRegion.dstSubresource.mipLevel = 0;
4439 resolveRegion.dstSubresource.baseArrayLayer = 0;
4440 resolveRegion.dstSubresource.layerCount = 1;
4441 resolveRegion.dstOffset.x = 0;
4442 resolveRegion.dstOffset.y = 0;
4443 resolveRegion.dstOffset.z = 0;
4444 resolveRegion.extent.width = 1;
4445 resolveRegion.extent.height = 1;
4446 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004447 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4448 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004449 m_commandBuffer->end();
4450
4451 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004452}
4453
4454TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004455 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004456
4457 ASSERT_NO_FATAL_FAILURE(Init());
4458
4459 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004460 VkImageObj srcImage(m_device);
4461 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004462
sfricke-samsung1c61f192021-12-31 01:53:03 -06004463 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004464 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4465 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4466 image_create_info.extent.width = 32;
4467 image_create_info.extent.height = 1;
4468 image_create_info.extent.depth = 1;
4469 image_create_info.mipLevels = 1;
4470 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004471 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004472 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4473 // Note: Some implementations expect color attachment usage for any
4474 // multisample surface
4475 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4476 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004477 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004478
4479 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4480 // Note: Some implementations expect color attachment usage for any
4481 // multisample surface
4482 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4483 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004484 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004485
4486 m_commandBuffer->begin();
4487 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4488 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4489 // VK_IMAGE_LAYOUT_GENERAL = 1,
4490 VkImageResolve resolveRegion;
4491 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4492 resolveRegion.srcSubresource.mipLevel = 0;
4493 resolveRegion.srcSubresource.baseArrayLayer = 0;
4494 resolveRegion.srcSubresource.layerCount = 1;
4495 resolveRegion.srcOffset.x = 0;
4496 resolveRegion.srcOffset.y = 0;
4497 resolveRegion.srcOffset.z = 0;
4498 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4499 resolveRegion.dstSubresource.mipLevel = 0;
4500 resolveRegion.dstSubresource.baseArrayLayer = 0;
4501 resolveRegion.dstSubresource.layerCount = 1;
4502 resolveRegion.dstOffset.x = 0;
4503 resolveRegion.dstOffset.y = 0;
4504 resolveRegion.dstOffset.z = 0;
4505 resolveRegion.extent.width = 1;
4506 resolveRegion.extent.height = 1;
4507 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004508 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4509 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004510 m_commandBuffer->end();
4511
4512 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004513}
4514
4515TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4516 ASSERT_NO_FATAL_FAILURE(Init());
4517
4518 // Create two images of different types and try to copy between them
4519 VkImageObj srcImage(m_device);
4520 VkImageObj dstImage(m_device);
4521
sfricke-samsung1c61f192021-12-31 01:53:03 -06004522 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004523 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4524 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4525 image_create_info.extent.width = 32;
4526 image_create_info.extent.height = 32;
4527 image_create_info.extent.depth = 1;
4528 image_create_info.mipLevels = 1;
4529 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004530 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004531 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4532 image_create_info.usage =
4533 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4534 // Note: Some implementations expect color attachment usage for any
4535 // multisample surface
4536 image_create_info.flags = 0;
4537 srcImage.init(&image_create_info);
4538 ASSERT_TRUE(srcImage.initialized());
4539
4540 // Note: Some implementations expect color attachment usage for any
4541 // multisample surface
4542 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4543 dstImage.init(&image_create_info);
4544 ASSERT_TRUE(dstImage.initialized());
4545
4546 m_commandBuffer->begin();
4547 // source image must have valid contents before resolve
4548 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4549 VkImageSubresourceRange subresource = {};
4550 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4551 subresource.layerCount = 1;
4552 subresource.levelCount = 1;
4553 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4554 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4555 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4556 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4557
4558 VkImageResolve resolveRegion;
4559 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4560 resolveRegion.srcSubresource.mipLevel = 0;
4561 resolveRegion.srcSubresource.baseArrayLayer = 0;
4562 resolveRegion.srcSubresource.layerCount = 1;
4563 resolveRegion.srcOffset.x = 0;
4564 resolveRegion.srcOffset.y = 0;
4565 resolveRegion.srcOffset.z = 0;
4566 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4567 resolveRegion.dstSubresource.mipLevel = 0;
4568 resolveRegion.dstSubresource.baseArrayLayer = 0;
4569 resolveRegion.dstSubresource.layerCount = 1;
4570 resolveRegion.dstOffset.x = 0;
4571 resolveRegion.dstOffset.y = 0;
4572 resolveRegion.dstOffset.z = 0;
4573 resolveRegion.extent.width = 1;
4574 resolveRegion.extent.height = 1;
4575 resolveRegion.extent.depth = 1;
4576 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004577 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004578 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4579 1, &resolveRegion);
4580 m_errorMonitor->VerifyFound();
4581 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004583 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4584 1, &resolveRegion);
4585 m_errorMonitor->VerifyFound();
4586 m_commandBuffer->end();
4587}
4588
4589TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004590 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4591
4592 bool copy_commands2 = false;
4593 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4594 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4595 copy_commands2 = true;
4596 }
4597 ASSERT_NO_FATAL_FAILURE(InitState());
4598
4599 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4600 if (copy_commands2) {
4601 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4602 }
unknown088160a2019-05-23 17:43:13 -06004603
4604 // Create two images of different types and try to copy between them
4605 VkImageObj srcImage(m_device);
4606 VkImageObj dstImage(m_device);
4607
sfricke-samsung1c61f192021-12-31 01:53:03 -06004608 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004609 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4610 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4611 image_create_info.extent.width = 32;
4612 image_create_info.extent.height = 32;
4613 image_create_info.extent.depth = 1;
4614 image_create_info.mipLevels = 1;
4615 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004616 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004617 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4618 image_create_info.usage =
4619 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4620 // Note: Some implementations expect color attachment usage for any
4621 // multisample surface
4622 image_create_info.flags = 0;
4623 srcImage.init(&image_create_info);
4624 ASSERT_TRUE(srcImage.initialized());
4625
4626 // Note: Some implementations expect color attachment usage for any
4627 // multisample surface
4628 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4629 dstImage.init(&image_create_info);
4630 ASSERT_TRUE(dstImage.initialized());
4631
4632 m_commandBuffer->begin();
4633 // source image must have valid contents before resolve
4634 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4635 VkImageSubresourceRange subresource = {};
4636 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4637 subresource.layerCount = 1;
4638 subresource.levelCount = 1;
4639 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4640 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4641 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4642 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4643
4644 VkImageResolve resolveRegion;
4645 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4646 resolveRegion.srcSubresource.mipLevel = 0;
4647 resolveRegion.srcSubresource.baseArrayLayer = 0;
4648 resolveRegion.srcSubresource.layerCount = 1;
4649 resolveRegion.srcOffset.x = 0;
4650 resolveRegion.srcOffset.y = 0;
4651 resolveRegion.srcOffset.z = 0;
4652 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4653 resolveRegion.dstSubresource.mipLevel = 0;
4654 resolveRegion.dstSubresource.baseArrayLayer = 0;
4655 resolveRegion.dstSubresource.layerCount = 1;
4656 resolveRegion.dstOffset.x = 0;
4657 resolveRegion.dstOffset.y = 0;
4658 resolveRegion.dstOffset.z = 0;
4659 resolveRegion.extent.width = 1;
4660 resolveRegion.extent.height = 1;
4661 resolveRegion.extent.depth = 1;
4662 // invalid source mip level
4663 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004665 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4666 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4667 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004668
4669 // Equivalent test using KHR_copy_commands2
4670 if (copy_commands2 && vkCmdResolveImage2Function) {
4671 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4672 NULL,
4673 resolveRegion.srcSubresource,
4674 resolveRegion.srcOffset,
4675 resolveRegion.dstSubresource,
4676 resolveRegion.dstOffset,
4677 resolveRegion.extent};
4678 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4679 NULL,
4680 srcImage.image(),
4681 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4682 dstImage.image(),
4683 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4684 1,
4685 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004686 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01709");
Jeff Leger465acf52020-10-12 18:07:16 -04004687 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4688 m_errorMonitor->VerifyFound();
4689 }
4690
unknown088160a2019-05-23 17:43:13 -06004691 resolveRegion.srcSubresource.mipLevel = 0;
4692 // invalid dest mip level
4693 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004695 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4696 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4697 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004698
4699 // Equivalent test using KHR_copy_commands2
4700 if (copy_commands2 && vkCmdResolveImage2Function) {
4701 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4702 NULL,
4703 resolveRegion.srcSubresource,
4704 resolveRegion.srcOffset,
4705 resolveRegion.dstSubresource,
4706 resolveRegion.dstOffset,
4707 resolveRegion.extent};
4708 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4709 NULL,
4710 srcImage.image(),
4711 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4712 dstImage.image(),
4713 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4714 1,
4715 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01710");
Jeff Leger465acf52020-10-12 18:07:16 -04004717 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4718 m_errorMonitor->VerifyFound();
4719 }
4720
unknown088160a2019-05-23 17:43:13 -06004721 resolveRegion.dstSubresource.mipLevel = 0;
4722 // invalid source array layer range
4723 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004724 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004725 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4726 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4727 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004728
4729 // Equivalent test using KHR_copy_commands2
4730 if (copy_commands2 && vkCmdResolveImage2Function) {
4731 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4732 NULL,
4733 resolveRegion.srcSubresource,
4734 resolveRegion.srcOffset,
4735 resolveRegion.dstSubresource,
4736 resolveRegion.dstOffset,
4737 resolveRegion.extent};
4738 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4739 NULL,
4740 srcImage.image(),
4741 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4742 dstImage.image(),
4743 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4744 1,
4745 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcSubresource-01711");
Jeff Leger465acf52020-10-12 18:07:16 -04004747 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4748 m_errorMonitor->VerifyFound();
4749 }
4750
unknown088160a2019-05-23 17:43:13 -06004751 resolveRegion.srcSubresource.baseArrayLayer = 0;
4752 // invalid dest array layer range
4753 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004754 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004755 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4756 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4757 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004758
4759 // Equivalent test using KHR_copy_commands2
4760 if (copy_commands2 && vkCmdResolveImage2Function) {
4761 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4762 NULL,
4763 resolveRegion.srcSubresource,
4764 resolveRegion.srcOffset,
4765 resolveRegion.dstSubresource,
4766 resolveRegion.dstOffset,
4767 resolveRegion.extent};
4768 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4769 NULL,
4770 srcImage.image(),
4771 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4772 dstImage.image(),
4773 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4774 1,
4775 &resolveRegion2};
Tony-LunarG953d55a2021-11-11 14:20:25 -07004776 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-dstSubresource-01712");
Jeff Leger465acf52020-10-12 18:07:16 -04004777 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4778 m_errorMonitor->VerifyFound();
4779 }
4780
unknown088160a2019-05-23 17:43:13 -06004781 resolveRegion.dstSubresource.baseArrayLayer = 0;
4782
4783 m_commandBuffer->end();
4784}
4785
sfricke-samsungf78d0592020-06-11 21:34:44 -07004786TEST_F(VkLayerTest, ResolveImageImageType) {
4787 ASSERT_NO_FATAL_FAILURE(Init());
4788 // Create images of different types and try to resolve between them
4789 VkImageObj srcImage2D(m_device);
4790 VkImageObj dstImage1D(m_device);
4791 VkImageObj dstImage3D(m_device);
4792
sfricke-samsung1c61f192021-12-31 01:53:03 -06004793 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungf78d0592020-06-11 21:34:44 -07004794 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4795 image_create_info.extent.width = 32;
4796 image_create_info.extent.height = 1;
4797 image_create_info.extent.depth = 1;
4798 image_create_info.mipLevels = 1;
4799 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004800 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004801 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4802 image_create_info.usage =
4803 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4804 // Note: Some implementations expect color attachment usage for any
4805 // multisample surface
4806 image_create_info.flags = 0;
4807
4808 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4809 srcImage2D.init(&image_create_info);
4810 ASSERT_TRUE(srcImage2D.initialized());
4811
4812 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4813 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4814 dstImage1D.init(&image_create_info);
4815 ASSERT_TRUE(dstImage1D.initialized());
4816
4817 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4818 image_create_info.extent.height = 16;
4819 image_create_info.extent.depth = 16;
4820 image_create_info.arrayLayers = 1;
4821 dstImage3D.init(&image_create_info);
4822 ASSERT_TRUE(dstImage3D.initialized());
4823
4824 m_commandBuffer->begin();
4825
4826 VkImageResolve resolveRegion;
4827 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4828 resolveRegion.srcSubresource.mipLevel = 0;
4829 resolveRegion.srcSubresource.baseArrayLayer = 0;
4830 resolveRegion.srcSubresource.layerCount = 1;
4831 resolveRegion.srcOffset.x = 0;
4832 resolveRegion.srcOffset.y = 0;
4833 resolveRegion.srcOffset.z = 0;
4834 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4835 resolveRegion.dstSubresource.mipLevel = 0;
4836 resolveRegion.dstSubresource.baseArrayLayer = 0;
4837 resolveRegion.dstSubresource.layerCount = 1;
4838 resolveRegion.dstOffset.x = 0;
4839 resolveRegion.dstOffset.y = 0;
4840 resolveRegion.dstOffset.z = 0;
4841 resolveRegion.extent.width = 1;
4842 resolveRegion.extent.height = 1;
4843 resolveRegion.extent.depth = 1;
4844
4845 // non-zero value baseArrayLayer
4846 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004848 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4849 &resolveRegion);
4850 m_errorMonitor->VerifyFound();
4851 resolveRegion.srcSubresource.baseArrayLayer = 0;
4852
4853 // Set height with 1D dstImage
4854 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004856 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004857 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004859 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4860 &resolveRegion);
4861 m_errorMonitor->VerifyFound();
4862 resolveRegion.extent.height = 1;
4863
4864 // Set depth with 1D dstImage and 2D srcImage
4865 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004868 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4869 &resolveRegion);
4870 m_errorMonitor->VerifyFound();
4871 resolveRegion.extent.depth = 1;
4872
4873 m_commandBuffer->end();
4874}
4875
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004876TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4877 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4878 ASSERT_NO_FATAL_FAILURE(Init());
4879
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004880 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004881 VkImageObj srcImage2D(m_device);
4882 VkImageObj dstImage2D(m_device);
4883
sfricke-samsung1c61f192021-12-31 01:53:03 -06004884 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004885 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4886 image_create_info.extent.width = 32;
4887 image_create_info.extent.height = 32;
4888 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004889 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004890 image_create_info.arrayLayers = 1;
4891 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4892 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4893 image_create_info.usage =
4894 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4895 // Note: Some implementations expect color attachment usage for any
4896 // multisample surface
4897 image_create_info.flags = 0;
4898
4899 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4900 srcImage2D.init(&image_create_info);
4901 ASSERT_TRUE(srcImage2D.initialized());
4902
4903 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4904 dstImage2D.init(&image_create_info);
4905 ASSERT_TRUE(dstImage2D.initialized());
4906
4907 m_commandBuffer->begin();
4908
4909 VkImageResolve resolveRegion = {};
4910 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4911 resolveRegion.srcSubresource.mipLevel = 0;
4912 resolveRegion.srcSubresource.baseArrayLayer = 0;
4913 resolveRegion.srcSubresource.layerCount = 1;
4914 resolveRegion.srcOffset.x = 0;
4915 resolveRegion.srcOffset.y = 0;
4916 resolveRegion.srcOffset.z = 0;
4917 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4918 resolveRegion.dstSubresource.mipLevel = 0;
4919 resolveRegion.dstSubresource.baseArrayLayer = 0;
4920 resolveRegion.dstSubresource.layerCount = 1;
4921 resolveRegion.dstOffset.x = 0;
4922 resolveRegion.dstOffset.y = 0;
4923 resolveRegion.dstOffset.z = 0;
4924 resolveRegion.extent.width = 32;
4925 resolveRegion.extent.height = 32;
4926 resolveRegion.extent.depth = 1;
4927
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004928 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4929 &resolveRegion);
4930 m_errorMonitor->VerifyNotFound();
4931
4932 // srcImage exceeded in x-dim
4933 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004935 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4936 &resolveRegion);
4937 m_errorMonitor->VerifyFound();
4938 resolveRegion.srcOffset.x = 0;
4939
4940 // dstImage exceeded in x-dim
4941 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004943 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4944 &resolveRegion);
4945 m_errorMonitor->VerifyFound();
4946 resolveRegion.dstOffset.x = 0;
4947
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004948 // both image exceeded in y-dim
4949 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004951 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4952 &resolveRegion);
4953 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004954 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004955
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004956 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004958 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4959 &resolveRegion);
4960 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004961 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004962
4963 // srcImage exceeded in z-dim
4964 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004965 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4966 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004967 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4968 &resolveRegion);
4969 m_errorMonitor->VerifyFound();
4970 resolveRegion.srcOffset.z = 0;
4971
4972 // dstImage exceeded in z-dim
4973 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004974 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4975 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004976 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4977 &resolveRegion);
4978 m_errorMonitor->VerifyFound();
4979 resolveRegion.dstOffset.z = 0;
4980
4981 m_commandBuffer->end();
4982}
4983
unknown088160a2019-05-23 17:43:13 -06004984TEST_F(VkLayerTest, ClearImageErrors) {
4985 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4986
4987 ASSERT_NO_FATAL_FAILURE(Init());
4988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4989
4990 m_commandBuffer->begin();
4991
4992 // Color image
4993 VkClearColorValue clear_color;
4994 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4995 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4996 const int32_t img_width = 32;
4997 const int32_t img_height = 32;
sfricke-samsung1c61f192021-12-31 01:53:03 -06004998 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06004999 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5000 image_create_info.format = color_format;
5001 image_create_info.extent.width = img_width;
5002 image_create_info.extent.height = img_height;
5003 image_create_info.extent.depth = 1;
5004 image_create_info.mipLevels = 1;
5005 image_create_info.arrayLayers = 1;
5006 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5007 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5008
5009 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5010 vk_testing::Image color_image_no_transfer;
5011 color_image_no_transfer.init(*m_device, image_create_info);
5012
5013 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5014 vk_testing::Image color_image;
5015 color_image.init(*m_device, image_create_info);
5016
5017 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
5018
5019 // Depth/Stencil image
5020 VkClearDepthStencilValue clear_value = {0};
5021 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
5022 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
5023 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
5024 ds_image_create_info.extent.width = 64;
5025 ds_image_create_info.extent.height = 64;
5026 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5027 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5028
5029 vk_testing::Image ds_image;
5030 ds_image.init(*m_device, ds_image_create_info);
5031
5032 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
5033
sfricke-samsungcd924d92020-05-20 23:51:17 -07005034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005035
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005036 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005037
5038 m_errorMonitor->VerifyFound();
5039
sfricke-samsungcd924d92020-05-20 23:51:17 -07005040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005041
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005042 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5043 &color_range);
unknown088160a2019-05-23 17:43:13 -06005044
5045 m_errorMonitor->VerifyFound();
5046
5047 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005050
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005051 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5052 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005053
5054 m_errorMonitor->VerifyFound();
5055}
5056
5057TEST_F(VkLayerTest, CommandQueueFlags) {
5058 TEST_DESCRIPTION(
5059 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5060
5061 ASSERT_NO_FATAL_FAILURE(Init());
5062
5063 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5064 if (queueFamilyIndex == UINT32_MAX) {
5065 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5066 return;
5067 } else {
5068 // Create command pool on a non-graphics queue
5069 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5070
5071 // Setup command buffer on pool
5072 VkCommandBufferObj command_buffer(m_device, &command_pool);
5073 command_buffer.begin();
5074
5075 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005076 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005077 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5078 command_buffer.SetViewport(0, 1, &viewport);
5079 m_errorMonitor->VerifyFound();
5080 }
5081}
5082
sfricke-samsung674ba102020-08-18 22:38:49 -07005083TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5084 TEST_DESCRIPTION(
5085 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5086 "buffer");
5087
5088 ASSERT_NO_FATAL_FAILURE(Init());
5089
5090 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5091 if (queueFamilyIndex == UINT32_MAX) {
5092 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5093 return;
5094 } else {
5095 // Create Depth image
5096 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5097 if (ds_format == VK_FORMAT_UNDEFINED) {
5098 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5099 return;
5100 }
5101
5102 VkImageObj ds_image(m_device);
5103 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5104 VK_IMAGE_TILING_OPTIMAL, 0);
5105 ASSERT_TRUE(ds_image.initialized());
5106
5107 // Allocate buffers
5108 VkBufferObj buffer;
5109 VkMemoryPropertyFlags reqs = 0;
5110 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5111
5112 VkBufferImageCopy region = {};
5113 region.bufferRowLength = 0;
5114 region.bufferImageHeight = 0;
5115 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5116 region.imageSubresource.layerCount = 1;
5117 region.imageOffset = {0, 0, 0};
5118 region.imageExtent = {64, 64, 1};
5119 region.bufferOffset = 0;
5120
5121 // Create command pool on a non-graphics queue
5122 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5123
5124 // Setup command buffer on pool
5125 VkCommandBufferObj command_buffer(m_device, &command_pool);
5126 command_buffer.begin();
5127
sfricke-samsungea4fd142020-10-17 23:51:59 -07005128 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005129 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5130 1, &region);
5131 m_errorMonitor->VerifyFound();
5132 }
5133}
5134
sfricke-samsung5a019492021-01-25 10:32:08 -08005135TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5136 TEST_DESCRIPTION(
5137 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5138 "buffer");
5139
5140 ASSERT_NO_FATAL_FAILURE(Init());
5141
5142 // Should be left with a tranfser queue
5143 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5144 if (queueFamilyIndex == UINT32_MAX) {
5145 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5146 return;
5147 }
5148
5149 VkImageObj image(m_device);
5150 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5151 VK_IMAGE_TILING_OPTIMAL, 0);
5152 ASSERT_TRUE(image.initialized());
5153
5154 // Allocate buffers
5155 VkBufferObj buffer;
5156 VkMemoryPropertyFlags reqs = 0;
5157 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5158
5159 VkBufferImageCopy region = {};
5160 region.bufferRowLength = 0;
5161 region.bufferImageHeight = 0;
5162 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5163 region.imageSubresource.layerCount = 1;
5164 region.imageOffset = {0, 0, 0};
5165 region.imageExtent = {16, 16, 1};
5166 region.bufferOffset = 5;
5167
5168 // Create command pool on a non-graphics queue
5169 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5170
5171 // Setup command buffer on pool
5172 VkCommandBufferObj command_buffer(m_device, &command_pool);
5173 command_buffer.begin();
5174
5175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5177 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5178 &region);
5179 m_errorMonitor->VerifyFound();
5180}
5181
sfricke-samsungcb467672020-11-25 00:09:28 -08005182TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5183 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5184
5185 ASSERT_NO_FATAL_FAILURE(Init());
5186
5187 if (m_device->queue_props.size() < 2) {
5188 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5189 return;
5190 }
5191
5192 // First two queue families
5193 uint32_t queue_index_A = 0;
5194 uint32_t queue_index_B = 1;
5195
sfricke-samsung1c61f192021-12-31 01:53:03 -06005196 VkCommandPoolCreateInfo pool_create_info = LvlInitStruct<VkCommandPoolCreateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005197 pool_create_info.flags = 0;
5198
5199 VkCommandPool command_pool_A;
5200 pool_create_info.queueFamilyIndex = queue_index_A;
5201 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5202
5203 VkCommandPool command_pool_B;
5204 pool_create_info.queueFamilyIndex = queue_index_B;
5205 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5206
5207 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
sfricke-samsung1c61f192021-12-31 01:53:03 -06005208 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005209 command_buffer_allocate_info.commandBufferCount = 1;
5210 command_buffer_allocate_info.commandPool = command_pool_A;
5211 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5212 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5213
5214 command_buffer_allocate_info.commandPool = command_pool_B;
5215 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5216 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5217
sfricke-samsung1c61f192021-12-31 01:53:03 -06005218 VkCommandBufferBeginInfo begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
sfricke-samsungcb467672020-11-25 00:09:28 -08005219
5220 // secondary
5221 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5222 vk::EndCommandBuffer(command_buffer[1]);
5223
5224 // Try using different pool's command buffer as secondary
5225 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5227 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5228 m_errorMonitor->VerifyFound();
5229 vk::EndCommandBuffer(command_buffer[0]);
5230
5231 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5232 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5233}
5234
unknown088160a2019-05-23 17:43:13 -06005235TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5236 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5237 ASSERT_NO_FATAL_FAILURE(Init());
5238 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5239 // never record secondary
5240
Mark Lobodzinski20310782020-02-28 14:25:17 -07005241 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005242 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005243 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005244 m_errorMonitor->VerifyFound();
5245 m_commandBuffer->end();
5246}
5247
5248TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5249 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5250
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005251 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005252 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5253
sfricke-samsung1c61f192021-12-31 01:53:03 -06005254 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06005255 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5256 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5257 image_create_info.extent.width = 32;
5258 image_create_info.extent.height = 1;
5259 image_create_info.extent.depth = 1;
5260 image_create_info.mipLevels = 1;
5261 image_create_info.arrayLayers = 1;
5262 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5263 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5264 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5265 image_create_info.flags = 0;
5266
5267 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5268 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5269
5270 VkImageObj image(m_device);
5271 image.init(&image_create_info);
5272 ASSERT_TRUE(image.initialized());
5273 VkImageMemoryBarrier image_barrier =
5274 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5275
5276 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5277 image_barrier.oldLayout = old_layout;
5278 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005279 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5280 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005281 };
5282
5283 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5284 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5285 secondary.begin();
5286 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5287 secondary.end();
5288
Mark Lobodzinski20310782020-02-28 14:25:17 -07005289 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005290 m_commandBuffer->begin();
5291 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005292 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005293 m_errorMonitor->VerifyFound();
5294
unknown088160a2019-05-23 17:43:13 -06005295 m_commandBuffer->reset();
5296 secondary.reset();
5297
5298 // Validate that UNDEFINED doesn't false positive on us
5299 secondary.begin();
5300 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5301 secondary.end();
5302 m_commandBuffer->begin();
5303 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5304 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005305 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005306 m_errorMonitor->VerifyNotFound();
5307 m_commandBuffer->end();
5308}
5309
5310TEST_F(VkLayerTest, SetDynViewportParamTests) {
5311 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5312
5313 SetTargetApiVersion(VK_API_VERSION_1_1);
5314 VkPhysicalDeviceFeatures features{};
5315 ASSERT_NO_FATAL_FAILURE(Init(&features));
5316
5317 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5318 const VkViewport viewports[] = {vp, vp};
5319
5320 m_commandBuffer->begin();
5321
5322 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005323 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005324 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005325 m_errorMonitor->VerifyFound();
5326
Mark Lobodzinski20310782020-02-28 14:25:17 -07005327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005328 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005329 m_errorMonitor->VerifyFound();
5330
Mark Lobodzinski20310782020-02-28 14:25:17 -07005331 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005332 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005333 m_errorMonitor->VerifyFound();
5334
Mark Lobodzinski20310782020-02-28 14:25:17 -07005335 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005337 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005338 m_errorMonitor->VerifyFound();
5339
Mark Lobodzinski20310782020-02-28 14:25:17 -07005340 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005341 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005342 m_errorMonitor->VerifyFound();
5343
5344 // core viewport tests
5345 using std::vector;
5346 struct TestCase {
5347 VkViewport vp;
5348 std::string veid;
5349 };
5350
5351 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5352 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5353 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5354
5355 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5356 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5357 const auto one_before_min_bounds = NearestSmaller(min_bound);
5358 const auto one_past_max_bounds = NearestGreater(max_bound);
5359
5360 const auto below_zero = NearestSmaller(0.0f);
5361 const auto past_one = NearestGreater(1.0f);
5362
5363 vector<TestCase> test_cases = {
5364 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5365 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5366 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5367 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5368 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5369 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5370 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5371 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5372 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5373 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5374 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5375 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5376 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5377 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5378 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5379 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5380 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5381 };
5382
5383 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5384 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5385 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5386 } else {
5387 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5388 }
5389
5390 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005391 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005392 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005393 m_errorMonitor->VerifyFound();
5394 }
5395}
5396
5397TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5398 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5399
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005400 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005401
Mike Schuchardt7cc57842021-09-15 10:49:59 -07005402 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME)) {
5403 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
unknown088160a2019-05-23 17:43:13 -06005404 } else {
5405 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5406 return;
5407 }
5408 ASSERT_NO_FATAL_FAILURE(InitState());
5409
5410 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5411}
5412
5413TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5414 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5415
5416 ASSERT_NO_FATAL_FAILURE(Init());
5417
5418 if (!m_device->phy().features().multiViewport) {
5419 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5420 return;
5421 }
5422
unknown088160a2019-05-23 17:43:13 -06005423 m_commandBuffer->begin();
5424
Mark Lobodzinski20310782020-02-28 14:25:17 -07005425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005426 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005427 m_errorMonitor->VerifyFound();
5428
Petr Kraus14e49492019-09-09 20:13:29 +02005429 const auto max_viewports = m_device->props.limits.maxViewports;
5430
Mark Lobodzinski20310782020-02-28 14:25:17 -07005431 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005432 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005433 m_errorMonitor->VerifyFound();
5434
Petr Kraus14e49492019-09-09 20:13:29 +02005435 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5436 if (max_viewports >= too_big_max_viewports) {
5437 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5438 kSkipPrefix);
5439 } else {
5440 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5441 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5442
Mark Lobodzinski20310782020-02-28 14:25:17 -07005443 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005444 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005445 m_errorMonitor->VerifyFound();
5446
Mark Lobodzinski20310782020-02-28 14:25:17 -07005447 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005448 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005449 m_errorMonitor->VerifyFound();
5450
Mark Lobodzinski20310782020-02-28 14:25:17 -07005451 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005452 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005453 m_errorMonitor->VerifyFound();
5454
Mark Lobodzinski20310782020-02-28 14:25:17 -07005455 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005456 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005457 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005458 }
unknown088160a2019-05-23 17:43:13 -06005459}
5460
5461TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5462 TEST_DESCRIPTION(
5463 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5464
5465 ASSERT_NO_FATAL_FAILURE(Init());
5466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5467
5468 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5469 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5470
5471 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5472 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5473 nullptr, // pNext
5474 m_renderPass,
5475 0, // subpass
5476 m_framebuffer,
5477 };
5478 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5479 nullptr, // pNext
5480 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5481
5482 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5483 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5484 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5485 sec_cmdbuff_inside_rp.end();
5486
5487 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5488 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5489 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5490 sec_cmdbuff_outside_rp.end();
5491
5492 m_commandBuffer->begin();
5493
Mark Lobodzinski20310782020-02-28 14:25:17 -07005494 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005495 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005496 m_errorMonitor->VerifyFound();
5497
5498 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5499 nullptr, // pNext
5500 m_renderPass,
5501 m_framebuffer,
5502 {{0, 0}, {32, 32}},
5503 static_cast<uint32_t>(m_renderPassClearValues.size()),
5504 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005505 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005506
Mark Lobodzinski20310782020-02-28 14:25:17 -07005507 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005508 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005509 m_errorMonitor->VerifyFound();
5510}
5511
5512TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5513 TEST_DESCRIPTION(
5514 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5515 ASSERT_NO_FATAL_FAILURE(Init());
5516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5517
sfricke-samsung1c61f192021-12-31 01:53:03 -06005518 VkCommandBufferAllocateInfo command_buffer_allocate_info = LvlInitStruct<VkCommandBufferAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06005519 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5520 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5521 command_buffer_allocate_info.commandBufferCount = 1;
5522
5523 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005524 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
sfricke-samsung1c61f192021-12-31 01:53:03 -06005525 VkCommandBufferBeginInfo command_buffer_begin_info = LvlInitStruct<VkCommandBufferBeginInfo>();
5526 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = LvlInitStruct<VkCommandBufferInheritanceInfo>();
unknown088160a2019-05-23 17:43:13 -06005527 command_buffer_inheritance_info.renderPass = m_renderPass;
5528 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5529
unknown088160a2019-05-23 17:43:13 -06005530 command_buffer_begin_info.flags =
5531 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5532 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5533
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005534 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005535 VkClearAttachment color_attachment;
5536 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5537 color_attachment.clearValue.color.float32[0] = 0;
5538 color_attachment.clearValue.color.float32[1] = 0;
5539 color_attachment.clearValue.color.float32[2] = 0;
5540 color_attachment.clearValue.color.float32[3] = 0;
5541 color_attachment.colorAttachment = 0;
5542 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005543 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005544 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5545 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005546 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005547 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005548
Mark Lobodzinski20310782020-02-28 14:25:17 -07005549 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005550 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005551 m_errorMonitor->VerifyFound();
5552
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005553 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005554 m_commandBuffer->end();
5555}
5556
5557TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5558 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5559 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5560 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5561 } else {
5562 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5563 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5564 return;
5565 }
5566
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005567 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005568 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5569 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5570 } else {
5571 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5572 return;
5573 }
5574 ASSERT_NO_FATAL_FAILURE(InitState());
5575
5576 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5577 if (push_descriptor_prop.maxPushDescriptors < 1) {
5578 // Some implementations report an invalid maxPushDescriptors of 0
5579 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5580 return;
5581 }
5582
5583 // Create ordinary and push descriptor set layout
5584 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5585 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5586 ASSERT_TRUE(ds_layout.initialized());
5587 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5588 ASSERT_TRUE(push_ds_layout.initialized());
5589
5590 // Now use the descriptor set layouts to create a pipeline layout
5591 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5592 ASSERT_TRUE(pipeline_layout.initialized());
5593
5594 // Create a descriptor to push
5595 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5596 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5597 ASSERT_TRUE(buffer_obj.initialized());
5598
5599 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5600 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5601 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5602
5603 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5604 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5605
5606 // Find address of extension call and make the call
5607 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005608 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005609 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5610
5611 // Section 1: Queue family matching/capabilities.
5612 // Create command pool on a non-graphics queue
5613 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5614 const uint32_t transfer_only_qfi =
5615 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5616 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005617 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005618 } else {
5619 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5620
5621 VkCommandPoolObj command_pool(m_device, err_qfi);
5622 ASSERT_TRUE(command_pool.initialized());
5623 VkCommandBufferObj command_buffer(m_device, &command_pool);
5624 ASSERT_TRUE(command_buffer.initialized());
5625 command_buffer.begin();
5626
Mark Lobodzinski20310782020-02-28 14:25:17 -07005627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005629 if (err_qfi == transfer_only_qfi) {
5630 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005631 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005632 }
5633 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5634 &descriptor_write);
5635 m_errorMonitor->VerifyFound();
5636 command_buffer.end();
5637
5638 // If we succeed in testing only one condition above, we need to test the other below.
5639 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5640 // Need to test the neither compute/gfx supported case separately.
5641 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5642 ASSERT_TRUE(tran_command_pool.initialized());
5643 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5644 ASSERT_TRUE(tran_command_buffer.initialized());
5645 tran_command_buffer.begin();
5646
5647 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005651 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5652 &descriptor_write);
5653 m_errorMonitor->VerifyFound();
5654 tran_command_buffer.end();
5655 }
5656 }
5657
5658 // Push to the non-push binding
5659 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005661 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5662 &descriptor_write);
5663 m_errorMonitor->VerifyFound();
5664
5665 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005667 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5668 &descriptor_write);
5669 m_errorMonitor->VerifyFound();
5670 m_commandBuffer->end();
5671
5672 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5673 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005674 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung85584a72021-09-30 21:43:38 -07005675 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005677 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5678 &descriptor_write);
5679 m_errorMonitor->VerifyFound();
5680}
5681
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005682TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5683 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5684 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5685 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5686 } else {
5687 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5688 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5689 return;
5690 }
5691
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005692 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005693 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5694 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5695 } else {
5696 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5697 return;
5698 }
5699 ASSERT_NO_FATAL_FAILURE(InitState());
5700
5701 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5702 if (push_descriptor_prop.maxPushDescriptors < 1) {
5703 // Some implementations report an invalid maxPushDescriptors of 0.
5704 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5705 return;
5706 }
5707
5708 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5709 if (min_alignment == 0) {
5710 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5711 return;
5712 }
5713
5714 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5715 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5716 ASSERT_TRUE(push_ds_layout.initialized());
5717
5718 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5719 ASSERT_TRUE(pipeline_layout.initialized());
5720
5721 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5722 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5723 ASSERT_TRUE(buffer_obj.initialized());
5724
5725 // Use an invalid alignment.
5726 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5727 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5728 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5729
5730 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5731 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5732 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5733
5734 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005736 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5737 &descriptor_write);
5738 m_errorMonitor->VerifyFound();
5739
5740 m_commandBuffer->end();
5741}
5742
unknown088160a2019-05-23 17:43:13 -06005743TEST_F(VkLayerTest, SetDynScissorParamTests) {
5744 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5745
5746 VkPhysicalDeviceFeatures features{};
5747 ASSERT_NO_FATAL_FAILURE(Init(&features));
5748
5749 const VkRect2D scissor = {{0, 0}, {16, 16}};
5750 const VkRect2D scissors[] = {scissor, scissor};
5751
5752 m_commandBuffer->begin();
5753
5754 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005756 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005757 m_errorMonitor->VerifyFound();
5758
Mark Lobodzinski20310782020-02-28 14:25:17 -07005759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005760 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005761 m_errorMonitor->VerifyFound();
5762
Mark Lobodzinski20310782020-02-28 14:25:17 -07005763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005764 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005765 m_errorMonitor->VerifyFound();
5766
Mark Lobodzinski20310782020-02-28 14:25:17 -07005767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005769 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005770 m_errorMonitor->VerifyFound();
5771
Mark Lobodzinski20310782020-02-28 14:25:17 -07005772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005773 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005774 m_errorMonitor->VerifyFound();
5775
5776 struct TestCase {
5777 VkRect2D scissor;
5778 std::string vuid;
5779 };
5780
5781 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5782 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5783 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5784 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5785 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5786 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5787 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5788 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5789
5790 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005792 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005793 m_errorMonitor->VerifyFound();
5794 }
5795
5796 m_commandBuffer->end();
5797}
5798
5799TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5800 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5801
5802 ASSERT_NO_FATAL_FAILURE(Init());
5803
5804 if (!m_device->phy().features().multiViewport) {
5805 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5806 return;
5807 }
5808
unknown088160a2019-05-23 17:43:13 -06005809 m_commandBuffer->begin();
5810
Mark Lobodzinski20310782020-02-28 14:25:17 -07005811 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005812 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005813 m_errorMonitor->VerifyFound();
5814
Petr Kraus14e49492019-09-09 20:13:29 +02005815 const auto max_scissors = m_device->props.limits.maxViewports;
5816
Mark Lobodzinski20310782020-02-28 14:25:17 -07005817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005818 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005819 m_errorMonitor->VerifyFound();
5820
Petr Kraus14e49492019-09-09 20:13:29 +02005821 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5822 if (max_scissors >= too_big_max_scissors) {
5823 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5824 kSkipPrefix);
5825 } else {
5826 const VkRect2D scissor = {{0, 0}, {16, 16}};
5827 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5828
Mark Lobodzinski20310782020-02-28 14:25:17 -07005829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005830 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005831 m_errorMonitor->VerifyFound();
5832
Mark Lobodzinski20310782020-02-28 14:25:17 -07005833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005834 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005835 m_errorMonitor->VerifyFound();
5836
Mark Lobodzinski20310782020-02-28 14:25:17 -07005837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005838 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005839 m_errorMonitor->VerifyFound();
5840
Mark Lobodzinski20310782020-02-28 14:25:17 -07005841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005842 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005843 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005844 }
unknown088160a2019-05-23 17:43:13 -06005845}
5846
Tony-LunarG667cc022021-06-25 10:11:17 -06005847TEST_F(VkLayerTest, MultiDrawTests) {
5848 TEST_DESCRIPTION("Test validation of multi_draw extension");
5849 SetTargetApiVersion(VK_API_VERSION_1_2);
5850 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5851 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09005852 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
Tony-LunarG667cc022021-06-25 10:11:17 -06005853 }
5854
5855 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
5856 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multi_draw_features);
5857 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
5858 if (!multi_draw_features.multiDraw) {
5859 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5860 return;
5861 }
5862 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5863 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5864 } else {
5865 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5866 return;
5867 }
5868 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5869 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
5870 vk::GetPhysicalDeviceProperties2(gpu(), &properties2);
5871
5872 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5874
5875 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5876 auto vkCmdDrawMultiIndexedEXT =
5877 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5878 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5879
5880 VkMultiDrawInfoEXT multi_draws[3] = {};
5881 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5882
5883 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5884 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5885
5886 CreatePipelineHelper pipe(*this);
5887 pipe.InitInfo();
5888 pipe.InitState();
5889 pipe.CreateGraphicsPipeline();
5890
5891 // Try existing VUID checks
5892 m_commandBuffer->begin();
5893 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5894
5895 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5896 &pipe.descriptor_set_->set_, 0, NULL);
5897 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5898 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5899 m_errorMonitor->VerifyFound();
5900 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5901 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5902 m_errorMonitor->VerifyFound();
5903
5904 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5905
5906 // New VUIDs added with multi_draw (also see GPU-AV)
5907 VkBufferObj buffer;
5908 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5909 multi_draw_indices[2].indexCount = 513;
5910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5911 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5912 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5913 m_errorMonitor->VerifyFound();
5914 multi_draw_indices[2].indexCount = 1;
5915
5916 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5917 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5918 m_errorMonitor->VerifyFound();
5919 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5920 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5921 m_errorMonitor->VerifyFound();
5922
5923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5924 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5925 m_errorMonitor->VerifyFound();
5926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5927 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5928 m_errorMonitor->VerifyFound();
5929
5930 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5931 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5932 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5933 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5935 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5936 m_errorMonitor->VerifyFound();
5937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5938 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5939 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5940 m_errorMonitor->VerifyFound();
5941 }
5942}
5943
5944TEST_F(VkLayerTest, MultiDrawFeatures) {
5945 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5946 SetTargetApiVersion(VK_API_VERSION_1_2);
5947 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5948 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09005949 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
Tony-LunarG667cc022021-06-25 10:11:17 -06005950 }
5951 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5952 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5953 } else {
5954 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5955 return;
5956 }
5957 ASSERT_NO_FATAL_FAILURE(InitState());
5958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5959
sfricke-samsungca162082022-02-10 08:53:41 -08005960 auto multi_draw_props = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5961 auto pd_props2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_props);
5962 vk::GetPhysicalDeviceProperties2(gpu(), &pd_props2);
5963 if (multi_draw_props.maxMultiDrawCount == 0) {
5964 // If using MockICD and devsim the value might be zero'ed and cause false errors
5965 return;
5966 }
5967
Tony-LunarG667cc022021-06-25 10:11:17 -06005968 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5969 auto vkCmdDrawMultiIndexedEXT =
5970 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5971 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5972
5973 VkMultiDrawInfoEXT multi_draws[3] = {};
5974 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5975
5976 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5977 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5978
5979 CreatePipelineHelper pipe(*this);
5980 pipe.InitInfo();
5981 pipe.InitState();
5982 pipe.CreateGraphicsPipeline();
5983
5984 m_commandBuffer->begin();
5985 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5986 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5988 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5989 m_errorMonitor->VerifyFound();
5990 VkBufferObj buffer;
5991 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5992 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5993 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5994 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5995 m_errorMonitor->VerifyFound();
5996}
5997
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005998TEST_F(VkLayerTest, IndirectDrawTests) {
5999 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06006000
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006001 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6002 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6003 } else {
6004 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6005 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6006 return;
6007 }
6008 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6009
6010 if (IsPlatform(kMockICD) || DeviceSimulation()) {
6011 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6012 return;
6013 }
6014
Aaron Hagand1a61212021-12-22 11:53:49 -05006015 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06006016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6017
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006018 CreatePipelineHelper pipe(*this);
6019 pipe.InitInfo();
6020 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006021 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006022 dyn_state_ci.dynamicStateCount = size(dyn_states);
6023 dyn_state_ci.pDynamicStates = dyn_states;
6024 pipe.dyn_state_ci_ = dyn_state_ci;
6025 pipe.InitState();
6026 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006027
6028 m_commandBuffer->begin();
6029 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6030
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006031 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6032 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6033 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006034
6035 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006036 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006037 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006038 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006039
sfricke-samsung1c61f192021-12-31 01:53:03 -06006040 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006041 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
6042 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006043 VkBufferObj draw_buffer;
6044 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006045
Aaron Hagand1a61212021-12-22 11:53:49 -05006046 VkBufferObj draw_buffer_correct;
6047 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6048 draw_buffer_correct.init(*m_device, buffer_create_info);
6049
unknown088160a2019-05-23 17:43:13 -06006050 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07006051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006052 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006053 m_errorMonitor->VerifyFound();
6054
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006055 // VUID-vkCmdDrawIndirect-drawCount-02718
Aaron Hagand1a61212021-12-22 11:53:49 -05006056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-00488");
6057 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006058 m_errorMonitor->VerifyFound();
6059
Aaron Hagand1a61212021-12-22 11:53:49 -05006060 // VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701
6061 // VUID-vkCmdDrawIndexedIndirect-drawCount-00540
6062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
6063 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540");
6064 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer_correct.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006065 m_errorMonitor->VerifyFound();
6066
unknown088160a2019-05-23 17:43:13 -06006067 m_commandBuffer->EndRenderPass();
6068 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006069}
6070
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006071TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
6072 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
6073
6074 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6075 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6076 } else {
6077 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6078 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6079 return;
6080 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006081 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006082
6083 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6084 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6085 } else {
6086 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07006087 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006088 }
6089
6090 ASSERT_NO_FATAL_FAILURE(InitState());
6091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6092
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006093 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6094 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006095 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6096
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006097 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
6098 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
6099
6100 m_commandBuffer->begin();
6101 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
sfricke-samsung1c61f192021-12-31 01:53:03 -06006102 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006103 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6104 buffer_create_info.size = 1024;
6105 VkBufferObj counter_buffer;
6106 counter_buffer.init(*m_device, buffer_create_info);
6107
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006108 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006110 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006111 m_errorMonitor->VerifyFound();
6112
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006113 // some mock ICD json files are missing a valid stride value
6114 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6115 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006117 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6118 m_errorMonitor->VerifyFound();
6119 }
6120
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006121 m_commandBuffer->EndRenderPass();
6122 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006123
6124 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6125 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6126 return;
6127 }
6128
6129 std::vector<const char *> device_extension_names;
6130 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6131 VkDeviceObj test_device(0, gpu(), device_extension_names);
6132 VkCommandPoolObj commandPool(&test_device, 0);
6133 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6134 VkBufferObj counter_buffer2;
6135 counter_buffer2.init(test_device, buffer_create_info);
6136 VkPipelineLayoutObj pipelineLayout(&test_device);
6137 VkRenderPass renderpass;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006138 VkRenderPassCreateInfo rp_info = LvlInitStruct<VkRenderPassCreateInfo>();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006139 VkSubpassDescription subpass = {};
Tony-LunarG983bbc52020-11-06 11:04:59 -07006140 rp_info.pSubpasses = &subpass;
6141 rp_info.subpassCount = 1;
6142 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6143 VkPipelineObj pipeline(&test_device);
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006144 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
6145 vs.InitFromGLSLTry(bindStateVertShaderText, false, SPV_ENV_VULKAN_1_0, &test_device);
Tony-LunarG983bbc52020-11-06 11:04:59 -07006146 pipeline.AddShader(&vs);
6147 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6148 m_renderPassBeginInfo.renderPass = renderpass;
6149 VkFramebuffer fb;
6150 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6151 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6152 m_renderPassBeginInfo.framebuffer = fb;
6153 m_renderPassBeginInfo.renderPass = renderpass;
6154 commandBuffer.begin();
6155 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6156 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6157 VkRect2D scissor = {{0, 0}, {16, 16}};
6158 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6159 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6160 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6161 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006163 }
6164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6165 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6166 m_errorMonitor->VerifyFound();
6167 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6168 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006169}
6170
unknown088160a2019-05-23 17:43:13 -06006171TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6172 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6173
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006174 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006175 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6176 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6177 } else {
6178 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6179 return;
6180 }
6181 ASSERT_NO_FATAL_FAILURE(InitState());
6182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6183
6184 VkMemoryRequirements memory_requirements;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006185 VkMemoryAllocateInfo memory_allocate_info = LvlInitStruct<VkMemoryAllocateInfo>();
unknown088160a2019-05-23 17:43:13 -06006186
6187 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006188 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006189
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006190 CreatePipelineHelper pipe(*this);
6191 pipe.InitInfo();
6192 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006193 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006194 dyn_state_ci.dynamicStateCount = size(dyn_states);
6195 dyn_state_ci.pDynamicStates = dyn_states;
6196 pipe.dyn_state_ci_ = dyn_state_ci;
6197 pipe.InitState();
6198 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006199
6200 m_commandBuffer->begin();
6201 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6202
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006203 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6204 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6205 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006206
6207 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006208 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006209 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006210 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006211
sfricke-samsung1c61f192021-12-31 01:53:03 -06006212 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006213 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6214 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6215 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006216 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006217
sjfrickeedd669c2022-06-02 17:37:19 +09006218 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006219 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006220 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006221 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006222 VkBufferObj count_buffer;
6223 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006224
Mark Lobodzinski20310782020-02-28 14:25:17 -07006225 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006226 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6227 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006228 m_errorMonitor->VerifyFound();
6229
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006230 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006231 memory_allocate_info.allocationSize = memory_requirements.size;
6232 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6233 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006234 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6235 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006236
6237 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006238 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006239
sjfrickeedd669c2022-06-02 17:37:19 +09006240 VkBufferObj count_buffer_wrong;
6241 count_buffer_create_info.usage = 0;
6242 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6243
Mark Lobodzinski20310782020-02-28 14:25:17 -07006244 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006245 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6246 m_errorMonitor->VerifyFound();
6247
sjfrickeedd669c2022-06-02 17:37:19 +09006248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, " VUID-vkCmdDrawIndirectCount-countBuffer-02715");
6249 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_wrong.handle(), 0, 1,
6250 sizeof(VkDrawIndirectCommand));
6251 m_errorMonitor->VerifyFound();
6252
Mark Lobodzinski20310782020-02-28 14:25:17 -07006253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006254 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6255 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006256 m_errorMonitor->VerifyFound();
6257
Mark Lobodzinski20310782020-02-28 14:25:17 -07006258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006259 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6260 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006261 m_errorMonitor->VerifyFound();
6262
sjfrickeedd669c2022-06-02 17:37:19 +09006263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-04129");
6264 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), count_buffer_size, 1,
6265 sizeof(VkDrawIndirectCommand));
6266 m_errorMonitor->VerifyFound();
6267
Mark Lobodzinski20310782020-02-28 14:25:17 -07006268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006269 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006270 m_errorMonitor->VerifyFound();
6271
unknown088160a2019-05-23 17:43:13 -06006272 m_commandBuffer->EndRenderPass();
6273 m_commandBuffer->end();
6274
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006275 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6276 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006277
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006278 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006279}
6280
6281TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6282 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6283
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006284 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006285 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6286 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6287 } else {
6288 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6289 return;
6290 }
6291 ASSERT_NO_FATAL_FAILURE(InitState());
6292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6293
unknown088160a2019-05-23 17:43:13 -06006294 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006295 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006296
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006297 CreatePipelineHelper pipe(*this);
6298 pipe.InitInfo();
6299 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
sfricke-samsung1c61f192021-12-31 01:53:03 -06006300 VkPipelineDynamicStateCreateInfo dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006301 dyn_state_ci.dynamicStateCount = size(dyn_states);
6302 dyn_state_ci.pDynamicStates = dyn_states;
6303 pipe.dyn_state_ci_ = dyn_state_ci;
6304 pipe.InitState();
6305 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006306
6307 m_commandBuffer->begin();
6308 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6309
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006310 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6311 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6312 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006313
6314 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006315 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006316 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006317 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006318
sfricke-samsung1c61f192021-12-31 01:53:03 -06006319 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006320 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6321 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006322 VkBufferObj draw_buffer;
6323 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006324
sjfrickeedd669c2022-06-02 17:37:19 +09006325 VkDeviceSize count_buffer_size = 128;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006326 VkBufferCreateInfo count_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sjfrickeedd669c2022-06-02 17:37:19 +09006327 count_buffer_create_info.size = count_buffer_size;
unknown088160a2019-05-23 17:43:13 -06006328 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006329 VkBufferObj count_buffer;
6330 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006331
sfricke-samsung1c61f192021-12-31 01:53:03 -06006332 VkBufferCreateInfo index_buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006333 index_buffer_create_info.size = sizeof(uint32_t);
6334 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006335 VkBufferObj index_buffer;
6336 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006337
Mark Lobodzinski20310782020-02-28 14:25:17 -07006338 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006339 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006340 sizeof(VkDrawIndexedIndirectCommand));
6341 m_errorMonitor->VerifyFound();
6342
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006343 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006344
6345 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006346 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006347
Mark Lobodzinski20310782020-02-28 14:25:17 -07006348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006349 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006350 sizeof(VkDrawIndexedIndirectCommand));
6351 m_errorMonitor->VerifyFound();
6352
6353 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006354 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006355
sjfrickeedd669c2022-06-02 17:37:19 +09006356 VkBufferObj count_buffer_wrong;
6357 count_buffer_create_info.usage = 0;
6358 count_buffer_wrong.init(*m_device, count_buffer_create_info);
6359
Mark Lobodzinski20310782020-02-28 14:25:17 -07006360 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006361 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006362 sizeof(VkDrawIndexedIndirectCommand));
6363 m_errorMonitor->VerifyFound();
6364
sjfrickeedd669c2022-06-02 17:37:19 +09006365 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715");
6366 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_wrong.handle(), 0, 1,
6367 sizeof(VkDrawIndexedIndirectCommand));
6368 m_errorMonitor->VerifyFound();
6369
Mark Lobodzinski20310782020-02-28 14:25:17 -07006370 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006371 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006372 sizeof(VkDrawIndexedIndirectCommand));
6373 m_errorMonitor->VerifyFound();
6374
Mark Lobodzinski20310782020-02-28 14:25:17 -07006375 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006376 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006377 sizeof(VkDrawIndexedIndirectCommand));
6378 m_errorMonitor->VerifyFound();
6379
sjfrickeedd669c2022-06-02 17:37:19 +09006380 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-04129");
6381 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), count_buffer_size,
6382 1, sizeof(VkDrawIndexedIndirectCommand));
6383 m_errorMonitor->VerifyFound();
6384
Mark Lobodzinski20310782020-02-28 14:25:17 -07006385 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006386 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006387 m_errorMonitor->VerifyFound();
6388
unknown088160a2019-05-23 17:43:13 -06006389 m_commandBuffer->EndRenderPass();
6390 m_commandBuffer->end();
6391
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006392 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6393 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006394}
6395
sfricke-samsung860d3b22020-05-04 21:08:29 -07006396TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6397 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6398
6399 SetTargetApiVersion(VK_API_VERSION_1_2);
6400 ASSERT_NO_FATAL_FAILURE(Init());
6401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6402 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
sjfrickebdd58dd2022-05-20 14:22:50 +09006403 GTEST_SKIP() << "At least Vulkan version 1.2 is required";
sfricke-samsung860d3b22020-05-04 21:08:29 -07006404 }
6405
6406 VkBufferObj indirect_buffer;
6407 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6408 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6409
6410 VkBufferObj indexed_indirect_buffer;
6411 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6412 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6413
6414 VkBufferObj count_buffer;
6415 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6416
6417 VkBufferObj index_buffer;
6418 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6419
6420 CreatePipelineHelper pipe(*this);
6421 pipe.InitInfo();
6422 pipe.InitState();
6423 pipe.CreateGraphicsPipeline();
6424
6425 // Make calls to valid commands but without the drawIndirectCount feature set
6426 m_commandBuffer->begin();
6427 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6428
6429 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6430
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006431 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006432 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6433 sizeof(VkDrawIndirectCommand));
6434 m_errorMonitor->VerifyFound();
6435
6436 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6437
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006438 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006439 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6440 sizeof(VkDrawIndexedIndirectCommand));
6441 m_errorMonitor->VerifyFound();
6442
6443 m_commandBuffer->EndRenderPass();
6444 m_commandBuffer->end();
6445}
6446
unknown088160a2019-05-23 17:43:13 -06006447TEST_F(VkLayerTest, ExclusiveScissorNV) {
6448 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6449
6450 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6451 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6452 } else {
6453 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6454 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6455 return;
6456 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006457 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006458 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6459 for (auto device_extension : required_device_extensions) {
6460 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6461 m_device_extension_names.push_back(device_extension);
6462 } else {
6463 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6464 return;
6465 }
6466 }
6467
6468 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006469 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006470 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6471
6472 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006473 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6474 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006475 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6476
6477 features2.features.multiViewport = VK_FALSE;
6478
6479 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6481
6482 if (m_device->phy().properties().limits.maxViewports) {
6483 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6484 return;
6485 }
6486
6487 // Based on PSOViewportStateTests
6488 {
6489 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6490 VkViewport viewports[] = {viewport, viewport};
6491 VkRect2D scissor = {{0, 0}, {64, 64}};
6492 VkRect2D scissors[100] = {scissor, scissor};
6493
6494 using std::vector;
6495 struct TestCase {
6496 uint32_t viewport_count;
6497 VkViewport *viewports;
6498 uint32_t scissor_count;
6499 VkRect2D *scissors;
6500 uint32_t exclusive_scissor_count;
6501 VkRect2D *exclusive_scissors;
6502
6503 vector<std::string> vuids;
6504 };
6505
6506 vector<TestCase> test_cases = {
6507 {1,
6508 viewports,
6509 1,
6510 scissors,
6511 2,
6512 scissors,
6513 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6514 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6515 {1,
6516 viewports,
6517 1,
6518 scissors,
6519 100,
6520 scissors,
6521 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6522 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6523 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006524 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006525 };
6526
6527 for (const auto &test_case : test_cases) {
sfricke-samsung1c61f192021-12-31 01:53:03 -06006528 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc =
6529 LvlInitStruct<VkPipelineViewportExclusiveScissorStateCreateInfoNV>();
unknown088160a2019-05-23 17:43:13 -06006530
6531 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6532 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6533 helper.vp_state_ci_.pViewports = test_case.viewports;
6534 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6535 helper.vp_state_ci_.pScissors = test_case.scissors;
6536 helper.vp_state_ci_.pNext = &exc;
6537
6538 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6539 exc.pExclusiveScissors = test_case.exclusive_scissors;
6540 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006541 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006542 }
6543 }
6544
6545 // Based on SetDynScissorParamTests
6546 {
6547 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006548 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006549
6550 const VkRect2D scissor = {{0, 0}, {16, 16}};
6551 const VkRect2D scissors[] = {scissor, scissor};
6552
6553 m_commandBuffer->begin();
6554
Mark Lobodzinski20310782020-02-28 14:25:17 -07006555 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006556 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6557 m_errorMonitor->VerifyFound();
6558
Mark Lobodzinski20310782020-02-28 14:25:17 -07006559 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006560 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6561 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6562 m_errorMonitor->VerifyFound();
6563
Mark Lobodzinski20310782020-02-28 14:25:17 -07006564 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006565 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6566 m_errorMonitor->VerifyFound();
6567
Mark Lobodzinski20310782020-02-28 14:25:17 -07006568 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006569 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006570 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006571 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6572 m_errorMonitor->VerifyFound();
6573
Mark Lobodzinski20310782020-02-28 14:25:17 -07006574 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6575 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006576 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6577 m_errorMonitor->VerifyFound();
6578
Mark Lobodzinski20310782020-02-28 14:25:17 -07006579 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006580 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6581 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6582 m_errorMonitor->VerifyFound();
6583
6584 struct TestCase {
6585 VkRect2D scissor;
6586 std::string vuid;
6587 };
6588
6589 std::vector<TestCase> test_cases = {
6590 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6591 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6592 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6593 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6594 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6595 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6596 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6597 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6598
6599 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006601 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6602 m_errorMonitor->VerifyFound();
6603 }
6604
6605 m_commandBuffer->end();
6606 }
6607}
6608
6609TEST_F(VkLayerTest, MeshShaderNV) {
6610 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6611
6612 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6613 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6614 } else {
6615 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6616 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6617 return;
6618 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006619 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006620 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6621 for (auto device_extension : required_device_extensions) {
6622 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6623 m_device_extension_names.push_back(device_extension);
6624 } else {
6625 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6626 return;
6627 }
6628 }
6629
Tony-LunarG048f5012020-04-29 16:55:11 -06006630 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006631 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6632 return;
6633 }
6634
6635 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006636 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006637 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6638
6639 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006640 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6641 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006642 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6643 features2.features.multiDrawIndirect = VK_FALSE;
6644
6645 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6647
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006648 static const char vertShaderText[] = R"glsl(
6649 #version 450
6650 vec2 vertices[3];
6651 void main() {
6652 vertices[0] = vec2(-1.0, -1.0);
6653 vertices[1] = vec2( 1.0, -1.0);
6654 vertices[2] = vec2( 0.0, 1.0);
6655 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6656 gl_PointSize = 1.0f;
6657 }
6658 )glsl";
unknown088160a2019-05-23 17:43:13 -06006659
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006660 static const char meshShaderText[] = R"glsl(
6661 #version 450
6662 #extension GL_NV_mesh_shader : require
6663 layout(local_size_x = 1) in;
6664 layout(max_vertices = 3) out;
6665 layout(max_primitives = 1) out;
6666 layout(triangles) out;
6667 void main() {
6668 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6669 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6670 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6671 gl_PrimitiveIndicesNV[0] = 0;
6672 gl_PrimitiveIndicesNV[1] = 1;
6673 gl_PrimitiveIndicesNV[2] = 2;
6674 gl_PrimitiveCountNV = 1;
6675 }
6676 )glsl";
unknown088160a2019-05-23 17:43:13 -06006677
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006678 VkShaderObj vs(this, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
6679 VkShaderObj ms(this, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV);
6680 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
unknown088160a2019-05-23 17:43:13 -06006681
6682 // Test pipeline creation
6683 {
6684 // can't mix mesh with vertex
6685 const auto break_vp = [&](CreatePipelineHelper &helper) {
6686 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6687 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006688 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006689 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6690
6691 // vertex or mesh must be present
6692 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006693 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006694 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6695
6696 // vertexinput and inputassembly must be valid when vertex stage is present
6697 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6698 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6699 helper.gp_ci_.pVertexInputState = nullptr;
6700 helper.gp_ci_.pInputAssemblyState = nullptr;
6701 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006702 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006703 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6704 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6705 }
6706
6707 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006708 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006709
sfricke-samsung1c61f192021-12-31 01:53:03 -06006710 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006711 buffer_create_info.size = sizeof(uint32_t);
6712 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6713 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006714 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006715 ASSERT_VK_SUCCESS(result);
6716
6717 m_commandBuffer->begin();
6718
Mark Lobodzinski20310782020-02-28 14:25:17 -07006719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6720 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006721 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6722 m_errorMonitor->VerifyFound();
6723
6724 m_commandBuffer->end();
6725
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006726 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006727}
6728
6729TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6730 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006731
sjfricked700bc02022-05-30 16:35:06 +09006732 AddRequiredExtensions(VK_NV_MESH_SHADER_EXTENSION_NAME);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006733 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +09006734 if (!AreRequiredExtensionsEnabled()) {
6735 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006736 }
6737 auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
6738 vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR"));
6739 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6740
6741 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6742 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
6743 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6744 if (mesh_shader_features.meshShader != VK_TRUE) {
6745 printf("%s Mesh shader feature not supported\n", kSkipPrefix);
6746 return;
6747 }
6748
6749 mesh_shader_features.meshShader = VK_FALSE;
6750 mesh_shader_features.taskShader = VK_FALSE;
6751 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06006752 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6753
6754 VkEvent event;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006755 VkEventCreateInfo event_create_info = LvlInitStruct<VkEventCreateInfo>();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006756 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006757
6758 m_commandBuffer->begin();
6759
Shannon McPherson93970b12020-06-12 14:34:35 -06006760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006761 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006762 m_errorMonitor->VerifyFound();
6763
Shannon McPherson93970b12020-06-12 14:34:35 -06006764 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006765 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006766 m_errorMonitor->VerifyFound();
6767
Shannon McPherson93970b12020-06-12 14:34:35 -06006768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006769 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006770 m_errorMonitor->VerifyFound();
6771
Shannon McPherson93970b12020-06-12 14:34:35 -06006772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006773 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006774 m_errorMonitor->VerifyFound();
6775
Shannon McPherson93970b12020-06-12 14:34:35 -06006776 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006778 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6779 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006780 m_errorMonitor->VerifyFound();
6781
Shannon McPherson93970b12020-06-12 14:34:35 -06006782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006784 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6785 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006786 m_errorMonitor->VerifyFound();
6787
Shannon McPherson93970b12020-06-12 14:34:35 -06006788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6789 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006790 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6791 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006792 m_errorMonitor->VerifyFound();
6793
Shannon McPherson93970b12020-06-12 14:34:35 -06006794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006796 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6797 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006798 m_errorMonitor->VerifyFound();
6799
6800 m_commandBuffer->end();
6801
sfricke-samsung1c61f192021-12-31 01:53:03 -06006802 VkSemaphoreCreateInfo semaphore_create_info = LvlInitStruct<VkSemaphoreCreateInfo>();
unknown088160a2019-05-23 17:43:13 -06006803 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006804 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006805
6806 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
sfricke-samsung1c61f192021-12-31 01:53:03 -06006807 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>();
unknown088160a2019-05-23 17:43:13 -06006808
6809 // Signal the semaphore so the next test can wait on it.
unknown088160a2019-05-23 17:43:13 -06006810 submit_info.signalSemaphoreCount = 1;
6811 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006812 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006813 m_errorMonitor->VerifyNotFound();
6814
unknown088160a2019-05-23 17:43:13 -06006815 submit_info.signalSemaphoreCount = 0;
6816 submit_info.pSignalSemaphores = nullptr;
6817 submit_info.waitSemaphoreCount = 1;
6818 submit_info.pWaitSemaphores = &semaphore;
6819 submit_info.pWaitDstStageMask = &stage_flags;
6820
sfricke-samsung1ac64842021-09-23 14:11:17 -07006821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04095");
6822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006823 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006824 m_errorMonitor->VerifyFound();
6825
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006826 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006827
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006828 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006829
6830 static const char task_src[] = R"glsl(
6831 #version 450
6832
6833 #extension GL_NV_mesh_shader : require
6834
6835 layout(local_size_x = 32) in;
6836
6837 taskNV out Task {
6838 uint baseID;
6839 } OUT;
6840
6841 void main() {
6842 OUT.baseID = 1;
6843 }
6844 )glsl";
6845
6846 static const char mesh_src[] = R"glsl(
6847 #version 450
6848
6849 #extension GL_NV_mesh_shader : require
6850
6851 layout(local_size_x = 1) in;
6852 layout(max_vertices = 3) out;
6853 layout(max_primitives = 1) out;
6854 layout(triangles) out;
6855
6856 taskNV in Task {
6857 uint baseID;
6858 } IN;
6859
6860 void main() {
6861 }
6862 )glsl";
6863
6864 VkShaderObj task_shader(this, task_src, VK_SHADER_STAGE_TASK_BIT_NV);
6865 VkShaderObj mesh_shader(this, mesh_src, VK_SHADER_STAGE_MESH_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006866
6867 // mesh and task shaders not supported
6868 const auto break_vp = [&](CreatePipelineHelper &helper) {
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006869 helper.shader_stages_ = {task_shader.GetStageCreateInfo(), mesh_shader.GetStageCreateInfo()};
unknown088160a2019-05-23 17:43:13 -06006870 };
Nathaniel Cesariofe8d7862022-02-16 17:27:29 -07006871 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
6872 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6873 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
unknown088160a2019-05-23 17:43:13 -06006874
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006875 vk::DestroyEvent(m_device->device(), event, nullptr);
6876 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006877}
Chris Mayerc93536f2019-09-19 16:34:49 +02006878
6879TEST_F(VkLayerTest, ViewportWScalingNV) {
6880 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6881
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006882 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006883
6884 VkPhysicalDeviceFeatures device_features = {};
6885 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6886
6887 if (!device_features.multiViewport) {
6888 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6889 return;
6890 }
6891
6892 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6893 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6894 } else {
6895 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6896 return;
6897 }
6898
6899 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6901
6902 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006903 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006904
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006905 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006906 #version 450
6907 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6908 vec2( 1.0f, 1.0f),
6909 vec2(-1.0f, -1.0f),
6910 vec2( 1.0f, -1.0f) };
6911 out gl_PerVertex {
6912 vec4 gl_Position;
6913 };
6914
6915 void main() {
6916 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006917 }
6918 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006919
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006920 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006921 #version 450
6922 layout(location = 0) out vec4 outColor;
6923
6924 void main() {
6925 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006926 }
6927 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006928
6929 const std::vector<VkViewport> vp = {
6930 {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}};
6931 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6932 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6933
6934 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6935
sfricke-samsung1c61f192021-12-31 01:53:03 -06006936 VkPipelineViewportWScalingStateCreateInfoNV vpsi = LvlInitStruct<VkPipelineViewportWScalingStateCreateInfoNV>();
Chris Mayerc93536f2019-09-19 16:34:49 +02006937 vpsi.viewportWScalingEnable = VK_TRUE;
6938 vpsi.viewportCount = vp_count;
6939 vpsi.pViewportWScalings = scale.data();
6940
sfricke-samsung1c61f192021-12-31 01:53:03 -06006941 VkPipelineViewportStateCreateInfo vpci = LvlInitStruct<VkPipelineViewportStateCreateInfo>(&vpsi);
Chris Mayerc93536f2019-09-19 16:34:49 +02006942 vpci.viewportCount = vp_count;
6943 vpci.pViewports = vp.data();
6944 vpci.scissorCount = vp_count;
6945 vpci.pScissors = sc.data();
Chris Mayerc93536f2019-09-19 16:34:49 +02006946
6947 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6948
6949 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006950 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006951
6952 // Create pipeline with w-scaling enabled but without a valid scaling array
6953 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006954 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006955 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6956
6957 vpsi.pViewportWScalings = scale.data();
6958
6959 // Create pipeline with w-scaling enabled but without matching viewport counts
6960 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006961 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006962 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6963
6964 const VkPipelineLayoutObj pl(m_device);
6965
sfricke-samsungae54c1e2022-01-21 05:35:21 -08006966 VkShaderObj vs(this, vs_src, VK_SHADER_STAGE_VERTEX_BIT);
6967 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Chris Mayerc93536f2019-09-19 16:34:49 +02006968
6969 VkPipelineObj pipe(m_device);
6970 pipe.AddDefaultColorAttachment();
6971 pipe.AddShader(&vs);
6972 pipe.AddShader(&fs);
6973 pipe.SetViewport(vp);
6974 pipe.SetScissor(sc);
6975 pipe.CreateVKPipeline(pl.handle(), renderPass());
6976
6977 VkPipelineObj pipeDynWScale(m_device);
6978 pipeDynWScale.AddDefaultColorAttachment();
6979 pipeDynWScale.AddShader(&vs);
6980 pipeDynWScale.AddShader(&fs);
6981 pipeDynWScale.SetViewport(vp);
6982 pipeDynWScale.SetScissor(sc);
6983 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6984 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6985
6986 m_commandBuffer->begin();
6987
6988 // Bind pipeline without dynamic w scaling enabled
6989 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006990 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006991 m_errorMonitor->VerifyNotFound();
6992
Chris Mayerc93536f2019-09-19 16:34:49 +02006993 // Bind pipeline that has dynamic w-scaling enabled
6994 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006995 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006996 m_errorMonitor->VerifyNotFound();
6997
6998 const auto max_vps = m_device->props.limits.maxViewports;
6999
Mark Lobodzinski20310782020-02-28 14:25:17 -07007000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02007001 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
7002 m_errorMonitor->VerifyFound();
7003
7004 m_errorMonitor->ExpectSuccess();
7005 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
7006 m_errorMonitor->VerifyNotFound();
7007
7008 m_commandBuffer->end();
7009}
sfricke-samsung914e8002020-01-07 22:26:18 -08007010
7011TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
7012 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
7013
7014 // Enable Sampler YCbCr Conversion req'd extensions
7015 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
7016 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
7017 if (mp_extensions) {
7018 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7019 }
7020 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07007021 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mike Schuchardt7cc57842021-09-15 10:49:59 -07007022 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08007023 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
7024 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
7025 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
7026 if (mp_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07007027 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
sfricke-samsung914e8002020-01-07 22:26:18 -08007028 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
7029 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
7030 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
7031 } else {
7032 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
7033 return;
7034 }
7035
7036 // Explictly not enable Ycbcr Conversion Features
sfricke-samsung1c61f192021-12-31 01:53:03 -06007037 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = LvlInitStruct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
sfricke-samsung914e8002020-01-07 22:26:18 -08007038 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
7039 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
7040
7041 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
7042 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
7043 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
7044 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
7045 return;
7046 }
7047
7048 // Create Ycbcr conversion
7049 VkSamplerYcbcrConversion conversions;
7050 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
7051 NULL,
7052 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
7053 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
7054 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
7055 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
7056 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
7057 VK_CHROMA_LOCATION_COSITED_EVEN,
7058 VK_CHROMA_LOCATION_COSITED_EVEN,
7059 VK_FILTER_NEAREST,
7060 false};
7061
Mark Lobodzinski20310782020-02-28 14:25:17 -07007062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08007063 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
7064 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07007065}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007066
7067TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
7068 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
7069
7070 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7071 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7072 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7073 return;
7074 }
7075 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7076
7077 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7078
7079 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7080 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7081 return;
7082 }
7083 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7084
7085 {
7086 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7087 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7088 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7089
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007090 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7091 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007092 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7093
7094 if (!tf_features.transformFeedback) {
7095 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7096 return;
7097 }
7098 }
7099
7100 ASSERT_NO_FATAL_FAILURE(InitState());
7101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7102
7103 {
7104 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
7105 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7106 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7107
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007108 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007109 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7110 info.size = 4;
7111 VkBufferObj buffer;
7112 buffer.init(*m_device, info);
7113 VkDeviceSize offsets[1]{};
7114
7115 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
7116 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
7117 m_errorMonitor->VerifyFound();
7118 }
7119
7120 {
7121 auto vkCmdBeginTransformFeedbackEXT =
7122 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7123 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7124
7125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
7126 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7127 m_errorMonitor->VerifyFound();
7128 }
7129
7130 {
7131 auto vkCmdEndTransformFeedbackEXT =
7132 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7133 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7134
7135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
7136 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7137 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7138 m_errorMonitor->VerifyFound();
7139 }
7140}
7141
7142TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
7143 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
7144
7145 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7146 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7147 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7148 return;
7149 }
7150 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7151
7152 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7153
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007154 if (IsPlatform(kGalaxyS10)) {
7155 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7156 return;
7157 }
7158
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007159 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7160 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7161 return;
7162 }
7163 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7164
7165 {
7166 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7167 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7168 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7169
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007170 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7171 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007172 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7173
7174 if (!tf_features.transformFeedback) {
7175 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7176 return;
7177 }
7178
7179 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7180 }
7181
7182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7183
7184 auto vkCmdBindTransformFeedbackBuffersEXT =
7185 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7186 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7187
7188 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007189 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7190 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007191 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7192
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007193 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007194 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7195 info.size = 8;
7196 VkBufferObj const buffer_obj(*m_device, info);
7197
7198 // Request a firstBinding that is too large.
7199 {
7200 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7201 VkDeviceSize const offsets[1]{};
7202
7203 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7204 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7205 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7206 nullptr);
7207 m_errorMonitor->VerifyFound();
7208 }
7209
7210 // Request too many bindings.
7211 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7212 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7213 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7214
7215 std::vector<VkDeviceSize> offsets(bindingCount);
7216
7217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7218 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7219 nullptr);
7220 m_errorMonitor->VerifyFound();
7221 }
7222
7223 // Request a size that is larger than the maximum size.
7224 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7225 VkDeviceSize const offsets[1]{};
7226 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7227
7228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7229 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7230 m_errorMonitor->VerifyFound();
7231 }
7232 }
7233
7234 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007235 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007236 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7237 info.size = 8;
7238 VkBufferObj const buffer_obj(*m_device, info);
7239
7240 // Request an offset that is too large.
7241 {
7242 VkDeviceSize const offsets[1]{info.size + 4};
7243
7244 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7245 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7246 m_errorMonitor->VerifyFound();
7247 }
7248
7249 // Request an offset that is not a multiple of 4.
7250 {
7251 VkDeviceSize const offsets[1]{1};
7252
7253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7254 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7255 m_errorMonitor->VerifyFound();
7256 }
7257
7258 // Request a size that is larger than the buffer's size.
7259 {
7260 VkDeviceSize const offsets[1]{};
7261 VkDeviceSize const sizes[1]{info.size + 1};
7262
7263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007264 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7265 m_errorMonitor->VerifyFound();
7266 }
7267
7268 // Request an offset and size whose sum is larger than the buffer's size.
7269 {
7270 VkDeviceSize const offsets[1]{4};
7271 VkDeviceSize const sizes[1]{info.size - 3};
7272
7273 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7274 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7275 m_errorMonitor->VerifyFound();
7276 }
7277
7278 // Bind while transform feedback is active.
7279 {
7280 auto vkCmdBeginTransformFeedbackEXT =
7281 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7282 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7283 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7284
7285 VkDeviceSize const offsets[1]{};
7286
7287 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7288 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7289 m_errorMonitor->VerifyFound();
7290
7291 auto vkCmdEndTransformFeedbackEXT =
7292 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7293 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7294 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7295 }
7296 }
7297
7298 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7299 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007300 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007301 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7302 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007303 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007304 VkBufferObj const buffer_obj(*m_device, info);
7305
7306 VkDeviceSize const offsets[1]{};
7307
7308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7309 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7310 m_errorMonitor->VerifyFound();
7311 }
7312
7313 // Don't bind memory.
7314 {
7315 VkBuffer buffer{};
7316 {
7317 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7318 ASSERT_TRUE(vkCreateBuffer != nullptr);
7319
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007320 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007321 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7322 info.size = 4;
7323 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7324 }
7325
7326 VkDeviceSize const offsets[1]{};
7327
7328 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7329 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7330 m_errorMonitor->VerifyFound();
7331 }
7332}
7333
7334TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7335 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7336
7337 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7338 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7339 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7340 return;
7341 }
7342 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7343
7344 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7345
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007346 if (IsPlatform(kGalaxyS10)) {
7347 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7348 return;
7349 }
7350
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007351 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7352 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7353 return;
7354 }
7355 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7356
7357 {
7358 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7359 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7360 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7361
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007362 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7363 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007364 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7365
7366 if (!tf_features.transformFeedback) {
7367 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7368 return;
7369 }
7370
7371 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7372 }
7373
7374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7375
7376 auto vkCmdBeginTransformFeedbackEXT =
7377 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7378 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7379
7380 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007381 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7382 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007383 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7384
7385 // Request a firstCounterBuffer that is too large.
7386 {
7387 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7388
7389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7390 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7391 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7392 m_errorMonitor->VerifyFound();
7393 }
7394
7395 // Request too many buffers.
7396 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7397 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7398
7399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7400 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7401 m_errorMonitor->VerifyFound();
7402 }
7403 }
7404
7405 // Request an out-of-bounds location.
7406 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007407 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007408 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7409 info.size = 4;
7410 VkBufferObj const buffer_obj(*m_device, info);
7411
7412 VkDeviceSize const offsets[1]{1};
7413
7414 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7415 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7416 m_errorMonitor->VerifyFound();
7417 }
7418
7419 // Request specific offsets without specifying buffers.
7420 {
7421 VkDeviceSize const offsets[1]{};
7422
7423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7424 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7425 m_errorMonitor->VerifyFound();
7426 }
7427
7428 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7429 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007430 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007431 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7432 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007433 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007434 VkBufferObj const buffer_obj(*m_device, info);
7435
7436 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7437 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7438 m_errorMonitor->VerifyFound();
7439 }
7440
7441 // Begin while transform feedback is active.
7442 {
7443 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7444
7445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7446 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7447 m_errorMonitor->VerifyFound();
7448
7449 auto vkCmdEndTransformFeedbackEXT =
7450 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7451 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7452
7453 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7454 }
7455}
7456
7457TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7458 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7459
7460 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7461 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7462 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7463 return;
7464 }
7465 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7466
7467 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7468
Nathaniel Cesario27d85f52021-07-22 12:42:07 -06007469 if (IsPlatform(kGalaxyS10)) {
7470 printf("%s Test temporarily disabled on S10 device\n", kSkipPrefix);
7471 return;
7472 }
7473
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007474 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7475 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7476 return;
7477 }
7478 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7479
7480 {
7481 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7482 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7483 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7484
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007485 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7486 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007487 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7488
7489 if (!tf_features.transformFeedback) {
7490 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7491 return;
7492 }
7493
7494 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7495 }
7496
7497 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7498
7499 auto vkCmdEndTransformFeedbackEXT =
7500 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7501 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7502
7503 {
7504 // Activate transform feedback.
7505 auto vkCmdBeginTransformFeedbackEXT =
7506 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7507 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7508 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7509
7510 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007511 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7512 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007513 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7514
7515 // Request a firstCounterBuffer that is too large.
7516 {
7517 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7518
7519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7520 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7521 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7522 m_errorMonitor->VerifyFound();
7523 }
7524
7525 // Request too many buffers.
7526 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7527 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7528
7529 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7530 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7531 m_errorMonitor->VerifyFound();
7532 }
7533 }
7534
7535 // Request an out-of-bounds location.
7536 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007537 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007538 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7539 info.size = 4;
7540 VkBufferObj const buffer_obj(*m_device, info);
7541
7542 VkDeviceSize const offsets[1]{1};
7543
7544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7545 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7546 m_errorMonitor->VerifyFound();
7547 }
7548
7549 // Request specific offsets without specifying buffers.
7550 {
7551 VkDeviceSize const offsets[1]{};
7552
7553 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7554 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7555 m_errorMonitor->VerifyFound();
7556 }
7557
7558 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7559 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007560 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007561 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7562 info.size = 4;
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01007563 m_errorMonitor->SetUnexpectedError("VUID-VkBufferCreateInfo-usage-parameter");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007564 VkBufferObj const buffer_obj(*m_device, info);
7565
7566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7567 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7568 m_errorMonitor->VerifyFound();
7569 }
7570 }
7571
7572 // End while transform feedback is inactive.
7573 {
7574 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7575
7576 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7577 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7578 m_errorMonitor->VerifyFound();
7579 }
7580}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007581
sfricke-samsung39ee2442020-07-22 21:21:15 -07007582TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7583 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007584
7585 // protect memory added in VK 1.1
7586 SetTargetApiVersion(VK_API_VERSION_1_1);
7587
7588 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7589 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7590 } else {
7591 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7592 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7593 return;
7594 }
7595 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7596
7597 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7598 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7599 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7600
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007601 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7602 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007603 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7604
7605 if (protected_memory_features.protectedMemory == VK_FALSE) {
7606 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7607 return;
7608 };
7609
7610 // Turns m_commandBuffer into a protected command buffer
7611 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7612
7613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7614 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007615 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung071af2d2020-07-02 10:37:22 -07007616 }
7617
7618 VkBufferObj indirect_buffer;
7619 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7620 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7621
7622 VkBufferObj indexed_indirect_buffer;
7623 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7624 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7625
7626 VkBufferObj index_buffer;
7627 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7628
7629 CreatePipelineHelper pipe(*this);
7630 pipe.InitInfo();
7631 pipe.InitState();
7632 pipe.CreateGraphicsPipeline();
7633
sfricke-samsung39ee2442020-07-22 21:21:15 -07007634 VkQueryPool query_pool;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007635 VkQueryPoolCreateInfo query_pool_create_info = LvlInitStruct<VkQueryPoolCreateInfo>();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007636 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7637 query_pool_create_info.queryCount = 1;
7638 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7639
sfricke-samsung071af2d2020-07-02 10:37:22 -07007640 m_commandBuffer->begin();
7641 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7642
7643 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7644
7645 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7646 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7647 m_errorMonitor->VerifyFound();
7648
7649 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7650
7651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7652 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7653 sizeof(VkDrawIndexedIndirectCommand));
7654 m_errorMonitor->VerifyFound();
7655
7656 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007657
7658 // Query should be outside renderpass
7659 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7660
7661 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7662 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7663 m_errorMonitor->VerifyFound();
7664
7665 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7666 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7667 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7668 m_errorMonitor->VerifyFound();
7669
sfricke-samsung071af2d2020-07-02 10:37:22 -07007670 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007671
7672 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007673}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007674
7675TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7676 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7677
7678 SetTargetApiVersion(VK_API_VERSION_1_1);
7679
7680 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7681 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7682 } else {
7683 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7684 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7685 return;
7686 }
7687 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7688
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007689 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7690 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7691 return;
7692 }
7693
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007694 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7695 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7696 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
sfricke-samsung21286f82021-11-16 08:21:46 -08007697 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
7698 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
7699 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007700
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007701 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7702 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007703 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7704
7705 if (protected_memory_features.protectedMemory == VK_FALSE) {
7706 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7707 return;
7708 };
7709
sfricke-samsung21286f82021-11-16 08:21:46 -08007710 VkPhysicalDeviceProtectedMemoryProperties protected_memory_properties =
7711 LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>();
7712 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&protected_memory_properties);
7713 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
7714
7715 // Turns m_commandBuffer into a unprotected command buffer without passing in a VkCommandPoolCreateFlags
7716 ASSERT_NO_FATAL_FAILURE(InitState());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007717
7718 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7719 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7720
7721 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09007722 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007723 }
7724
7725 // Create actual protected and unprotected buffers
7726 VkBuffer buffer_protected = VK_NULL_HANDLE;
7727 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06007728 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007729 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007730 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7731 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7732 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007733 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7734
7735 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7736 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7737 buffer_create_info.flags = 0;
7738 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7739
7740 // Create actual protected and unprotected images
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007741 const VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007742 VkImageObj image_protected(m_device);
7743 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007744 VkImageObj image_protected_descriptor(m_device);
7745 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007746 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007747 VkImageView image_views_descriptor[2];
sfricke-samsung1c61f192021-12-31 01:53:03 -06007748 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007749 image_create_info.extent = {64, 64, 1};
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007750 image_create_info.format = image_format;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007751 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7752 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007753 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7754 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007755 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7756 image_create_info.arrayLayers = 1;
7757 image_create_info.mipLevels = 1;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007758 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7759 image_protected.init_no_mem(*m_device, image_create_info);
7760 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7761
locke-lunarg0de02522020-10-27 22:55:17 -06007762 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7763 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007764
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007765 image_create_info.flags = 0;
7766 image_unprotected.init_no_mem(*m_device, image_create_info);
7767 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7768
locke-lunarg0de02522020-10-27 22:55:17 -06007769 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7770 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007771
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007772 // Create protected and unproteced memory
7773 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7774 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7775
sfricke-samsung1c61f192021-12-31 01:53:03 -06007776 VkMemoryAllocateInfo alloc_info = LvlInitStruct<VkMemoryAllocateInfo>();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007777 alloc_info.allocationSize = 0;
7778
7779 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7780 VkMemoryRequirements mem_reqs_protected;
7781 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7782 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7783 VkMemoryRequirements mem_reqs_unprotected;
7784 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7785 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7786
7787 // Get memory index for a protected and unprotected memory
7788 VkPhysicalDeviceMemoryProperties phys_mem_props;
7789 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7790 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7791 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7792 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7793 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7794 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7795 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7796 memory_type_unprotected = i;
7797 }
7798 // Check just protected bit is in type at all
7799 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7800 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7801 memory_type_protected = i;
7802 }
7803 }
7804 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7805 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7806 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7807 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7808 return;
7809 }
7810
7811 alloc_info.memoryTypeIndex = memory_type_protected;
7812 alloc_info.allocationSize = mem_reqs_protected.size;
7813 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7814
7815 alloc_info.allocationSize = mem_reqs_unprotected.size;
7816 alloc_info.memoryTypeIndex = memory_type_unprotected;
7817 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7818
7819 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7820 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7821 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7822 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007823 vk::BindImageMemory(device(), image_protected_descriptor.handle(), memory_protected, 0);
7824 vk::BindImageMemory(device(), image_unprotected_descriptor.handle(), memory_unprotected, 0);
7825
7826 // need memory bound at image view creation time
7827 image_views[0] = image_protected.targetView(image_format);
7828 image_views[1] = image_unprotected.targetView(image_format);
7829 image_views_descriptor[0] = image_protected_descriptor.targetView(image_format);
7830 image_views_descriptor[1] = image_unprotected_descriptor.targetView(image_format);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007831
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007832 // A renderpass and framebuffer that contains a protected and unprotected image view
7833 VkAttachmentDescription attachments[2] = {
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007834 {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 -07007835 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7836 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
sfricke-samsung27d3c1e2021-07-16 22:36:48 -07007837 {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 -07007838 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7839 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7840 };
7841 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7842 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7843 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7844 VkSubpassDependency dependency = {0,
7845 0,
7846 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7847 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7848 VK_ACCESS_SHADER_WRITE_BIT,
7849 VK_ACCESS_SHADER_WRITE_BIT,
7850 VK_DEPENDENCY_BY_REGION_BIT};
7851 VkRenderPassCreateInfo render_pass_create_info = {
7852 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7853 VkRenderPass render_pass;
7854 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7855 VkFramebufferCreateInfo framebuffer_create_info = {
7856 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7857 VkFramebuffer framebuffer;
7858 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7859
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007860 // Various structs used for commands
7861 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7862 VkImageBlit blit_region = {};
7863 blit_region.srcSubresource = image_subresource;
7864 blit_region.dstSubresource = image_subresource;
7865 blit_region.srcOffsets[0] = {0, 0, 0};
7866 blit_region.srcOffsets[1] = {8, 8, 1};
7867 blit_region.dstOffsets[0] = {0, 8, 0};
7868 blit_region.dstOffsets[1] = {8, 8, 1};
7869 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7870 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7871 VkBufferCopy buffer_copy = {0, 0, 64};
7872 VkBufferImageCopy buffer_image_copy = {};
7873 buffer_image_copy.bufferRowLength = 0;
7874 buffer_image_copy.bufferImageHeight = 0;
7875 buffer_image_copy.imageSubresource = image_subresource;
7876 buffer_image_copy.imageOffset = {0, 0, 0};
7877 buffer_image_copy.imageExtent = {1, 1, 1};
7878 buffer_image_copy.bufferOffset = 0;
7879 VkImageCopy image_copy = {};
7880 image_copy.srcSubresource = image_subresource;
7881 image_copy.srcOffset = {0, 0, 0};
7882 image_copy.dstSubresource = image_subresource;
7883 image_copy.dstOffset = {0, 0, 0};
7884 image_copy.extent = {1, 1, 1};
7885 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007886 VkRect2D render_area = {{0, 0}, {8, 8}};
7887 VkRenderPassBeginInfo render_pass_begin = {
7888 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7889 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7890 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7891 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007892
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007893 const char fsSource[] = R"glsl(
7894 #version 450
7895 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7896 layout(set=0, binding=1, rgba8) uniform image2D si1;
7897 layout(location=0) out vec4 x;
7898 void main(){
7899 x = vec4(bar.y);
7900 imageStore(si1, ivec2(0), vec4(0));
7901 }
7902 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08007903 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06007904
aitor-lunargf15acd52022-03-09 22:13:25 +01007905 CreatePipelineHelper g_pipe(*this, 2u);
locke-lunarg0de02522020-10-27 22:55:17 -06007906 g_pipe.InitInfo();
7907 g_pipe.gp_ci_.renderPass = render_pass;
7908 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7909 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7910 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg0de02522020-10-27 22:55:17 -06007911 g_pipe.InitState();
7912 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7913
7914 VkSampler sampler;
7915 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7916 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7917 ASSERT_VK_SUCCESS(err);
7918
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007919 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007920 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007921 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7922 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7923 g_pipe.descriptor_set_->UpdateDescriptorSets();
7924
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007925 m_commandBuffer->begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08007926 // will get undefined values, but not invalid if protectedNoFault is supported
7927 // Will still create an empty command buffer to test submit VUs if protectedNoFault is supported
7928 if (!protected_memory_properties.protectedNoFault) {
7929 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7930 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7931 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7932 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007933
sfricke-samsung21286f82021-11-16 08:21:46 -08007934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7935 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7936 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7937 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007938
sfricke-samsung21286f82021-11-16 08:21:46 -08007939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7940 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7941 &subresource_range);
7942 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007943
sfricke-samsung21286f82021-11-16 08:21:46 -08007944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7945 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7946 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007947
sfricke-samsung21286f82021-11-16 08:21:46 -08007948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7949 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7950 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007951
sfricke-samsung21286f82021-11-16 08:21:46 -08007952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7953 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7954 1, &buffer_image_copy);
7955 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007956
sfricke-samsung21286f82021-11-16 08:21:46 -08007957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7958 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7959 1, &buffer_image_copy);
7960 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007961
sfricke-samsung21286f82021-11-16 08:21:46 -08007962 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7963 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7964 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7965 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007966
sfricke-samsung21286f82021-11-16 08:21:46 -08007967 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7968 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7969 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7970 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007971
sfricke-samsung21286f82021-11-16 08:21:46 -08007972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7973 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7974 1, &buffer_image_copy);
7975 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007976
sfricke-samsung21286f82021-11-16 08:21:46 -08007977 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7978 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected,
7979 1, &buffer_image_copy);
7980 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007981
sfricke-samsung21286f82021-11-16 08:21:46 -08007982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7983 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7984 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007985
sfricke-samsung21286f82021-11-16 08:21:46 -08007986 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7987 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7988 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007989
sfricke-samsung21286f82021-11-16 08:21:46 -08007990 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007991
sfricke-samsung21286f82021-11-16 08:21:46 -08007992 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7993 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7994 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007995
sfricke-samsung21286f82021-11-16 08:21:46 -08007996 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7997 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7998 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7999 VkDeviceSize offset = 0;
8000 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
8001 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008002
sfricke-samsung21286f82021-11-16 08:21:46 -08008003 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
8004 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
8005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
8006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
8007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
locke-lunarg0de02522020-10-27 22:55:17 -06008008
sfricke-samsung21286f82021-11-16 08:21:46 -08008009 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
8010 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06008011
sfricke-samsung21286f82021-11-16 08:21:46 -08008012 vk::CmdEndRenderPass(m_commandBuffer->handle());
8013 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008014 m_commandBuffer->end();
8015
8016 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08008017 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07008018 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
8019 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06008020 g_pipe.descriptor_set_->UpdateDescriptorSets();
8021
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008022 protectedCommandBuffer.begin();
sfricke-samsung21286f82021-11-16 08:21:46 -08008023 if (!protected_memory_properties.protectedNoFault) {
8024 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
8025 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
8026 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
8027 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008028
sfricke-samsung21286f82021-11-16 08:21:46 -08008029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
8030 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color,
8031 1, &subresource_range);
8032 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008033
sfricke-samsung21286f82021-11-16 08:21:46 -08008034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
8035 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
8036 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008037
sfricke-samsung21286f82021-11-16 08:21:46 -08008038 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
8039 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(),
8040 VK_IMAGE_LAYOUT_GENERAL, 1, &buffer_image_copy);
8041 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008042
sfricke-samsung21286f82021-11-16 08:21:46 -08008043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
8044 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
8045 image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
8046 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008047
sfricke-samsung21286f82021-11-16 08:21:46 -08008048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
8049 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL,
8050 buffer_unprotected, 1, &buffer_image_copy);
8051 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008052
sfricke-samsung21286f82021-11-16 08:21:46 -08008053 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
8054 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
8055 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008056
sfricke-samsung21286f82021-11-16 08:21:46 -08008057 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
8058 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
8059 m_errorMonitor->VerifyFound();
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008060
sfricke-samsung21286f82021-11-16 08:21:46 -08008061 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008062
sfricke-samsung21286f82021-11-16 08:21:46 -08008063 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
8064 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
8065 m_errorMonitor->VerifyFound();
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008066
sfricke-samsung21286f82021-11-16 08:21:46 -08008067 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8068 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8069 g_pipe.pipeline_layout_.handle(), 0, 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
8070 VkDeviceSize offset = 0;
8071 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
8072 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008073
sfricke-samsung21286f82021-11-16 08:21:46 -08008074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
8075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
8076 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
8077 m_errorMonitor->VerifyFound();
locke-lunarg0de02522020-10-27 22:55:17 -06008078
sfricke-samsung21286f82021-11-16 08:21:46 -08008079 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
8080 }
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008081 protectedCommandBuffer.end();
8082
sfricke-samsung96cd9932020-08-23 20:57:11 -07008083 // Try submitting together to test only 1 error occurs for the corresponding command buffer
8084 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
8085
sfricke-samsung1c61f192021-12-31 01:53:03 -06008086 VkProtectedSubmitInfo protected_submit_info = LvlInitStruct<VkProtectedSubmitInfo>();
8087 VkSubmitInfo submit_info = LvlInitStruct<VkSubmitInfo>(&protected_submit_info);
sfricke-samsung96cd9932020-08-23 20:57:11 -07008088 submit_info.commandBufferCount = 2;
8089 submit_info.pCommandBuffers = comman_buffers;
8090
8091 protected_submit_info.protectedSubmit = VK_TRUE;
sfricke-samsung21286f82021-11-16 08:21:46 -08008092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkQueueSubmit-queue-06448");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06008093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07008094 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8095 m_errorMonitor->VerifyFound();
8096
8097 protected_submit_info.protectedSubmit = VK_FALSE;
8098 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
8099 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8100 m_errorMonitor->VerifyFound();
8101
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008102 vk::DestroyBuffer(device(), buffer_protected, nullptr);
8103 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
8104 vk::FreeMemory(device(), memory_protected, nullptr);
8105 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008106 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
8107 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06008108}
locke-lunarg6b0de702020-08-07 17:42:13 -06008109
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008110TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06008111 TEST_DESCRIPTION(
8112 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
8113 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
8114
sfricke-samsungbbd74ca2021-08-05 01:09:56 -07008115 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8116 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8117 } else {
8118 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8119 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8120 return;
8121 }
8122 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8123 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)) {
8124 m_device_extension_names.push_back(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
8125 } else {
8126 printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
8127 return;
8128 }
8129
8130 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8131 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8132 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
8133
8134 auto atomic_float_features = lvl_init_struct<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>();
8135 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&atomic_float_features);
8136 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8137 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8138
8139 if (atomic_float_features.shaderImageFloat32Atomics == VK_FALSE) {
8140 printf("%s shaderImageFloat32Atomics not supported. Skipping test.\n", kSkipPrefix);
8141 return;
8142 }
locke-lunarg6b0de702020-08-07 17:42:13 -06008143
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008144 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06008145 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
8146 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
8147 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8148 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
8149
8150 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
8151 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8152 return;
8153 }
8154
8155 VkFormat buffer_view_format =
8156 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
8157 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8158 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8159 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8160 return;
8161 }
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -06008162 m_errorMonitor->SetUnexpectedError("VUID-VkBufferViewCreateInfo-buffer-00934");
locke-lunarg6b0de702020-08-07 17:42:13 -06008163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8164
8165 VkPhysicalDeviceFeatures device_features = {};
8166 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8167 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8168 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8169 return;
8170 }
8171
8172 VkImageObj image(m_device);
8173 image.Init(image_ci);
8174 VkImageView image_view = image.targetView(image_format);
8175
8176 VkSampler sampler = VK_NULL_HANDLE;
8177 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8178 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8179
8180 VkBufferObj buffer;
8181 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8182
sfricke-samsung1c61f192021-12-31 01:53:03 -06008183 VkBufferViewCreateInfo bvci = LvlInitStruct<VkBufferViewCreateInfo>();
locke-lunarg6b0de702020-08-07 17:42:13 -06008184 bvci.buffer = buffer.handle();
8185 bvci.format = buffer_view_format;
8186 bvci.range = VK_WHOLE_SIZE;
8187 VkBufferView buffer_view;
8188 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8189
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008190 char const *fsSource = R"glsl(
8191 #version 450
8192 layout(set=0, binding=3, r32f) uniform image2D si0;
8193 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8194 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8195 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8196 void main() {
8197 imageAtomicExchange(si0, ivec2(0), 1);
8198 imageAtomicExchange(si1[0], ivec2(0), 1);
8199 imageAtomicExchange(si1[1], ivec2(0), 1);
8200 imageAtomicExchange(stb2, 0, 1);
8201 imageAtomicExchange(stb3[0], 0, 1);
8202 imageAtomicExchange(stb3[1], 0, 1);
8203 }
8204 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008205
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008206 VkShaderObj vs(this, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT);
8207 VkShaderObj fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg6b0de702020-08-07 17:42:13 -06008208
8209 CreatePipelineHelper g_pipe(*this);
8210 g_pipe.InitInfo();
8211 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008212 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8213 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8214 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8215 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008216 g_pipe.InitState();
8217 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8218
locke-lunarg76e8dee2020-08-21 13:20:02 -06008219 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008220 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008221 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008222 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008223 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008224 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008225 g_pipe.descriptor_set_->UpdateDescriptorSets();
8226
8227 m_commandBuffer->begin();
8228 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8229 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8230 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8231 &g_pipe.descriptor_set_->set_, 0, nullptr);
8232
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008233 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8238 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8239 m_errorMonitor->VerifyFound();
8240
8241 m_commandBuffer->EndRenderPass();
8242 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008243 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8244 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008245}
locke-lunargae1bbab2020-09-10 11:55:56 -06008246
8247TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8248 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8249
8250 ASSERT_NO_FATAL_FAILURE(Init());
8251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8252
8253 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008254 char const *const vsSource = R"glsl(
8255 #version 450
8256 layout(push_constant, std430) uniform foo {
8257 bool b;
8258 float f2[3];
8259 vec3 v;
8260 vec4 v2[2];
8261 mat3 m;
8262 } constants;
8263 void func1( float f ){
8264 // use the whole v2[1]. byte: 48-63.
8265 vec2 v2 = constants.v2[1].yz;
8266 }
8267 void main(){
8268 // use only v2[0].z. byte: 40-43.
8269 func1( constants.v2[0].z);
8270 // index of m is variable. The all m is used. byte: 64-99.
8271 for(int i=1;i<2;++i) {
8272 vec3 v3 = constants.m[i];
8273 }
8274 }
8275 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008276
8277 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008278 char const *const fsSource = R"glsl(
8279 #version 450
8280 struct foo1{
8281 int i[4];
8282 }f;
8283 layout(push_constant, std430) uniform foo {
8284 float x[2][2][2];
8285 foo1 s;
8286 foo1 ss[3];
8287 } constants;
8288 void main(){
8289 // use s. byte: 32-47.
8290 f = constants.s;
8291 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8292 for(int i=1;i<2;++i) {
8293 int ii = constants.ss[i].i[3];
8294 }
8295 }
8296 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008297
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008298 VkShaderObj const vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
8299 VkShaderObj const fs(this, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunargae1bbab2020-09-10 11:55:56 -06008300
8301 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8302 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8303
8304 VkPipelineLayoutCreateInfo pipeline_layout_info{
8305 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8306
8307 VkPipelineLayout pipeline_layout;
8308 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8309
8310 CreatePipelineHelper g_pipe(*this);
8311 g_pipe.InitInfo();
8312 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8313 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8314 g_pipe.InitState();
8315 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8316
8317 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8318 VkPipelineLayout pipeline_layout_small;
8319 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8320
8321 CreatePipelineHelper g_pipe_small_range(*this);
8322 g_pipe_small_range.InitInfo();
8323 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8324 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8325 g_pipe_small_range.InitState();
8326
sfricke-samsung7699b912021-04-12 23:01:51 -07008327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008329 g_pipe_small_range.CreateGraphicsPipeline();
8330 m_errorMonitor->VerifyFound();
8331
8332 m_commandBuffer->begin();
8333 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8334
Piers Daniella7f93b62021-11-20 12:32:04 -07008335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
locke-lunargae1bbab2020-09-10 11:55:56 -06008336 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8337 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8338 &g_pipe.descriptor_set_->set_, 0, nullptr);
8339 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8340 m_errorMonitor->VerifyFound();
8341
locke-lunargae1bbab2020-09-10 11:55:56 -06008342 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008343
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008344 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8345 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8346 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8347 // for more details.
Piers Daniella7f93b62021-11-20 12:32:04 -07008348 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008349 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8350 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8351 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8352 // m_errorMonitor->VerifyFound();
8353
Piers Daniella7f93b62021-11-20 12:32:04 -07008354 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maintenance4-06425");
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008355 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8356 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8357 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008358
8359 m_errorMonitor->ExpectSuccess();
8360 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8361 68, dummy_values);
8362 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8363 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008364}
8365
8366TEST_F(VkLayerTest, VerifyVertextBinding) {
8367 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8368
8369 ASSERT_NO_FATAL_FAILURE(Init());
8370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8371
8372 VkBufferObj vtx_buf;
8373 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8374 vtx_buf.init(*m_device, info);
8375
8376 CreatePipelineHelper pipe(*this);
8377 pipe.InitInfo();
8378 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8379 VkVertexInputBindingDescription vtx_binding_des[3] = {
8380 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8381
8382 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8383 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8384 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8385 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8386 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8387 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8388 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8389 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8390 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8391 pipe.InitState();
8392 pipe.CreateGraphicsPipeline();
8393
8394 m_commandBuffer->begin();
8395 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8396 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8397 VkDeviceSize offset = 0;
8398 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8399
8400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8405 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8406 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008407
8408 m_commandBuffer->EndRenderPass();
8409 m_commandBuffer->end();
8410}
locke-lunargd7a08e92020-10-21 00:24:00 -06008411
8412TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8413 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8414 ASSERT_NO_FATAL_FAILURE(Init());
8415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8416
8417 CreatePipelineHelper pipe(*this);
8418 pipe.InitInfo();
8419
8420 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8421
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008422 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008423 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8424 dyn_state_ci.pDynamicStates = dyn_states.data();
8425 pipe.dyn_state_ci_ = dyn_state_ci;
8426 pipe.InitState();
8427 pipe.CreateGraphicsPipeline();
8428
8429 m_commandBuffer->begin();
8430 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8431 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8432
8433 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8434 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8435 VkRect2D scissor = {{0, 0}, {16, 16}};
8436 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8437 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8438
8439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8440 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8441 m_errorMonitor->VerifyFound();
8442
8443 m_commandBuffer->EndRenderPass();
8444 m_commandBuffer->end();
8445}
locke-lunarg0de02522020-10-27 22:55:17 -06008446
8447TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8448 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8449 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8450 if (version < VK_API_VERSION_1_1) {
8451 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8452 return;
8453 }
8454 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8455
8456 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8457 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8458 } else {
8459 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8460 return;
8461 }
8462
8463 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8465
8466 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8467 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008468
8469 VkFormatProperties format_props;
8470 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8471 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8472 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8473 return;
8474 }
8475
locke-lunarg0de02522020-10-27 22:55:17 -06008476 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8477 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8478
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008479 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008480 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008481 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008482 image_format_info.type = image_ci.imageType;
8483 image_format_info.format = image_ci.format;
8484 image_format_info.tiling = image_ci.tiling;
8485 image_format_info.usage = image_ci.usage;
8486 image_format_info.flags = image_ci.flags;
8487
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008488 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8489 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008490
8491 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8492
8493 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8494 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8495 return;
8496 }
8497
8498 VkImageObj image(m_device);
8499 image.Init(image_ci);
8500 VkImageView imageView = image.targetView(format, imageViewType);
8501
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008502 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008503 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8504 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8505 VkSampler sampler;
8506 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8507
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008508 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008509 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8510 sampler_ci.pNext = &reduction_mode_ci;
8511 VkSampler sampler_rediction;
8512 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8513
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008514 VkShaderObj fs(this, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
locke-lunarg0de02522020-10-27 22:55:17 -06008515
8516 CreatePipelineHelper g_pipe(*this);
8517 g_pipe.InitInfo();
8518 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8519 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8520 g_pipe.InitState();
8521 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8522
8523 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8524 g_pipe.descriptor_set_->UpdateDescriptorSets();
8525
8526 m_commandBuffer->begin();
8527 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8528 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8529 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8530 &g_pipe.descriptor_set_->set_, 0, nullptr);
8531
8532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8533 m_commandBuffer->Draw(1, 0, 0, 0);
8534 m_errorMonitor->VerifyFound();
8535
8536 m_commandBuffer->EndRenderPass();
8537 m_commandBuffer->end();
8538 m_commandBuffer->reset();
8539
8540 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8541 g_pipe.descriptor_set_->UpdateDescriptorSets();
8542
8543 m_commandBuffer->begin();
8544 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8545 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8546 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8547 &g_pipe.descriptor_set_->set_, 0, nullptr);
8548
8549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8550 m_commandBuffer->Draw(1, 0, 0, 0);
8551 m_errorMonitor->VerifyFound();
8552
8553 m_commandBuffer->EndRenderPass();
8554 m_commandBuffer->end();
8555}
8556
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008557TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008558 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 -07008559
Clemens Kern5a42ea62021-09-29 16:30:23 +02008560 AddRequiredExtensions(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8561 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sjfricked700bc02022-05-30 16:35:06 +09008562 if (!AreRequiredExtensionsEnabled()) {
8563 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008564 }
8565
8566 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8568
8569 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8570 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
Clemens Kern5a42ea62021-09-29 16:30:23 +02008571 auto image_ci = vk_testing::Image::create_info();
8572 image_ci.imageType = VK_IMAGE_TYPE_3D;
8573 image_ci.format = format;
8574 image_ci.extent.width = 128;
8575 image_ci.extent.height = 128;
8576 image_ci.mipLevels = 1;
8577 image_ci.arrayLayers = 1;
8578 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8579 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8580 image_ci.usage = usage;
8581 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_3D;
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008582
8583 VkImageObj image(m_device);
8584 image.Init(image_ci);
8585 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8586 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8587
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008588 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008589 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8590 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8591 VkSampler sampler;
8592 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8593
Clemens Kern5a42ea62021-09-29 16:30:23 +02008594 static const char fs_src[] = R"glsl(
8595 #version 450
8596 layout(set=0, binding=0) uniform sampler3D s;
8597 layout(location=0) out vec4 x;
8598 void main(){
8599 x = texture(s, vec3(1));
8600 }
8601 )glsl";
sfricke-samsungae54c1e2022-01-21 05:35:21 -08008602 VkShaderObj fs(this, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT);
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008603
8604 CreatePipelineHelper g_pipe(*this);
8605 g_pipe.InitInfo();
8606 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8607 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8608 g_pipe.InitState();
8609 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8610
8611 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8612 g_pipe.descriptor_set_->UpdateDescriptorSets();
8613
8614 m_commandBuffer->begin();
8615 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8616 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8617 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8618 &g_pipe.descriptor_set_->set_, 0, nullptr);
8619
8620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8621 m_commandBuffer->Draw(1, 0, 0, 0);
8622 m_errorMonitor->VerifyFound();
8623
8624 m_commandBuffer->EndRenderPass();
8625 m_commandBuffer->end();
8626}
8627
locke-lunarg0de02522020-10-27 22:55:17 -06008628TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8629 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8630 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8631 if (version < VK_API_VERSION_1_1) {
8632 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8633 return;
8634 }
8635 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8636 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8637 } else {
8638 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8639 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8640 return;
8641 }
8642 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8643
8644 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8645 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8646 } else {
8647 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8648 return;
8649 }
8650
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008651 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008652 multiview_features.multiview = VK_TRUE;
sfricke-samsung1c61f192021-12-31 01:53:03 -06008653 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
locke-lunarg0de02522020-10-27 22:55:17 -06008654
8655 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8657
8658 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8659 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8660 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008661 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8662 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008663 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8664 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8665 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8666 return;
8667 }
8668 CreatePipelineHelper pipe(*this);
8669 pipe.InitInfo();
8670 pipe.InitState();
8671 pipe.CreateGraphicsPipeline();
8672
8673 m_commandBuffer->begin();
8674 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8675 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8676
8677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8678 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8679 m_errorMonitor->VerifyFound();
8680
8681 m_commandBuffer->EndRenderPass();
8682 m_commandBuffer->end();
8683}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008684
8685TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8686 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8687
8688 // Enable KHR_fragment_shading_rate and all of its required extensions
8689 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8690 if (fsr_extensions) {
8691 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8692 }
8693 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8694
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008695 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8696 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008697 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8698 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8699 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8700 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008701 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8702 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008703 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8704 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8705 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8706 } else {
8707 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8708 return;
8709 }
8710
sfricke-samsung1c61f192021-12-31 01:53:03 -06008711 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008712 fsr_features.pipelineFragmentShadingRate = true;
8713
sfricke-samsung1c61f192021-12-31 01:53:03 -06008714 VkPhysicalDeviceFeatures2 device_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008715
8716 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8717
8718 // Find address of extension call and make the call
8719 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8720 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8721 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8722
8723 VkExtent2D fragmentSize = {1, 1};
8724 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8725 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8726
8727 m_commandBuffer->begin();
8728 fragmentSize.width = 0;
8729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8730 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8731 m_errorMonitor->VerifyFound();
8732 fragmentSize.width = 1;
8733
8734 fragmentSize.height = 0;
8735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8736 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8737 m_errorMonitor->VerifyFound();
8738 fragmentSize.height = 1;
8739
8740 fragmentSize.width = 3;
8741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8742 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8743 m_errorMonitor->VerifyFound();
8744 fragmentSize.width = 1;
8745
8746 fragmentSize.height = 3;
8747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8748 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8749 m_errorMonitor->VerifyFound();
8750 fragmentSize.height = 1;
8751
8752 fragmentSize.width = 8;
8753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8754 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8755 m_errorMonitor->VerifyFound();
8756 fragmentSize.width = 1;
8757
8758 fragmentSize.height = 8;
8759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8760 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8761 m_errorMonitor->VerifyFound();
8762 fragmentSize.height = 1;
8763 m_commandBuffer->end();
8764}
8765
8766TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8767 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8768
8769 // Enable KHR_fragment_shading_rate and all of its required extensions
8770 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8771 if (fsr_extensions) {
8772 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8773 }
8774 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8775
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008776 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8777 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008778 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8779 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8780 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8781 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008782 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8783 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008784 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8785 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8786 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8787 } else {
8788 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8789 return;
8790 }
8791
8792 ASSERT_NO_FATAL_FAILURE(InitState());
8793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8794
8795 // Find address of extension call and make the call
8796 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8797 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8798 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8799
8800 VkExtent2D fragmentSize = {1, 1};
8801 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8802 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8803
8804 m_commandBuffer->begin();
8805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8806 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8807 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8808 m_errorMonitor->VerifyFound();
8809 m_commandBuffer->end();
8810}
8811
8812TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8813 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8814
8815 // Enable KHR_fragment_shading_rate and all of its required extensions
8816 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8817 if (fsr_extensions) {
8818 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8819 }
8820 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8821
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008822 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8823 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008824 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8825 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8826 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8827 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008828 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8829 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008830 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8831 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8832 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8833 } else {
8834 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8835 return;
8836 }
8837
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008838 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8839 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008840
8841 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8842 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8843 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8844
8845 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8847
8848 // Find address of extension call and make the call
8849 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8850 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8851 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8852
8853 VkExtent2D fragmentSize = {1, 1};
8854 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8855 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8856
8857 m_commandBuffer->begin();
8858
8859 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8861 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8862 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8863 m_errorMonitor->VerifyFound();
8864 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8865
8866 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8868 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8869 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8870 m_errorMonitor->VerifyFound();
8871 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8872
8873 m_commandBuffer->end();
8874}
8875
8876TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8877 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8878
8879 // Enable KHR_fragment_shading_rate and all of its required extensions
8880 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8881 if (fsr_extensions) {
8882 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8883 }
8884 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8885
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008886 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8887 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008888 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8889 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8890 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8891 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008892 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8893 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008894 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8895 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8896 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8897 } else {
8898 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8899 return;
8900 }
8901
8902 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8903 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8904 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008905 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8906 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008907 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8908
8909 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8910 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8911 return;
8912 }
8913
8914 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8915
8916 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8918
8919 // Find address of extension call and make the call
8920 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8921 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8922 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8923
8924 VkExtent2D fragmentSize = {1, 1};
8925 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8926 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8927
8928 m_commandBuffer->begin();
8929 fragmentSize.width = 2;
8930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8931 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8932 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8933 m_errorMonitor->VerifyFound();
8934 fragmentSize.width = 1;
8935
8936 fragmentSize.height = 2;
8937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8938 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8939 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8940 m_errorMonitor->VerifyFound();
8941 fragmentSize.height = 1;
8942}
8943
8944TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8945 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8946
8947 // Enable KHR_fragment_shading_rate and all of its required extensions
8948 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8949 if (fsr_extensions) {
8950 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8951 }
8952 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8953
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008954 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8955 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008956 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8957 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8958 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8959 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07008960 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
8961 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008962 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8963 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8964 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8965 } else {
8966 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8967 return;
8968 }
8969
8970 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8971 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8972 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8973 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008974 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8975 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008976 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8977
8978 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8979 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8980 return;
8981 }
8982
8983 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8984 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8985 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008986 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8987 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008988 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8989
8990 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8991 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8992 return;
8993 }
8994
8995 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8997
8998 // Find address of extension call and make the call
8999 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
9000 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
9001 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
9002
9003 VkExtent2D fragmentSize = {1, 1};
9004 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
9005 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
9006
9007 m_commandBuffer->begin();
9008 if (fsr_features.primitiveFragmentShadingRate) {
9009 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
9010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9011 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
9012 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
9013 m_errorMonitor->VerifyFound();
9014 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
9015 }
9016
9017 if (fsr_features.attachmentFragmentShadingRate) {
9018 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
9019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9020 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
9021 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
9022 m_errorMonitor->VerifyFound();
9023 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
9024 }
9025 m_commandBuffer->end();
9026}
9027
9028TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
9029 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
9030
9031 // Enable KHR_fragment_shading_rate and all of its required extensions
9032 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9033 if (fsr_extensions) {
9034 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9035 }
9036 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9037
Mike Schuchardt7cc57842021-09-15 10:49:59 -07009038 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
9039 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009040 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9041 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
9042 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
9043 if (fsr_extensions) {
Mike Schuchardt7cc57842021-09-15 10:49:59 -07009044 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
9045 m_device_extension_names.push_back(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009046 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9047 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
9048 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
9049 } else {
9050 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
9051 return;
9052 }
9053
9054 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
9055 if (eds_extension) {
9056 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
9057 } else {
9058 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
9059 return;
9060 }
9061
9062 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
9063 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
9064 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
9065 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009066 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
9067 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009068 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
9069
9070 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
9071 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
9072 return;
9073 }
9074
9075 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
9076 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
9077 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009078 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00009079 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009080 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
9081 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009082 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
9083
9084 if (!fsr_features.primitiveFragmentShadingRate) {
9085 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
9086 return;
9087 }
9088
9089 if (!features2.features.multiViewport) {
9090 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
9091 return;
9092 }
9093
9094 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9096
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07009097 char const *vsSource = R"glsl(
9098 #version 450
9099 #extension GL_EXT_fragment_shading_rate : enable
9100 void main() {
9101 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
9102 }
9103 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00009104
sfricke-samsungae54c1e2022-01-21 05:35:21 -08009105 VkShaderObj fs(this, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009106
9107 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07009108 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
9109 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009110 pipe.AddShader(&fs);
9111 pipe.AddDefaultColorAttachment();
9112 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00009113 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07009114 {
sfricke-samsungae54c1e2022-01-21 05:35:21 -08009115 VkShaderObj vs(this, vsSource, VK_SHADER_STAGE_VERTEX_BIT);
Tony-LunarG6ee10062021-02-03 13:56:52 -07009116 pipe.AddShader(&vs);
9117 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
9118 ASSERT_VK_SUCCESS(err);
9119 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00009120 m_commandBuffer->begin();
9121 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9122
9123 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
9124
9125 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
9126 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
9127 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
9128 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
9129
9130 // error produced here.
9131 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9132
9133 m_errorMonitor->VerifyFound();
9134
9135 m_commandBuffer->EndRenderPass();
9136 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009137}
ziga-lunargdada63d2021-07-13 22:10:11 +02009138
9139TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
9140 TEST_DESCRIPTION("Update buffer with invalid dataSize");
9141
9142 ASSERT_NO_FATAL_FAILURE(Init());
9143
9144 uint32_t update_data[4] = {0, 0, 0, 0};
9145 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9146 VkMemoryPropertyFlags reqs = 0;
9147 VkBufferObj buffer;
9148 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9149
9150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
9151 m_commandBuffer->begin();
9152 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
9153 m_commandBuffer->end();
9154 m_errorMonitor->VerifyFound();
9155}
ziga-lunargc08456d2021-07-16 21:40:13 +02009156
9157TEST_F(VkLayerTest, InvalidCmdUpdateBufferDstOffset) {
9158 TEST_DESCRIPTION("Update buffer with invalid dst offset");
9159
9160 ASSERT_NO_FATAL_FAILURE(Init());
9161
9162 uint32_t update_data[4] = {0, 0, 0, 0};
9163 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9164 VkMemoryPropertyFlags reqs = 0;
9165 VkBufferObj buffer;
9166 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9167
9168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dstOffset-00032");
9169 m_commandBuffer->begin();
9170 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t) * 8, dataSize, (void *)update_data);
9171 m_commandBuffer->end();
9172 m_errorMonitor->VerifyFound();
9173}
ziga-lunarg4e31a752021-07-22 14:35:03 +02009174
9175TEST_F(VkLayerTest, InvalidDescriptorSetPipelineBindPoint) {
9176 TEST_DESCRIPTION(
9177 "Attempt to bind descriptor set to a bind point not supported by command pool the command buffer was allocated from");
9178
9179 ASSERT_NO_FATAL_FAILURE(Init());
9180
9181 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
9182 const uint32_t INVALID_QUEUE = std::numeric_limits<uint32_t>::max();
9183 if (INVALID_QUEUE == no_gfx_qfi) {
9184 printf("%s No compute and transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
9185 return;
9186 }
9187
9188 VkCommandPoolObj command_pool(m_device, no_gfx_qfi);
9189 ASSERT_TRUE(command_pool.initialized());
9190 VkCommandBufferObj command_buffer(m_device, &command_pool);
9191
9192 VkDescriptorPoolSize ds_type_count = {};
9193 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9194 ds_type_count.descriptorCount = 1;
9195
9196 VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
9197 ds_pool_ci.maxSets = 1;
9198 ds_pool_ci.poolSizeCount = 1;
9199 ds_pool_ci.flags = 0;
9200 ds_pool_ci.pPoolSizes = &ds_type_count;
9201
9202 VkDescriptorPool ds_pool;
9203 vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, nullptr, &ds_pool);
9204
9205 VkDescriptorSetLayoutBinding dsl_binding = {};
9206 dsl_binding.binding = 0;
9207 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9208 dsl_binding.descriptorCount = 1;
9209 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9210 dsl_binding.pImmutableSamplers = nullptr;
9211
9212 const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding});
9213
9214 VkDescriptorSet descriptorSet;
9215 VkDescriptorSetAllocateInfo alloc_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
9216 alloc_info.descriptorSetCount = 1;
9217 alloc_info.descriptorPool = ds_pool;
9218 alloc_info.pSetLayouts = &ds_layout.handle();
9219 vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
9220
9221 const VkDescriptorSetLayoutObj descriptor_set_layout(m_device, {dsl_binding});
9222 const VkPipelineLayoutObj pipeline_layout(DeviceObj(), {&descriptor_set_layout});
9223
9224 command_buffer.begin();
9225 // Set invalid set
9226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361");
9227 vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
9228 &descriptorSet, 0, nullptr);
9229 m_errorMonitor->VerifyFound();
9230 command_buffer.end();
9231}
ziga-lunarg4d86a252021-07-23 00:31:07 +02009232
9233TEST_F(VkLayerTest, CommandBufferMissingOcclusionQueryEnabled) {
9234 TEST_DESCRIPTION(
9235 "Test executing secondary command buffer without VkCommandBufferInheritanceInfo::occlusionQueryEnable enabled while "
9236 "occlusion query is active.");
9237 ASSERT_NO_FATAL_FAILURE(Init());
9238 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9239
9240 VkQueryPoolCreateInfo qpci = LvlInitStruct<VkQueryPoolCreateInfo>();
9241 qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
9242 qpci.queryCount = 1;
9243
9244 VkQueryPool query_pool;
9245 vk::CreateQueryPool(device(), &qpci, nullptr, &query_pool);
9246
9247 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9248
9249 VkCommandBufferInheritanceInfo cbii = LvlInitStruct<VkCommandBufferInheritanceInfo>();
9250 cbii.renderPass = m_renderPass;
9251 cbii.framebuffer = m_framebuffer;
9252 cbii.occlusionQueryEnable = VK_FALSE; // Invalid
9253
9254 VkCommandBufferBeginInfo cbbi = LvlInitStruct<VkCommandBufferBeginInfo>();
9255 cbbi.pInheritanceInfo = &cbii;
9256
9257 VkCommandBuffer secondary_handle = secondary.handle();
9258 vk::BeginCommandBuffer(secondary_handle, &cbbi);
9259 vk::EndCommandBuffer(secondary_handle);
9260
9261 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-commandBuffer-00102");
9262 m_commandBuffer->begin();
9263 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
9264 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_handle);
9265 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
9266 m_commandBuffer->end();
9267 m_errorMonitor->VerifyFound();
9268
9269 vk::DestroyQueryPool(device(), query_pool, nullptr);
9270}
Nathaniel Cesario46465d32021-08-03 13:52:01 -06009271
9272TEST_F(VkLayerTest, CmdClearColorImageNullColor) {
9273 TEST_DESCRIPTION("Test invalid null entries for clear color");
9274
9275 ASSERT_NO_FATAL_FAILURE(InitFramework());
9276 ASSERT_NO_FATAL_FAILURE(InitState());
9277
9278 VkImageObj image(m_device);
9279 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9280
9281 VkImageSubresourceRange isr = {};
9282 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9283 isr.baseArrayLayer = 0;
9284 isr.baseMipLevel = 0;
9285 isr.layerCount = 1;
9286 isr.levelCount = 1;
9287
9288 m_commandBuffer->begin();
9289 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pColor-04961");
9290 vk::CmdClearColorImage(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, nullptr, 1, &isr);
9291 m_errorMonitor->VerifyFound();
9292 m_commandBuffer->end();
9293}
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009294
9295TEST_F(VkLayerTest, InvalidClearColorAttachmentsWithMultiview) {
9296 TEST_DESCRIPTION("Test cmdClearAttachments with active render pass that uses multiview");
9297
9298 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9299 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9300 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9301 return;
9302 }
9303 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9304 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9305 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9306 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9307 return;
9308 }
9309 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9310 ASSERT_NO_FATAL_FAILURE(InitState());
9311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9312
9313 VkAttachmentDescription attachmentDescription = {};
9314 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9315 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9316 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9317
9318 VkAttachmentReference colorAttachmentReference = {};
9319 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9320 colorAttachmentReference.attachment = 0;
9321
9322 VkSubpassDescription subpassDescription = {};
9323 subpassDescription.colorAttachmentCount = 1;
9324 subpassDescription.pColorAttachments = &colorAttachmentReference;
9325
9326 uint32_t viewMask = 0x1u;
9327 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9328 renderPassMultiviewCreateInfo.subpassCount = 1;
9329 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9330
9331 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9332 renderPassCreateInfo.attachmentCount = 1;
9333 renderPassCreateInfo.pAttachments = &attachmentDescription;
9334 renderPassCreateInfo.subpassCount = 1;
9335 renderPassCreateInfo.pSubpasses = &subpassDescription;
9336
9337 VkRenderPass renderPass;
9338 vk::CreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
9339
9340 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9341 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9342 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9343 image_create_info.extent.width = 32;
9344 image_create_info.extent.height = 32;
9345 image_create_info.extent.depth = 1;
9346 image_create_info.mipLevels = 1;
9347 image_create_info.arrayLayers = 4;
9348 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9349 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9350 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9351 image_create_info.flags = 0;
9352
9353 VkImageObj image(m_device);
9354 image.Init(image_create_info);
aitor-lunarg4c6d9b22022-01-25 20:24:57 +01009355 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
9356 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
ziga-lunargad4f0fe2021-08-05 17:01:07 +02009357
9358 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9359 framebufferCreateInfo.width = 32;
9360 framebufferCreateInfo.height = 32;
9361 framebufferCreateInfo.layers = 1;
9362 framebufferCreateInfo.renderPass = renderPass;
9363 framebufferCreateInfo.attachmentCount = 1;
9364 framebufferCreateInfo.pAttachments = &imageView;
9365
9366 VkFramebuffer framebuffer = VK_NULL_HANDLE;
9367 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
9368
9369 // Start no RenderPass
9370 m_commandBuffer->begin();
9371
9372 VkClearAttachment color_attachment;
9373 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9374 color_attachment.clearValue.color.float32[0] = 0;
9375 color_attachment.clearValue.color.float32[1] = 0;
9376 color_attachment.clearValue.color.float32[2] = 0;
9377 color_attachment.clearValue.color.float32[3] = 0;
9378 color_attachment.colorAttachment = 0;
9379
9380 VkClearRect clear_rect = {};
9381 clear_rect.rect.extent.width = 32;
9382 clear_rect.rect.extent.height = 32;
9383
9384 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9385 render_pass_begin_info.renderPass = renderPass;
9386 render_pass_begin_info.framebuffer = framebuffer;
9387 render_pass_begin_info.renderArea.extent.width = 32;
9388 render_pass_begin_info.renderArea.extent.height = 32;
9389
9390 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
9391 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9392 clear_rect.layerCount = 2;
9393 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9394 m_errorMonitor->VerifyFound();
9395
9396 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-baseArrayLayer-00018");
9397 clear_rect.baseArrayLayer = 1;
9398 clear_rect.layerCount = 1;
9399 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
9400 m_errorMonitor->VerifyFound();
9401}
ziga-lunargdaff74b2021-08-14 23:16:25 +02009402
9403TEST_F(VkLayerTest, TestEndCommandBufferWithConditionalRendering) {
9404 TEST_DESCRIPTION("Call EndCommandBuffer when conditional rendering is active");
9405
9406 ASSERT_NO_FATAL_FAILURE(InitFramework());
9407 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9408 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9409 } else {
9410 printf("%s %s not supported, skipping test\n", kSkipPrefix, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9411 return;
9412 }
9413 ASSERT_NO_FATAL_FAILURE(InitState());
9414
9415 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9416 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetInstanceProcAddr(instance(), "vkCmdBeginConditionalRenderingEXT");
9417
9418 VkBufferObj buffer;
9419 VkMemoryPropertyFlags reqs = 0;
9420 buffer.init_as_storage(*m_device, 32, reqs);
9421
9422 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9423 conditional_rendering_begin.buffer = buffer.handle();
9424
9425 VkCommandBufferBeginInfo command_buffer_begin = LvlInitStruct<VkCommandBufferBeginInfo>();
9426
9427 vk::BeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin);
9428 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-None-01978");
9430 vk::EndCommandBuffer(m_commandBuffer->handle());
9431 m_errorMonitor->VerifyFound();
9432}
ziga-lunarg1b7bd572021-08-21 21:49:26 +02009433
9434TEST_F(VkLayerTest, BindPipelineDuringTransformFeedback) {
9435 TEST_DESCRIPTION("Call CmdBindPipeline when transform feedback is active");
9436
9437 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9438 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9439 } else {
9440 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9441 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9442 return;
9443 }
9444 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9445
9446 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9447 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9448 } else {
9449 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
9450 return;
9451 }
9452
9453 ASSERT_NO_FATAL_FAILURE(InitState());
9454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9455
9456 CreatePipelineHelper pipe_one(*this);
9457 pipe_one.InitInfo();
9458 pipe_one.InitState();
9459 pipe_one.CreateGraphicsPipeline();
9460
9461 CreatePipelineHelper pipe_two(*this);
9462 pipe_two.InitInfo();
9463 pipe_two.InitState();
9464 pipe_two.CreateGraphicsPipeline();
9465
9466 auto vkCmdBeginTransformFeedbackEXT =
9467 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9468 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9469 auto vkCmdEndTransformFeedbackEXT =
9470 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
9471 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
9472
9473 m_commandBuffer->begin();
9474 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_one.pipeline_);
9475 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9476 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-None-02323");
9477 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_two.pipeline_);
9478 m_errorMonitor->VerifyFound();
9479 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9480 m_commandBuffer->end();
ziga-lunargdeeb8252021-08-30 16:48:46 +02009481}
9482
9483TEST_F(VkLayerTest, DrawBlendEnabledFormatFeatures) {
9484 TEST_DESCRIPTION("Test pipeline blend enabled with missing image views format features");
9485
9486 ASSERT_NO_FATAL_FAILURE(Init());
9487
9488 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
9489 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
9490
9491 // Load required functions
9492 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
9493 printf("%s Failed to device profile layer.\n", kSkipPrefix);
9494 return;
9495 }
9496
9497 VkFormat render_format = VkTestFramework::GetFormat(instance_, m_device);
9498
9499 // Set format features from being found
9500 VkFormatProperties formatProps;
9501 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, &formatProps);
9502 if ((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
9503 printf("%s Required linear tiling features not supported.\n", kSkipPrefix);
9504 return;
9505 }
9506 // Gets pass pipeline creation but not the actual tiling used
9507 formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9508 // will be caught at draw time that feature for optimal image is not set
9509 // InitRenderTarget() should be setting color attachment as VK_IMAGE_TILING_LINEAR
9510 formatProps.linearTilingFeatures &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
9511 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), render_format, formatProps);
9512
9513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9514
9515 CreatePipelineHelper pipe(*this);
9516 pipe.InitInfo();
9517 pipe.InitState();
aitor-lunargf15acd52022-03-09 22:13:25 +01009518 pipe.cb_attachments_[0].blendEnable = VK_TRUE;
ziga-lunargdeeb8252021-08-30 16:48:46 +02009519 pipe.CreateGraphicsPipeline();
9520
9521 m_commandBuffer->begin();
9522 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
9523 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9524
9525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-blendEnable-04727");
9526 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9527 m_errorMonitor->VerifyFound();
9528
9529 m_commandBuffer->EndRenderPass();
9530 m_commandBuffer->end();
9531}
ziga-lunarg88c0e392021-09-03 19:14:13 +02009532
9533TEST_F(VkLayerTest, InvalidEndConditionalRendering) {
9534 TEST_DESCRIPTION("Invalid calls to vkCmdEndConditionalRenderingEXT.");
9535
9536 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9537 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
9538 printf("%s Did not find required device extension %s; test skipped.\n", kSkipPrefix, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
9539 return;
9540 }
9541 m_device_extension_names.push_back(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME);
9542 ASSERT_NO_FATAL_FAILURE(InitState());
9543
9544 VkAttachmentDescription attach[] = {
9545 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9546 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9547 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9548 };
9549 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9550 VkSubpassDescription subpasses[] = {
9551 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9552 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9553 };
9554
9555 VkSubpassDependency dep = {0,
9556 1,
9557 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9558 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
9559 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9560 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
9561 VK_DEPENDENCY_BY_REGION_BIT};
9562
9563 VkRenderPassCreateInfo rpci = LvlInitStruct<VkRenderPassCreateInfo>();
9564 rpci.attachmentCount = 1;
9565 rpci.pAttachments = attach;
9566 rpci.subpassCount = 2;
9567 rpci.pSubpasses = subpasses;
9568 rpci.dependencyCount = 1;
9569 rpci.pDependencies = &dep;
9570
9571 vk_testing::RenderPass render_pass;
9572 render_pass.init(*m_device, rpci);
9573
9574 VkImageObj image(m_device);
9575 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9576 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9577
9578 VkFramebufferCreateInfo fbci = LvlInitStruct<VkFramebufferCreateInfo>();
9579 fbci.renderPass = render_pass.handle();
9580 fbci.attachmentCount = 1;
9581 fbci.pAttachments = &imageView;
9582 fbci.width = 32;
9583 fbci.height = 32;
9584 fbci.layers = 1;
9585 VkFramebuffer framebuffer;
9586 vk::CreateFramebuffer(device(), &fbci, nullptr, &framebuffer);
9587
9588 PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT =
9589 (PFN_vkCmdBeginConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBeginConditionalRenderingEXT");
9590 PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT =
9591 (PFN_vkCmdEndConditionalRenderingEXT)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdEndConditionalRenderingEXT");
9592
9593 VkBufferCreateInfo buffer_create_info = LvlInitStruct<VkBufferCreateInfo>();
9594 buffer_create_info.size = 32;
9595 buffer_create_info.usage = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT;
9596 VkBufferObj buffer;
9597 buffer.init(*m_device, buffer_create_info);
9598
9599 VkConditionalRenderingBeginInfoEXT conditional_rendering_begin = LvlInitStruct<VkConditionalRenderingBeginInfoEXT>();
9600 conditional_rendering_begin.buffer = buffer.handle();
9601
9602 VkClearValue clear_value;
9603 clear_value.color = m_clear_color;
9604
9605 VkRenderPassBeginInfo rpbi = LvlInitStruct<VkRenderPassBeginInfo>();
9606 rpbi.renderPass = render_pass.handle();
9607 rpbi.framebuffer = framebuffer;
9608 rpbi.renderArea = {{0, 0}, {32, 32}};
9609 rpbi.clearValueCount = 1;
9610 rpbi.pClearValues = &clear_value;
9611
9612 m_commandBuffer->begin();
9613
9614 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01985");
9615 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9616 m_errorMonitor->VerifyFound();
9617
9618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01986");
9619 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9620 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9621 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9622 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9623 vk::CmdEndRenderPass(m_commandBuffer->handle());
9624 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9625 m_errorMonitor->VerifyFound();
9626
9627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndConditionalRenderingEXT-None-01987");
9628 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9629 vkCmdBeginConditionalRenderingEXT(m_commandBuffer->handle(), &conditional_rendering_begin);
9630 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
9631 vkCmdEndConditionalRenderingEXT(m_commandBuffer->handle());
9632 vk::CmdEndRenderPass(m_commandBuffer->handle());
9633 m_errorMonitor->VerifyFound();
9634
9635 m_commandBuffer->end();
9636}
ziga-lunarg58255142021-09-12 13:25:17 +02009637
9638TEST_F(VkLayerTest, InvalidBeginTransformFeedbackInMultiviewRenderPass) {
9639 TEST_DESCRIPTION("Test beginning transform feedback in a render pass with multiview enabled");
9640
9641 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
9642 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
9643 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9644 return;
9645 }
9646 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
9647
9648 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9649 if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
9650 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
9651 return;
9652 }
9653 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
9654 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9655 return;
9656 }
9657 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
9658 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
9659
9660 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
9661 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
9662
9663 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
9664 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
9665 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
9666 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
9667
9668 if (!tf_features.transformFeedback) {
9669 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
9670 return;
9671 }
9672
9673 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
9674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9675
9676 VkAttachmentDescription attachmentDescription = {};
9677 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
9678 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
9679 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
9680
9681 VkAttachmentReference colorAttachmentReference = {};
9682 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
9683 colorAttachmentReference.attachment = 0;
9684
9685 VkSubpassDescription subpassDescription = {};
9686 subpassDescription.colorAttachmentCount = 1;
9687 subpassDescription.pColorAttachments = &colorAttachmentReference;
9688
9689 uint32_t viewMask = 0x1u;
9690 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
9691 renderPassMultiviewCreateInfo.subpassCount = 1;
9692 renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
9693
9694 VkRenderPassCreateInfo renderPassCreateInfo = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
9695 renderPassCreateInfo.attachmentCount = 1;
9696 renderPassCreateInfo.pAttachments = &attachmentDescription;
9697 renderPassCreateInfo.subpassCount = 1;
9698 renderPassCreateInfo.pSubpasses = &subpassDescription;
9699
9700 vk_testing::RenderPass render_pass;
9701 render_pass.init(*m_device, renderPassCreateInfo);
9702
9703 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
9704 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9705 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
9706 image_create_info.extent.width = 32;
9707 image_create_info.extent.height = 32;
9708 image_create_info.extent.depth = 1;
9709 image_create_info.mipLevels = 1;
9710 image_create_info.arrayLayers = 4;
9711 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9712 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9713 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
9714 image_create_info.flags = 0;
9715
9716 VkImageObj image(m_device);
9717 image.Init(image_create_info);
9718 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9719
9720 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
9721 framebufferCreateInfo.width = 32;
9722 framebufferCreateInfo.height = 32;
9723 framebufferCreateInfo.layers = 1;
9724 framebufferCreateInfo.renderPass = render_pass.handle();
9725 framebufferCreateInfo.attachmentCount = 1;
9726 framebufferCreateInfo.pAttachments = &imageView;
9727
9728 vk_testing::Framebuffer framebuffer;
9729 framebuffer.init(*m_device, framebufferCreateInfo);
9730
9731 VkRenderPassBeginInfo render_pass_begin_info = LvlInitStruct<VkRenderPassBeginInfo>();
9732 render_pass_begin_info.renderPass = render_pass.handle();
9733 render_pass_begin_info.framebuffer = framebuffer.handle();
9734 render_pass_begin_info.renderArea.extent.width = 32;
9735 render_pass_begin_info.renderArea.extent.height = 32;
9736
9737 auto vkCmdBeginTransformFeedbackEXT =
9738 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
9739 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
9740
9741 m_commandBuffer->begin();
9742 m_commandBuffer->BeginRenderPass(render_pass_begin_info);
9743
9744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02373");
9745 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
9746 m_errorMonitor->VerifyFound();
9747
9748 m_commandBuffer->EndRenderPass();
9749 m_commandBuffer->end();
9750}
stusmithd2f36832021-11-26 11:44:11 +00009751
9752TEST_F(VkLayerTest, BeginRenderingWithSecondaryContents) {
9753 TEST_DESCRIPTION("Test that an error is produced when a secondary command buffer calls BeginRendering with secondary contents");
9754
9755 SetTargetApiVersion(VK_API_VERSION_1_1);
9756
stusmithab8e2a22021-12-17 11:20:03 +00009757 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9758
stusmithd2f36832021-11-26 11:44:11 +00009759 ASSERT_NO_FATAL_FAILURE(InitFramework());
9760
sjfricked700bc02022-05-30 16:35:06 +09009761 if (!AreRequiredExtensionsEnabled()) {
9762 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +00009763 }
9764
9765 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009766 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +00009767 }
9768
9769 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9770 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9771 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9772 if (!dynamic_rendering_features.dynamicRendering) {
9773 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9774 return;
9775 }
9776
9777 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9778
sfricke-samsung1c61f192021-12-31 01:53:03 -06009779 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009780 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9781
sfricke-samsung1c61f192021-12-31 01:53:03 -06009782 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009783 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
ziga-lunargaa97cbb2022-03-18 19:06:35 +01009784 begin_rendering_info.layerCount = 1;
stusmithd2f36832021-11-26 11:44:11 +00009785 begin_rendering_info.colorAttachmentCount = 1;
9786 begin_rendering_info.pColorAttachments = &color_attachment;
9787
9788 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9789
9790 secondary.begin();
9791
Tony-LunarGbbd2ab92021-12-02 08:31:24 -07009792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginRendering-commandBuffer-06068");
stusmithd2f36832021-11-26 11:44:11 +00009793 secondary.BeginRendering(begin_rendering_info);
9794 m_errorMonitor->VerifyFound();
9795
9796 secondary.end();
9797}
9798
9799TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRenderPass) {
9800 TEST_DESCRIPTION(
9801 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRenderPass that hasn't set "
9802 "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS");
9803
9804 ASSERT_NO_FATAL_FAILURE(Init());
9805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9806
9807 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9808
9809 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9810 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9811 nullptr, // pNext
9812 m_renderPass,
9813 0, // subpass
9814 m_framebuffer,
9815 };
9816
9817 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9818 nullptr, // pNext
9819 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9820 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9821 secondary.begin(&cmdbuff__bi);
9822 secondary.end();
9823
9824 m_commandBuffer->begin();
9825
9826 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9827 nullptr, // pNext
9828 m_renderPass,
9829 m_framebuffer,
9830 {{0, 0}, {32, 32}},
9831 static_cast<uint32_t>(m_renderPassClearValues.size()),
9832 m_renderPassClearValues.data()};
9833
9834 m_commandBuffer->BeginRenderPass(rp_bi);
9835
9836 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-06018");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-contents-00095");
stusmithd2f36832021-11-26 11:44:11 +00009838 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9839 m_errorMonitor->VerifyFound();
9840
9841 m_commandBuffer->EndRenderPass();
9842 m_commandBuffer->end();
9843}
9844
9845TEST_F(VkLayerTest, BadRenderPassContentsWhenCallingCmdExecuteCommandsWithBeginRendering) {
9846 TEST_DESCRIPTION(
9847 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
9848 "VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR");
9849
9850 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -06009851
stusmithab8e2a22021-12-17 11:20:03 +00009852 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
9853
stusmithd2f36832021-11-26 11:44:11 +00009854 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +00009855
sjfricked700bc02022-05-30 16:35:06 +09009856 if (!AreRequiredExtensionsEnabled()) {
9857 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +00009858 }
stusmithab8e2a22021-12-17 11:20:03 +00009859
9860 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +09009861 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +00009862 }
9863
stusmithd2f36832021-11-26 11:44:11 +00009864 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
9865 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
9866 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
9867 if (!dynamic_rendering_features.dynamicRendering) {
9868 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
9869 return;
9870 }
sfricke-samsung1c61f192021-12-31 01:53:03 -06009871
stusmithd2f36832021-11-26 11:44:11 +00009872 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
9873
9874 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -06009875
9876 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009877 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9878
sfricke-samsung1c61f192021-12-31 01:53:03 -06009879 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
9880 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009881 inheritance_rendering_info.colorAttachmentCount = 1;
9882 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +00009883 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +00009884
sfricke-samsung1c61f192021-12-31 01:53:03 -06009885 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +00009886 begin_rendering_info.colorAttachmentCount = 1;
9887 begin_rendering_info.pColorAttachments = &color_attachment;
9888
9889 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9890
9891 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9892 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9893 &inheritance_rendering_info, // pNext
9894 VK_NULL_HANDLE,
9895 0, // subpass
9896 VK_NULL_HANDLE,
9897 };
9898
9899 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9900 nullptr, // pNext
9901 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9902 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9903 secondary.begin(&cmdbuff__bi);
9904 secondary.end();
9905
9906 m_commandBuffer->begin();
9907
9908 m_commandBuffer->BeginRendering(begin_rendering_info);
9909
9910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06024");
9911 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9912 m_errorMonitor->VerifyFound();
9913
9914 m_commandBuffer->EndRendering();
9915 m_commandBuffer->end();
9916}
9917
9918TEST_F(VkLayerTest, BadExecuteCommandsSubpassIndices) {
9919 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9920
9921 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9922 ASSERT_NO_FATAL_FAILURE(InitState());
9923
9924 // A renderpass with two subpasses, both writing the same attachment.
9925 VkAttachmentDescription attach[] = {
9926 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9927 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
9928 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
9929 };
9930 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
9931 VkSubpassDescription subpasses[] = {
9932 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9933 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
9934 };
9935
9936 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
9937 VkRenderPass render_pass;
9938 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
9939 ASSERT_VK_SUCCESS(err);
9940
9941 VkImageObj image(m_device);
9942 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9943 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
9944
9945 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 1, &imageView, 32, 32, 1};
9946 VkFramebuffer framebuffer;
9947 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
9948 ASSERT_VK_SUCCESS(err);
9949
9950 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
9951
9952 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
9953 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
9954 nullptr, // pNext
9955 render_pass,
9956 1, // subpass
9957 framebuffer,
9958 };
9959
9960 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
9961 nullptr, // pNext
9962 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
9963 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
9964 secondary.begin(&cmdbuff__bi);
9965 secondary.end();
9966
9967 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
9968 nullptr, // pNext
9969 render_pass,
9970 framebuffer,
9971 {{0, 0}, {32, 32}},
9972 0,
9973 nullptr};
9974
9975 m_commandBuffer->begin();
9976 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9977
9978 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-06019");
ziga-lunarga3cc8482022-04-29 14:58:29 +02009979 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00097");
stusmithd2f36832021-11-26 11:44:11 +00009980 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
9981 m_errorMonitor->VerifyFound();
9982
9983 m_commandBuffer->EndRenderPass();
9984 m_commandBuffer->end();
9985
9986 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
9987 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
9988}
9989
9990TEST_F(VkLayerTest, IncompatibleRenderPassesInExecuteCommands) {
9991 TEST_DESCRIPTION("Test invalid subpass when calling CmdExecuteCommands");
9992
9993 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
9994 ASSERT_NO_FATAL_FAILURE(InitState());
9995
9996 // A renderpass with two subpasses, both writing the same attachment.
9997 VkAttachmentDescription attach[] = {
9998 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
9999 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
10000 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
10001 };
10002 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
10003 VkSubpassDescription subpasses[] = {
10004 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
10005 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
10006 };
10007
10008 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 0, nullptr};
10009 VkRenderPass render_pass_1;
10010 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass_1);
10011 ASSERT_VK_SUCCESS(err);
10012
10013 VkRenderPassCreateInfo rpci_2 = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
10014 VkRenderPass render_pass_2;
10015 vk::CreateRenderPass(m_device->device(), &rpci_2, nullptr, &render_pass_2);
10016 ASSERT_VK_SUCCESS(err);
10017
10018 VkImageObj image(m_device);
10019 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10020 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10021
10022 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass_1, 1, &imageView, 32, 32, 1};
10023 VkFramebuffer framebuffer;
10024 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &framebuffer);
10025 ASSERT_VK_SUCCESS(err);
10026
10027 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10028
10029 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10030 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10031 nullptr, // pNext
10032 render_pass_2,
10033 0, // subpass
10034 VK_NULL_HANDLE,
10035 };
10036
10037 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10038 nullptr, // pNext
10039 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10040 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10041 secondary.begin(&cmdbuff__bi);
10042 secondary.end();
10043
10044 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
10045 nullptr, // pNext
10046 render_pass_1,
10047 framebuffer,
10048 {{0, 0}, {32, 32}},
10049 0,
10050 nullptr};
10051
10052 m_commandBuffer->begin();
10053 m_commandBuffer->BeginRenderPass(rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10054
10055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06020");
ziga-lunarga3cc8482022-04-29 14:58:29 +020010056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
stusmithd2f36832021-11-26 11:44:11 +000010057 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10058 m_errorMonitor->VerifyFound();
10059
10060 m_commandBuffer->EndRenderPass();
10061 m_commandBuffer->end();
10062
10063 vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
10064 vk::DestroyRenderPass(m_device->device(), render_pass_2, nullptr);
10065 vk::DestroyRenderPass(m_device->device(), render_pass_1, nullptr);
10066}
10067
10068TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithNonNullRenderPass) {
10069 TEST_DESCRIPTION(
10070 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that hasn't set "
10071 "renderPass to VK_NULL_HANDLE in pInheritanceInfo");
10072
10073 SetTargetApiVersion(VK_API_VERSION_1_1);
sfricke-samsung1c61f192021-12-31 01:53:03 -060010074
stusmithab8e2a22021-12-17 11:20:03 +000010075 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10076
stusmithd2f36832021-11-26 11:44:11 +000010077 ASSERT_NO_FATAL_FAILURE(InitFramework());
stusmithab8e2a22021-12-17 11:20:03 +000010078
sjfricked700bc02022-05-30 16:35:06 +090010079 if (!AreRequiredExtensionsEnabled()) {
10080 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithd2f36832021-11-26 11:44:11 +000010081 }
stusmithab8e2a22021-12-17 11:20:03 +000010082
10083 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010084 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithab8e2a22021-12-17 11:20:03 +000010085 }
10086
stusmithd2f36832021-11-26 11:44:11 +000010087 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10088 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10089 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10090 if (!dynamic_rendering_features.dynamicRendering) {
10091 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10092 return;
10093 }
sfricke-samsung1c61f192021-12-31 01:53:03 -060010094
stusmithd2f36832021-11-26 11:44:11 +000010095 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10096
10097 VkAttachmentDescription attach[] = {
10098 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
10099 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
10100 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
10101 };
10102 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
10103 VkSubpassDescription subpasses[] = {
10104 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
10105 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
10106 };
10107
10108 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 0, nullptr};
10109 VkRenderPass render_pass;
10110 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &render_pass);
10111 ASSERT_VK_SUCCESS(err);
10112
10113 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
sfricke-samsung1c61f192021-12-31 01:53:03 -060010114
10115 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010116 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10117
sfricke-samsung1c61f192021-12-31 01:53:03 -060010118 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10119 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010120 inheritance_rendering_info.colorAttachmentCount = 1;
10121 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010122 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010123
sfricke-samsung1c61f192021-12-31 01:53:03 -060010124 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010125 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10126 begin_rendering_info.colorAttachmentCount = 1;
10127 begin_rendering_info.pColorAttachments = &color_attachment;
10128
10129 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10130
10131 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10132 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10133 &inheritance_rendering_info, // pNext
10134 render_pass,
10135 0, // subpass
10136 VK_NULL_HANDLE,
10137 };
10138
10139 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10140 nullptr, // pNext
10141 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10142 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10143 secondary.begin(&cmdbuff__bi);
10144 secondary.end();
10145
10146 m_commandBuffer->begin();
10147
10148 m_commandBuffer->BeginRendering(begin_rendering_info);
10149
10150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pBeginInfo-06025");
10151 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10152 m_errorMonitor->VerifyFound();
10153
10154 m_commandBuffer->EndRendering();
10155 m_commandBuffer->end();
10156
10157 vk::DestroyRenderPass(m_device->device(), render_pass, nullptr);
10158}
10159
10160TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingFlags) {
10161 TEST_DESCRIPTION("Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching flags");
10162
10163 SetTargetApiVersion(VK_API_VERSION_1_1);
10164
stusmithab8e2a22021-12-17 11:20:03 +000010165 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10166
stusmithd2f36832021-11-26 11:44:11 +000010167 ASSERT_NO_FATAL_FAILURE(InitFramework());
10168
sjfricked700bc02022-05-30 16:35:06 +090010169 if (!AreRequiredExtensionsEnabled()) {
10170 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010171 }
10172
10173 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010174 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010175 }
10176
10177 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10178 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10179 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10180 if (!dynamic_rendering_features.dynamicRendering) {
10181 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10182 return;
10183 }
10184
10185 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10186
10187 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10188
sfricke-samsung1c61f192021-12-31 01:53:03 -060010189 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010190 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
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 = &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 =
10200 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR | VK_RENDERING_SUSPENDING_BIT_KHR | VK_RENDERING_RESUMING_BIT_KHR;
10201 begin_rendering_info.colorAttachmentCount = 1;
10202 begin_rendering_info.pColorAttachments = &color_attachment;
10203
10204 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10205
10206 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10207 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10208 &inheritance_rendering_info, // pNext
10209 VK_NULL_HANDLE,
10210 0, // subpass
10211 VK_NULL_HANDLE,
10212 };
10213
10214 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10215 nullptr, // pNext
10216 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10217 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10218 secondary.begin(&cmdbuff__bi);
10219 secondary.end();
10220
10221 m_commandBuffer->begin();
10222
10223 m_commandBuffer->BeginRendering(begin_rendering_info);
10224
10225 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-flags-06026");
10226 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10227 m_errorMonitor->VerifyFound();
10228
10229 m_commandBuffer->EndRendering();
10230 m_commandBuffer->end();
10231}
10232
10233TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorAttachmentCount) {
10234 TEST_DESCRIPTION(
10235 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching colorAttachmentCount");
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
sjfricked700bc02022-05-30 16:35:06 +090010243 if (!AreRequiredExtensionsEnabled()) {
10244 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010245 }
10246
10247 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010248 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010249 }
10250
10251 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10252 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10253 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10254 if (!dynamic_rendering_features.dynamicRendering) {
10255 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10256 return;
10257 }
10258
10259 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10260
10261 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10262
sfricke-samsung1c61f192021-12-31 01:53:03 -060010263 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010264 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10265
sfricke-samsung1c61f192021-12-31 01:53:03 -060010266 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10267 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010268 inheritance_rendering_info.colorAttachmentCount = 0;
10269 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010270 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010271
sfricke-samsung1c61f192021-12-31 01:53:03 -060010272 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010273 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10274 begin_rendering_info.colorAttachmentCount = 1;
10275 begin_rendering_info.pColorAttachments = &color_attachment;
10276
10277 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10278
10279 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10280 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10281 &inheritance_rendering_info, // pNext
10282 VK_NULL_HANDLE,
10283 0, // subpass
10284 VK_NULL_HANDLE,
10285 };
10286
10287 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10288 nullptr, // pNext
10289 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10290 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10291 secondary.begin(&cmdbuff__bi);
10292 secondary.end();
10293
10294 m_commandBuffer->begin();
10295
10296 m_commandBuffer->BeginRendering(begin_rendering_info);
10297
10298 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-colorAttachmentCount-06027");
10299 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10300 m_errorMonitor->VerifyFound();
10301
10302 m_commandBuffer->EndRendering();
10303 m_commandBuffer->end();
10304}
10305
10306TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingColorImageViewFormat) {
10307 TEST_DESCRIPTION(
10308 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching color image view format");
10309
10310 SetTargetApiVersion(VK_API_VERSION_1_1);
10311
stusmithab8e2a22021-12-17 11:20:03 +000010312 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10313
stusmithd2f36832021-11-26 11:44:11 +000010314 ASSERT_NO_FATAL_FAILURE(InitFramework());
10315
sjfricked700bc02022-05-30 16:35:06 +090010316 if (!AreRequiredExtensionsEnabled()) {
10317 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010318 }
10319
10320 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010321 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010322 }
10323
10324 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10325 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10326 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10327 if (!dynamic_rendering_features.dynamicRendering) {
10328 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10329 return;
10330 }
10331
10332 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10333
10334 VkImageObj image(m_device);
10335 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10336 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10337
sfricke-samsung1c61f192021-12-31 01:53:03 -060010338 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010339 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10340 color_attachment.imageView = imageView;
10341
10342 VkFormat bad_color_formats = {VK_FORMAT_R8G8B8A8_UINT};
10343
sfricke-samsung1c61f192021-12-31 01:53:03 -060010344 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10345 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010346 inheritance_rendering_info.colorAttachmentCount = 1;
10347 inheritance_rendering_info.pColorAttachmentFormats = &bad_color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010348 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010349
sfricke-samsung1c61f192021-12-31 01:53:03 -060010350 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010351 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10352 begin_rendering_info.colorAttachmentCount = 1;
10353 begin_rendering_info.pColorAttachments = &color_attachment;
10354
10355 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10356
10357 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10358 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10359 &inheritance_rendering_info, // pNext
10360 VK_NULL_HANDLE,
10361 0, // subpass
10362 VK_NULL_HANDLE,
10363 };
10364
10365 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10366 nullptr, // pNext
10367 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10368 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10369 secondary.begin(&cmdbuff__bi);
10370 secondary.end();
10371
10372 m_commandBuffer->begin();
10373
10374 m_commandBuffer->BeginRendering(begin_rendering_info);
10375
10376 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-imageView-06028");
10377 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10378 m_errorMonitor->VerifyFound();
10379
10380 m_commandBuffer->EndRendering();
10381 m_commandBuffer->end();
10382}
10383
10384TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingDepthStencilImageViewFormat) {
10385 TEST_DESCRIPTION(
10386 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching depth/stencil image view "
10387 "format");
10388
10389 SetTargetApiVersion(VK_API_VERSION_1_1);
10390
stusmithab8e2a22021-12-17 11:20:03 +000010391 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10392
stusmithd2f36832021-11-26 11:44:11 +000010393 ASSERT_NO_FATAL_FAILURE(InitFramework());
10394
sjfricked700bc02022-05-30 16:35:06 +090010395 if (!AreRequiredExtensionsEnabled()) {
10396 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010397 }
10398
10399 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010400 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010401 }
10402
10403 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10404 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10405 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10406 if (!dynamic_rendering_features.dynamicRendering) {
10407 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10408 return;
10409 }
10410
10411 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10412
10413 VkImageObj image(m_device);
10414 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10415 if (!depth_stencil_format) {
10416 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10417 return;
10418 }
10419 image.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10420 VkImageView imageView = image.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
10421
sfricke-samsung1c61f192021-12-31 01:53:03 -060010422 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010423 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
10424 depth_stencil_attachment.imageView = imageView;
10425
sfricke-samsung1c61f192021-12-31 01:53:03 -060010426 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10427 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010428 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT;
10429 inheritance_rendering_info.stencilAttachmentFormat = VK_FORMAT_S8_UINT;
stusmithcba0c502021-12-21 17:16:28 +000010430 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010431
sfricke-samsung1c61f192021-12-31 01:53:03 -060010432 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010433 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10434 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10435 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10436
10437 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10438
10439 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10440 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10441 &inheritance_rendering_info, // pNext
10442 VK_NULL_HANDLE,
10443 0, // subpass
10444 VK_NULL_HANDLE,
10445 };
10446
10447 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10448 nullptr, // pNext
10449 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10450 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10451 secondary.begin(&cmdbuff__bi);
10452 secondary.end();
10453
10454 m_commandBuffer->begin();
10455
10456 m_commandBuffer->BeginRendering(begin_rendering_info);
10457
10458 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pDepthAttachment-06029");
10459 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pStencilAttachment-06030");
10460 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10461 m_errorMonitor->VerifyFound();
10462
10463 m_commandBuffer->EndRendering();
10464 m_commandBuffer->end();
10465}
10466
10467TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingViewMask) {
10468 TEST_DESCRIPTION(
10469 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching viewMask format");
10470
10471 SetTargetApiVersion(VK_API_VERSION_1_1);
10472
stusmithab8e2a22021-12-17 11:20:03 +000010473 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10474
stusmithd2f36832021-11-26 11:44:11 +000010475 ASSERT_NO_FATAL_FAILURE(InitFramework());
10476
sjfricked700bc02022-05-30 16:35:06 +090010477 if (!AreRequiredExtensionsEnabled()) {
10478 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithab8e2a22021-12-17 11:20:03 +000010479 }
10480
10481 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010482 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithd2f36832021-11-26 11:44:11 +000010483 }
10484
10485 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10486 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10487 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10488 if (!dynamic_rendering_features.dynamicRendering) {
10489 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10490 return;
10491 }
10492
10493 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10494
sfricke-samsung1c61f192021-12-31 01:53:03 -060010495 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010496 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10497
10498 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10499
sfricke-samsung1c61f192021-12-31 01:53:03 -060010500 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10501 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010502 inheritance_rendering_info.viewMask = 0;
10503 inheritance_rendering_info.colorAttachmentCount = 1;
10504 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
stusmithcba0c502021-12-21 17:16:28 +000010505 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
stusmithd2f36832021-11-26 11:44:11 +000010506
sfricke-samsung1c61f192021-12-31 01:53:03 -060010507 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithd2f36832021-11-26 11:44:11 +000010508 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10509 begin_rendering_info.viewMask = 1;
10510 begin_rendering_info.colorAttachmentCount = 1;
10511 begin_rendering_info.pColorAttachments = &color_attachment;
10512
10513 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10514
10515 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10516 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10517 &inheritance_rendering_info, // pNext
10518 VK_NULL_HANDLE,
10519 0, // subpass
10520 VK_NULL_HANDLE,
10521 };
10522
10523 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10524 nullptr, // pNext
10525 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10526 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10527 secondary.begin(&cmdbuff__bi);
10528 secondary.end();
10529
10530 m_commandBuffer->begin();
10531
10532 m_commandBuffer->BeginRendering(begin_rendering_info);
10533
10534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-viewMask-06031");
10535 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10536 m_errorMonitor->VerifyFound();
10537
10538 m_commandBuffer->EndRendering();
10539 m_commandBuffer->end();
10540}
stusmithcba0c502021-12-21 17:16:28 +000010541
10542TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewRasterizationSamples) {
10543 TEST_DESCRIPTION(
10544 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching rasterization samples");
10545
10546 SetTargetApiVersion(VK_API_VERSION_1_1);
10547
10548 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10549
10550 ASSERT_NO_FATAL_FAILURE(InitFramework());
10551
sjfricked700bc02022-05-30 16:35:06 +090010552 if (!AreRequiredExtensionsEnabled()) {
10553 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010554 }
10555
10556 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010557 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010558 }
10559
10560 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10561 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10562 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10563 if (!dynamic_rendering_features.dynamicRendering) {
10564 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", 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
sfricke-samsung1c61f192021-12-31 01:53:03 -060010580 VkCommandBufferInheritanceRenderingInfoKHR inheritance_rendering_info =
10581 LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010582 inheritance_rendering_info.colorAttachmentCount = 1;
10583 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10584 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
10585
sfricke-samsung1c61f192021-12-31 01:53:03 -060010586 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010587 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10588 begin_rendering_info.colorAttachmentCount = 1;
10589 begin_rendering_info.pColorAttachments = &color_attachment;
10590
10591 // A pool we can reset in.
10592 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10593 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10594
10595 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10596 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10597 &inheritance_rendering_info, // pNext
10598 VK_NULL_HANDLE,
10599 0, // subpass
10600 VK_NULL_HANDLE,
10601 };
10602
10603 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10604 nullptr, // pNext
10605 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10606 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10607 secondary.begin(&cmdbuff__bi);
10608 secondary.end();
10609
10610 m_commandBuffer->begin();
10611
10612 // color samples mismatch
10613 m_commandBuffer->BeginRendering(begin_rendering_info);
10614 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06035");
10615 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10616 m_errorMonitor->VerifyFound();
10617 m_commandBuffer->EndRendering();
10618
10619 VkImageObj depthStencilImage(m_device);
10620 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10621 if (!depth_stencil_format) {
10622 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10623 return;
10624 }
10625 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10626 0);
10627 VkImageView depthStencilImageView =
10628 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10629
sfricke-samsung1c61f192021-12-31 01:53:03 -060010630 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010631 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10632 depth_stencil_attachment.imageView = depthStencilImageView;
10633
10634 begin_rendering_info.colorAttachmentCount = 0;
10635 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10636 inheritance_rendering_info.colorAttachmentCount = 0;
10637 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10638
10639 secondary.begin(&cmdbuff__bi);
10640 secondary.end();
10641
10642 // depth samples mismatch
10643 m_commandBuffer->BeginRendering(begin_rendering_info);
10644 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06036");
10645 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10646 m_errorMonitor->VerifyFound();
10647 m_commandBuffer->EndRendering();
10648
10649 begin_rendering_info.pDepthAttachment = nullptr;
10650 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10651 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10652 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10653
10654 secondary.begin(&cmdbuff__bi);
10655 secondary.end();
10656
10657 // stencil samples mismatch
10658 m_commandBuffer->BeginRendering(begin_rendering_info);
10659 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06037");
10660 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10661 m_errorMonitor->VerifyFound();
10662 m_commandBuffer->EndRendering();
10663
10664 m_commandBuffer->end();
10665}
10666
10667TEST_F(VkLayerTest, DynamicRenderingAndExecuteCommandsWithMismatchingImageViewAttachmentSamples) {
10668 TEST_DESCRIPTION(
10669 "Test CmdExecuteCommands inside a render pass begun with CmdBeginRendering that has mismatching that has mismatching "
10670 "attachment samples");
10671
10672 SetTargetApiVersion(VK_API_VERSION_1_1);
10673
10674 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
10675
10676 ASSERT_NO_FATAL_FAILURE(InitFramework());
10677
sjfricked700bc02022-05-30 16:35:06 +090010678 if (!AreRequiredExtensionsEnabled()) {
10679 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
stusmithcba0c502021-12-21 17:16:28 +000010680 }
10681
10682 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010683 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
stusmithcba0c502021-12-21 17:16:28 +000010684 }
10685
10686 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
10687 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
10688 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
10689 if (!dynamic_rendering_features.dynamicRendering) {
10690 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
10691 return;
10692 }
10693
10694 bool amd_samples = false;
10695 if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME)) {
10696 m_device_extension_names.push_back(VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME);
10697 amd_samples = true;
10698 }
10699
10700 bool nv_samples = false;
10701 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)) {
10702 m_device_extension_names.push_back(VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME);
10703 nv_samples = true;
10704 }
10705
10706 if (!amd_samples && !nv_samples) {
10707 printf("%s Test requires either VK_AMD_mixed_attachment_samples or VK_NV_framebuffer_mixed_samples, skipping\n",
10708 kSkipPrefix);
10709 return;
10710 }
10711
10712 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
10713
10714 VkImageObj image(m_device);
10715 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
10716 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
10717
sfricke-samsung1c61f192021-12-31 01:53:03 -060010718 VkRenderingAttachmentInfoKHR color_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010719 color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10720 color_attachment.imageView = imageView;
10721
10722 VkFormat color_formats = {VK_FORMAT_R8G8B8A8_UNORM};
10723
10724 VkSampleCountFlagBits counts = {VK_SAMPLE_COUNT_2_BIT};
10725 auto samples_info = LvlInitStruct<VkAttachmentSampleCountInfoAMD>();
10726 samples_info.colorAttachmentCount = 1;
10727 samples_info.pColorAttachmentSamples = &counts;
10728
10729 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>(&samples_info);
stusmithcba0c502021-12-21 17:16:28 +000010730 inheritance_rendering_info.colorAttachmentCount = 1;
10731 inheritance_rendering_info.pColorAttachmentFormats = &color_formats;
10732 inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10733
sfricke-samsung1c61f192021-12-31 01:53:03 -060010734 VkRenderingInfoKHR begin_rendering_info = LvlInitStruct<VkRenderingInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010735 begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR;
10736 begin_rendering_info.colorAttachmentCount = 1;
10737 begin_rendering_info.pColorAttachments = &color_attachment;
10738
10739 // A pool we can reset in.
10740 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
10741 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
10742
10743 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
10744 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
10745 &inheritance_rendering_info, // pNext
10746 VK_NULL_HANDLE,
10747 0, // subpass
10748 VK_NULL_HANDLE,
10749 };
10750
10751 VkCommandBufferBeginInfo cmdbuff__bi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
10752 nullptr, // pNext
10753 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
10754 cmdbuff__bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
10755 secondary.begin(&cmdbuff__bi);
10756 secondary.end();
10757
10758 m_commandBuffer->begin();
10759
10760 // color samples mismatch
10761 m_commandBuffer->BeginRendering(begin_rendering_info);
10762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06032");
10763 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10764 m_errorMonitor->VerifyFound();
10765 m_commandBuffer->EndRendering();
10766
10767 VkImageObj depthStencilImage(m_device);
10768 auto depth_stencil_format = FindSupportedDepthStencilFormat(gpu());
10769 if (!depth_stencil_format) {
10770 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
10771 return;
10772 }
10773 depthStencilImage.Init(32, 32, 1, depth_stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
10774 0);
10775 VkImageView depthStencilImageView =
10776 depthStencilImage.targetView(depth_stencil_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
10777
sfricke-samsung1c61f192021-12-31 01:53:03 -060010778 VkRenderingAttachmentInfoKHR depth_stencil_attachment = LvlInitStruct<VkRenderingAttachmentInfoKHR>();
stusmithcba0c502021-12-21 17:16:28 +000010779 depth_stencil_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10780 depth_stencil_attachment.imageView = depthStencilImageView;
10781
10782 samples_info.colorAttachmentCount = 0;
10783 samples_info.pColorAttachmentSamples = nullptr;
10784 begin_rendering_info.colorAttachmentCount = 0;
10785 begin_rendering_info.pDepthAttachment = &depth_stencil_attachment;
10786 inheritance_rendering_info.colorAttachmentCount = 0;
10787 inheritance_rendering_info.depthAttachmentFormat = depth_stencil_format;
10788 samples_info.depthStencilAttachmentSamples = VK_SAMPLE_COUNT_2_BIT;
10789
10790 secondary.begin(&cmdbuff__bi);
10791 secondary.end();
10792
10793 // depth samples mismatch
10794 m_commandBuffer->BeginRendering(begin_rendering_info);
10795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06033");
10796 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10797 m_errorMonitor->VerifyFound();
10798 m_commandBuffer->EndRendering();
10799
10800 begin_rendering_info.pDepthAttachment = nullptr;
10801 begin_rendering_info.pStencilAttachment = &depth_stencil_attachment;
10802 inheritance_rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
10803 inheritance_rendering_info.stencilAttachmentFormat = depth_stencil_format;
10804
10805 secondary.begin(&cmdbuff__bi);
10806 secondary.end();
10807
10808 // stencil samples mismatch
10809 m_commandBuffer->BeginRendering(begin_rendering_info);
10810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pNext-06034");
10811 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
10812 m_errorMonitor->VerifyFound();
10813 m_commandBuffer->EndRendering();
10814
10815 m_commandBuffer->end();
10816}
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010817
10818TEST_F(VkLayerTest, CopyCommands2V13) {
10819 TEST_DESCRIPTION("Ensure copy_commands2 promotions are validated");
10820
10821 SetTargetApiVersion(VK_API_VERSION_1_3);
10822 ASSERT_NO_FATAL_FAILURE(Init());
10823 if (DeviceValidationVersion() < VK_API_VERSION_1_3) {
sjfrickebdd58dd2022-05-20 14:22:50 +090010824 GTEST_SKIP() << "At least Vulkan version 1.3 is required";
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010825 }
10826 VkImageObj image(m_device);
10827 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
ziga-lunarg0ce51882022-05-18 14:36:48 +020010828 VkImageObj image2(m_device);
10829 image2.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
10830 VK_IMAGE_TILING_OPTIMAL, 0);
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010831 ASSERT_TRUE(image.initialized());
10832 VkBufferObj dst_buffer;
10833 VkMemoryPropertyFlags reqs = 0;
10834 dst_buffer.init_as_dst(*m_device, 128 * 128, reqs);
10835 VkBufferObj src_buffer;
10836 src_buffer.init_as_src(*m_device, 128 * 128, reqs);
10837 auto copy_region = LvlInitStruct<VkImageCopy2>();
10838 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10839 copy_region.srcSubresource.layerCount = 1;
10840 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10841 copy_region.dstSubresource.layerCount = 1;
10842 copy_region.dstOffset = {4, 4, 0};
10843 copy_region.extent.width = 1;
10844 copy_region.extent.height = 1;
10845 copy_region.extent.depth = 1;
10846 auto copy_image_info = LvlInitStruct<VkCopyImageInfo2>();
10847 copy_image_info.srcImage = image.handle();
10848 copy_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10849 copy_image_info.dstImage = image.handle();
10850 copy_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10851 copy_image_info.regionCount = 1;
10852 copy_image_info.pRegions = &copy_region;
10853 m_commandBuffer->begin();
10854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2-dstImage-00131");
10855 vk::CmdCopyImage2(m_commandBuffer->handle(), &copy_image_info);
10856 m_errorMonitor->VerifyFound();
10857 auto copy_buffer = LvlInitStruct<VkBufferCopy2>();
ziga-lunarg852187f2022-03-16 21:21:33 +010010858 copy_buffer.dstOffset = 4;
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010859 copy_buffer.size = 4;
10860 auto copy_buffer_info = LvlInitStruct<VkCopyBufferInfo2>();
10861 copy_buffer_info.srcBuffer = dst_buffer.handle();
10862 copy_buffer_info.dstBuffer = dst_buffer.handle();
10863 copy_buffer_info.regionCount = 1;
10864 copy_buffer_info.pRegions = &copy_buffer;
10865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferInfo2-srcBuffer-00118");
10866 vk::CmdCopyBuffer2(m_commandBuffer->handle(), &copy_buffer_info);
10867 m_errorMonitor->VerifyFound();
10868 auto bic_region = LvlInitStruct<VkBufferImageCopy2>();
10869 bic_region.bufferRowLength = 128;
10870 bic_region.bufferImageHeight = 128;
10871 bic_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10872 bic_region.imageSubresource.layerCount = 1;
10873 bic_region.imageExtent.height = 4;
10874 bic_region.imageExtent.width = 4;
10875 bic_region.imageExtent.depth = 1;
10876 VkCopyBufferToImageInfo2KHR buffer_image_info = LvlInitStruct<VkCopyBufferToImageInfo2>();
10877 buffer_image_info.srcBuffer = src_buffer.handle();
10878 buffer_image_info.dstImage = image.handle();
10879 buffer_image_info.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10880 buffer_image_info.regionCount = 1;
10881 buffer_image_info.pRegions = &bic_region;
10882 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyBufferToImageInfo2-dstImage-00177");
10883 vk::CmdCopyBufferToImage2(m_commandBuffer->handle(), &buffer_image_info);
10884 m_errorMonitor->VerifyFound();
10885 auto image_buffer_info = LvlInitStruct<VkCopyImageToBufferInfo2>();
10886 image_buffer_info.dstBuffer = src_buffer.handle();
10887 image_buffer_info.srcImage = image.handle();
10888 image_buffer_info.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10889 image_buffer_info.regionCount = 1;
10890 image_buffer_info.pRegions = &bic_region;
10891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageToBufferInfo2-dstBuffer-00191");
10892 vk::CmdCopyImageToBuffer2(m_commandBuffer->handle(), &image_buffer_info);
10893 m_errorMonitor->VerifyFound();
10894 auto blit_region = LvlInitStruct<VkImageBlit2>();
10895 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10896 blit_region.srcSubresource.baseArrayLayer = 0;
10897 blit_region.srcSubresource.layerCount = 1;
10898 blit_region.srcSubresource.mipLevel = 0;
10899 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10900 blit_region.dstSubresource.baseArrayLayer = 0;
10901 blit_region.dstSubresource.layerCount = 1;
10902 blit_region.dstSubresource.mipLevel = 0;
10903 blit_region.srcOffsets[0] = {0, 0, 0};
aitor-lunarg3ad811f2022-03-31 22:00:39 +020010904 blit_region.srcOffsets[1] = {31, 31, 1};
10905 blit_region.dstOffsets[0] = {32, 32, 0};
10906 blit_region.dstOffsets[1] = {64, 64, 1};
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010907 auto blit_image_info = LvlInitStruct<VkBlitImageInfo2>();
10908 blit_image_info.srcImage = image.handle();
10909 blit_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10910 blit_image_info.dstImage = image.handle();
10911 blit_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10912 blit_image_info.regionCount = 1;
10913 blit_image_info.pRegions = &blit_region;
10914 blit_image_info.filter = VK_FILTER_NEAREST;
10915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBlitImageInfo2-dstImage-00224");
10916 vk::CmdBlitImage2(m_commandBuffer->handle(), &blit_image_info);
10917 m_errorMonitor->VerifyFound();
10918 auto resolve_region = LvlInitStruct<VkImageResolve2>();
10919 resolve_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10920 resolve_region.srcSubresource.mipLevel = 0;
10921 resolve_region.srcSubresource.baseArrayLayer = 0;
10922 resolve_region.srcSubresource.layerCount = 1;
10923 resolve_region.srcOffset.x = 0;
10924 resolve_region.srcOffset.y = 0;
10925 resolve_region.srcOffset.z = 0;
10926 resolve_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10927 resolve_region.dstSubresource.mipLevel = 0;
10928 resolve_region.dstSubresource.baseArrayLayer = 0;
10929 resolve_region.dstSubresource.layerCount = 1;
10930 resolve_region.dstOffset.x = 0;
10931 resolve_region.dstOffset.y = 0;
10932 resolve_region.dstOffset.z = 0;
10933 resolve_region.extent.width = 1;
10934 resolve_region.extent.height = 1;
10935 resolve_region.extent.depth = 1;
10936 auto resolve_image_info = LvlInitStruct<VkResolveImageInfo2>();
10937 resolve_image_info.srcImage = image.handle();
10938 resolve_image_info.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL;
ziga-lunarg0ce51882022-05-18 14:36:48 +020010939 resolve_image_info.dstImage = image2.handle();
Tony-LunarG7d584ce2022-01-17 13:52:40 -070010940 resolve_image_info.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL;
10941 resolve_image_info.regionCount = 1;
10942 resolve_image_info.pRegions = &resolve_region;
10943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2-srcImage-00257");
10944 vk::CmdResolveImage2(m_commandBuffer->handle(), &resolve_image_info);
10945 m_errorMonitor->VerifyFound();
10946}
aitor-lunarga131fca2022-02-17 22:55:55 +010010947
10948TEST_F(VkLayerTest, ValidateMultiviewUnboundResourcesAfterBeginRenderPassAndNextSubpass) {
10949 TEST_DESCRIPTION(
10950 "Validate all required resources are bound if multiview is enabled after vkCmdBeginRenderPass and vkCmdNextSubpass");
10951
sjfricked700bc02022-05-30 16:35:06 +090010952 AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
10953 AddRequiredExtensions(VK_KHR_MULTIVIEW_EXTENSION_NAME);
aitor-lunarga131fca2022-02-17 22:55:55 +010010954 ASSERT_NO_FATAL_FAILURE(InitFramework());
sjfricked700bc02022-05-30 16:35:06 +090010955 if (!AreRequiredExtensionsEnabled()) {
10956 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
aitor-lunarga131fca2022-02-17 22:55:55 +010010957 }
10958
10959 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
10960 multiview_features.multiview = VK_TRUE;
10961 VkPhysicalDeviceFeatures2 pd_features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&multiview_features);
10962
10963 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
10964
10965 VkAttachmentDescription attachmentDescription = {};
10966 attachmentDescription.format = VK_FORMAT_R8G8B8A8_UNORM;
10967 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
10968 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
10969
10970 VkAttachmentReference colorAttachmentReference = {};
10971 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
10972 colorAttachmentReference.attachment = 0;
10973
10974 m_renderPass_subpasses.resize(2);
10975 m_renderPass_subpasses[0].colorAttachmentCount = 1;
10976 m_renderPass_subpasses[0].pColorAttachments = &colorAttachmentReference;
10977 m_renderPass_subpasses[1].colorAttachmentCount = 1;
10978 m_renderPass_subpasses[1].pColorAttachments = &colorAttachmentReference;
10979
10980 uint32_t viewMasks[] = {0x1u, 0x2u};
10981 VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = LvlInitStruct<VkRenderPassMultiviewCreateInfo>();
10982 renderPassMultiviewCreateInfo.subpassCount = 2;
10983 renderPassMultiviewCreateInfo.pViewMasks = viewMasks;
10984
10985 m_renderPass_info = LvlInitStruct<VkRenderPassCreateInfo>(&renderPassMultiviewCreateInfo);
10986 m_renderPass_info.attachmentCount = 1;
10987 m_renderPass_info.pAttachments = &attachmentDescription;
10988 m_renderPass_info.subpassCount = m_renderPass_subpasses.size();
10989 m_renderPass_info.pSubpasses = m_renderPass_subpasses.data();
10990
10991 m_renderPass_dependencies.resize(1);
10992 VkSubpassDependency &subpass_dep = m_renderPass_dependencies[0];
10993 subpass_dep.srcSubpass = 0;
10994 subpass_dep.dstSubpass = 1;
10995 // Just using all framebuffer-space pipeline stages in order to get a reasonably large
10996 // set of bits that can be used for both src & dst
10997 subpass_dep.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
10998 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
10999 subpass_dep.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
11000 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
11001 // Add all of the gfx mem access bits that correlate to the fb-space pipeline stages
11002 subpass_dep.srcAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
11003 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
11004 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
11005 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
11006 subpass_dep.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
11007 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
11008 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
11009 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
11010 // Must include dep_by_region bit when src & dst both include framebuffer-space stages
11011 subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
11012
11013 m_renderPass_info.dependencyCount = static_cast<uint32_t>(m_renderPass_dependencies.size());
11014 m_renderPass_info.pDependencies = m_renderPass_dependencies.data();
11015
11016 vk::CreateRenderPass(m_device->handle(), &m_renderPass_info, nullptr, &m_renderPass);
11017
11018 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
11019 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11020 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
11021 image_create_info.extent.width = static_cast<uint32_t>(m_width);
11022 image_create_info.extent.height = static_cast<uint32_t>(m_height);
11023 image_create_info.extent.depth = 1;
11024 image_create_info.mipLevels = 1;
11025 image_create_info.arrayLayers = 2;
11026 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11027 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11028 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
11029 image_create_info.flags = 0;
11030
11031 VkImageObj image(m_device);
11032 image.Init(image_create_info);
11033 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
11034 VK_REMAINING_ARRAY_LAYERS, VK_IMAGE_VIEW_TYPE_2D_ARRAY);
11035
11036 VkFramebufferCreateInfo framebufferCreateInfo = LvlInitStruct<VkFramebufferCreateInfo>();
11037 framebufferCreateInfo.width = static_cast<uint32_t>(m_width);
11038 framebufferCreateInfo.height = static_cast<uint32_t>(m_height);
11039 framebufferCreateInfo.layers = 1;
11040 framebufferCreateInfo.renderPass = m_renderPass;
11041 framebufferCreateInfo.attachmentCount = 1;
11042 framebufferCreateInfo.pAttachments = &imageView;
11043
11044 vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &m_framebuffer);
11045
11046 VkClearValue clear{};
11047 clear.color = m_clear_color;
11048 m_renderPassClearValues.emplace_back(clear);
11049 m_renderPassBeginInfo.renderPass = m_renderPass;
11050 m_renderPassBeginInfo.framebuffer = m_framebuffer;
11051 m_renderPassBeginInfo.renderArea.extent.width = static_cast<uint32_t>(m_width);
11052 m_renderPassBeginInfo.renderArea.extent.height = static_cast<uint32_t>(m_height);
11053 m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size();
11054 m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data();
11055
11056 CreatePipelineHelper pipe(*this);
11057 pipe.InitInfo();
11058 pipe.InitState();
11059 pipe.CreateGraphicsPipeline();
11060
11061 // This bind should not be valid after we begin the renderpass
11062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
11063
11064 m_commandBuffer->begin();
11065 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11066 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
11067 m_commandBuffer->Draw(1, 0, 0, 0);
11068 m_errorMonitor->VerifyFound();
11069
11070 // This bind should not be valid for next subpass
11071 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
11072
11073 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-None-02700");
11074 vk::CmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
11075 m_commandBuffer->Draw(1, 0, 0, 0);
11076 m_errorMonitor->VerifyFound();
11077
11078 m_commandBuffer->EndRenderPass();
11079 m_commandBuffer->end();
11080}
ziga-lunarg813fa012022-04-09 14:09:57 +020011081
11082TEST_F(VkLayerTest, TestCommandBufferInheritanceWithInvalidDepthFormat) {
11083 TEST_DESCRIPTION(
11084 "Test VkCommandBufferInheritanceRenderingInfoKHR with depthAttachmentFormat that does not include depth aspect");
11085
11086 SetTargetApiVersion(VK_API_VERSION_1_1);
11087
11088 AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
11089
11090 ASSERT_NO_FATAL_FAILURE(InitFramework());
11091
sjfricked700bc02022-05-30 16:35:06 +090011092 if (!AreRequiredExtensionsEnabled()) {
11093 GTEST_SKIP() << RequiredExtensionsNotSupported() << " not supported";
ziga-lunarg813fa012022-04-09 14:09:57 +020011094 }
11095
11096 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
sjfrickebdd58dd2022-05-20 14:22:50 +090011097 GTEST_SKIP() << "At least Vulkan version 1.1 is required";
ziga-lunarg813fa012022-04-09 14:09:57 +020011098 }
11099
11100 auto dynamic_rendering_features = LvlInitStruct<VkPhysicalDeviceDynamicRenderingFeaturesKHR>();
11101 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2>(&dynamic_rendering_features);
11102 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
11103 if (!dynamic_rendering_features.dynamicRendering) {
11104 printf("%s Test requires (unsupported) dynamicRendering , skipping\n", kSkipPrefix);
11105 return;
11106 }
11107
11108 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
11109
11110 auto stencil_format = FindSupportedStencilOnlyFormat(gpu());
11111 if (!stencil_format) {
11112 printf("%s Couldn't stencil image format.\n", kSkipPrefix);
11113 return;
11114 }
11115
11116 auto inheritance_rendering_info = LvlInitStruct<VkCommandBufferInheritanceRenderingInfoKHR>();
11117 inheritance_rendering_info.depthAttachmentFormat = stencil_format;
11118
11119 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
11120
11121 auto cmdbuf_ii = LvlInitStruct<VkCommandBufferInheritanceInfo>(&inheritance_rendering_info);
11122 auto cmdbuf_bi = LvlInitStruct<VkCommandBufferBeginInfo>();
11123 cmdbuf_bi.pInheritanceInfo = &cmdbuf_ii;
11124
11125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferInheritanceRenderingInfo-depthAttachmentFormat-06540");
11126
11127 vk::BeginCommandBuffer(secondary.handle(), &cmdbuf_bi);
11128
11129 m_errorMonitor->VerifyFound();
11130}
ziga-lunarg0ce51882022-05-18 14:36:48 +020011131
11132TEST_F(VkLayerTest, ResolveInvalidUsage) {
11133 TEST_DESCRIPTION("Resolve image with missing usage flags.");
11134
11135 if (!EnableDeviceProfileLayer()) {
11136 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
11137 return;
11138 }
11139
11140 ASSERT_NO_FATAL_FAILURE(Init());
11141
11142 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
11143 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
11144
11145 // Load required functions
11146 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
11147 printf("%s Failed to device profile layer.\n", kSkipPrefix);
11148 return;
11149 }
11150
11151 VkFormat src_format = VK_FORMAT_R8_UNORM;
11152 VkFormat dst_format = VK_FORMAT_R8_SNORM;
11153
11154 VkFormatProperties formatProps;
11155 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, &formatProps);
11156 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
11157 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), src_format, formatProps);
11158 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, &formatProps);
11159 formatProps.optimalTilingFeatures &= ~VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
11160 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), dst_format, formatProps);
11161
11162 VkImageCreateInfo image_create_info = LvlInitStruct<VkImageCreateInfo>();
11163 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11164 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11165 image_create_info.extent.width = 32;
11166 image_create_info.extent.height = 1;
11167 image_create_info.extent.depth = 1;
11168 image_create_info.mipLevels = 1;
11169 image_create_info.arrayLayers = 1;
11170 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
11171 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11172 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11173 image_create_info.flags = 0;
11174
11175 VkImageObj srcImage(m_device);
11176 srcImage.init(&image_create_info);
11177 ASSERT_TRUE(srcImage.initialized());
11178
11179 image_create_info.format = dst_format;
11180 VkImageObj srcImage2(m_device);
11181 srcImage2.init(&image_create_info);
11182 ASSERT_TRUE(srcImage2.initialized());
11183
11184 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11185 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11186 VkImageObj invalidSrcImage(m_device);
11187 invalidSrcImage.init(&image_create_info);
11188 ASSERT_TRUE(invalidSrcImage.initialized());
11189
11190 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11191 image_create_info.format = src_format;
11192 VkImageObj invalidSrcImage2(m_device);
11193 invalidSrcImage2.init(&image_create_info);
11194 ASSERT_TRUE(invalidSrcImage2.initialized());
11195
11196 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11197 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11198 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11199 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11200 VkImageObj dstImage(m_device);
11201 dstImage.init(&image_create_info);
11202 ASSERT_TRUE(dstImage.initialized());
11203
11204 image_create_info.format = src_format;
11205 VkImageObj dstImage2(m_device);
11206 dstImage2.init(&image_create_info);
11207 ASSERT_TRUE(dstImage2.initialized());
11208
11209 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
11210 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11211 VkImageObj invalidDstImage(m_device);
11212 invalidDstImage.init(&image_create_info);
11213 ASSERT_TRUE(invalidDstImage.initialized());
11214
11215 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
11216 image_create_info.format = dst_format;
11217 VkImageObj invalidDstImage2(m_device);
11218 invalidDstImage2.init(&image_create_info);
11219 ASSERT_TRUE(invalidDstImage2.initialized());
11220
11221 m_commandBuffer->begin();
11222 VkImageResolve resolveRegion;
11223 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11224 resolveRegion.srcSubresource.mipLevel = 0;
11225 resolveRegion.srcSubresource.baseArrayLayer = 0;
11226 resolveRegion.srcSubresource.layerCount = 1;
11227 resolveRegion.srcOffset.x = 0;
11228 resolveRegion.srcOffset.y = 0;
11229 resolveRegion.srcOffset.z = 0;
11230 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11231 resolveRegion.dstSubresource.mipLevel = 0;
11232 resolveRegion.dstSubresource.baseArrayLayer = 0;
11233 resolveRegion.dstSubresource.layerCount = 1;
11234 resolveRegion.dstOffset.x = 0;
11235 resolveRegion.dstOffset.y = 0;
11236 resolveRegion.dstOffset.z = 0;
11237 resolveRegion.extent.width = 1;
11238 resolveRegion.extent.height = 1;
11239 resolveRegion.extent.depth = 1;
11240
11241 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06762");
11242 m_commandBuffer->ResolveImage(invalidSrcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11243 &resolveRegion);
11244 m_errorMonitor->VerifyFound();
11245
11246 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06764");
11247 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
11248 &resolveRegion);
11249 m_errorMonitor->VerifyFound();
11250
11251 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-06763");
11252 m_commandBuffer->ResolveImage(invalidSrcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11253 1, &resolveRegion);
11254 m_errorMonitor->VerifyFound();
11255
11256 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-06765");
11257 m_commandBuffer->ResolveImage(srcImage2.handle(), VK_IMAGE_LAYOUT_GENERAL, invalidDstImage2.handle(), VK_IMAGE_LAYOUT_GENERAL,
11258 1, &resolveRegion);
11259 m_errorMonitor->VerifyFound();
11260
11261 m_commandBuffer->end();
11262}