blob: fa5c9e81f4a7272b066bb6c0baca582923196ba0 [file] [log] [blame]
unknown088160a2019-05-23 17:43:13 -06001/*
sfricke-samsung6886c4b2021-01-16 08:37:35 -08002 * Copyright (c) 2015-2021 The Khronos Group Inc.
3 * Copyright (c) 2015-2021 Valve Corporation
4 * Copyright (c) 2015-2021 LunarG, Inc.
5 * Copyright (c) 2015-2021 Google, Inc.
Tobias Hector04f2ab22020-12-01 10:59:33 +00006 * Modifications Copyright (C) 2020 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
41 VkCommandPoolCreateInfo pool_create_info{};
42 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
43 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
44 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
45
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060046 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
unknown088160a2019-05-23 17:43:13 -060047
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060048 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
unknown088160a2019-05-23 17:43:13 -060049
50 VkCommandBuffer cb;
51 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
52 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
53 command_buffer_allocate_info.commandPool = command_pool_one;
54 command_buffer_allocate_info.commandBufferCount = 1;
55 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060056 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
unknown088160a2019-05-23 17:43:13 -060057
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060058 vk::FreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
unknown088160a2019-05-23 17:43:13 -060059
60 m_errorMonitor->VerifyFound();
61
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060062 vk::DestroyCommandPool(m_device->device(), command_pool_one, NULL);
63 vk::DestroyCommandPool(m_device->device(), command_pool_two, NULL);
unknown088160a2019-05-23 17:43:13 -060064}
65
66TEST_F(VkLayerTest, InvalidSecondaryCommandBufferBarrier) {
67 TEST_DESCRIPTION("Add an invalid image barrier in a secondary command buffer");
68 ASSERT_NO_FATAL_FAILURE(Init());
69
70 // A renderpass with a single subpass that declared a self-dependency
71 VkAttachmentDescription attach[] = {
72 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
73 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
74 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
75 };
76 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
77 VkSubpassDescription subpasses[] = {
78 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
79 };
80 VkSubpassDependency dep = {0,
81 0,
82 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
83 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
84 VK_ACCESS_SHADER_WRITE_BIT,
85 VK_ACCESS_SHADER_WRITE_BIT,
86 VK_DEPENDENCY_BY_REGION_BIT};
87 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 1, &dep};
88 VkRenderPass rp;
89
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060090 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
unknown088160a2019-05-23 17:43:13 -060091 ASSERT_VK_SUCCESS(err);
92
93 VkImageObj image(m_device);
94 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
95 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
96 // Second image that img_barrier will incorrectly use
97 VkImageObj image2(m_device);
98 image2.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
99
100 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
101 VkFramebuffer fb;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600102 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
unknown088160a2019-05-23 17:43:13 -0600103 ASSERT_VK_SUCCESS(err);
104
105 m_commandBuffer->begin();
106
107 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
108 nullptr,
109 rp,
110 fb,
111 {{
112 0,
113 0,
114 },
115 {32, 32}},
116 0,
117 nullptr};
118
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600119 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600120
121 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
122 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
123
124 VkCommandBufferInheritanceInfo cbii = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
125 nullptr,
126 rp,
127 0,
128 VK_NULL_HANDLE, // Set to NULL FB handle intentionally to flesh out any errors
129 VK_FALSE,
130 0,
131 0};
132 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
133 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
134 &cbii};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600135 vk::BeginCommandBuffer(secondary.handle(), &cbbi);
unknown088160a2019-05-23 17:43:13 -0600136 VkImageMemoryBarrier img_barrier = {};
137 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
138 img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
139 img_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
140 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
141 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
142 img_barrier.image = image2.handle(); // Image mis-matches with FB image
143 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
144 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
145 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
146 img_barrier.subresourceRange.baseArrayLayer = 0;
147 img_barrier.subresourceRange.baseMipLevel = 0;
148 img_barrier.subresourceRange.layerCount = 1;
149 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600150 vk::CmdPipelineBarrier(secondary.handle(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
151 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
unknown088160a2019-05-23 17:43:13 -0600152 secondary.end();
153
Shannon McPherson93970b12020-06-12 14:34:35 -0600154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600155 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600156 m_errorMonitor->VerifyFound();
157
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600158 vk::DestroyFramebuffer(m_device->device(), fb, nullptr);
159 vk::DestroyRenderPass(m_device->device(), rp, nullptr);
unknown088160a2019-05-23 17:43:13 -0600160}
161
162TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
163 TEST_DESCRIPTION(
164 "Run a simple draw calls to validate failure when Depth Bias dynamic state is required but not correctly bound.");
165
166 ASSERT_NO_FATAL_FAILURE(Init());
167 // Dynamic depth bias
Mark Lobodzinski20310782020-02-28 14:25:17 -0700168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bias state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600169 VKTriangleTest(BsoFailDepthBias);
170 m_errorMonitor->VerifyFound();
171}
172
173TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
174 TEST_DESCRIPTION(
175 "Run a simple draw calls to validate failure when Line Width dynamic state is required but not correctly bound.");
176
177 ASSERT_NO_FATAL_FAILURE(Init());
178 // Dynamic line width
Mark Lobodzinski20310782020-02-28 14:25:17 -0700179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line width state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600180 VKTriangleTest(BsoFailLineWidth);
181 m_errorMonitor->VerifyFound();
182}
183
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500184TEST_F(VkLayerTest, DynamicLineStippleNotBound) {
185 TEST_DESCRIPTION(
186 "Run a simple draw calls to validate failure when Line Stipple dynamic state is required but not correctly bound.");
187
188 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
189 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
190 } else {
191 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
192 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
193 return;
194 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -0700195 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500196 std::array<const char *, 1> required_device_extensions = {{VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME}};
197 for (auto device_extension : required_device_extensions) {
198 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
199 m_device_extension_names.push_back(device_extension);
200 } else {
201 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
202 return;
203 }
204 }
205
206 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600207 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500208 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
209
Mark Lobodzinski07d0a612020-12-30 15:42:31 -0700210 auto line_rasterization_features = LvlInitStruct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
211 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&line_rasterization_features);
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500212 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
213
214 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
215 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
216 return;
217 }
218
219 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
220
Mark Lobodzinski20310782020-02-28 14:25:17 -0700221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500222 VKTriangleTest(BsoFailLineStipple);
223 m_errorMonitor->VerifyFound();
224}
225
unknown088160a2019-05-23 17:43:13 -0600226TEST_F(VkLayerTest, DynamicViewportNotBound) {
227 TEST_DESCRIPTION(
228 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
229
230 ASSERT_NO_FATAL_FAILURE(Init());
231 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700232 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600233 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
234 VKTriangleTest(BsoFailViewport);
235 m_errorMonitor->VerifyFound();
236}
237
238TEST_F(VkLayerTest, DynamicScissorNotBound) {
239 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
240
241 ASSERT_NO_FATAL_FAILURE(Init());
242 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600244 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
245 VKTriangleTest(BsoFailScissor);
246 m_errorMonitor->VerifyFound();
247}
248
249TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
250 TEST_DESCRIPTION(
251 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
252
253 ASSERT_NO_FATAL_FAILURE(Init());
254 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700255 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600256 VKTriangleTest(BsoFailBlend);
257 m_errorMonitor->VerifyFound();
258}
259
260TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
261 TEST_DESCRIPTION(
262 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
263
264 ASSERT_NO_FATAL_FAILURE(Init());
265 if (!m_device->phy().features().depthBounds) {
266 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
267 return;
268 }
269 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600271 VKTriangleTest(BsoFailDepthBounds);
272 m_errorMonitor->VerifyFound();
273}
274
275TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
276 TEST_DESCRIPTION(
277 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
278
279 ASSERT_NO_FATAL_FAILURE(Init());
280 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600282 VKTriangleTest(BsoFailStencilReadMask);
283 m_errorMonitor->VerifyFound();
284}
285
286TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
287 TEST_DESCRIPTION(
288 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
289
290 ASSERT_NO_FATAL_FAILURE(Init());
291 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700292 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600293 VKTriangleTest(BsoFailStencilWriteMask);
294 m_errorMonitor->VerifyFound();
295}
296
297TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
298 TEST_DESCRIPTION(
299 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
300
301 ASSERT_NO_FATAL_FAILURE(Init());
302 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600304 VKTriangleTest(BsoFailStencilReference);
305 m_errorMonitor->VerifyFound();
306}
307
308TEST_F(VkLayerTest, IndexBufferNotBound) {
309 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
310
311 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600313 VKTriangleTest(BsoFailIndexBuffer);
314 m_errorMonitor->VerifyFound();
315}
316
317TEST_F(VkLayerTest, IndexBufferBadSize) {
318 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
319
320 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600322 VKTriangleTest(BsoFailIndexBufferBadSize);
323 m_errorMonitor->VerifyFound();
324}
325
326TEST_F(VkLayerTest, IndexBufferBadOffset) {
327 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
328
329 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600331 VKTriangleTest(BsoFailIndexBufferBadOffset);
332 m_errorMonitor->VerifyFound();
333}
334
335TEST_F(VkLayerTest, IndexBufferBadBindSize) {
336 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
337
338 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600340 VKTriangleTest(BsoFailIndexBufferBadMapSize);
341 m_errorMonitor->VerifyFound();
342}
343
344TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
345 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
346
347 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600349 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
350 m_errorMonitor->VerifyFound();
351}
352
353TEST_F(VkLayerTest, MissingClearAttachment) {
354 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
355 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700356 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600357
358 VKTriangleTest(BsoFailCmdClearAttachments);
359 m_errorMonitor->VerifyFound();
360}
361
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700362TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
363 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700365
366 ASSERT_NO_FATAL_FAILURE(Init());
367
368 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
369 secondary.begin();
370 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
371 secondary.end();
372
373 VkSubmitInfo submit_info;
374 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
375 submit_info.pNext = NULL;
376 submit_info.waitSemaphoreCount = 0;
377 submit_info.pWaitSemaphores = NULL;
378 submit_info.pWaitDstStageMask = NULL;
379 submit_info.commandBufferCount = 1;
380 submit_info.pCommandBuffers = &secondary.handle();
381 submit_info.signalSemaphoreCount = 0;
382 submit_info.pSignalSemaphores = NULL;
383
384 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
385 m_errorMonitor->VerifyFound();
386}
387
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700388TEST_F(VkLayerTest, Sync2SecondaryCommandbufferAsPrimary) {
389 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit2KHR.");
390 SetTargetApiVersion(VK_API_VERSION_1_2);
391 ASSERT_NO_FATAL_FAILURE(InitFramework());
392 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
393 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
394 } else {
395 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
396 return;
397 }
398
399 if (!CheckSynchronization2SupportAndInitState(this)) {
400 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
401 return;
402 }
403 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferSubmitInfoKHR-commandBuffer-03890");
405
406 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
407 secondary.begin();
408 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
409 secondary.end();
410
411 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
412 cb_info.commandBuffer = secondary.handle();
413
414 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
415 submit_info.commandBufferInfoCount = 1;
416 submit_info.pCommandBufferInfos = &cb_info;
417
418 fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
419 m_errorMonitor->VerifyFound();
420}
421
unknown088160a2019-05-23 17:43:13 -0600422TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600424 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
425
426 ASSERT_NO_FATAL_FAILURE(Init());
427 ASSERT_NO_FATAL_FAILURE(InitViewport());
428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
429
430 // We luck out b/c by default the framework creates CB w/ the
431 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
432 m_commandBuffer->begin();
433 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
434 m_commandBuffer->end();
435
436 // Bypass framework since it does the waits automatically
437 VkResult err = VK_SUCCESS;
438 VkSubmitInfo submit_info;
439 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
440 submit_info.pNext = NULL;
441 submit_info.waitSemaphoreCount = 0;
442 submit_info.pWaitSemaphores = NULL;
443 submit_info.pWaitDstStageMask = NULL;
444 submit_info.commandBufferCount = 1;
445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
446 submit_info.signalSemaphoreCount = 0;
447 submit_info.pSignalSemaphores = NULL;
448
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600449 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600450 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600451 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600452
453 // Cause validation error by re-submitting cmd buffer that should only be
454 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600455 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
456 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600457
458 m_errorMonitor->VerifyFound();
459}
460
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700461TEST_F(VkLayerTest, Sync2CommandBufferTwoSubmits) {
462 SetTargetApiVersion(VK_API_VERSION_1_2);
463 ASSERT_NO_FATAL_FAILURE(InitFramework());
464 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
465 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
466 } else {
467 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
468 return;
469 }
470
471 if (!CheckSynchronization2SupportAndInitState(this)) {
472 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
473 return;
474 }
475 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
476
477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
478 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
479 ASSERT_NO_FATAL_FAILURE(InitViewport());
480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
481
482 // We luck out b/c by default the framework creates CB w/ the
483 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
484 m_commandBuffer->begin();
485 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
486 m_commandBuffer->end();
487
488 // Bypass framework since it does the waits automatically
489 VkResult err = VK_SUCCESS;
490 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
491 cb_info.commandBuffer = m_commandBuffer->handle();
492
493 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
494 submit_info.commandBufferInfoCount = 1;
495 submit_info.pCommandBufferInfos = &cb_info;
496
497 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
498 ASSERT_VK_SUCCESS(err);
499 vk::QueueWaitIdle(m_device->m_queue);
500
501 // Cause validation error by re-submitting cmd buffer that should only be
502 // submitted once
503 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
504 vk::QueueWaitIdle(m_device->m_queue);
505
506 m_errorMonitor->VerifyFound();
507}
508
unknown088160a2019-05-23 17:43:13 -0600509TEST_F(VkLayerTest, InvalidPushConstants) {
510 ASSERT_NO_FATAL_FAILURE(Init());
511 ASSERT_NO_FATAL_FAILURE(InitViewport());
512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
513
514 VkPipelineLayout pipeline_layout;
515 VkPushConstantRange pc_range = {};
516 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
517 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
518 pipeline_layout_ci.pushConstantRangeCount = 1;
519 pipeline_layout_ci.pPushConstantRanges = &pc_range;
520
521 //
522 // Check for invalid push constant ranges in pipeline layouts.
523 //
524 struct PipelineLayoutTestCase {
525 VkPushConstantRange const range;
526 char const *msg;
527 };
528
529 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
530 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700531 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
532 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
533 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
534 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
535 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
537 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
538 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
539 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
540 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600541 }};
542
543 // Check for invalid offset and size
544 for (const auto &iter : range_tests) {
545 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700546 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600547 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600548 m_errorMonitor->VerifyFound();
549 }
550
551 // Check for invalid stage flag
552 pc_range.offset = 0;
553 pc_range.size = 16;
554 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700555 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600556 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600557 m_errorMonitor->VerifyFound();
558
559 // Check for duplicate stage flags in a list of push constant ranges.
560 // A shader can only have one push constant block and that block is mapped
561 // to the push constant range that has that shader's stage flag set.
562 // The shader's stage flag can only appear once in all the ranges, so the
563 // implementation can find the one and only range to map it to.
564 const uint32_t ranges_per_test = 5;
565 struct DuplicateStageFlagsTestCase {
566 VkPushConstantRange const ranges[ranges_per_test];
567 std::vector<char const *> const msg;
568 };
569 // Overlapping ranges are OK, but a stage flag can appear only once.
570 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
571 {
572 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
573 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
574 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
575 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
576 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
577 {
578 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
579 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
580 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
581 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
582 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
583 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
584 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
585 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
586 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
587 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
588 }},
589 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
590 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
591 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
592 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
593 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
594 {
595 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
596 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
597 }},
598 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
599 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
600 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
601 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
602 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
603 {
604 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
605 }},
606 },
607 };
608
609 for (const auto &iter : duplicate_stageFlags_tests) {
610 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
611 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600613 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600614 m_errorMonitor->VerifyFound();
615 }
616
617 //
618 // CmdPushConstants tests
619 //
620
621 // Setup a pipeline layout with ranges: [0,32) [16,80)
622 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
623 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
624 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
625
626 const uint8_t dummy_values[100] = {};
627
628 m_commandBuffer->begin();
629 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
630
631 // Check for invalid stage flag
632 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600634 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600635 m_errorMonitor->VerifyFound();
636
637 // Positive tests for the overlapping ranges
638 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600639 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
640 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600641 m_errorMonitor->VerifyNotFound();
642 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600643 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600644 m_errorMonitor->VerifyNotFound();
645 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600646 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
647 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600648 m_errorMonitor->VerifyNotFound();
649
650 // Wrong cmd stages for extant range
651 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600653 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600655 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
656 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600657 m_errorMonitor->VerifyFound();
658
659 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600661 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
662 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600663 m_errorMonitor->VerifyFound();
664
665 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600667 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
668 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600669 m_errorMonitor->VerifyFound();
670
671 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600673 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600674 m_errorMonitor->VerifyFound();
675
676 m_commandBuffer->EndRenderPass();
677 m_commandBuffer->end();
678}
679
680TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600682
683 ASSERT_NO_FATAL_FAILURE(Init());
684 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
685 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600686 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600687
688 m_errorMonitor->VerifyFound();
689}
690
691TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
692 ASSERT_NO_FATAL_FAILURE(Init());
693
694 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
695
696 // Force the failure by not setting the Renderpass and Framebuffer fields
697 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
698 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
699
700 VkCommandBufferBeginInfo cmd_buf_info = {};
701 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
702 cmd_buf_info.pNext = NULL;
703 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
704 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
705
Mark Lobodzinski20310782020-02-28 14:25:17 -0700706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-00053");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600707 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600708 m_errorMonitor->VerifyFound();
709}
710
711TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
712 ASSERT_NO_FATAL_FAILURE(Init());
713
Mark Lobodzinski20310782020-02-28 14:25:17 -0700714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600715
716 // A pool we can reset in.
717 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
718 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
719
720 secondary.begin();
721 secondary.end();
722
723 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600724 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600725
726 // rerecording of secondary
727 secondary.reset(); // explicit reset here.
728 secondary.begin();
729 secondary.end();
730
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600731 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600732 m_errorMonitor->VerifyFound();
733}
734
735TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
736 ASSERT_NO_FATAL_FAILURE(Init());
737
Mark Lobodzinski20310782020-02-28 14:25:17 -0700738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600739
740 // A pool we can reset in.
741 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
742 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
743
744 secondary.begin();
745 secondary.end();
746
747 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600748 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600749
750 // rerecording of secondary
751 secondary.begin(); // implicit reset in begin
752 secondary.end();
753
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600754 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600755 m_errorMonitor->VerifyFound();
756}
757
758TEST_F(VkLayerTest, CascadedInvalidation) {
759 ASSERT_NO_FATAL_FAILURE(Init());
760
761 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
762 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600763 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600764
765 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
766 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600767 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600768 secondary.end();
769
770 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600771 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600772 m_commandBuffer->end();
773
774 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600775 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600776
Mark Lobodzinski20310782020-02-28 14:25:17 -0700777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600778 m_commandBuffer->QueueCommandBuffer(false);
779 m_errorMonitor->VerifyFound();
780}
781
782TEST_F(VkLayerTest, CommandBufferResetErrors) {
783 // Cause error due to Begin while recording CB
784 // Then cause 2 errors for attempting to reset CB w/o having
785 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
786 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600788
789 ASSERT_NO_FATAL_FAILURE(Init());
790
791 // Calls AllocateCommandBuffers
792 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
793
794 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
795 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
796 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
797 VkCommandBufferBeginInfo cmd_buf_info = {};
798 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
799 cmd_buf_info.pNext = NULL;
800 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
801 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
802
803 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600804 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600805 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600806 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600807 m_errorMonitor->VerifyFound();
808
Mark Lobodzinski20310782020-02-28 14:25:17 -0700809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600810 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
811 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600812 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600813 m_errorMonitor->VerifyFound();
814
Mark Lobodzinski20310782020-02-28 14:25:17 -0700815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600816 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600817 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600818 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600819 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600820 m_errorMonitor->VerifyFound();
821}
822
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700823TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
824 ASSERT_NO_FATAL_FAILURE(Init());
825
826 // Calls AllocateCommandBuffers
827 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
828
829 VkCommandBufferBeginInfo cmd_buf_info = {};
830 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
831 cmd_buf_info.pNext = NULL;
832 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
833
834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
835 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
836 m_errorMonitor->VerifyFound();
837}
838
unknown088160a2019-05-23 17:43:13 -0600839TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
840 // Call CmdClearAttachmentss outside of an active RenderPass
841
Mark Lobodzinski20310782020-02-28 14:25:17 -0700842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600843 "vkCmdClearAttachments(): This call must be issued inside an active render pass");
844
845 ASSERT_NO_FATAL_FAILURE(Init());
846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
847
848 // Start no RenderPass
849 m_commandBuffer->begin();
850
851 VkClearAttachment color_attachment;
852 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
853 color_attachment.clearValue.color.float32[0] = 0;
854 color_attachment.clearValue.color.float32[1] = 0;
855 color_attachment.clearValue.color.float32[2] = 0;
856 color_attachment.clearValue.color.float32[3] = 0;
857 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600858 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600859 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600860
861 m_errorMonitor->VerifyFound();
862}
863
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600864TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
865 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
866
Mark Lobodzinski20310782020-02-28 14:25:17 -0700867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600868
869 ASSERT_NO_FATAL_FAILURE(Init());
870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
871
872 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600873 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600874
875 VkClearAttachment color_attachment;
876 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
877 color_attachment.clearValue.color.float32[0] = 0;
878 color_attachment.clearValue.color.float32[1] = 0;
879 color_attachment.clearValue.color.float32[2] = 0;
880 color_attachment.clearValue.color.float32[3] = 0;
881 color_attachment.colorAttachment = 0;
882 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600883 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600884
885 m_errorMonitor->VerifyFound();
886}
887
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700888TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
889 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
890
891 ASSERT_NO_FATAL_FAILURE(Init());
892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
893
894 m_commandBuffer->begin();
895 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
896
897 VkClearAttachment color_attachment;
898 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
899 color_attachment.clearValue.color.float32[0] = 0;
900 color_attachment.clearValue.color.float32[1] = 0;
901 color_attachment.clearValue.color.float32[2] = 0;
902 color_attachment.clearValue.color.float32[3] = 0;
903 color_attachment.colorAttachment = 0;
904 VkClearRect clear_rect = {};
905 clear_rect.rect.offset = {0, 0};
906 clear_rect.baseArrayLayer = 0;
907 clear_rect.layerCount = 1;
908
909 clear_rect.rect.extent = {0, 1};
910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
911 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
912 m_errorMonitor->VerifyFound();
913
914 clear_rect.rect.extent = {1, 0};
915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
916 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
917 m_errorMonitor->VerifyFound();
918}
919
sfricke-samsung6141db32020-10-26 03:31:38 -0700920TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
921 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
922
923 ASSERT_NO_FATAL_FAILURE(Init());
924 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
925
926 m_commandBuffer->begin();
927 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
928
929 VkClearAttachment attachment;
930 attachment.clearValue.color.float32[0] = 0;
931 attachment.clearValue.color.float32[1] = 0;
932 attachment.clearValue.color.float32[2] = 0;
933 attachment.clearValue.color.float32[3] = 0;
934 attachment.colorAttachment = 0;
935 VkClearRect clear_rect = {};
936 clear_rect.rect.offset = {0, 0};
937 clear_rect.rect.extent = {1, 1};
938 clear_rect.baseArrayLayer = 0;
939 clear_rect.layerCount = 1;
940
941 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
943 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
944 m_errorMonitor->VerifyFound();
945
946 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
947 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
948 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
949 m_errorMonitor->VerifyFound();
950
951 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
953 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
954 m_errorMonitor->VerifyFound();
955
956 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
958 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
959 m_errorMonitor->VerifyFound();
960}
961
sfricke-samsung91f4a542020-10-21 00:29:17 -0700962TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
963 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
964
965 ASSERT_NO_FATAL_FAILURE(Init());
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 color_attachment;
972 color_attachment.clearValue.color.float32[0] = 0;
973 color_attachment.clearValue.color.float32[1] = 0;
974 color_attachment.clearValue.color.float32[2] = 0;
975 color_attachment.clearValue.color.float32[3] = 0;
976 color_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 color_attachment.aspectMask = 0;
984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
985 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
986 m_errorMonitor->VerifyFound();
987
988 color_attachment.aspectMask = 0xffffffff;
989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
990 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
991 m_errorMonitor->VerifyFound();
992}
993
sfricke-samsung87b09512020-10-26 03:35:42 -0700994TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
995 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
996
997 ASSERT_NO_FATAL_FAILURE(Init());
998 // Creates a color attachment
999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1000
1001 m_commandBuffer->begin();
1002 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
1003
1004 VkClearAttachment attachment;
1005 attachment.clearValue.color.float32[0] = 0;
1006 attachment.clearValue.color.float32[1] = 0;
1007 attachment.clearValue.color.float32[2] = 0;
1008 attachment.clearValue.color.float32[3] = 0;
1009 attachment.colorAttachment = 0;
1010 VkClearRect clear_rect = {};
1011 clear_rect.rect.offset = {0, 0};
1012 clear_rect.rect.extent = {1, 1};
1013 clear_rect.baseArrayLayer = 0;
1014 clear_rect.layerCount = 1;
1015
1016 m_errorMonitor->ExpectSuccess();
1017 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1018 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1019 m_errorMonitor->VerifyNotFound();
1020
1021 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
1022 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1023 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1024 m_errorMonitor->VerifyFound();
1025
1026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
1027 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1028 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1029 m_errorMonitor->VerifyFound();
1030}
1031
unknown088160a2019-05-23 17:43:13 -06001032TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1033 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1034
1035 ASSERT_NO_FATAL_FAILURE(Init());
1036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1037
1038 // An empty primary command buffer
1039 VkCommandBufferObj cb(m_device, m_commandPool);
1040 cb.begin();
1041 cb.end();
1042
1043 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001044 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001045 VkCommandBuffer handle = cb.handle();
1046
Mark Lobodzinski20310782020-02-28 14:25:17 -07001047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001048 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001049 m_errorMonitor->VerifyFound();
1050
1051 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1052
1053 m_commandBuffer->EndRenderPass();
1054 m_commandBuffer->end();
1055}
1056
Petr Kraus8e53cf02020-01-03 05:30:04 +01001057TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1058 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1059
1060 ASSERT_NO_FATAL_FAILURE(Init());
1061
1062 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1063 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1064 secondary_cb.begin();
1065 secondary_cb.end();
1066
1067 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001069 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1070 m_errorMonitor->VerifyFound();
1071}
1072
unknown088160a2019-05-23 17:43:13 -06001073TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1074 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1075
1076 ASSERT_NO_FATAL_FAILURE(Init());
1077 ASSERT_NO_FATAL_FAILURE(InitViewport());
1078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1079
1080 const VkPipelineLayoutObj pipeline_layout(m_device);
1081
1082 struct VboEntry {
1083 uint16_t input0[2];
1084 uint32_t input1;
1085 float input2[4];
1086 };
1087
1088 const unsigned vbo_entry_count = 3;
1089 const VboEntry vbo_data[vbo_entry_count] = {};
1090
1091 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1092 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1093
1094 VkVertexInputBindingDescription input_binding;
1095 input_binding.binding = 0;
1096 input_binding.stride = sizeof(VboEntry);
1097 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1098
1099 VkVertexInputAttributeDescription input_attribs[3];
1100
1101 input_attribs[0].binding = 0;
1102 // Location switch between attrib[0] and attrib[1] is intentional
1103 input_attribs[0].location = 1;
1104 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1105 input_attribs[0].offset = offsetof(VboEntry, input1);
1106
1107 input_attribs[1].binding = 0;
1108 input_attribs[1].location = 0;
1109 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1110 input_attribs[1].offset = offsetof(VboEntry, input0);
1111
1112 input_attribs[2].binding = 0;
1113 input_attribs[2].location = 2;
1114 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1115 input_attribs[2].offset = offsetof(VboEntry, input2);
1116
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001117 char const *vsSource = R"glsl(
1118 #version 450
1119 layout(location = 0) in vec2 input0;
1120 layout(location = 1) in vec4 input1;
1121 layout(location = 2) in vec4 input2;
1122 void main(){
1123 gl_Position = input1 + input2;
1124 gl_Position.xy += input0;
1125 }
1126 )glsl";
unknown088160a2019-05-23 17:43:13 -06001127
1128 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001129 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001130
1131 VkPipelineObj pipe1(m_device);
1132 pipe1.AddDefaultColorAttachment();
1133 pipe1.AddShader(&vs);
1134 pipe1.AddShader(&fs);
1135 pipe1.AddVertexInputBindings(&input_binding, 1);
1136 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1137 pipe1.SetViewport(m_viewports);
1138 pipe1.SetScissor(m_scissors);
1139 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1140
1141 input_binding.stride = 6;
1142
1143 VkPipelineObj pipe2(m_device);
1144 pipe2.AddDefaultColorAttachment();
1145 pipe2.AddShader(&vs);
1146 pipe2.AddShader(&fs);
1147 pipe2.AddVertexInputBindings(&input_binding, 1);
1148 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1149 pipe2.SetViewport(m_viewports);
1150 pipe2.SetScissor(m_scissors);
1151 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1152
1153 m_commandBuffer->begin();
1154 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1155
1156 // Test with invalid buffer offset
1157 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001158 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1159 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001160 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
1161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
1162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001163 m_commandBuffer->Draw(1, 0, 0, 0);
1164 m_errorMonitor->VerifyFound();
1165
1166 // Test with invalid buffer stride
1167 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001168 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1169 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001170 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -06001171 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -07001172 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001173 m_commandBuffer->Draw(1, 0, 0, 0);
1174 m_errorMonitor->VerifyFound();
1175
1176 m_commandBuffer->EndRenderPass();
1177 m_commandBuffer->end();
1178}
1179
1180TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1181 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001182 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001183
1184 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1185
1186 secondary.begin();
1187 secondary.end();
1188
1189 VkCommandBufferBeginInfo cbbi = {
1190 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1191 nullptr,
1192 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1193 nullptr,
1194 };
1195
1196 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001197 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001198 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001199 m_errorMonitor->VerifyFound();
1200 m_commandBuffer->end();
1201}
1202
1203TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1204 ASSERT_NO_FATAL_FAILURE(Init());
1205
John Zulauff1640d12019-08-13 15:39:58 -06001206 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001207
1208 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1209
1210 VkCommandBufferInheritanceInfo inh = {
1211 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1212 nullptr,
1213 };
1214 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1215
1216 secondary.begin(&cbbi);
1217 secondary.end();
1218
1219 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001220 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001222 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001223 m_errorMonitor->VerifyFound();
1224 m_commandBuffer->end();
1225}
1226
1227TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1228 ASSERT_NO_FATAL_FAILURE(Init());
1229
1230 // variation on previous test executing the same CB twice in the same
1231 // CmdExecuteCommands call
1232
John Zulauff1640d12019-08-13 15:39:58 -06001233 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001234
1235 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1236
1237 VkCommandBufferInheritanceInfo inh = {
1238 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1239 nullptr,
1240 };
1241 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1242
1243 secondary.begin(&cbbi);
1244 secondary.end();
1245
1246 m_commandBuffer->begin();
1247 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001249 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001250 m_errorMonitor->VerifyFound();
1251 m_commandBuffer->end();
1252}
1253
1254TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1255 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1256 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1257 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1258 ASSERT_NO_FATAL_FAILURE(Init());
1259
1260 VkCommandBuffer cmd_bufs[2];
1261 VkCommandBufferAllocateInfo alloc_info;
1262 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1263 alloc_info.pNext = NULL;
1264 alloc_info.commandBufferCount = 2;
1265 alloc_info.commandPool = m_commandPool->handle();
1266 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001267 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001268
1269 VkCommandBufferBeginInfo cb_binfo;
1270 cb_binfo.pNext = NULL;
1271 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1272 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1273 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001274 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001275 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001276 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1277 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001278 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1279
1280 VkSubmitInfo submit_info = {};
1281 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1282 submit_info.commandBufferCount = 2;
1283 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001284 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001285 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001286 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001287 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001288
1289 // Set one time use and now look for one time submit
1290 duplicates[0] = duplicates[1] = cmd_bufs[1];
1291 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 -06001292 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1293 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1294 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001296 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001297 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001298 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001299}
1300
1301TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1302 TEST_DESCRIPTION(
1303 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1304
Mark Lobodzinski20310782020-02-28 14:25:17 -07001305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001306
1307 ASSERT_NO_FATAL_FAILURE(Init());
1308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1309
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001310 char const *fsSource = R"glsl(
1311 #version 450
1312 layout(set=0, binding=0) uniform sampler3D s;
1313 layout(location=0) out vec4 color;
1314 void main() {
1315 color = texture(s, vec3(0));
1316 }
1317 )glsl";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001318 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1320
1321 VkPipelineObj pipe(m_device);
1322 pipe.AddShader(&vs);
1323 pipe.AddShader(&fs);
1324 pipe.AddDefaultColorAttachment();
1325
1326 VkTextureObj texture(m_device, nullptr);
1327 VkSamplerObj sampler(m_device);
1328
1329 VkDescriptorSetObj descriptorSet(m_device);
1330 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1331 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1332
1333 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1334 ASSERT_VK_SUCCESS(err);
1335
1336 m_commandBuffer->begin();
1337 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1338
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001339 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001340 m_commandBuffer->BindDescriptorSet(descriptorSet);
1341
1342 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001343 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001344 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001345 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001346
1347 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001348 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001349
1350 m_errorMonitor->VerifyFound();
1351
1352 m_commandBuffer->EndRenderPass();
1353 m_commandBuffer->end();
1354}
1355
1356TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1357 TEST_DESCRIPTION(
1358 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1359 "vice versa.");
1360
Mark Lobodzinski20310782020-02-28 14:25:17 -07001361 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001362
1363 ASSERT_NO_FATAL_FAILURE(Init());
1364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1365
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001366 char const *fsSource = R"glsl(
1367 #version 450
1368 layout(set=0, binding=0) uniform sampler2DMS s;
1369 layout(location=0) out vec4 color;
1370 void main() {
1371 color = texelFetch(s, ivec2(0), 0);
1372 }
1373 )glsl";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001374 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001375 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1376
1377 VkPipelineObj pipe(m_device);
1378 pipe.AddShader(&vs);
1379 pipe.AddShader(&fs);
1380 pipe.AddDefaultColorAttachment();
1381
1382 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1383 VkSamplerObj sampler(m_device);
1384
1385 VkDescriptorSetObj descriptorSet(m_device);
1386 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1387 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1388
1389 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1390 ASSERT_VK_SUCCESS(err);
1391
1392 m_commandBuffer->begin();
1393 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1394
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001395 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001396 m_commandBuffer->BindDescriptorSet(descriptorSet);
1397
1398 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001399 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001400 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001401 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001402
1403 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001404 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001405
1406 m_errorMonitor->VerifyFound();
1407
1408 m_commandBuffer->EndRenderPass();
1409 m_commandBuffer->end();
1410}
1411
1412TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1413 TEST_DESCRIPTION(
1414 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1415
Mark Lobodzinski20310782020-02-28 14:25:17 -07001416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001417
1418 ASSERT_NO_FATAL_FAILURE(Init());
1419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1420
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07001421 char const *fsSource = R"glsl(
1422 #version 450
1423 layout(set=0, binding=0) uniform isampler2D s;
1424 layout(location=0) out vec4 color;
1425 void main() {
1426 color = texelFetch(s, ivec2(0), 0);
1427 }
1428 )glsl";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001429 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001430 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1431
1432 VkPipelineObj pipe(m_device);
1433 pipe.AddShader(&vs);
1434 pipe.AddShader(&fs);
1435 pipe.AddDefaultColorAttachment();
1436
1437 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1438 VkSamplerObj sampler(m_device);
1439
1440 VkDescriptorSetObj descriptorSet(m_device);
1441 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1442 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1443
1444 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1445 ASSERT_VK_SUCCESS(err);
1446
1447 m_commandBuffer->begin();
1448 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1449
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001450 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001451 m_commandBuffer->BindDescriptorSet(descriptorSet);
1452
1453 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001454 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001455 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001456 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001457
1458 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001459 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001460
1461 m_errorMonitor->VerifyFound();
1462
1463 m_commandBuffer->EndRenderPass();
1464 m_commandBuffer->end();
1465}
1466
unknown088160a2019-05-23 17:43:13 -06001467TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1468 TEST_DESCRIPTION(
1469 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001470 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1471 bool maintenance1 = false;
1472 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
1473 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1474 maintenance1 = true;
1475 }
1476 ASSERT_NO_FATAL_FAILURE(InitState());
1477
1478 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1479 VkFormatProperties format_props;
1480 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1481 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1482 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1483 return;
1484 }
unknown088160a2019-05-23 17:43:13 -06001485
1486 // Create two images to copy between
1487 VkImageObj src_image_obj(m_device);
1488 VkImageObj dst_image_obj(m_device);
1489
1490 VkImageCreateInfo image_create_info = {};
1491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1492 image_create_info.pNext = NULL;
1493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001494 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001495 image_create_info.extent.width = 32;
1496 image_create_info.extent.height = 32;
1497 image_create_info.extent.depth = 1;
1498 image_create_info.mipLevels = 1;
1499 image_create_info.arrayLayers = 4;
1500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1502 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1503 image_create_info.flags = 0;
1504
1505 src_image_obj.init(&image_create_info);
1506 ASSERT_TRUE(src_image_obj.initialized());
1507
1508 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1509 dst_image_obj.init(&image_create_info);
1510 ASSERT_TRUE(dst_image_obj.initialized());
1511
1512 m_commandBuffer->begin();
1513 VkImageCopy copyRegion;
1514 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1515 copyRegion.srcSubresource.mipLevel = 0;
1516 copyRegion.srcSubresource.baseArrayLayer = 0;
1517 copyRegion.srcSubresource.layerCount = 1;
1518 copyRegion.srcOffset.x = 0;
1519 copyRegion.srcOffset.y = 0;
1520 copyRegion.srcOffset.z = 0;
1521 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1522 copyRegion.dstSubresource.mipLevel = 0;
1523 copyRegion.dstSubresource.baseArrayLayer = 0;
1524 // Introduce failure by forcing the dst layerCount to differ from src
1525 copyRegion.dstSubresource.layerCount = 3;
1526 copyRegion.dstOffset.x = 0;
1527 copyRegion.dstOffset.y = 0;
1528 copyRegion.dstOffset.z = 0;
1529 copyRegion.extent.width = 1;
1530 copyRegion.extent.height = 1;
1531 copyRegion.extent.depth = 1;
1532
sfricke-samsung30b094c2020-05-30 11:42:11 -07001533 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001535 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1536 &copyRegion);
1537 m_errorMonitor->VerifyFound();
1538}
1539
1540TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1541 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1542
Jeff Leger465acf52020-10-12 18:07:16 -04001543 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1544
1545 bool copy_commands2 = false;
1546 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1547 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1548 copy_commands2 = true;
1549 }
1550 ASSERT_NO_FATAL_FAILURE(InitState());
1551
1552 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001553 if (copy_commands2) {
1554 vkCmdCopyBufferToImage2Function =
1555 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001556 }
unknown088160a2019-05-23 17:43:13 -06001557
1558 VkPhysicalDeviceFeatures device_features = {};
1559 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1560 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1561 if (device_features.textureCompressionBC) {
1562 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1563 } else if (device_features.textureCompressionETC2) {
1564 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1565 } else if (device_features.textureCompressionASTC_LDR) {
1566 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1567 } else {
1568 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1569 return;
1570 }
1571
1572 VkImageCreateInfo ci;
1573 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1574 ci.pNext = NULL;
1575 ci.flags = 0;
1576 ci.imageType = VK_IMAGE_TYPE_2D;
1577 ci.format = compressed_format;
1578 ci.extent = {32, 32, 1};
1579 ci.mipLevels = 6;
1580 ci.arrayLayers = 1;
1581 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1582 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1583 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1584 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1585 ci.queueFamilyIndexCount = 0;
1586 ci.pQueueFamilyIndices = NULL;
1587 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1588
1589 VkImageObj image(m_device);
1590 image.init(&ci);
1591 ASSERT_TRUE(image.initialized());
1592
1593 VkImageObj odd_image(m_device);
1594 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1595 odd_image.init(&ci);
1596 ASSERT_TRUE(odd_image.initialized());
1597
1598 // Allocate buffers
1599 VkMemoryPropertyFlags reqs = 0;
1600 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1601 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1602 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1603 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1604 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1605
1606 VkBufferImageCopy region = {};
1607 region.bufferRowLength = 0;
1608 region.bufferImageHeight = 0;
1609 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1610 region.imageSubresource.layerCount = 1;
1611 region.imageOffset = {0, 0, 0};
1612 region.bufferOffset = 0;
1613
1614 // start recording
1615 m_commandBuffer->begin();
1616
locke-lunargdf00db02020-03-04 19:00:57 -07001617 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001618 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001619 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1620 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001621 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001622 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1623 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001624 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001625 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1626 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1627
unknown088160a2019-05-23 17:43:13 -06001628 // Mip level copies that work - 5 levels
1629 m_errorMonitor->ExpectSuccess();
1630
1631 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1632 region.imageExtent = {32, 32, 1};
1633 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001634 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001635
1636 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1637 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001638 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001639
1640 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1641 region.imageExtent = {8, 8, 1};
1642 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001643 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001644
1645 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1646 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001647 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001648
1649 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1650 region.imageExtent = {4, 4, 1};
1651 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001652 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001653
1654 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1655 &mem_barriers[1], 0, nullptr, 0, nullptr);
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
1658 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1659 region.imageExtent = {2, 2, 1};
1660 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001661
1662 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1663 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001664 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001665
1666 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1667 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001668 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001669
1670 region.imageExtent = {1, 1, 1};
1671 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001672
1673 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1674 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001675 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001676
1677 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1678 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001679 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001680 m_errorMonitor->VerifyNotFound();
1681
1682 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001684 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001685 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001686 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001687 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001688 m_errorMonitor->VerifyFound();
1689
1690 // Copy width < compressed block size, but not the full mip width
1691 region.imageExtent = {1, 2, 1};
1692 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001693 // width not a multiple of compressed block width
1694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001696 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001697 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001698 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001699
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001700 m_errorMonitor->SetDesiredFailureMsg(
1701 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001703 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001704 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001705 m_errorMonitor->VerifyFound();
1706
1707 // Copy height < compressed block size but not the full mip height
1708 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001709 m_errorMonitor->SetDesiredFailureMsg(
1710 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001712 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001713 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001714 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001715
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001716 m_errorMonitor->SetDesiredFailureMsg(
1717 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001719 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001720 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001721 m_errorMonitor->VerifyFound();
1722
1723 // Offsets must be multiple of compressed block size
1724 region.imageOffset = {1, 1, 0};
1725 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001726 // imageOffset not a multiple of block size
1727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001729 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001730 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001731 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001732
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001733 m_errorMonitor->SetDesiredFailureMsg(
1734 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001736 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001737 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001738 m_errorMonitor->VerifyFound();
1739
Jeff Leger465acf52020-10-12 18:07:16 -04001740 // Equivalent test using KHR_copy_commands2
1741 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1742 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1743 NULL,
1744 region.bufferOffset,
1745 region.bufferRowLength,
1746 region.bufferImageHeight,
1747 region.imageSubresource,
1748 region.imageOffset,
1749 region.imageExtent};
1750 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1751 NULL,
1752 buffer_16.handle(),
1753 image.handle(),
1754 VK_IMAGE_LAYOUT_GENERAL,
1755 1,
1756 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001757 m_errorMonitor->SetDesiredFailureMsg(
1758 kErrorBit, "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1760 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1761 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1762 m_errorMonitor->VerifyFound();
1763 }
1764
unknown088160a2019-05-23 17:43:13 -06001765 // Offset + extent width = mip width - should succeed
1766 region.imageOffset = {4, 4, 0};
1767 region.imageExtent = {3, 4, 1};
1768 region.imageSubresource.mipLevel = 2;
1769 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001770
1771 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1772 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001773 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1774 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001775
1776 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1777 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001778 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1779 &region);
unknown088160a2019-05-23 17:43:13 -06001780 m_errorMonitor->VerifyNotFound();
1781
unknown088160a2019-05-23 17:43:13 -06001782 // Offset + extent width < mip width and not a multiple of block width - should fail
1783 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001784 m_errorMonitor->SetDesiredFailureMsg(
1785 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001787 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001788 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1789 &region);
unknown088160a2019-05-23 17:43:13 -06001790 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001791 m_errorMonitor->SetDesiredFailureMsg(
1792 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001793 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001794 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001795 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1796 &region);
unknown088160a2019-05-23 17:43:13 -06001797 m_errorMonitor->VerifyFound();
1798}
1799
1800TEST_F(VkLayerTest, ImageBufferCopyTests) {
1801 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001802
1803 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1804 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1805 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1806 if (mp_extensions) {
1807 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1808 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001809 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001810 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1811 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1812 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1813 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1814 if (mp_extensions) {
1815 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1816 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1817 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1818 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1819 }
1820 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001821
1822 // Bail if any dimension of transfer granularity is 0.
1823 auto index = m_device->graphics_queue_node_index_;
1824 auto queue_family_properties = m_device->phy().queue_properties();
1825 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1826 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1827 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1828 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1829 return;
1830 }
1831
sfricke-samsung6d97e562020-01-07 22:01:00 -08001832 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1833 // 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 -07001834 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1835 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001836 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001837 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1838 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1839 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1840 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1841 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001842 // compression
1843 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1844 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1845 // multi-planar
1846 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 -06001847
sfricke-samsung6d97e562020-01-07 22:01:00 -08001848 // Verify R8G8B8A8_UINT format is supported for transfer
1849 bool missing_rgba_support = false;
1850 VkFormatProperties props = {0, 0, 0};
1851 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1852 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1853 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1854 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1855
1856 if (!missing_rgba_support) {
1857 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1858 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1859 VK_IMAGE_TILING_OPTIMAL, 0);
1860 ASSERT_TRUE(image_64k.initialized());
1861
1862 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1863 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1864 VK_IMAGE_TILING_OPTIMAL, 0);
1865 ASSERT_TRUE(image_16k.initialized());
1866 }
unknown088160a2019-05-23 17:43:13 -06001867
1868 // Verify all needed Depth/Stencil formats are supported
1869 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001870 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001871 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1872 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1873 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001874 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001875 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1876 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1877 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001878 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001879 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1880 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1881 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001882 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001883 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1884 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1885 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1886
1887 if (!missing_ds_support) {
1888 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1889 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1890 ASSERT_TRUE(image_16k_depth.initialized());
1891
1892 ds_image_4D_1S.Init(
1893 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1894 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1895 VK_IMAGE_TILING_OPTIMAL, 0);
1896 ASSERT_TRUE(ds_image_4D_1S.initialized());
1897
1898 ds_image_3D_1S.Init(
1899 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1900 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1901 VK_IMAGE_TILING_OPTIMAL, 0);
1902 ASSERT_TRUE(ds_image_3D_1S.initialized());
1903
1904 ds_image_2D.Init(
1905 256, 256, 1, VK_FORMAT_D16_UNORM,
1906 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1907 VK_IMAGE_TILING_OPTIMAL, 0);
1908 ASSERT_TRUE(ds_image_2D.initialized());
1909
1910 ds_image_1S.Init(
1911 256, 256, 1, VK_FORMAT_S8_UINT,
1912 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1913 VK_IMAGE_TILING_OPTIMAL, 0);
1914 ASSERT_TRUE(ds_image_1S.initialized());
1915 }
1916
1917 // Allocate buffers
1918 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1919 VkMemoryPropertyFlags reqs = 0;
1920 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1921 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1922 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1923 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1924
1925 VkBufferImageCopy region = {};
1926 region.bufferRowLength = 0;
1927 region.bufferImageHeight = 0;
1928 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1929 region.imageSubresource.layerCount = 1;
1930 region.imageOffset = {0, 0, 0};
1931 region.imageExtent = {64, 64, 1};
1932 region.bufferOffset = 0;
1933
locke-lunargdf00db02020-03-04 19:00:57 -07001934 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001935 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001936 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1937 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001938 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001939 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1940 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001941 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001942 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1943 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1944
sfricke-samsung6d97e562020-01-07 22:01:00 -08001945 if (missing_rgba_support) {
1946 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001947
sfricke-samsung6d97e562020-01-07 22:01:00 -08001948 // start recording for future tests
1949 m_commandBuffer->begin();
1950 } else {
1951 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001953 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1954 &region);
unknown088160a2019-05-23 17:43:13 -06001955 m_errorMonitor->VerifyFound();
1956
Mark Lobodzinski20310782020-02-28 14:25:17 -07001957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001958 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1959 &region);
1960 m_errorMonitor->VerifyFound();
1961
1962 // start recording
1963 m_commandBuffer->begin();
1964
1965 // successful copies
1966 m_errorMonitor->ExpectSuccess();
1967 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1968 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001969
1970 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1971 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001972 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1973 &region);
1974 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001975
1976 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1977 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001978 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1979 &region);
1980 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001981
1982 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1983 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001984 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1985 &region);
1986 region.imageOffset.x = 0;
1987 region.imageExtent.height = 64;
1988 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001989
1990 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1991 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001992 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1993 &region);
1994 m_errorMonitor->VerifyNotFound();
1995
1996 // image/buffer too small (extent too large) on copy to image
1997 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001998 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001999 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2000 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2001 &region);
2002 m_errorMonitor->VerifyFound();
2003
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002004 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002006 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2007 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2008 &region);
2009 m_errorMonitor->VerifyFound();
2010
2011 // image/buffer too small (offset) on copy to image
2012 region.imageExtent = {64, 64, 1};
2013 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07002014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002015 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2016 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2017 &region);
2018 m_errorMonitor->VerifyFound();
2019
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002020 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2021 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002022 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002023 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2024 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2025 &region);
2026 m_errorMonitor->VerifyFound();
2027
2028 // image/buffer too small on copy to buffer
2029 region.imageExtent = {64, 64, 1};
2030 region.imageOffset = {0, 0, 0};
2031 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002032 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002033 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
2034 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2035 &region);
2036 m_errorMonitor->VerifyFound();
2037
2038 region.imageExtent = {64, 65, 1};
2039 region.bufferOffset = 0;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002040 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002041 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002042 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
2043 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
2044 &region);
2045 m_errorMonitor->VerifyFound();
2046
2047 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002049 region.imageExtent = {64, 64, 1};
2050 region.bufferRowLength = 68;
2051 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2052 &region);
2053 m_errorMonitor->VerifyFound();
2054
2055 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002056 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002057 region.imageExtent.width = 0;
2058 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2059 &region);
2060 m_errorMonitor->VerifyFound();
2061
2062 // aspect bits
2063 region.imageExtent = {64, 64, 1};
2064 region.bufferRowLength = 0;
2065 region.bufferImageHeight = 0;
2066 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002067 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002068 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2069 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2070 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2071 buffer_16k.handle(), 1, &region);
2072 m_errorMonitor->VerifyFound();
2073
Mark Lobodzinski20310782020-02-28 14:25:17 -07002074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002075 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002076 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2077 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2078 buffer_16k.handle(), 1, &region);
2079 m_errorMonitor->VerifyFound();
2080 }
2081
Mark Lobodzinski20310782020-02-28 14:25:17 -07002082 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002083 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002084 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2085 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2086 &region);
2087 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002088 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002089
2090 // Out-of-range mip levels should fail
2091 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002093 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00197");
2094 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
2095 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002096 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002097 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002098 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
2099 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2100 &region);
2101 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002102 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002103 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2104 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2105 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002106 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002107 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002108 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
2109 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2110 &region);
2111 m_errorMonitor->VerifyFound();
2112 region.imageSubresource.mipLevel = 0;
2113
2114 // Out-of-range array layers should fail
2115 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2116 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002118 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2119 &region);
2120 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002121 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002122 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2123 &region);
2124 m_errorMonitor->VerifyFound();
2125 region.imageSubresource.baseArrayLayer = 0;
2126
2127 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002128 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002129 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2130 buffer_16k.handle(), 1, &region);
2131 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002133 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2134 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002135 m_errorMonitor->VerifyFound();
2136 }
2137
unknown088160a2019-05-23 17:43:13 -06002138 // Test Depth/Stencil copies
2139 if (missing_ds_support) {
2140 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2141 } else {
2142 VkBufferImageCopy ds_region = {};
2143 ds_region.bufferOffset = 0;
2144 ds_region.bufferRowLength = 0;
2145 ds_region.bufferImageHeight = 0;
2146 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2147 ds_region.imageSubresource.mipLevel = 0;
2148 ds_region.imageSubresource.baseArrayLayer = 0;
2149 ds_region.imageSubresource.layerCount = 1;
2150 ds_region.imageOffset = {0, 0, 0};
2151 ds_region.imageExtent = {256, 256, 1};
2152
2153 // Depth copies that should succeed
2154 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002155 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2156 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002157 m_errorMonitor->VerifyNotFound();
2158
2159 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002160 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2161 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002162 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2163 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002164 m_errorMonitor->VerifyNotFound();
2165
2166 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002167 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2168 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002169 m_errorMonitor->VerifyNotFound();
2170
2171 // Depth copies that should fail
2172 ds_region.bufferOffset = 4;
2173 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002174 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002175 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002176 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2177 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002178 m_errorMonitor->VerifyFound();
2179
2180 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002181 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002182 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002183 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002184 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002185 m_errorMonitor->VerifyFound();
2186
2187 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002188 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002189 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002190 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2191 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002192 m_errorMonitor->VerifyFound();
2193
sfricke-samsung5a019492021-01-25 10:32:08 -08002194 ds_region.bufferOffset = 5;
2195 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2196 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2197 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2198 buffer_128k.handle(), 1, &ds_region);
2199 m_errorMonitor->VerifyFound();
2200 ds_region.imageExtent = {256, 256, 1};
2201
unknown088160a2019-05-23 17:43:13 -06002202 // Stencil copies that should succeed
2203 ds_region.bufferOffset = 0;
2204 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2205 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002206 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2207 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002208 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2209 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002210 m_errorMonitor->VerifyNotFound();
2211
2212 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002213 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2214 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002215 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2216 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002217 m_errorMonitor->VerifyNotFound();
2218
2219 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002220 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2221 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002222 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2223 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002224 m_errorMonitor->VerifyNotFound();
2225
2226 // Stencil copies that should fail
2227 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002228 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002229 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002230 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2231 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002232 m_errorMonitor->VerifyFound();
2233
2234 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002235 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002236 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2237 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002238 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2239 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002240 m_errorMonitor->VerifyFound();
2241
2242 ds_region.bufferRowLength = 0;
2243 ds_region.bufferOffset = 4;
2244 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002245 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002246 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002247 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2248 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002249 m_errorMonitor->VerifyFound();
2250 }
2251
2252 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002253 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002254 VkPhysicalDeviceFeatures device_features = {};
2255 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2256 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2257 device_features.textureCompressionASTC_LDR)) {
2258 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2259 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002260 // Verify transfer support for each compression format used blow
2261 bool missing_bc_support = false;
2262 bool missing_etc_support = false;
2263 bool missing_astc_support = false;
2264 bool missing_compression_support = false;
2265
2266 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2267 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2268 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2269 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2270
2271 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2272 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2273 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2274 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2275
2276 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2277 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2278 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2279 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2280
2281 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002282 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2283 0);
2284 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2285 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002286 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002287 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2288 VK_IMAGE_TILING_OPTIMAL, 0);
2289 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2290 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002291 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002292 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2293 VK_IMAGE_TILING_OPTIMAL, 0);
2294 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2295 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002296 } else {
2297 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002298 }
unknown088160a2019-05-23 17:43:13 -06002299
sfricke-samsung6d97e562020-01-07 22:01:00 -08002300 if (missing_compression_support) {
2301 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2302 } else {
2303 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002304 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002305 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002306 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2307 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002308 m_errorMonitor->ExpectSuccess();
2309 region.imageExtent = {128, 128, 1};
2310 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2311 buffer_16k.handle(), 1, &region);
2312 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002313
sfricke-samsung6d97e562020-01-07 22:01:00 -08002314 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002316 region.bufferOffset = 16;
2317 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2318 buffer_16k.handle(), 1, &region);
2319 m_errorMonitor->VerifyFound();
2320 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002321
sfricke-samsung6d97e562020-01-07 22:01:00 -08002322 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002323 m_errorMonitor->SetDesiredFailureMsg(
2324 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002325 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002326 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2327 region.imageExtent.width = 66;
2328 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2329 buffer_16k.handle(), 1, &region);
2330 m_errorMonitor->VerifyFound();
2331 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002332
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002333 m_errorMonitor->SetDesiredFailureMsg(
2334 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002335 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002336 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2337 region.imageExtent.height = 2;
2338 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2339 buffer_16k.handle(), 1, &region);
2340 m_errorMonitor->VerifyFound();
2341 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002342
sfricke-samsung6d97e562020-01-07 22:01:00 -08002343 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002344
sfricke-samsung6d97e562020-01-07 22:01:00 -08002345 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2346 m_errorMonitor->ExpectSuccess();
2347 region.imageExtent.width = 66;
2348 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002349 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2350 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002351 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2352 buffer_16k.handle(), 1, &region);
2353 region.imageExtent.width = 16;
2354 region.imageOffset.x = 0;
2355 region.imageExtent.height = 2;
2356 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002357 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2358 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002359 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2360 buffer_16k.handle(), 1, &region);
2361 m_errorMonitor->VerifyNotFound();
2362 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002363
sfricke-samsung6d97e562020-01-07 22:01:00 -08002364 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002365 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002366 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002367 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002368 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002369 region.imageExtent = {64, 64, 1};
2370 region.bufferOffset = 24;
2371 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2372 buffer_16k.handle(), 1, &region);
2373 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002374
sfricke-samsung6d97e562020-01-07 22:01:00 -08002375 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002376 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002377 region.bufferOffset = 0;
2378 region.bufferRowLength = 130;
2379 region.bufferImageHeight = 0;
2380 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2381 buffer_64k.handle(), 1, &region);
2382 m_errorMonitor->VerifyFound();
2383
2384 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002385 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002386 region.bufferRowLength = 0;
2387 region.bufferImageHeight = 130;
2388 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2389 buffer_64k.handle(), 1, &region);
2390 m_errorMonitor->VerifyFound();
2391 }
2392 }
2393
2394 // Test multi-planar formats, if supported
2395 if (!mp_extensions) {
2396 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2397 } else {
2398 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2399 // being required with samplerYcbcrConversion feature
2400 bool missing_mp_support = false;
2401 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2402 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2403 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2404 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2405
2406 if (missing_mp_support) {
2407 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2408 } else {
2409 VkBufferImageCopy mp_region = {};
2410 mp_region.bufferOffset = 0;
2411 mp_region.bufferRowLength = 0;
2412 mp_region.bufferImageHeight = 0;
2413 mp_region.imageSubresource.mipLevel = 0;
2414 mp_region.imageSubresource.baseArrayLayer = 0;
2415 mp_region.imageSubresource.layerCount = 1;
2416 mp_region.imageOffset = {0, 0, 0};
2417 mp_region.imageExtent = {128, 128, 1};
2418
2419 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2420 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2421 VK_IMAGE_TILING_OPTIMAL, 0);
2422 ASSERT_TRUE(image_multi_planar.initialized());
2423
2424 // Copies into a mutli-planar image aspect properly
2425 m_errorMonitor->ExpectSuccess();
2426 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002427 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2428 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002429 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2430 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2431 m_errorMonitor->VerifyNotFound();
2432
2433 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002434 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002435 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2436 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2437 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2438 m_errorMonitor->VerifyFound();
2439
2440 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002441 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002442 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2443 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2444 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2445 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002446
2447 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002449 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2450 mp_region.bufferOffset = 5;
2451 mp_region.imageExtent = {8, 8, 1};
2452 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2453 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2454 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002455 }
unknown088160a2019-05-23 17:43:13 -06002456 }
2457}
2458
2459TEST_F(VkLayerTest, MiscImageLayerTests) {
2460 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2461
2462 ASSERT_NO_FATAL_FAILURE(Init());
2463
2464 // TODO: Ideally we should check if a format is supported, before using it.
2465 VkImageObj image(m_device);
2466 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2467 ASSERT_TRUE(image.initialized());
2468 VkBufferObj buffer;
2469 VkMemoryPropertyFlags reqs = 0;
2470 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2471 VkBufferImageCopy region = {};
2472 region.bufferRowLength = 128;
2473 region.bufferImageHeight = 128;
2474 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2475 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2476 region.imageSubresource.layerCount = 1;
2477 region.imageExtent.height = 4;
2478 region.imageExtent.width = 4;
2479 region.imageExtent.depth = 1;
2480
2481 VkImageObj image2(m_device);
2482 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2483 ASSERT_TRUE(image2.initialized());
2484 VkBufferObj buffer2;
2485 VkMemoryPropertyFlags reqs2 = 0;
2486 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002487 m_commandBuffer->begin();
2488
2489 // Image must have offset.z of 0 and extent.depth of 1
2490 // Introduce failure by setting imageExtent.depth to 0
2491 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002492 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002493 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2494 &region);
unknown088160a2019-05-23 17:43:13 -06002495 m_errorMonitor->VerifyFound();
2496
2497 region.imageExtent.depth = 1;
2498
2499 // Image must have offset.z of 0 and extent.depth of 1
2500 // Introduce failure by setting imageOffset.z to 4
2501 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2502 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2504 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002506 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2507 &region);
unknown088160a2019-05-23 17:43:13 -06002508 m_errorMonitor->VerifyFound();
2509
2510 region.imageOffset.z = 0;
2511 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2512 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2513 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002514 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002515 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2516 &region);
unknown088160a2019-05-23 17:43:13 -06002517 m_errorMonitor->VerifyFound();
2518
unknown088160a2019-05-23 17:43:13 -06002519 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2520 region.bufferOffset = 0;
2521 region.imageExtent.height = 128;
2522 region.imageExtent.width = 128;
2523 // Introduce failure by setting bufferRowLength > 0 but less than width
2524 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002526 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2527 &region);
unknown088160a2019-05-23 17:43:13 -06002528 m_errorMonitor->VerifyFound();
2529
2530 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2531 region.bufferRowLength = 128;
2532 // Introduce failure by setting bufferRowHeight > 0 but less than height
2533 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002535 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2536 &region);
unknown088160a2019-05-23 17:43:13 -06002537 m_errorMonitor->VerifyFound();
2538
2539 region.bufferImageHeight = 128;
2540 VkImageObj intImage1(m_device);
2541 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2542 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2543 VkImageObj intImage2(m_device);
2544 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2545 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2546 VkImageBlit blitRegion = {};
2547 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2548 blitRegion.srcSubresource.baseArrayLayer = 0;
2549 blitRegion.srcSubresource.layerCount = 1;
2550 blitRegion.srcSubresource.mipLevel = 0;
2551 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2552 blitRegion.dstSubresource.baseArrayLayer = 0;
2553 blitRegion.dstSubresource.layerCount = 1;
2554 blitRegion.dstSubresource.mipLevel = 0;
2555 blitRegion.srcOffsets[0] = {128, 0, 0};
2556 blitRegion.srcOffsets[1] = {128, 128, 1};
2557 blitRegion.dstOffsets[0] = {0, 128, 0};
2558 blitRegion.dstOffsets[1] = {128, 128, 1};
2559
2560 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002561 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2562 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002563 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2564 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002565 m_errorMonitor->VerifyFound();
2566}
2567
2568TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2569 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002570 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2571
2572 bool copy_commands2 = false;
2573 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2574 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2575 copy_commands2 = true;
2576 }
2577 ASSERT_NO_FATAL_FAILURE(InitState());
2578
2579 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2580 if (copy_commands2) {
2581 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2582 }
unknown088160a2019-05-23 17:43:13 -06002583
sfricke-samsung30b094c2020-05-30 11:42:11 -07002584 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2585 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2586 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2587 return;
2588 }
2589
unknown088160a2019-05-23 17:43:13 -06002590 VkImageCreateInfo ci;
2591 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2592 ci.pNext = NULL;
2593 ci.flags = 0;
2594 ci.imageType = VK_IMAGE_TYPE_1D;
2595 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2596 ci.extent = {32, 1, 1};
2597 ci.mipLevels = 1;
2598 ci.arrayLayers = 1;
2599 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2600 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2601 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2602 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2603 ci.queueFamilyIndexCount = 0;
2604 ci.pQueueFamilyIndices = NULL;
2605 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2606
2607 // Create 1D image
2608 VkImageObj image_1D(m_device);
2609 image_1D.init(&ci);
2610 ASSERT_TRUE(image_1D.initialized());
2611
2612 // 2D image
2613 ci.imageType = VK_IMAGE_TYPE_2D;
2614 ci.extent = {32, 32, 1};
2615 VkImageObj image_2D(m_device);
2616 image_2D.init(&ci);
2617 ASSERT_TRUE(image_2D.initialized());
2618
2619 // 3D image
2620 ci.imageType = VK_IMAGE_TYPE_3D;
2621 ci.extent = {32, 32, 8};
2622 VkImageObj image_3D(m_device);
2623 image_3D.init(&ci);
2624 ASSERT_TRUE(image_3D.initialized());
2625
2626 // 2D image array
2627 ci.imageType = VK_IMAGE_TYPE_2D;
2628 ci.extent = {32, 32, 1};
2629 ci.arrayLayers = 8;
2630 VkImageObj image_2D_array(m_device);
2631 image_2D_array.init(&ci);
2632 ASSERT_TRUE(image_2D_array.initialized());
2633
2634 m_commandBuffer->begin();
2635
2636 VkImageCopy copy_region;
2637 copy_region.extent = {32, 1, 1};
2638 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2639 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2640 copy_region.srcSubresource.mipLevel = 0;
2641 copy_region.dstSubresource.mipLevel = 0;
2642 copy_region.srcSubresource.baseArrayLayer = 0;
2643 copy_region.dstSubresource.baseArrayLayer = 0;
2644 copy_region.srcSubresource.layerCount = 1;
2645 copy_region.dstSubresource.layerCount = 1;
2646 copy_region.srcOffset = {0, 0, 0};
2647 copy_region.dstOffset = {0, 0, 0};
2648
2649 // Sanity check
2650 m_errorMonitor->ExpectSuccess();
2651 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2652 &copy_region);
2653 m_errorMonitor->VerifyNotFound();
2654
Jeff Leger465acf52020-10-12 18:07:16 -04002655 // Equivalent sanity check using KHR_copy_commands2
2656 if (copy_commands2 && vkCmdCopyImage2Function) {
2657 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2658 NULL,
2659 copy_region.srcSubresource,
2660 copy_region.srcOffset,
2661 copy_region.dstSubresource,
2662 copy_region.dstOffset,
2663 copy_region.extent};
2664 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2665 NULL,
2666 image_1D.image(),
2667 VK_IMAGE_LAYOUT_GENERAL,
2668 image_2D.image(),
2669 VK_IMAGE_LAYOUT_GENERAL,
2670 1,
2671 &region2};
2672 m_errorMonitor->ExpectSuccess();
2673 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2674 m_errorMonitor->VerifyNotFound();
2675 }
2676
unknown088160a2019-05-23 17:43:13 -06002677 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2678 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002679 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002681 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2682 &copy_region);
2683 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002684
2685 // Equivalent test using KHR_copy_commands2
2686 if (copy_commands2 && vkCmdCopyImage2Function) {
2687 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2688 NULL,
2689 copy_region.srcSubresource,
2690 copy_region.srcOffset,
2691 copy_region.dstSubresource,
2692 copy_region.dstOffset,
2693 copy_region.extent};
2694 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2695 NULL,
2696 image_1D.image(),
2697 VK_IMAGE_LAYOUT_GENERAL,
2698 image_2D.image(),
2699 VK_IMAGE_LAYOUT_GENERAL,
2700 1,
2701 &region2};
2702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2704 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2705 m_errorMonitor->VerifyFound();
2706 }
2707
unknown088160a2019-05-23 17:43:13 -06002708 copy_region.srcOffset.y = 0;
2709 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002712 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2713 &copy_region);
2714 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002715
2716 // Equivalent test using KHR_copy_commands2
2717 if (copy_commands2 && vkCmdCopyImage2Function) {
2718 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2719 NULL,
2720 copy_region.srcSubresource,
2721 copy_region.srcOffset,
2722 copy_region.dstSubresource,
2723 copy_region.dstOffset,
2724 copy_region.extent};
2725 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2726 NULL,
2727 image_2D.image(),
2728 VK_IMAGE_LAYOUT_GENERAL,
2729 image_1D.image(),
2730 VK_IMAGE_LAYOUT_GENERAL,
2731 1,
2732 &region2};
2733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2735 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2736 m_errorMonitor->VerifyFound();
2737 }
2738
unknown088160a2019-05-23 17:43:13 -06002739 copy_region.dstOffset.y = 0;
2740
2741 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2742 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002745 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2746 &copy_region);
2747 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002748
2749 // Equivalent test using KHR_copy_commands2
2750 if (copy_commands2 && vkCmdCopyImage2Function) {
2751 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2752 NULL,
2753 copy_region.srcSubresource,
2754 copy_region.srcOffset,
2755 copy_region.dstSubresource,
2756 copy_region.dstOffset,
2757 copy_region.extent};
2758 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2759 NULL,
2760 image_1D.image(),
2761 VK_IMAGE_LAYOUT_GENERAL,
2762 image_2D.image(),
2763 VK_IMAGE_LAYOUT_GENERAL,
2764 1,
2765 &region2};
2766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2768 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2769 m_errorMonitor->VerifyFound();
2770 }
2771
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002774 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2775 &copy_region);
2776 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002777
2778 // Equivalent test using KHR_copy_commands2
2779 if (copy_commands2 && vkCmdCopyImage2Function) {
2780 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2781 NULL,
2782 copy_region.srcSubresource,
2783 copy_region.srcOffset,
2784 copy_region.dstSubresource,
2785 copy_region.dstOffset,
2786 copy_region.extent};
2787 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2788 NULL,
2789 image_2D.image(),
2790 VK_IMAGE_LAYOUT_GENERAL,
2791 image_1D.image(),
2792 VK_IMAGE_LAYOUT_GENERAL,
2793 1,
2794 &region2};
2795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2797 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2798 m_errorMonitor->VerifyFound();
2799 }
2800
unknown088160a2019-05-23 17:43:13 -06002801 copy_region.extent.height = 1;
2802
2803 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2804 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002805 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002807 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2808 &copy_region);
2809 m_errorMonitor->VerifyFound();
2810 copy_region.srcOffset.z = 0;
2811 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002814 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2815 &copy_region);
2816 m_errorMonitor->VerifyFound();
2817 copy_region.dstOffset.z = 0;
2818
2819 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2820 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002823 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002825 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002826 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002827 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002828 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2829 &copy_region);
2830 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002831 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002833 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002835 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002836 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002837 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002838 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2839 &copy_region);
2840 m_errorMonitor->VerifyFound();
2841 copy_region.extent.depth = 1;
2842
2843 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2844 copy_region.extent = {16, 16, 1};
2845 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002848 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002849 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2850 &copy_region);
2851 m_errorMonitor->VerifyFound();
2852 copy_region.srcOffset.z = 0;
2853 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002856 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002857 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2858 &copy_region);
2859 m_errorMonitor->VerifyFound();
2860 copy_region.dstOffset.z = 0;
2861
2862 // 3D texture accessing an array layer other than 0. VU 09c0011a
2863 copy_region.extent = {4, 4, 1};
2864 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002867 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2868 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2869 &copy_region);
2870 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002871 copy_region.srcSubresource.baseArrayLayer = 0;
2872
unknown088160a2019-05-23 17:43:13 -06002873 m_commandBuffer->end();
2874}
2875
2876TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2877 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002878 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002879 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2880 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2881 } else {
2882 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2883 return;
2884 }
2885 ASSERT_NO_FATAL_FAILURE(InitState());
2886
2887 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2888 VkFormatProperties format_props;
2889 // TODO: Remove this check if or when devsim handles extensions.
2890 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2891 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002892 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002893 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2894 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2895 return;
2896 }
2897
2898 VkImageCreateInfo ci;
2899 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2900 ci.pNext = NULL;
2901 ci.flags = 0;
2902 ci.imageType = VK_IMAGE_TYPE_1D;
2903 ci.format = image_format;
2904 ci.extent = {32, 1, 1};
2905 ci.mipLevels = 1;
2906 ci.arrayLayers = 1;
2907 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2908 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2909 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2910 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2911 ci.queueFamilyIndexCount = 0;
2912 ci.pQueueFamilyIndices = NULL;
2913 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2914
2915 // Create 1D image
2916 VkImageObj image_1D(m_device);
2917 image_1D.init(&ci);
2918 ASSERT_TRUE(image_1D.initialized());
2919
2920 // 2D image
2921 ci.imageType = VK_IMAGE_TYPE_2D;
2922 ci.extent = {32, 32, 1};
2923 VkImageObj image_2D(m_device);
2924 image_2D.init(&ci);
2925 ASSERT_TRUE(image_2D.initialized());
2926
2927 // 3D image
2928 ci.imageType = VK_IMAGE_TYPE_3D;
2929 ci.extent = {32, 32, 8};
2930 VkImageObj image_3D(m_device);
2931 image_3D.init(&ci);
2932 ASSERT_TRUE(image_3D.initialized());
2933
2934 // 2D image array
2935 ci.imageType = VK_IMAGE_TYPE_2D;
2936 ci.extent = {32, 32, 1};
2937 ci.arrayLayers = 8;
2938 VkImageObj image_2D_array(m_device);
2939 image_2D_array.init(&ci);
2940 ASSERT_TRUE(image_2D_array.initialized());
2941
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002942 // second 2D image array
2943 ci.imageType = VK_IMAGE_TYPE_2D;
2944 ci.extent = {32, 32, 1};
2945 ci.arrayLayers = 8;
2946 VkImageObj image_2D_array_2(m_device);
2947 image_2D_array_2.init(&ci);
2948 ASSERT_TRUE(image_2D_array_2.initialized());
2949
unknown088160a2019-05-23 17:43:13 -06002950 m_commandBuffer->begin();
2951
2952 VkImageCopy copy_region;
2953 copy_region.extent = {32, 1, 1};
2954 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2955 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2956 copy_region.srcSubresource.mipLevel = 0;
2957 copy_region.dstSubresource.mipLevel = 0;
2958 copy_region.srcSubresource.baseArrayLayer = 0;
2959 copy_region.dstSubresource.baseArrayLayer = 0;
2960 copy_region.srcSubresource.layerCount = 1;
2961 copy_region.dstSubresource.layerCount = 1;
2962 copy_region.srcOffset = {0, 0, 0};
2963 copy_region.dstOffset = {0, 0, 0};
2964
2965 // Copy from layer not present
2966 copy_region.srcSubresource.baseArrayLayer = 4;
2967 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002969 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2970 &copy_region);
2971 m_errorMonitor->VerifyFound();
2972 copy_region.srcSubresource.baseArrayLayer = 0;
2973 copy_region.srcSubresource.layerCount = 1;
2974
2975 // Copy to layer not present
2976 copy_region.dstSubresource.baseArrayLayer = 1;
2977 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002978 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002979 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2980 &copy_region);
2981 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002982 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002983 copy_region.dstSubresource.layerCount = 1;
2984
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002985 // both 2D and extent.depth not 1
2986 // Need two 2D array images to prevent other errors
2987 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002988 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002989 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2990 1, &copy_region);
2991 m_errorMonitor->VerifyFound();
2992 copy_region.extent = {32, 1, 1};
2993
2994 // 2D src / 3D dst and depth not equal to src layerCount
2995 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002996 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002997 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002998 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2999 &copy_region);
3000 m_errorMonitor->VerifyFound();
3001 copy_region.extent = {32, 1, 1};
3002
3003 // 3D src / 2D dst and depth not equal to dst layerCount
3004 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08003007 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3008 &copy_region);
3009 m_errorMonitor->VerifyFound();
3010 copy_region.extent = {32, 1, 1};
3011
unknown088160a2019-05-23 17:43:13 -06003012 m_commandBuffer->end();
3013}
3014
3015TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
3016 // Image copy tests on compressed images with block alignment errors
3017 SetTargetApiVersion(VK_API_VERSION_1_1);
3018 ASSERT_NO_FATAL_FAILURE(Init());
3019
3020 // Select a compressed format and verify support
3021 VkPhysicalDeviceFeatures device_features = {};
3022 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
3023 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
3024 if (device_features.textureCompressionBC) {
3025 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
3026 } else if (device_features.textureCompressionETC2) {
3027 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
3028 } else if (device_features.textureCompressionASTC_LDR) {
3029 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
3030 }
3031
3032 VkImageCreateInfo ci;
3033 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3034 ci.pNext = NULL;
3035 ci.flags = 0;
3036 ci.imageType = VK_IMAGE_TYPE_2D;
3037 ci.format = compressed_format;
3038 ci.extent = {64, 64, 1};
3039 ci.mipLevels = 1;
3040 ci.arrayLayers = 1;
3041 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3042 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3043 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3044 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3045 ci.queueFamilyIndexCount = 0;
3046 ci.pQueueFamilyIndices = NULL;
3047 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3048
3049 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003050 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
3051 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06003052 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
3053 return;
3054 }
3055
3056 // Create images
3057 VkImageObj image_1(m_device);
3058 image_1.init(&ci);
3059 ASSERT_TRUE(image_1.initialized());
3060
3061 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3062 VkImageObj image_2(m_device);
3063 image_2.init(&ci);
3064 ASSERT_TRUE(image_2.initialized());
3065
3066 m_commandBuffer->begin();
3067
3068 VkImageCopy copy_region;
3069 copy_region.extent = {48, 48, 1};
3070 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3071 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3072 copy_region.srcSubresource.mipLevel = 0;
3073 copy_region.dstSubresource.mipLevel = 0;
3074 copy_region.srcSubresource.baseArrayLayer = 0;
3075 copy_region.dstSubresource.baseArrayLayer = 0;
3076 copy_region.srcSubresource.layerCount = 1;
3077 copy_region.dstSubresource.layerCount = 1;
3078 copy_region.srcOffset = {0, 0, 0};
3079 copy_region.dstOffset = {0, 0, 0};
3080
3081 // Sanity check
3082 m_errorMonitor->ExpectSuccess();
3083 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3084 m_errorMonitor->VerifyNotFound();
3085
3086 std::string vuid;
3087 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3088 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3089
3090 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3091 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003092 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003093 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003096 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3097 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3098 m_errorMonitor->VerifyFound();
3099 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003102 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3103 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3104 m_errorMonitor->VerifyFound();
3105 copy_region.srcOffset = {0, 0, 0};
3106
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003107 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003108 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003111 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3112 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3113 m_errorMonitor->VerifyFound();
3114 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003115 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003117 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3118 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3119 m_errorMonitor->VerifyFound();
3120 copy_region.dstOffset = {0, 0, 0};
3121
3122 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003123 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003124 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3126 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003127 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3128 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3129 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003130 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003131 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003134 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3135 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3136 m_errorMonitor->VerifyFound();
3137
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003138 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003139 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003140 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003142 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3143 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3144 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003145 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003146 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003147 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3148 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003149 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3150 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3151 m_errorMonitor->VerifyFound();
3152
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003153 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3154 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003155 // There are currently no supported compressed formats with a block depth other than 1,
3156 // so impossible to create a 'not a multiple' condition for depth.
3157 m_commandBuffer->end();
3158}
3159
3160TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3161 // Image copy tests on single-plane _422 formats with block alignment errors
3162
3163 // Enable KHR multiplane req'd extensions
3164 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3165 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3166 if (mp_extensions) {
3167 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3168 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003169 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003170 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3171 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3172 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3173 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3174 if (mp_extensions) {
3175 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3176 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3177 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3178 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3179 } else {
3180 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3181 return;
3182 }
3183 ASSERT_NO_FATAL_FAILURE(InitState());
3184
3185 // Select a _422 format and verify support
3186 VkImageCreateInfo ci = {};
3187 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3188 ci.pNext = NULL;
3189 ci.flags = 0;
3190 ci.imageType = VK_IMAGE_TYPE_2D;
3191 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3192 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3193 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3194 ci.mipLevels = 1;
3195 ci.arrayLayers = 1;
3196 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3197 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3198 ci.queueFamilyIndexCount = 0;
3199 ci.pQueueFamilyIndices = NULL;
3200 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3201
3202 // Verify formats
3203 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3204 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3205 if (!supported) {
3206 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3207 return; // Assume there's low ROI on searching for different mp formats
3208 }
3209
3210 // Create images
3211 ci.extent = {64, 64, 1};
3212 VkImageObj image_422(m_device);
3213 image_422.init(&ci);
3214 ASSERT_TRUE(image_422.initialized());
3215
3216 ci.extent = {64, 64, 1};
3217 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3218 VkImageObj image_ucmp(m_device);
3219 image_ucmp.init(&ci);
3220 ASSERT_TRUE(image_ucmp.initialized());
3221
3222 m_commandBuffer->begin();
3223
3224 VkImageCopy copy_region;
3225 copy_region.extent = {48, 48, 1};
3226 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3227 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3228 copy_region.srcSubresource.mipLevel = 0;
3229 copy_region.dstSubresource.mipLevel = 0;
3230 copy_region.srcSubresource.baseArrayLayer = 0;
3231 copy_region.dstSubresource.baseArrayLayer = 0;
3232 copy_region.srcSubresource.layerCount = 1;
3233 copy_region.dstSubresource.layerCount = 1;
3234 copy_region.srcOffset = {0, 0, 0};
3235 copy_region.dstOffset = {0, 0, 0};
3236
3237 // Src offsets must be multiples of compressed block sizes
3238 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003241 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3242 &copy_region);
3243 m_errorMonitor->VerifyFound();
3244 copy_region.srcOffset = {0, 0, 0};
3245
3246 // Dst offsets must be multiples of compressed block sizes
3247 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003251 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3252 &copy_region);
3253 m_errorMonitor->VerifyFound();
3254 copy_region.dstOffset = {0, 0, 0};
3255
3256 // Copy extent must be multiples of compressed block sizes if not full width/height
3257 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003259 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003260 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3261 &copy_region);
3262 m_errorMonitor->VerifyFound();
3263
unknown357e1782019-09-25 17:57:40 -06003264 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003265 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3266 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003267 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003268 copy_region.dstOffset = {0, 0, 0};
3269
3270 m_commandBuffer->end();
3271}
3272
3273TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3274 // Image copy tests on multiplane images with aspect errors
3275
3276 // Enable KHR multiplane req'd extensions
3277 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3278 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3279 if (mp_extensions) {
3280 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3281 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003282 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003283 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3284 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3285 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3286 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3287 if (mp_extensions) {
3288 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3289 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3290 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3291 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3292 } else {
3293 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3294 return;
3295 }
3296 ASSERT_NO_FATAL_FAILURE(InitState());
3297
3298 // Select multi-plane formats and verify support
3299 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3300 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3301
3302 VkImageCreateInfo ci = {};
3303 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3304 ci.pNext = NULL;
3305 ci.flags = 0;
3306 ci.imageType = VK_IMAGE_TYPE_2D;
3307 ci.format = mp2_format;
3308 ci.extent = {256, 256, 1};
3309 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3310 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3311 ci.mipLevels = 1;
3312 ci.arrayLayers = 1;
3313 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3314 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3315 ci.queueFamilyIndexCount = 0;
3316 ci.pQueueFamilyIndices = NULL;
3317 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3318
3319 // Verify formats
3320 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3321 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3322 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3323 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3324 ci.format = mp3_format;
3325 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3326 if (!supported) {
3327 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3328 kSkipPrefix);
3329 return; // Assume there's low ROI on searching for different mp formats
3330 }
3331
3332 // Create images
3333 VkImageObj mp3_image(m_device);
3334 mp3_image.init(&ci);
3335 ASSERT_TRUE(mp3_image.initialized());
3336
3337 ci.format = mp2_format;
3338 VkImageObj mp2_image(m_device);
3339 mp2_image.init(&ci);
3340 ASSERT_TRUE(mp2_image.initialized());
3341
3342 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3343 VkImageObj sp_image(m_device);
3344 sp_image.init(&ci);
3345 ASSERT_TRUE(sp_image.initialized());
3346
3347 m_commandBuffer->begin();
3348
3349 VkImageCopy copy_region;
3350 copy_region.extent = {128, 128, 1};
3351 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3352 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3353 copy_region.srcSubresource.mipLevel = 0;
3354 copy_region.dstSubresource.mipLevel = 0;
3355 copy_region.srcSubresource.baseArrayLayer = 0;
3356 copy_region.dstSubresource.baseArrayLayer = 0;
3357 copy_region.srcSubresource.layerCount = 1;
3358 copy_region.dstSubresource.layerCount = 1;
3359 copy_region.srcOffset = {0, 0, 0};
3360 copy_region.dstOffset = {0, 0, 0};
3361
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003363 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3364 &copy_region);
3365 m_errorMonitor->VerifyFound();
3366
unknown088160a2019-05-23 17:43:13 -06003367 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3368 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003369 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003370 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3371 &copy_region);
3372 m_errorMonitor->VerifyFound();
3373
3374 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3375 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003376 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003377 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3378 &copy_region);
3379 m_errorMonitor->VerifyFound();
3380
3381 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003382 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003383 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3384 &copy_region);
3385 m_errorMonitor->VerifyFound();
3386
3387 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003388 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003390 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3391 &copy_region);
3392 m_errorMonitor->VerifyFound();
3393
3394 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3395 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003396 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003398 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3399 &copy_region);
3400 m_errorMonitor->VerifyFound();
3401
3402 m_commandBuffer->end();
3403}
3404
3405TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3406 // Image copy with source region specified greater than src image size
3407 ASSERT_NO_FATAL_FAILURE(Init());
3408
3409 // Create images with full mip chain
3410 VkImageCreateInfo ci;
3411 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3412 ci.pNext = NULL;
3413 ci.flags = 0;
3414 ci.imageType = VK_IMAGE_TYPE_3D;
3415 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3416 ci.extent = {32, 32, 8};
3417 ci.mipLevels = 6;
3418 ci.arrayLayers = 1;
3419 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3420 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3421 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3422 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3423 ci.queueFamilyIndexCount = 0;
3424 ci.pQueueFamilyIndices = NULL;
3425 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3426
3427 VkImageObj src_image(m_device);
3428 src_image.init(&ci);
3429 ASSERT_TRUE(src_image.initialized());
3430
3431 // Dest image with one more mip level
3432 ci.extent = {64, 64, 16};
3433 ci.mipLevels = 7;
3434 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3435 VkImageObj dst_image(m_device);
3436 dst_image.init(&ci);
3437 ASSERT_TRUE(dst_image.initialized());
3438
3439 m_commandBuffer->begin();
3440
3441 VkImageCopy copy_region;
3442 copy_region.extent = {32, 32, 8};
3443 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3444 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3445 copy_region.srcSubresource.mipLevel = 0;
3446 copy_region.dstSubresource.mipLevel = 0;
3447 copy_region.srcSubresource.baseArrayLayer = 0;
3448 copy_region.dstSubresource.baseArrayLayer = 0;
3449 copy_region.srcSubresource.layerCount = 1;
3450 copy_region.dstSubresource.layerCount = 1;
3451 copy_region.srcOffset = {0, 0, 0};
3452 copy_region.dstOffset = {0, 0, 0};
3453
3454 m_errorMonitor->ExpectSuccess();
3455 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3456 &copy_region);
3457 m_errorMonitor->VerifyNotFound();
3458
3459 // Source exceeded in x-dim, VU 01202
3460 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003462 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3463 &copy_region);
3464 m_errorMonitor->VerifyFound();
3465
3466 // Source exceeded in y-dim, VU 01203
3467 copy_region.srcOffset.x = 0;
3468 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003469 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003470 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3471 &copy_region);
3472 m_errorMonitor->VerifyFound();
3473
3474 // Source exceeded in z-dim, VU 01204
3475 copy_region.extent = {4, 4, 4};
3476 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003478 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3479 &copy_region);
3480 m_errorMonitor->VerifyFound();
3481
3482 m_commandBuffer->end();
3483}
3484
3485TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3486 // Image copy with dest region specified greater than dest image size
3487 ASSERT_NO_FATAL_FAILURE(Init());
3488
3489 // Create images with full mip chain
3490 VkImageCreateInfo ci;
3491 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3492 ci.pNext = NULL;
3493 ci.flags = 0;
3494 ci.imageType = VK_IMAGE_TYPE_3D;
3495 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3496 ci.extent = {32, 32, 8};
3497 ci.mipLevels = 6;
3498 ci.arrayLayers = 1;
3499 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3500 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3501 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3502 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3503 ci.queueFamilyIndexCount = 0;
3504 ci.pQueueFamilyIndices = NULL;
3505 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3506
3507 VkImageObj dst_image(m_device);
3508 dst_image.init(&ci);
3509 ASSERT_TRUE(dst_image.initialized());
3510
3511 // Src image with one more mip level
3512 ci.extent = {64, 64, 16};
3513 ci.mipLevels = 7;
3514 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3515 VkImageObj src_image(m_device);
3516 src_image.init(&ci);
3517 ASSERT_TRUE(src_image.initialized());
3518
3519 m_commandBuffer->begin();
3520
3521 VkImageCopy copy_region;
3522 copy_region.extent = {32, 32, 8};
3523 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3524 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3525 copy_region.srcSubresource.mipLevel = 0;
3526 copy_region.dstSubresource.mipLevel = 0;
3527 copy_region.srcSubresource.baseArrayLayer = 0;
3528 copy_region.dstSubresource.baseArrayLayer = 0;
3529 copy_region.srcSubresource.layerCount = 1;
3530 copy_region.dstSubresource.layerCount = 1;
3531 copy_region.srcOffset = {0, 0, 0};
3532 copy_region.dstOffset = {0, 0, 0};
3533
3534 m_errorMonitor->ExpectSuccess();
3535 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3536 &copy_region);
3537 m_errorMonitor->VerifyNotFound();
3538
3539 // Dest exceeded in x-dim, VU 01205
3540 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003541 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003542 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3543 &copy_region);
3544 m_errorMonitor->VerifyFound();
3545
3546 // Dest exceeded in y-dim, VU 01206
3547 copy_region.dstOffset.x = 0;
3548 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003549 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003550 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3551 &copy_region);
3552 m_errorMonitor->VerifyFound();
3553
3554 // Dest exceeded in z-dim, VU 01207
3555 copy_region.extent = {4, 4, 4};
3556 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003557 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003558 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3559 &copy_region);
3560 m_errorMonitor->VerifyFound();
3561
3562 m_commandBuffer->end();
3563}
3564
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003565TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3566 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3567
3568 // Enable KHR multiplane req'd extensions
3569 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3570 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3571 if (mp_extensions == true) {
3572 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3573 }
3574 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3575 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3576 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3577 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3578 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3579 if (mp_extensions == true) {
3580 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3581 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3582 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3583 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3584 } else {
3585 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3586 return;
3587 }
3588 ASSERT_NO_FATAL_FAILURE(InitState());
3589
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003590 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3591 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003592 VkFormatProperties props = {0, 0, 0};
3593 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003594 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003595 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3596 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3597 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3598
3599 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003600 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003601 return;
3602 }
3603
3604 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3605 VkImageObj src_image(m_device);
3606 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003607 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 -08003608 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003609 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 -08003610 ASSERT_TRUE(dst_image.initialized());
3611
3612 VkImageCopy copy_region = {};
3613 copy_region.extent = {64, 64, 1}; // Size of plane 1
3614 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3615 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3616 copy_region.srcSubresource.mipLevel = 0;
3617 copy_region.dstSubresource.mipLevel = 0;
3618 copy_region.srcSubresource.baseArrayLayer = 0;
3619 copy_region.dstSubresource.baseArrayLayer = 0;
3620 copy_region.srcSubresource.layerCount = 1;
3621 copy_region.dstSubresource.layerCount = 1;
3622 copy_region.srcOffset = {0, 0, 0};
3623 copy_region.dstOffset = {0, 0, 0};
3624 VkImageCopy original_region = copy_region;
3625
3626 m_commandBuffer->begin();
3627
3628 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3629 m_errorMonitor->ExpectSuccess();
3630 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3631 &copy_region);
3632 m_errorMonitor->VerifyNotFound();
3633
3634 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3635 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3636 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3637 m_errorMonitor->ExpectSuccess();
3638 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3639 &copy_region);
3640 m_errorMonitor->VerifyNotFound();
3641
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003642 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003643 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3644 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3645
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003646 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3647 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3648 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3649 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003650 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3651 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003652 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3653 &copy_region);
3654 m_errorMonitor->VerifyNotFound();
3655
3656 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3657 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3658 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3659 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003660 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3661 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003662 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3663 &copy_region);
3664 m_errorMonitor->VerifyNotFound();
3665
3666 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3667 copy_region.extent = {128, 64, 1};
3668 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3669 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3670 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003671 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3672 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003673 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3674 &copy_region);
3675 m_errorMonitor->VerifyNotFound();
3676
3677 // 128x64 copy from plane 0 -> Plane 1
3678 copy_region.extent = {128, 64, 1};
3679 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3680 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003682 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3683 &copy_region);
3684 m_errorMonitor->VerifyFound();
3685
3686 // 128x64 copy from plane 1 -> Plane 0
3687 copy_region.extent = {128, 64, 1};
3688 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3689 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003690 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003691 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3692 &copy_region);
3693 m_errorMonitor->VerifyFound();
3694
3695 // src exceeded in y-dim from offset
3696 copy_region = original_region;
3697 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003699 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3700 &copy_region);
3701 m_errorMonitor->VerifyFound();
3702
3703 // dst exceeded in y-dim from offset
3704 copy_region = original_region;
3705 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003707 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3708 &copy_region);
3709 m_errorMonitor->VerifyFound();
3710
3711 m_commandBuffer->end();
3712}
3713
unknown088160a2019-05-23 17:43:13 -06003714TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003715 if (!EnableDeviceProfileLayer()) {
3716 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3717 return;
3718 }
unknown088160a2019-05-23 17:43:13 -06003719
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003720 // Enable KHR multiplane req'd extensions
3721 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3722 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3723 if (mp_extensions == true) {
3724 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3725 }
3726 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3727 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3728 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3729 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3730 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3731 if (mp_extensions == true) {
3732 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3733 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3734 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3735 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3736 }
3737 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003738
sfricke-samsung51067b22020-04-30 21:41:17 -07003739 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3740 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003741
sfricke-samsung51067b22020-04-30 21:41:17 -07003742 // Load required functions
3743 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3744 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3745 return;
3746 }
3747
3748 // Set transfer for all potential used formats
3749 VkFormatProperties format_props;
3750 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3751 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3752 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3753
3754 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3755 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3756 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003757
3758 VkImageCreateInfo image_create_info = {};
3759 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3760 image_create_info.pNext = NULL;
3761 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003762 image_create_info.extent.width = 32;
3763 image_create_info.extent.height = 32;
3764 image_create_info.extent.depth = 1;
3765 image_create_info.mipLevels = 1;
3766 image_create_info.arrayLayers = 1;
3767 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003768 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3769 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003770 image_create_info.flags = 0;
3771
sfricke-samsung51067b22020-04-30 21:41:17 -07003772 image_create_info.format = VK_FORMAT_R8_UNORM;
3773 VkImageObj image_8b_unorm(m_device);
3774 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003775
sfricke-samsung51067b22020-04-30 21:41:17 -07003776 image_create_info.format = VK_FORMAT_R8_UINT;
3777 VkImageObj image_8b_uint(m_device);
3778 image_8b_uint.init(&image_create_info);
3779
3780 // First try to test two single plane mismatch
3781 {
3782 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3783 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3784 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3785
3786 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3787 VkImageObj image_32b_unorm(m_device);
3788 image_32b_unorm.init(&image_create_info);
3789
3790 m_commandBuffer->begin();
3791 VkImageCopy copyRegion;
3792 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3793 copyRegion.srcSubresource.mipLevel = 0;
3794 copyRegion.srcSubresource.baseArrayLayer = 0;
3795 copyRegion.srcSubresource.layerCount = 1;
3796 copyRegion.srcOffset.x = 0;
3797 copyRegion.srcOffset.y = 0;
3798 copyRegion.srcOffset.z = 0;
3799 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3800 copyRegion.dstSubresource.mipLevel = 0;
3801 copyRegion.dstSubresource.baseArrayLayer = 0;
3802 copyRegion.dstSubresource.layerCount = 1;
3803 copyRegion.dstOffset.x = 0;
3804 copyRegion.dstOffset.y = 0;
3805 copyRegion.dstOffset.z = 0;
3806 copyRegion.extent.width = 1;
3807 copyRegion.extent.height = 1;
3808 copyRegion.extent.depth = 1;
3809
3810 // Sanity check between two 8bit formats
3811 m_errorMonitor->ExpectSuccess();
3812 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3813 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3814 m_errorMonitor->VerifyNotFound();
3815
3816 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3818 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3819 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3820 m_errorMonitor->VerifyFound();
3821
3822 // Swap src and dst
3823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3824 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3825 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3826 m_errorMonitor->VerifyFound();
3827
3828 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003829 }
3830
sfricke-samsung51067b22020-04-30 21:41:17 -07003831 // DstImage is a mismatched plane of a multi-planar format
3832 if (mp_extensions == false) {
3833 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3834 } else {
3835 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3836 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3837 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003838
sfricke-samsung51067b22020-04-30 21:41:17 -07003839 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3840 VkImageObj image_8b_16b_420_unorm(m_device);
3841 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003842
sfricke-samsung51067b22020-04-30 21:41:17 -07003843 m_commandBuffer->begin();
3844 VkImageCopy copyRegion;
3845 copyRegion.srcSubresource.mipLevel = 0;
3846 copyRegion.srcSubresource.baseArrayLayer = 0;
3847 copyRegion.srcSubresource.layerCount = 1;
3848 copyRegion.srcOffset.x = 0;
3849 copyRegion.srcOffset.y = 0;
3850 copyRegion.srcOffset.z = 0;
3851 copyRegion.dstSubresource.mipLevel = 0;
3852 copyRegion.dstSubresource.baseArrayLayer = 0;
3853 copyRegion.dstSubresource.layerCount = 1;
3854 copyRegion.dstOffset.x = 0;
3855 copyRegion.dstOffset.y = 0;
3856 copyRegion.dstOffset.z = 0;
3857 copyRegion.extent.width = 1;
3858 copyRegion.extent.height = 1;
3859 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003860
sfricke-samsung51067b22020-04-30 21:41:17 -07003861 // First test single-plane -> multi-plan
3862 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3863 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003864
sfricke-samsung51067b22020-04-30 21:41:17 -07003865 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3866 m_errorMonitor->ExpectSuccess();
3867 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3868 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3869 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003870
locke-lunargdf00db02020-03-04 19:00:57 -07003871 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3872 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3873
sfricke-samsung51067b22020-04-30 21:41:17 -07003874 // Make sure no false postiives if Compatible format
3875 m_errorMonitor->ExpectSuccess();
3876 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3877 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3878 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003879
sfricke-samsung51067b22020-04-30 21:41:17 -07003880 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3881 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3882 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3883 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3884 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3885 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003886
sfricke-samsung51067b22020-04-30 21:41:17 -07003887 // Same tests but swap src and dst
3888 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3889 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003890
locke-lunargdf00db02020-03-04 19:00:57 -07003891 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3892 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3893 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3894 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3895
sfricke-samsung51067b22020-04-30 21:41:17 -07003896 m_errorMonitor->ExpectSuccess();
3897 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3898 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3899 m_errorMonitor->VerifyNotFound();
3900
locke-lunargdf00db02020-03-04 19:00:57 -07003901 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3902 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3903
sfricke-samsung51067b22020-04-30 21:41:17 -07003904 m_errorMonitor->ExpectSuccess();
3905 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3906 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3907 m_errorMonitor->VerifyNotFound();
3908
3909 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3911 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3912 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3913 m_errorMonitor->VerifyFound();
3914
3915 m_commandBuffer->end();
3916 }
unknown088160a2019-05-23 17:43:13 -06003917}
3918
3919TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3920 ASSERT_NO_FATAL_FAILURE(Init());
3921 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3922 if (!depth_format) {
3923 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3924 return;
3925 }
3926
3927 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003928 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003929 if (properties.optimalTilingFeatures == 0) {
3930 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3931 return;
3932 }
3933
3934 VkImageObj srcImage(m_device);
3935 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3936 ASSERT_TRUE(srcImage.initialized());
3937 VkImageObj dstImage(m_device);
3938 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3939 ASSERT_TRUE(dstImage.initialized());
3940
3941 // Create two images of different types and try to copy between them
3942
3943 m_commandBuffer->begin();
3944 VkImageCopy copyRegion;
3945 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3946 copyRegion.srcSubresource.mipLevel = 0;
3947 copyRegion.srcSubresource.baseArrayLayer = 0;
3948 copyRegion.srcSubresource.layerCount = 1;
3949 copyRegion.srcOffset.x = 0;
3950 copyRegion.srcOffset.y = 0;
3951 copyRegion.srcOffset.z = 0;
3952 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3953 copyRegion.dstSubresource.mipLevel = 0;
3954 copyRegion.dstSubresource.baseArrayLayer = 0;
3955 copyRegion.dstSubresource.layerCount = 1;
3956 copyRegion.dstOffset.x = 0;
3957 copyRegion.dstOffset.y = 0;
3958 copyRegion.dstOffset.z = 0;
3959 copyRegion.extent.width = 1;
3960 copyRegion.extent.height = 1;
3961 copyRegion.extent.depth = 1;
3962
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003963 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003964 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3965 &copyRegion);
3966 m_commandBuffer->end();
3967
3968 m_errorMonitor->VerifyFound();
3969}
3970
3971TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3972 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3973
3974 ASSERT_NO_FATAL_FAILURE(Init());
3975
3976 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003977 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3978 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3979 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003980
3981 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3982 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3983 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3984 return;
3985 }
3986
3987 VkImageCreateInfo ci;
3988 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3989 ci.pNext = NULL;
3990 ci.flags = 0;
3991 ci.imageType = VK_IMAGE_TYPE_2D;
3992 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3993 ci.extent = {128, 128, 1};
3994 ci.mipLevels = 1;
3995 ci.arrayLayers = 1;
3996 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3997 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3998 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3999 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4000 ci.queueFamilyIndexCount = 0;
4001 ci.pQueueFamilyIndices = NULL;
4002 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4003
4004 VkImageObj image1(m_device);
4005 image1.init(&ci);
4006 ASSERT_TRUE(image1.initialized());
4007
4008 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4009 VkImageObj image2(m_device);
4010 image2.init(&ci);
4011 ASSERT_TRUE(image2.initialized());
4012
4013 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4014 VkImageObj image4(m_device);
4015 image4.init(&ci);
4016 ASSERT_TRUE(image4.initialized());
4017
4018 m_commandBuffer->begin();
4019
4020 VkImageCopy copyRegion;
4021 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4022 copyRegion.srcSubresource.mipLevel = 0;
4023 copyRegion.srcSubresource.baseArrayLayer = 0;
4024 copyRegion.srcSubresource.layerCount = 1;
4025 copyRegion.srcOffset = {0, 0, 0};
4026 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4027 copyRegion.dstSubresource.mipLevel = 0;
4028 copyRegion.dstSubresource.baseArrayLayer = 0;
4029 copyRegion.dstSubresource.layerCount = 1;
4030 copyRegion.dstOffset = {0, 0, 0};
4031 copyRegion.extent = {128, 128, 1};
4032
4033 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07004034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004035 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4036 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004037 m_errorMonitor->VerifyFound();
4038
Mark Lobodzinski20310782020-02-28 14:25:17 -07004039 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004040 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4041 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004042 m_errorMonitor->VerifyFound();
4043
4044 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004046 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4047 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004048 m_errorMonitor->VerifyFound();
4049
Mark Lobodzinski20310782020-02-28 14:25:17 -07004050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004051 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4052 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004053 m_errorMonitor->VerifyFound();
4054
4055 m_commandBuffer->end();
4056}
4057
4058TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4059 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004060
4061 if (!EnableDeviceProfileLayer()) {
4062 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4063 return;
4064 }
4065
4066 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4067 if (mp_extensions) {
4068 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4069 }
4070
4071 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4072 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4073 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4074 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4075 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4076 if (mp_extensions) {
4077 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4078 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4079 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4080 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4081 }
4082 ASSERT_NO_FATAL_FAILURE(InitState());
4083
4084 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4085 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4086
4087 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4088 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4089 return;
4090 }
4091
unknown088160a2019-05-23 17:43:13 -06004092 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4093 if (!ds_format) {
4094 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4095 return;
4096 }
4097
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004098 // Add Transfer support for all used formats
4099 VkFormatProperties formatProps;
4100 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4101 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4102 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4103 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4104 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4105 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4106 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4107 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4108 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4109
unknown088160a2019-05-23 17:43:13 -06004110 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4111 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4112 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4113 VK_IMAGE_TILING_OPTIMAL, 0);
4114 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4115 VK_IMAGE_TILING_OPTIMAL, 0);
4116 ASSERT_TRUE(color_image.initialized());
4117 ASSERT_TRUE(depth_image.initialized());
4118 ASSERT_TRUE(ds_image.initialized());
4119
4120 VkImageCopy copyRegion;
4121 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4122 copyRegion.srcSubresource.mipLevel = 0;
4123 copyRegion.srcSubresource.baseArrayLayer = 0;
4124 copyRegion.srcSubresource.layerCount = 1;
4125 copyRegion.srcOffset = {0, 0, 0};
4126 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4127 copyRegion.dstSubresource.mipLevel = 0;
4128 copyRegion.dstSubresource.baseArrayLayer = 0;
4129 copyRegion.dstSubresource.layerCount = 1;
4130 copyRegion.dstOffset = {64, 0, 0};
4131 copyRegion.extent = {64, 128, 1};
4132
4133 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004135 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004136 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4137 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004138 m_errorMonitor->VerifyFound();
4139
4140 m_commandBuffer->begin();
4141
4142 // Src and dest aspect masks don't match
4143 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004144 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004145 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004146 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4147 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004148 m_errorMonitor->VerifyFound();
4149 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4150
4151 // Illegal combinations of aspect bits
4152 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4153 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004155 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004156 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004157 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004158 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4159 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004160 m_errorMonitor->VerifyFound();
4161 // same test for dstSubresource
4162 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4163 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004165 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004168 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4169 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004170 m_errorMonitor->VerifyFound();
4171
4172 // Metadata aspect is illegal
4173 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4174 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004176 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004177 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004178 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4179 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004180 m_errorMonitor->VerifyFound();
4181 // same test for dstSubresource
4182 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4183 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004184 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004185 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004187 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4188 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004189 m_errorMonitor->VerifyFound();
4190
sfricke-samsung6141db32020-10-26 03:31:38 -07004191 // Aspect Memory Plane mask is illegal
4192 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4193 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4194 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4195 // These aspect/format mismatches are redundant but unavoidable here
4196 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4197 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4198 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4199 m_errorMonitor->VerifyFound();
4200
unknown088160a2019-05-23 17:43:13 -06004201 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4202 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004203 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004204
4205 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004206 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004207 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004208 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004209 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4210 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004211 m_errorMonitor->VerifyFound();
4212
4213 // Aspect mask doesn't match dest image format
4214 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4215 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004216 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004217 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004218 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004219 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4220 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004221 m_errorMonitor->VerifyFound();
4222
4223 m_commandBuffer->end();
4224}
4225
4226TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004227 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004228
4229 ASSERT_NO_FATAL_FAILURE(Init());
4230
4231 // Create two images of sample count 1 and try to Resolve between them
4232
4233 VkImageCreateInfo image_create_info = {};
4234 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4235 image_create_info.pNext = NULL;
4236 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4237 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4238 image_create_info.extent.width = 32;
4239 image_create_info.extent.height = 1;
4240 image_create_info.extent.depth = 1;
4241 image_create_info.mipLevels = 1;
4242 image_create_info.arrayLayers = 1;
4243 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4244 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4245 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4246 image_create_info.flags = 0;
4247
4248 VkImageObj srcImage(m_device);
4249 srcImage.init(&image_create_info);
4250 ASSERT_TRUE(srcImage.initialized());
4251
4252 VkImageObj dstImage(m_device);
4253 dstImage.init(&image_create_info);
4254 ASSERT_TRUE(dstImage.initialized());
4255
4256 m_commandBuffer->begin();
4257 VkImageResolve resolveRegion;
4258 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4259 resolveRegion.srcSubresource.mipLevel = 0;
4260 resolveRegion.srcSubresource.baseArrayLayer = 0;
4261 resolveRegion.srcSubresource.layerCount = 1;
4262 resolveRegion.srcOffset.x = 0;
4263 resolveRegion.srcOffset.y = 0;
4264 resolveRegion.srcOffset.z = 0;
4265 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4266 resolveRegion.dstSubresource.mipLevel = 0;
4267 resolveRegion.dstSubresource.baseArrayLayer = 0;
4268 resolveRegion.dstSubresource.layerCount = 1;
4269 resolveRegion.dstOffset.x = 0;
4270 resolveRegion.dstOffset.y = 0;
4271 resolveRegion.dstOffset.z = 0;
4272 resolveRegion.extent.width = 1;
4273 resolveRegion.extent.height = 1;
4274 resolveRegion.extent.depth = 1;
4275 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4276 &resolveRegion);
4277 m_commandBuffer->end();
4278
4279 m_errorMonitor->VerifyFound();
4280}
4281
4282TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004284
4285 ASSERT_NO_FATAL_FAILURE(Init());
4286
4287 // Create two images of sample count 4 and try to Resolve between them
4288
4289 VkImageCreateInfo image_create_info = {};
4290 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4291 image_create_info.pNext = NULL;
4292 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4293 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4294 image_create_info.extent.width = 32;
4295 image_create_info.extent.height = 1;
4296 image_create_info.extent.depth = 1;
4297 image_create_info.mipLevels = 1;
4298 image_create_info.arrayLayers = 1;
4299 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4300 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4301 // Note: Some implementations expect color attachment usage for any
4302 // multisample surface
4303 image_create_info.usage =
4304 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4305 image_create_info.flags = 0;
4306
4307 VkImageObj srcImage(m_device);
4308 srcImage.init(&image_create_info);
4309 ASSERT_TRUE(srcImage.initialized());
4310
4311 VkImageObj dstImage(m_device);
4312 dstImage.init(&image_create_info);
4313 ASSERT_TRUE(dstImage.initialized());
4314
4315 m_commandBuffer->begin();
4316 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4317 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4318 // VK_IMAGE_LAYOUT_GENERAL = 1,
4319 VkImageResolve resolveRegion;
4320 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4321 resolveRegion.srcSubresource.mipLevel = 0;
4322 resolveRegion.srcSubresource.baseArrayLayer = 0;
4323 resolveRegion.srcSubresource.layerCount = 1;
4324 resolveRegion.srcOffset.x = 0;
4325 resolveRegion.srcOffset.y = 0;
4326 resolveRegion.srcOffset.z = 0;
4327 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4328 resolveRegion.dstSubresource.mipLevel = 0;
4329 resolveRegion.dstSubresource.baseArrayLayer = 0;
4330 resolveRegion.dstSubresource.layerCount = 1;
4331 resolveRegion.dstOffset.x = 0;
4332 resolveRegion.dstOffset.y = 0;
4333 resolveRegion.dstOffset.z = 0;
4334 resolveRegion.extent.width = 1;
4335 resolveRegion.extent.height = 1;
4336 resolveRegion.extent.depth = 1;
4337 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4338 &resolveRegion);
4339 m_commandBuffer->end();
4340
4341 m_errorMonitor->VerifyFound();
4342}
4343
4344TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004345 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004346
4347 ASSERT_NO_FATAL_FAILURE(Init());
4348
4349 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004350 VkImageObj srcImage(m_device);
4351 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004352
4353 VkImageCreateInfo image_create_info = {};
4354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4355 image_create_info.pNext = NULL;
4356 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4357 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4358 image_create_info.extent.width = 32;
4359 image_create_info.extent.height = 1;
4360 image_create_info.extent.depth = 1;
4361 image_create_info.mipLevels = 1;
4362 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004363 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4365 // Note: Some implementations expect color attachment usage for any
4366 // multisample surface
4367 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4368 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004369 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004370
4371 // Set format to something other than source image
4372 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4373 // Note: Some implementations expect color attachment usage for any
4374 // multisample surface
4375 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4376 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004377 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004378
4379 m_commandBuffer->begin();
4380 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4381 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4382 // VK_IMAGE_LAYOUT_GENERAL = 1,
4383 VkImageResolve resolveRegion;
4384 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4385 resolveRegion.srcSubresource.mipLevel = 0;
4386 resolveRegion.srcSubresource.baseArrayLayer = 0;
4387 resolveRegion.srcSubresource.layerCount = 1;
4388 resolveRegion.srcOffset.x = 0;
4389 resolveRegion.srcOffset.y = 0;
4390 resolveRegion.srcOffset.z = 0;
4391 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4392 resolveRegion.dstSubresource.mipLevel = 0;
4393 resolveRegion.dstSubresource.baseArrayLayer = 0;
4394 resolveRegion.dstSubresource.layerCount = 1;
4395 resolveRegion.dstOffset.x = 0;
4396 resolveRegion.dstOffset.y = 0;
4397 resolveRegion.dstOffset.z = 0;
4398 resolveRegion.extent.width = 1;
4399 resolveRegion.extent.height = 1;
4400 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004401 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4402 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004403 m_commandBuffer->end();
4404
4405 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004406}
4407
4408TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004409 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004410
4411 ASSERT_NO_FATAL_FAILURE(Init());
4412
4413 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004414 VkImageObj srcImage(m_device);
4415 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004416
4417 VkImageCreateInfo image_create_info = {};
4418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4419 image_create_info.pNext = NULL;
4420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4421 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4422 image_create_info.extent.width = 32;
4423 image_create_info.extent.height = 1;
4424 image_create_info.extent.depth = 1;
4425 image_create_info.mipLevels = 1;
4426 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004427 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004428 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4429 // Note: Some implementations expect color attachment usage for any
4430 // multisample surface
4431 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4432 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004433 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004434
4435 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4436 // Note: Some implementations expect color attachment usage for any
4437 // multisample surface
4438 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4439 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004440 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004441
4442 m_commandBuffer->begin();
4443 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4444 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4445 // VK_IMAGE_LAYOUT_GENERAL = 1,
4446 VkImageResolve resolveRegion;
4447 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4448 resolveRegion.srcSubresource.mipLevel = 0;
4449 resolveRegion.srcSubresource.baseArrayLayer = 0;
4450 resolveRegion.srcSubresource.layerCount = 1;
4451 resolveRegion.srcOffset.x = 0;
4452 resolveRegion.srcOffset.y = 0;
4453 resolveRegion.srcOffset.z = 0;
4454 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4455 resolveRegion.dstSubresource.mipLevel = 0;
4456 resolveRegion.dstSubresource.baseArrayLayer = 0;
4457 resolveRegion.dstSubresource.layerCount = 1;
4458 resolveRegion.dstOffset.x = 0;
4459 resolveRegion.dstOffset.y = 0;
4460 resolveRegion.dstOffset.z = 0;
4461 resolveRegion.extent.width = 1;
4462 resolveRegion.extent.height = 1;
4463 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004464 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4465 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004466 m_commandBuffer->end();
4467
4468 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004469}
4470
4471TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4472 ASSERT_NO_FATAL_FAILURE(Init());
4473
4474 // Create two images of different types and try to copy between them
4475 VkImageObj srcImage(m_device);
4476 VkImageObj dstImage(m_device);
4477
4478 VkImageCreateInfo image_create_info = {};
4479 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4480 image_create_info.pNext = NULL;
4481 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4482 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4483 image_create_info.extent.width = 32;
4484 image_create_info.extent.height = 32;
4485 image_create_info.extent.depth = 1;
4486 image_create_info.mipLevels = 1;
4487 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004488 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004489 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4490 image_create_info.usage =
4491 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4492 // Note: Some implementations expect color attachment usage for any
4493 // multisample surface
4494 image_create_info.flags = 0;
4495 srcImage.init(&image_create_info);
4496 ASSERT_TRUE(srcImage.initialized());
4497
4498 // Note: Some implementations expect color attachment usage for any
4499 // multisample surface
4500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4501 dstImage.init(&image_create_info);
4502 ASSERT_TRUE(dstImage.initialized());
4503
4504 m_commandBuffer->begin();
4505 // source image must have valid contents before resolve
4506 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4507 VkImageSubresourceRange subresource = {};
4508 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4509 subresource.layerCount = 1;
4510 subresource.levelCount = 1;
4511 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4512 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4513 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4514 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4515
4516 VkImageResolve resolveRegion;
4517 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4518 resolveRegion.srcSubresource.mipLevel = 0;
4519 resolveRegion.srcSubresource.baseArrayLayer = 0;
4520 resolveRegion.srcSubresource.layerCount = 1;
4521 resolveRegion.srcOffset.x = 0;
4522 resolveRegion.srcOffset.y = 0;
4523 resolveRegion.srcOffset.z = 0;
4524 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4525 resolveRegion.dstSubresource.mipLevel = 0;
4526 resolveRegion.dstSubresource.baseArrayLayer = 0;
4527 resolveRegion.dstSubresource.layerCount = 1;
4528 resolveRegion.dstOffset.x = 0;
4529 resolveRegion.dstOffset.y = 0;
4530 resolveRegion.dstOffset.z = 0;
4531 resolveRegion.extent.width = 1;
4532 resolveRegion.extent.height = 1;
4533 resolveRegion.extent.depth = 1;
4534 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004536 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4537 1, &resolveRegion);
4538 m_errorMonitor->VerifyFound();
4539 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004540 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004541 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4542 1, &resolveRegion);
4543 m_errorMonitor->VerifyFound();
4544 m_commandBuffer->end();
4545}
4546
4547TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004548 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4549
4550 bool copy_commands2 = false;
4551 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4552 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4553 copy_commands2 = true;
4554 }
4555 ASSERT_NO_FATAL_FAILURE(InitState());
4556
4557 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4558 if (copy_commands2) {
4559 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4560 }
unknown088160a2019-05-23 17:43:13 -06004561
4562 // Create two images of different types and try to copy between them
4563 VkImageObj srcImage(m_device);
4564 VkImageObj dstImage(m_device);
4565
4566 VkImageCreateInfo image_create_info = {};
4567 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4568 image_create_info.pNext = NULL;
4569 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4570 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4571 image_create_info.extent.width = 32;
4572 image_create_info.extent.height = 32;
4573 image_create_info.extent.depth = 1;
4574 image_create_info.mipLevels = 1;
4575 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004576 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004577 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4578 image_create_info.usage =
4579 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4580 // Note: Some implementations expect color attachment usage for any
4581 // multisample surface
4582 image_create_info.flags = 0;
4583 srcImage.init(&image_create_info);
4584 ASSERT_TRUE(srcImage.initialized());
4585
4586 // Note: Some implementations expect color attachment usage for any
4587 // multisample surface
4588 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4589 dstImage.init(&image_create_info);
4590 ASSERT_TRUE(dstImage.initialized());
4591
4592 m_commandBuffer->begin();
4593 // source image must have valid contents before resolve
4594 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4595 VkImageSubresourceRange subresource = {};
4596 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4597 subresource.layerCount = 1;
4598 subresource.levelCount = 1;
4599 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4600 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4601 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4602 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4603
4604 VkImageResolve resolveRegion;
4605 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4606 resolveRegion.srcSubresource.mipLevel = 0;
4607 resolveRegion.srcSubresource.baseArrayLayer = 0;
4608 resolveRegion.srcSubresource.layerCount = 1;
4609 resolveRegion.srcOffset.x = 0;
4610 resolveRegion.srcOffset.y = 0;
4611 resolveRegion.srcOffset.z = 0;
4612 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4613 resolveRegion.dstSubresource.mipLevel = 0;
4614 resolveRegion.dstSubresource.baseArrayLayer = 0;
4615 resolveRegion.dstSubresource.layerCount = 1;
4616 resolveRegion.dstOffset.x = 0;
4617 resolveRegion.dstOffset.y = 0;
4618 resolveRegion.dstOffset.z = 0;
4619 resolveRegion.extent.width = 1;
4620 resolveRegion.extent.height = 1;
4621 resolveRegion.extent.depth = 1;
4622 // invalid source mip level
4623 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004625 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4626 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4627 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004628
4629 // Equivalent test using KHR_copy_commands2
4630 if (copy_commands2 && vkCmdResolveImage2Function) {
4631 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4632 NULL,
4633 resolveRegion.srcSubresource,
4634 resolveRegion.srcOffset,
4635 resolveRegion.dstSubresource,
4636 resolveRegion.dstOffset,
4637 resolveRegion.extent};
4638 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4639 NULL,
4640 srcImage.image(),
4641 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4642 dstImage.image(),
4643 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4644 1,
4645 &resolveRegion2};
4646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4647 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4648 m_errorMonitor->VerifyFound();
4649 }
4650
unknown088160a2019-05-23 17:43:13 -06004651 resolveRegion.srcSubresource.mipLevel = 0;
4652 // invalid dest mip level
4653 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004655 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4656 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4657 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004658
4659 // Equivalent test using KHR_copy_commands2
4660 if (copy_commands2 && vkCmdResolveImage2Function) {
4661 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4662 NULL,
4663 resolveRegion.srcSubresource,
4664 resolveRegion.srcOffset,
4665 resolveRegion.dstSubresource,
4666 resolveRegion.dstOffset,
4667 resolveRegion.extent};
4668 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4669 NULL,
4670 srcImage.image(),
4671 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4672 dstImage.image(),
4673 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4674 1,
4675 &resolveRegion2};
4676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4677 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4678 m_errorMonitor->VerifyFound();
4679 }
4680
unknown088160a2019-05-23 17:43:13 -06004681 resolveRegion.dstSubresource.mipLevel = 0;
4682 // invalid source array layer range
4683 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004685 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4686 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4687 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004688
4689 // Equivalent test using KHR_copy_commands2
4690 if (copy_commands2 && vkCmdResolveImage2Function) {
4691 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4692 NULL,
4693 resolveRegion.srcSubresource,
4694 resolveRegion.srcOffset,
4695 resolveRegion.dstSubresource,
4696 resolveRegion.dstOffset,
4697 resolveRegion.extent};
4698 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4699 NULL,
4700 srcImage.image(),
4701 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4702 dstImage.image(),
4703 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4704 1,
4705 &resolveRegion2};
4706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4707 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4708 m_errorMonitor->VerifyFound();
4709 }
4710
unknown088160a2019-05-23 17:43:13 -06004711 resolveRegion.srcSubresource.baseArrayLayer = 0;
4712 // invalid dest array layer range
4713 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004715 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4716 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4717 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004718
4719 // Equivalent test using KHR_copy_commands2
4720 if (copy_commands2 && vkCmdResolveImage2Function) {
4721 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4722 NULL,
4723 resolveRegion.srcSubresource,
4724 resolveRegion.srcOffset,
4725 resolveRegion.dstSubresource,
4726 resolveRegion.dstOffset,
4727 resolveRegion.extent};
4728 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4729 NULL,
4730 srcImage.image(),
4731 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4732 dstImage.image(),
4733 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4734 1,
4735 &resolveRegion2};
4736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4737 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4738 m_errorMonitor->VerifyFound();
4739 }
4740
unknown088160a2019-05-23 17:43:13 -06004741 resolveRegion.dstSubresource.baseArrayLayer = 0;
4742
4743 m_commandBuffer->end();
4744}
4745
sfricke-samsungf78d0592020-06-11 21:34:44 -07004746TEST_F(VkLayerTest, ResolveImageImageType) {
4747 ASSERT_NO_FATAL_FAILURE(Init());
4748 // Create images of different types and try to resolve between them
4749 VkImageObj srcImage2D(m_device);
4750 VkImageObj dstImage1D(m_device);
4751 VkImageObj dstImage3D(m_device);
4752
4753 VkImageCreateInfo image_create_info = {};
4754 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4755 image_create_info.pNext = NULL;
4756 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4757 image_create_info.extent.width = 32;
4758 image_create_info.extent.height = 1;
4759 image_create_info.extent.depth = 1;
4760 image_create_info.mipLevels = 1;
4761 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004762 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004763 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4764 image_create_info.usage =
4765 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4766 // Note: Some implementations expect color attachment usage for any
4767 // multisample surface
4768 image_create_info.flags = 0;
4769
4770 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4771 srcImage2D.init(&image_create_info);
4772 ASSERT_TRUE(srcImage2D.initialized());
4773
4774 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4775 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4776 dstImage1D.init(&image_create_info);
4777 ASSERT_TRUE(dstImage1D.initialized());
4778
4779 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4780 image_create_info.extent.height = 16;
4781 image_create_info.extent.depth = 16;
4782 image_create_info.arrayLayers = 1;
4783 dstImage3D.init(&image_create_info);
4784 ASSERT_TRUE(dstImage3D.initialized());
4785
4786 m_commandBuffer->begin();
4787
4788 VkImageResolve resolveRegion;
4789 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4790 resolveRegion.srcSubresource.mipLevel = 0;
4791 resolveRegion.srcSubresource.baseArrayLayer = 0;
4792 resolveRegion.srcSubresource.layerCount = 1;
4793 resolveRegion.srcOffset.x = 0;
4794 resolveRegion.srcOffset.y = 0;
4795 resolveRegion.srcOffset.z = 0;
4796 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4797 resolveRegion.dstSubresource.mipLevel = 0;
4798 resolveRegion.dstSubresource.baseArrayLayer = 0;
4799 resolveRegion.dstSubresource.layerCount = 1;
4800 resolveRegion.dstOffset.x = 0;
4801 resolveRegion.dstOffset.y = 0;
4802 resolveRegion.dstOffset.z = 0;
4803 resolveRegion.extent.width = 1;
4804 resolveRegion.extent.height = 1;
4805 resolveRegion.extent.depth = 1;
4806
4807 // non-zero value baseArrayLayer
4808 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004810 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4811 &resolveRegion);
4812 m_errorMonitor->VerifyFound();
4813 resolveRegion.srcSubresource.baseArrayLayer = 0;
4814
4815 // Set height with 1D dstImage
4816 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004818 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004819 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004821 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4822 &resolveRegion);
4823 m_errorMonitor->VerifyFound();
4824 resolveRegion.extent.height = 1;
4825
4826 // Set depth with 1D dstImage and 2D srcImage
4827 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004830 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4831 &resolveRegion);
4832 m_errorMonitor->VerifyFound();
4833 resolveRegion.extent.depth = 1;
4834
4835 m_commandBuffer->end();
4836}
4837
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004838TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4839 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4840 ASSERT_NO_FATAL_FAILURE(Init());
4841
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004842 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004843 VkImageObj srcImage2D(m_device);
4844 VkImageObj dstImage2D(m_device);
4845
4846 VkImageCreateInfo image_create_info = {};
4847 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4848 image_create_info.pNext = NULL;
4849 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4850 image_create_info.extent.width = 32;
4851 image_create_info.extent.height = 32;
4852 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004853 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004854 image_create_info.arrayLayers = 1;
4855 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4856 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4857 image_create_info.usage =
4858 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4859 // Note: Some implementations expect color attachment usage for any
4860 // multisample surface
4861 image_create_info.flags = 0;
4862
4863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4864 srcImage2D.init(&image_create_info);
4865 ASSERT_TRUE(srcImage2D.initialized());
4866
4867 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4868 dstImage2D.init(&image_create_info);
4869 ASSERT_TRUE(dstImage2D.initialized());
4870
4871 m_commandBuffer->begin();
4872
4873 VkImageResolve resolveRegion = {};
4874 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4875 resolveRegion.srcSubresource.mipLevel = 0;
4876 resolveRegion.srcSubresource.baseArrayLayer = 0;
4877 resolveRegion.srcSubresource.layerCount = 1;
4878 resolveRegion.srcOffset.x = 0;
4879 resolveRegion.srcOffset.y = 0;
4880 resolveRegion.srcOffset.z = 0;
4881 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4882 resolveRegion.dstSubresource.mipLevel = 0;
4883 resolveRegion.dstSubresource.baseArrayLayer = 0;
4884 resolveRegion.dstSubresource.layerCount = 1;
4885 resolveRegion.dstOffset.x = 0;
4886 resolveRegion.dstOffset.y = 0;
4887 resolveRegion.dstOffset.z = 0;
4888 resolveRegion.extent.width = 32;
4889 resolveRegion.extent.height = 32;
4890 resolveRegion.extent.depth = 1;
4891
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004892 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4893 &resolveRegion);
4894 m_errorMonitor->VerifyNotFound();
4895
4896 // srcImage exceeded in x-dim
4897 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004898 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004899 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4900 &resolveRegion);
4901 m_errorMonitor->VerifyFound();
4902 resolveRegion.srcOffset.x = 0;
4903
4904 // dstImage exceeded in x-dim
4905 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004906 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004907 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4908 &resolveRegion);
4909 m_errorMonitor->VerifyFound();
4910 resolveRegion.dstOffset.x = 0;
4911
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004912 // both image exceeded in y-dim
4913 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004915 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4916 &resolveRegion);
4917 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004918 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004919
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004920 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004921 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004922 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4923 &resolveRegion);
4924 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004925 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004926
4927 // srcImage exceeded in z-dim
4928 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004929 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4930 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004931 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4932 &resolveRegion);
4933 m_errorMonitor->VerifyFound();
4934 resolveRegion.srcOffset.z = 0;
4935
4936 // dstImage exceeded in z-dim
4937 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004938 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004940 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4941 &resolveRegion);
4942 m_errorMonitor->VerifyFound();
4943 resolveRegion.dstOffset.z = 0;
4944
4945 m_commandBuffer->end();
4946}
4947
unknown088160a2019-05-23 17:43:13 -06004948TEST_F(VkLayerTest, ClearImageErrors) {
4949 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4950
4951 ASSERT_NO_FATAL_FAILURE(Init());
4952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4953
4954 m_commandBuffer->begin();
4955
4956 // Color image
4957 VkClearColorValue clear_color;
4958 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4959 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4960 const int32_t img_width = 32;
4961 const int32_t img_height = 32;
4962 VkImageCreateInfo image_create_info = {};
4963 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4964 image_create_info.pNext = NULL;
4965 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4966 image_create_info.format = color_format;
4967 image_create_info.extent.width = img_width;
4968 image_create_info.extent.height = img_height;
4969 image_create_info.extent.depth = 1;
4970 image_create_info.mipLevels = 1;
4971 image_create_info.arrayLayers = 1;
4972 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4973 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4974
4975 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4976 vk_testing::Image color_image_no_transfer;
4977 color_image_no_transfer.init(*m_device, image_create_info);
4978
4979 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4980 vk_testing::Image color_image;
4981 color_image.init(*m_device, image_create_info);
4982
4983 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4984
4985 // Depth/Stencil image
4986 VkClearDepthStencilValue clear_value = {0};
4987 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4988 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4989 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4990 ds_image_create_info.extent.width = 64;
4991 ds_image_create_info.extent.height = 64;
4992 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4993 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4994
4995 vk_testing::Image ds_image;
4996 ds_image.init(*m_device, ds_image_create_info);
4997
4998 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4999
sfricke-samsungcd924d92020-05-20 23:51:17 -07005000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005001
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005002 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005003
5004 m_errorMonitor->VerifyFound();
5005
sfricke-samsungcd924d92020-05-20 23:51:17 -07005006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005007
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005008 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5009 &color_range);
unknown088160a2019-05-23 17:43:13 -06005010
5011 m_errorMonitor->VerifyFound();
5012
5013 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005016
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005017 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5018 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005019
5020 m_errorMonitor->VerifyFound();
5021}
5022
5023TEST_F(VkLayerTest, CommandQueueFlags) {
5024 TEST_DESCRIPTION(
5025 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5026
5027 ASSERT_NO_FATAL_FAILURE(Init());
5028
5029 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5030 if (queueFamilyIndex == UINT32_MAX) {
5031 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5032 return;
5033 } else {
5034 // Create command pool on a non-graphics queue
5035 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5036
5037 // Setup command buffer on pool
5038 VkCommandBufferObj command_buffer(m_device, &command_pool);
5039 command_buffer.begin();
5040
5041 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005043 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5044 command_buffer.SetViewport(0, 1, &viewport);
5045 m_errorMonitor->VerifyFound();
5046 }
5047}
5048
sfricke-samsung674ba102020-08-18 22:38:49 -07005049TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5050 TEST_DESCRIPTION(
5051 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5052 "buffer");
5053
5054 ASSERT_NO_FATAL_FAILURE(Init());
5055
5056 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5057 if (queueFamilyIndex == UINT32_MAX) {
5058 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5059 return;
5060 } else {
5061 // Create Depth image
5062 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5063 if (ds_format == VK_FORMAT_UNDEFINED) {
5064 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5065 return;
5066 }
5067
5068 VkImageObj ds_image(m_device);
5069 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5070 VK_IMAGE_TILING_OPTIMAL, 0);
5071 ASSERT_TRUE(ds_image.initialized());
5072
5073 // Allocate buffers
5074 VkBufferObj buffer;
5075 VkMemoryPropertyFlags reqs = 0;
5076 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5077
5078 VkBufferImageCopy region = {};
5079 region.bufferRowLength = 0;
5080 region.bufferImageHeight = 0;
5081 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5082 region.imageSubresource.layerCount = 1;
5083 region.imageOffset = {0, 0, 0};
5084 region.imageExtent = {64, 64, 1};
5085 region.bufferOffset = 0;
5086
5087 // Create command pool on a non-graphics queue
5088 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5089
5090 // Setup command buffer on pool
5091 VkCommandBufferObj command_buffer(m_device, &command_pool);
5092 command_buffer.begin();
5093
sfricke-samsungea4fd142020-10-17 23:51:59 -07005094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005095 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5096 1, &region);
5097 m_errorMonitor->VerifyFound();
5098 }
5099}
5100
sfricke-samsung5a019492021-01-25 10:32:08 -08005101TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5102 TEST_DESCRIPTION(
5103 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5104 "buffer");
5105
5106 ASSERT_NO_FATAL_FAILURE(Init());
5107
5108 // Should be left with a tranfser queue
5109 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5110 if (queueFamilyIndex == UINT32_MAX) {
5111 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5112 return;
5113 }
5114
5115 VkImageObj image(m_device);
5116 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5117 VK_IMAGE_TILING_OPTIMAL, 0);
5118 ASSERT_TRUE(image.initialized());
5119
5120 // Allocate buffers
5121 VkBufferObj buffer;
5122 VkMemoryPropertyFlags reqs = 0;
5123 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5124
5125 VkBufferImageCopy region = {};
5126 region.bufferRowLength = 0;
5127 region.bufferImageHeight = 0;
5128 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5129 region.imageSubresource.layerCount = 1;
5130 region.imageOffset = {0, 0, 0};
5131 region.imageExtent = {16, 16, 1};
5132 region.bufferOffset = 5;
5133
5134 // Create command pool on a non-graphics queue
5135 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5136
5137 // Setup command buffer on pool
5138 VkCommandBufferObj command_buffer(m_device, &command_pool);
5139 command_buffer.begin();
5140
5141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5143 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5144 &region);
5145 m_errorMonitor->VerifyFound();
5146}
5147
sfricke-samsungcb467672020-11-25 00:09:28 -08005148TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5149 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5150
5151 ASSERT_NO_FATAL_FAILURE(Init());
5152
5153 if (m_device->queue_props.size() < 2) {
5154 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5155 return;
5156 }
5157
5158 // First two queue families
5159 uint32_t queue_index_A = 0;
5160 uint32_t queue_index_B = 1;
5161
5162 VkCommandPoolCreateInfo pool_create_info = {};
5163 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5164 pool_create_info.pNext = nullptr;
5165 pool_create_info.flags = 0;
5166
5167 VkCommandPool command_pool_A;
5168 pool_create_info.queueFamilyIndex = queue_index_A;
5169 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5170
5171 VkCommandPool command_pool_B;
5172 pool_create_info.queueFamilyIndex = queue_index_B;
5173 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5174
5175 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
5176 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5177 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5178 command_buffer_allocate_info.commandBufferCount = 1;
5179 command_buffer_allocate_info.commandPool = command_pool_A;
5180 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5181 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5182
5183 command_buffer_allocate_info.commandPool = command_pool_B;
5184 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5185 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5186
5187 VkCommandBufferBeginInfo begin_info = {};
5188 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5189
5190 // secondary
5191 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5192 vk::EndCommandBuffer(command_buffer[1]);
5193
5194 // Try using different pool's command buffer as secondary
5195 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5196 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5197 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5198 m_errorMonitor->VerifyFound();
5199 vk::EndCommandBuffer(command_buffer[0]);
5200
5201 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5202 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5203}
5204
unknown088160a2019-05-23 17:43:13 -06005205TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5206 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5207 ASSERT_NO_FATAL_FAILURE(Init());
5208 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5209 // never record secondary
5210
Mark Lobodzinski20310782020-02-28 14:25:17 -07005211 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005212 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005213 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005214 m_errorMonitor->VerifyFound();
5215 m_commandBuffer->end();
5216}
5217
5218TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5219 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5220
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005221 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005222 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5223
5224 VkImageCreateInfo image_create_info = {};
5225 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5226 image_create_info.pNext = NULL;
5227 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5228 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5229 image_create_info.extent.width = 32;
5230 image_create_info.extent.height = 1;
5231 image_create_info.extent.depth = 1;
5232 image_create_info.mipLevels = 1;
5233 image_create_info.arrayLayers = 1;
5234 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5235 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5236 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5237 image_create_info.flags = 0;
5238
5239 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5240 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5241
5242 VkImageObj image(m_device);
5243 image.init(&image_create_info);
5244 ASSERT_TRUE(image.initialized());
5245 VkImageMemoryBarrier image_barrier =
5246 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5247
5248 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5249 image_barrier.oldLayout = old_layout;
5250 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005251 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5252 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005253 };
5254
5255 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5256 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5257 secondary.begin();
5258 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5259 secondary.end();
5260
Mark Lobodzinski20310782020-02-28 14:25:17 -07005261 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005262 m_commandBuffer->begin();
5263 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005264 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005265 m_errorMonitor->VerifyFound();
5266
unknown088160a2019-05-23 17:43:13 -06005267 m_commandBuffer->reset();
5268 secondary.reset();
5269
5270 // Validate that UNDEFINED doesn't false positive on us
5271 secondary.begin();
5272 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5273 secondary.end();
5274 m_commandBuffer->begin();
5275 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5276 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005277 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005278 m_errorMonitor->VerifyNotFound();
5279 m_commandBuffer->end();
5280}
5281
5282TEST_F(VkLayerTest, SetDynViewportParamTests) {
5283 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5284
5285 SetTargetApiVersion(VK_API_VERSION_1_1);
5286 VkPhysicalDeviceFeatures features{};
5287 ASSERT_NO_FATAL_FAILURE(Init(&features));
5288
5289 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5290 const VkViewport viewports[] = {vp, vp};
5291
5292 m_commandBuffer->begin();
5293
5294 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005296 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005297 m_errorMonitor->VerifyFound();
5298
Mark Lobodzinski20310782020-02-28 14:25:17 -07005299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005300 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005301 m_errorMonitor->VerifyFound();
5302
Mark Lobodzinski20310782020-02-28 14:25:17 -07005303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005304 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005305 m_errorMonitor->VerifyFound();
5306
Mark Lobodzinski20310782020-02-28 14:25:17 -07005307 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005309 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005310 m_errorMonitor->VerifyFound();
5311
Mark Lobodzinski20310782020-02-28 14:25:17 -07005312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005313 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005314 m_errorMonitor->VerifyFound();
5315
5316 // core viewport tests
5317 using std::vector;
5318 struct TestCase {
5319 VkViewport vp;
5320 std::string veid;
5321 };
5322
5323 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5324 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5325 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5326
5327 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5328 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5329 const auto one_before_min_bounds = NearestSmaller(min_bound);
5330 const auto one_past_max_bounds = NearestGreater(max_bound);
5331
5332 const auto below_zero = NearestSmaller(0.0f);
5333 const auto past_one = NearestGreater(1.0f);
5334
5335 vector<TestCase> test_cases = {
5336 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5337 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5338 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5339 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5340 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5341 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5342 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5343 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5344 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5345 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5346 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5347 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5348 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5349 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5350 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5351 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5352 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5353 };
5354
5355 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5356 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5357 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5358 } else {
5359 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5360 }
5361
5362 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005363 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005364 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005365 m_errorMonitor->VerifyFound();
5366 }
5367}
5368
5369TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5370 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5371
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005372 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005373
5374 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
5375 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5376 } else {
5377 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5378 return;
5379 }
5380 ASSERT_NO_FATAL_FAILURE(InitState());
5381
5382 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5383}
5384
5385TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5386 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5387
5388 ASSERT_NO_FATAL_FAILURE(Init());
5389
5390 if (!m_device->phy().features().multiViewport) {
5391 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5392 return;
5393 }
5394
unknown088160a2019-05-23 17:43:13 -06005395 m_commandBuffer->begin();
5396
Mark Lobodzinski20310782020-02-28 14:25:17 -07005397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005398 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005399 m_errorMonitor->VerifyFound();
5400
Petr Kraus14e49492019-09-09 20:13:29 +02005401 const auto max_viewports = m_device->props.limits.maxViewports;
5402
Mark Lobodzinski20310782020-02-28 14:25:17 -07005403 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005404 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005405 m_errorMonitor->VerifyFound();
5406
Petr Kraus14e49492019-09-09 20:13:29 +02005407 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5408 if (max_viewports >= too_big_max_viewports) {
5409 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5410 kSkipPrefix);
5411 } else {
5412 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5413 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5414
Mark Lobodzinski20310782020-02-28 14:25:17 -07005415 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005416 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005417 m_errorMonitor->VerifyFound();
5418
Mark Lobodzinski20310782020-02-28 14:25:17 -07005419 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005420 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005421 m_errorMonitor->VerifyFound();
5422
Mark Lobodzinski20310782020-02-28 14:25:17 -07005423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005424 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005425 m_errorMonitor->VerifyFound();
5426
Mark Lobodzinski20310782020-02-28 14:25:17 -07005427 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005428 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005429 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005430 }
unknown088160a2019-05-23 17:43:13 -06005431}
5432
5433TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5434 TEST_DESCRIPTION(
5435 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5436
5437 ASSERT_NO_FATAL_FAILURE(Init());
5438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5439
5440 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5441 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5442
5443 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5444 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5445 nullptr, // pNext
5446 m_renderPass,
5447 0, // subpass
5448 m_framebuffer,
5449 };
5450 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5451 nullptr, // pNext
5452 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5453
5454 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5455 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5456 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5457 sec_cmdbuff_inside_rp.end();
5458
5459 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5460 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5461 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5462 sec_cmdbuff_outside_rp.end();
5463
5464 m_commandBuffer->begin();
5465
Mark Lobodzinski20310782020-02-28 14:25:17 -07005466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005467 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005468 m_errorMonitor->VerifyFound();
5469
5470 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5471 nullptr, // pNext
5472 m_renderPass,
5473 m_framebuffer,
5474 {{0, 0}, {32, 32}},
5475 static_cast<uint32_t>(m_renderPassClearValues.size()),
5476 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005477 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005478
Mark Lobodzinski20310782020-02-28 14:25:17 -07005479 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005480 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005481 m_errorMonitor->VerifyFound();
5482}
5483
5484TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5485 TEST_DESCRIPTION(
5486 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5487 ASSERT_NO_FATAL_FAILURE(Init());
5488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5489
5490 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5491 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5492 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5493 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5494 command_buffer_allocate_info.commandBufferCount = 1;
5495
5496 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005497 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005498 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5499 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5500 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5501 command_buffer_inheritance_info.renderPass = m_renderPass;
5502 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5503
5504 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5505 command_buffer_begin_info.flags =
5506 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5507 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5508
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005509 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005510 VkClearAttachment color_attachment;
5511 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5512 color_attachment.clearValue.color.float32[0] = 0;
5513 color_attachment.clearValue.color.float32[1] = 0;
5514 color_attachment.clearValue.color.float32[2] = 0;
5515 color_attachment.clearValue.color.float32[3] = 0;
5516 color_attachment.colorAttachment = 0;
5517 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005518 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005519 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5520 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005521 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005522 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005523
Mark Lobodzinski20310782020-02-28 14:25:17 -07005524 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005525 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005526 m_errorMonitor->VerifyFound();
5527
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005528 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005529 m_commandBuffer->end();
5530}
5531
5532TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5533 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5534 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5535 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5536 } else {
5537 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5538 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5539 return;
5540 }
5541
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005542 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005543 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5544 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5545 } else {
5546 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5547 return;
5548 }
5549 ASSERT_NO_FATAL_FAILURE(InitState());
5550
5551 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5552 if (push_descriptor_prop.maxPushDescriptors < 1) {
5553 // Some implementations report an invalid maxPushDescriptors of 0
5554 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5555 return;
5556 }
5557
5558 // Create ordinary and push descriptor set layout
5559 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5560 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5561 ASSERT_TRUE(ds_layout.initialized());
5562 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5563 ASSERT_TRUE(push_ds_layout.initialized());
5564
5565 // Now use the descriptor set layouts to create a pipeline layout
5566 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5567 ASSERT_TRUE(pipeline_layout.initialized());
5568
5569 // Create a descriptor to push
5570 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5571 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5572 ASSERT_TRUE(buffer_obj.initialized());
5573
5574 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5575 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5576 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5577
5578 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5579 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5580
5581 // Find address of extension call and make the call
5582 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005583 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005584 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5585
5586 // Section 1: Queue family matching/capabilities.
5587 // Create command pool on a non-graphics queue
5588 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5589 const uint32_t transfer_only_qfi =
5590 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5591 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005592 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005593 } else {
5594 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5595
5596 VkCommandPoolObj command_pool(m_device, err_qfi);
5597 ASSERT_TRUE(command_pool.initialized());
5598 VkCommandBufferObj command_buffer(m_device, &command_pool);
5599 ASSERT_TRUE(command_buffer.initialized());
5600 command_buffer.begin();
5601
Mark Lobodzinski20310782020-02-28 14:25:17 -07005602 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5603 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005604 if (err_qfi == transfer_only_qfi) {
5605 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005606 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005607 }
5608 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5609 &descriptor_write);
5610 m_errorMonitor->VerifyFound();
5611 command_buffer.end();
5612
5613 // If we succeed in testing only one condition above, we need to test the other below.
5614 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5615 // Need to test the neither compute/gfx supported case separately.
5616 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5617 ASSERT_TRUE(tran_command_pool.initialized());
5618 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5619 ASSERT_TRUE(tran_command_buffer.initialized());
5620 tran_command_buffer.begin();
5621
5622 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005623 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005626 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5627 &descriptor_write);
5628 m_errorMonitor->VerifyFound();
5629 tran_command_buffer.end();
5630 }
5631 }
5632
5633 // Push to the non-push binding
5634 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005636 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5637 &descriptor_write);
5638 m_errorMonitor->VerifyFound();
5639
5640 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005641 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005642 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5643 &descriptor_write);
5644 m_errorMonitor->VerifyFound();
5645 m_commandBuffer->end();
5646
5647 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5648 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005650 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005652 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5653 &descriptor_write);
5654 m_errorMonitor->VerifyFound();
5655}
5656
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005657TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5658 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5659 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5660 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5661 } else {
5662 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5663 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5664 return;
5665 }
5666
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005667 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005668 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5669 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5670 } else {
5671 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5672 return;
5673 }
5674 ASSERT_NO_FATAL_FAILURE(InitState());
5675
5676 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5677 if (push_descriptor_prop.maxPushDescriptors < 1) {
5678 // Some implementations report an invalid maxPushDescriptors of 0.
5679 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5680 return;
5681 }
5682
5683 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5684 if (min_alignment == 0) {
5685 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5686 return;
5687 }
5688
5689 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5690 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5691 ASSERT_TRUE(push_ds_layout.initialized());
5692
5693 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5694 ASSERT_TRUE(pipeline_layout.initialized());
5695
5696 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5697 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5698 ASSERT_TRUE(buffer_obj.initialized());
5699
5700 // Use an invalid alignment.
5701 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5702 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5703 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5704
5705 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5706 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5707 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5708
5709 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005711 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5712 &descriptor_write);
5713 m_errorMonitor->VerifyFound();
5714
5715 m_commandBuffer->end();
5716}
5717
unknown088160a2019-05-23 17:43:13 -06005718TEST_F(VkLayerTest, SetDynScissorParamTests) {
5719 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5720
5721 VkPhysicalDeviceFeatures features{};
5722 ASSERT_NO_FATAL_FAILURE(Init(&features));
5723
5724 const VkRect2D scissor = {{0, 0}, {16, 16}};
5725 const VkRect2D scissors[] = {scissor, scissor};
5726
5727 m_commandBuffer->begin();
5728
5729 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005730 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005731 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005732 m_errorMonitor->VerifyFound();
5733
Mark Lobodzinski20310782020-02-28 14:25:17 -07005734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005735 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005736 m_errorMonitor->VerifyFound();
5737
Mark Lobodzinski20310782020-02-28 14:25:17 -07005738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005739 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005740 m_errorMonitor->VerifyFound();
5741
Mark Lobodzinski20310782020-02-28 14:25:17 -07005742 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005744 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005745 m_errorMonitor->VerifyFound();
5746
Mark Lobodzinski20310782020-02-28 14:25:17 -07005747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005748 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005749 m_errorMonitor->VerifyFound();
5750
5751 struct TestCase {
5752 VkRect2D scissor;
5753 std::string vuid;
5754 };
5755
5756 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5757 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5758 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5759 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5760 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5761 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5762 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5763 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5764
5765 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005767 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005768 m_errorMonitor->VerifyFound();
5769 }
5770
5771 m_commandBuffer->end();
5772}
5773
5774TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5775 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5776
5777 ASSERT_NO_FATAL_FAILURE(Init());
5778
5779 if (!m_device->phy().features().multiViewport) {
5780 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5781 return;
5782 }
5783
unknown088160a2019-05-23 17:43:13 -06005784 m_commandBuffer->begin();
5785
Mark Lobodzinski20310782020-02-28 14:25:17 -07005786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005787 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005788 m_errorMonitor->VerifyFound();
5789
Petr Kraus14e49492019-09-09 20:13:29 +02005790 const auto max_scissors = m_device->props.limits.maxViewports;
5791
Mark Lobodzinski20310782020-02-28 14:25:17 -07005792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005793 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005794 m_errorMonitor->VerifyFound();
5795
Petr Kraus14e49492019-09-09 20:13:29 +02005796 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5797 if (max_scissors >= too_big_max_scissors) {
5798 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5799 kSkipPrefix);
5800 } else {
5801 const VkRect2D scissor = {{0, 0}, {16, 16}};
5802 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5803
Mark Lobodzinski20310782020-02-28 14:25:17 -07005804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005805 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005806 m_errorMonitor->VerifyFound();
5807
Mark Lobodzinski20310782020-02-28 14:25:17 -07005808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005809 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005810 m_errorMonitor->VerifyFound();
5811
Mark Lobodzinski20310782020-02-28 14:25:17 -07005812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005813 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005814 m_errorMonitor->VerifyFound();
5815
Mark Lobodzinski20310782020-02-28 14:25:17 -07005816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005817 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005818 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005819 }
unknown088160a2019-05-23 17:43:13 -06005820}
5821
Tony-LunarG667cc022021-06-25 10:11:17 -06005822TEST_F(VkLayerTest, MultiDrawTests) {
5823 TEST_DESCRIPTION("Test validation of multi_draw extension");
5824 SetTargetApiVersion(VK_API_VERSION_1_2);
5825 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5826 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5827 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5828 return;
5829 }
5830
5831 auto multi_draw_features = LvlInitStruct<VkPhysicalDeviceMultiDrawFeaturesEXT>();
5832 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&multi_draw_features);
5833 vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
5834 if (!multi_draw_features.multiDraw) {
5835 printf("%s Test requires (unsupported) multiDraw, skipping\n", kSkipPrefix);
5836 return;
5837 }
5838 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5839 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5840 } else {
5841 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5842 return;
5843 }
5844 auto multi_draw_properties = LvlInitStruct<VkPhysicalDeviceMultiDrawPropertiesEXT>();
5845 auto properties2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&multi_draw_properties);
5846 vk::GetPhysicalDeviceProperties2(gpu(), &properties2);
5847
5848 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5849 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5850
5851 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5852 auto vkCmdDrawMultiIndexedEXT =
5853 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5854 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5855
5856 VkMultiDrawInfoEXT multi_draws[3] = {};
5857 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5858
5859 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5860 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5861
5862 CreatePipelineHelper pipe(*this);
5863 pipe.InitInfo();
5864 pipe.InitState();
5865 pipe.CreateGraphicsPipeline();
5866
5867 // Try existing VUID checks
5868 m_commandBuffer->begin();
5869 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5870
5871 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5872 &pipe.descriptor_set_->set_, 0, NULL);
5873 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-02700");
5874 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5875 m_errorMonitor->VerifyFound();
5876 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-02700");
5877 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5878 m_errorMonitor->VerifyFound();
5879
5880 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5881
5882 // New VUIDs added with multi_draw (also see GPU-AV)
5883 VkBufferObj buffer;
5884 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5885 multi_draw_indices[2].indexCount = 513;
5886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938");
5887 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5888 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5889 m_errorMonitor->VerifyFound();
5890 multi_draw_indices[2].indexCount = 1;
5891
5892 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-stride-04936");
5893 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT) + 1);
5894 m_errorMonitor->VerifyFound();
5895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-stride-04941");
5896 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT) + 1, 0);
5897 m_errorMonitor->VerifyFound();
5898
5899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04935");
5900 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
5901 m_errorMonitor->VerifyFound();
5902 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940");
5903 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, nullptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5904 m_errorMonitor->VerifyFound();
5905
5906 if (multi_draw_properties.maxMultiDrawCount < UINT32_MAX) {
5907 uint32_t draw_count = multi_draw_properties.maxMultiDrawCount + 1;
5908 std::vector<VkMultiDrawInfoEXT> max_multi_draws(draw_count);
5909 std::vector<VkMultiDrawIndexedInfoEXT> max_multi_indexed_draws(draw_count);
5910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-drawCount-04934");
5911 vkCmdDrawMultiEXT(m_commandBuffer->handle(), draw_count, max_multi_draws.data(), 1, 0, sizeof(VkMultiDrawInfoEXT));
5912 m_errorMonitor->VerifyFound();
5913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939");
5914 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), draw_count, max_multi_indexed_draws.data(), 1, 0,
5915 sizeof(VkMultiDrawIndexedInfoEXT), 0);
5916 m_errorMonitor->VerifyFound();
5917 }
5918}
5919
5920TEST_F(VkLayerTest, MultiDrawFeatures) {
5921 TEST_DESCRIPTION("Test validation of multi draw feature enabled");
5922 SetTargetApiVersion(VK_API_VERSION_1_2);
5923 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5924 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5925 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5926 return;
5927 }
5928 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
5929 m_device_extension_names.push_back(VK_EXT_MULTI_DRAW_EXTENSION_NAME);
5930 } else {
5931 printf("%s VK_EXT_multi_draw extension not supported, skipping test\n", kSkipPrefix);
5932 return;
5933 }
5934 ASSERT_NO_FATAL_FAILURE(InitState());
5935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5936
5937 auto vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiEXT");
5938 auto vkCmdDrawMultiIndexedEXT =
5939 (PFN_vkCmdDrawMultiIndexedEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawMultiIndexedEXT");
5940 assert(vkCmdDrawMultiEXT != nullptr && vkCmdDrawMultiIndexedEXT != nullptr);
5941
5942 VkMultiDrawInfoEXT multi_draws[3] = {};
5943 multi_draws[0].vertexCount = multi_draws[1].vertexCount = multi_draws[2].vertexCount = 3;
5944
5945 VkMultiDrawIndexedInfoEXT multi_draw_indices[3] = {};
5946 multi_draw_indices[0].indexCount = multi_draw_indices[1].indexCount = multi_draw_indices[2].indexCount = 1;
5947
5948 CreatePipelineHelper pipe(*this);
5949 pipe.InitInfo();
5950 pipe.InitState();
5951 pipe.CreateGraphicsPipeline();
5952
5953 m_commandBuffer->begin();
5954 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5955 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiEXT-None-04933");
5957 vkCmdDrawMultiEXT(m_commandBuffer->handle(), 3, multi_draws, 1, 0, sizeof(VkMultiDrawInfoEXT));
5958 m_errorMonitor->VerifyFound();
5959 VkBufferObj buffer;
5960 buffer.init(*m_device, 1024, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5961 m_commandBuffer->BindIndexBuffer(&buffer, 0, VK_INDEX_TYPE_UINT16);
5962 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMultiIndexedEXT-None-04937");
5963 vkCmdDrawMultiIndexedEXT(m_commandBuffer->handle(), 3, multi_draw_indices, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), 0);
5964 m_errorMonitor->VerifyFound();
5965}
5966
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005967TEST_F(VkLayerTest, IndirectDrawTests) {
5968 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005969
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005970 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5971 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5972 } else {
5973 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5974 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5975 return;
5976 }
5977 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5978
5979 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5980 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5981 return;
5982 }
5983
5984 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
5985 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
5986 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5987
5988 // Create a device and ensure multiDrawIndirect is disabled
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005989 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5990 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005991 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5992 features2.features.multiDrawIndirect = VK_FALSE;
5993
5994 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06005995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5996
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005997 CreatePipelineHelper pipe(*this);
5998 pipe.InitInfo();
5999 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6000 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6001 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6002 dyn_state_ci.dynamicStateCount = size(dyn_states);
6003 dyn_state_ci.pDynamicStates = dyn_states;
6004 pipe.dyn_state_ci_ = dyn_state_ci;
6005 pipe.InitState();
6006 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006007
6008 m_commandBuffer->begin();
6009 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6010
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006011 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6012 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6013 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006014
6015 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006016 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006017 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006018 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006019
6020 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6021 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
6022 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006023 VkBufferObj draw_buffer;
6024 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006025
6026 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07006027 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006028 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006029 m_errorMonitor->VerifyFound();
6030
Mark Lobodzinski128608f2020-11-02 13:46:57 -07006031 // VUID-vkCmdDrawIndirect-drawCount-02718
6032 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-02718");
6033 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
6034 m_errorMonitor->VerifyFound();
6035
6036 // VUID-vkCmdDrawIndexedIndirect-drawCount-02718
6037 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-02718");
6038 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
6039 m_errorMonitor->VerifyFound();
6040
unknown088160a2019-05-23 17:43:13 -06006041 m_commandBuffer->EndRenderPass();
6042 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06006043}
6044
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006045TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
6046 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
6047
6048 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6049 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6050 } else {
6051 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6052 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6053 return;
6054 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006055 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006056
6057 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6058 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6059 } else {
6060 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07006061 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006062 }
6063
6064 ASSERT_NO_FATAL_FAILURE(InitState());
6065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6066
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006067 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6068 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006069 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6070
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006071 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
6072 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
6073
6074 m_commandBuffer->begin();
6075 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6076 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6077 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6078 buffer_create_info.size = 1024;
6079 VkBufferObj counter_buffer;
6080 counter_buffer.init(*m_device, buffer_create_info);
6081
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006082 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07006083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006084 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006085 m_errorMonitor->VerifyFound();
6086
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006087 // some mock ICD json files are missing a valid stride value
6088 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
6089 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08006090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07006091 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
6092 m_errorMonitor->VerifyFound();
6093 }
6094
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006095 m_commandBuffer->EndRenderPass();
6096 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07006097
6098 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
6099 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
6100 return;
6101 }
6102
6103 std::vector<const char *> device_extension_names;
6104 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6105 VkDeviceObj test_device(0, gpu(), device_extension_names);
6106 VkCommandPoolObj commandPool(&test_device, 0);
6107 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
6108 VkBufferObj counter_buffer2;
6109 counter_buffer2.init(test_device, buffer_create_info);
6110 VkPipelineLayoutObj pipelineLayout(&test_device);
6111 VkRenderPass renderpass;
6112 VkRenderPassCreateInfo rp_info = {};
6113 VkSubpassDescription subpass = {};
6114 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
6115 rp_info.pSubpasses = &subpass;
6116 rp_info.subpassCount = 1;
6117 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
6118 VkPipelineObj pipeline(&test_device);
6119 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6120 pipeline.AddShader(&vs);
6121 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
6122 m_renderPassBeginInfo.renderPass = renderpass;
6123 VkFramebuffer fb;
6124 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
6125 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
6126 m_renderPassBeginInfo.framebuffer = fb;
6127 m_renderPassBeginInfo.renderPass = renderpass;
6128 commandBuffer.begin();
6129 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6130 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
6131 VkRect2D scissor = {{0, 0}, {16, 16}};
6132 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
6133 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
6134 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
6135 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08006136 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07006137 }
6138 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
6139 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6140 m_errorMonitor->VerifyFound();
6141 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6142 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006143}
6144
unknown088160a2019-05-23 17:43:13 -06006145TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6146 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6147
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006148 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006149 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6150 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6151 } else {
6152 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6153 return;
6154 }
6155 ASSERT_NO_FATAL_FAILURE(InitState());
6156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6157
6158 VkMemoryRequirements memory_requirements;
6159 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
6160
6161 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006162 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006163
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006164 CreatePipelineHelper pipe(*this);
6165 pipe.InitInfo();
6166 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6167 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6168 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6169 dyn_state_ci.dynamicStateCount = size(dyn_states);
6170 dyn_state_ci.pDynamicStates = dyn_states;
6171 pipe.dyn_state_ci_ = dyn_state_ci;
6172 pipe.InitState();
6173 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006174
6175 m_commandBuffer->begin();
6176 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6177
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006178 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6179 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6180 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006181
6182 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006183 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006184 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006185 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006186
6187 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6188 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6189 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6190 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006191 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006192
6193 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6194 count_buffer_create_info.size = sizeof(uint32_t);
6195 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006196 VkBufferObj count_buffer;
6197 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006198
Mike Schuchardt65847d92019-12-20 13:50:47 -08006199 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006200 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006201 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6202 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006203 m_errorMonitor->VerifyFound();
6204
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006205 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006206 memory_allocate_info.allocationSize = memory_requirements.size;
6207 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6208 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006209 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6210 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006211
6212 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006213 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006214
Mike Schuchardt65847d92019-12-20 13:50:47 -08006215 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006216 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006217 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6218 m_errorMonitor->VerifyFound();
6219
Mike Schuchardt65847d92019-12-20 13:50:47 -08006220 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006222 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6223 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006224 m_errorMonitor->VerifyFound();
6225
Mike Schuchardt65847d92019-12-20 13:50:47 -08006226 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006227 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006228 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6229 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006230 m_errorMonitor->VerifyFound();
6231
Mike Schuchardt65847d92019-12-20 13:50:47 -08006232 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006233 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006234 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006235 m_errorMonitor->VerifyFound();
6236
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006237 // TODO: These covered VUIDs aren't tested. There is also no test coverage for the core Vulkan 1.0 vk::CmdDraw* equivalent of
unknown088160a2019-05-23 17:43:13 -06006238 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006239 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6240 // VUID-vkCmdDrawIndirectCount-subpass-02685
6241 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006242
6243 m_commandBuffer->EndRenderPass();
6244 m_commandBuffer->end();
6245
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006246 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6247 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006248
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006249 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006250}
6251
6252TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6253 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6254
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006255 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006256 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6257 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6258 } else {
6259 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6260 return;
6261 }
6262 ASSERT_NO_FATAL_FAILURE(InitState());
6263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6264
unknown088160a2019-05-23 17:43:13 -06006265 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006266 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006267
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006268 CreatePipelineHelper pipe(*this);
6269 pipe.InitInfo();
6270 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6271 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6272 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6273 dyn_state_ci.dynamicStateCount = size(dyn_states);
6274 dyn_state_ci.pDynamicStates = dyn_states;
6275 pipe.dyn_state_ci_ = dyn_state_ci;
6276 pipe.InitState();
6277 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006278
6279 m_commandBuffer->begin();
6280 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6281
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006282 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6283 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6284 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006285
6286 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006287 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006288 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006289 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006290
6291 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6292 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6293 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006294 VkBufferObj draw_buffer;
6295 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006296
6297 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6298 count_buffer_create_info.size = sizeof(uint32_t);
6299 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006300 VkBufferObj count_buffer;
6301 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006302
6303 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6304 index_buffer_create_info.size = sizeof(uint32_t);
6305 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006306 VkBufferObj index_buffer;
6307 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006308
Mike Schuchardt65847d92019-12-20 13:50:47 -08006309 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006311 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006312 sizeof(VkDrawIndexedIndirectCommand));
6313 m_errorMonitor->VerifyFound();
6314
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006315 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006316
6317 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006318 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006319
Mike Schuchardt65847d92019-12-20 13:50:47 -08006320 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006322 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006323 sizeof(VkDrawIndexedIndirectCommand));
6324 m_errorMonitor->VerifyFound();
6325
6326 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006327 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006328
Mike Schuchardt65847d92019-12-20 13:50:47 -08006329 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006331 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006332 sizeof(VkDrawIndexedIndirectCommand));
6333 m_errorMonitor->VerifyFound();
6334
Mike Schuchardt65847d92019-12-20 13:50:47 -08006335 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006337 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006338 sizeof(VkDrawIndexedIndirectCommand));
6339 m_errorMonitor->VerifyFound();
6340
Mike Schuchardt65847d92019-12-20 13:50:47 -08006341 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006342 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006343 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006344 sizeof(VkDrawIndexedIndirectCommand));
6345 m_errorMonitor->VerifyFound();
6346
Mike Schuchardt65847d92019-12-20 13:50:47 -08006347 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006349 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006350 m_errorMonitor->VerifyFound();
6351
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006352 // TODO: These covered VUIDs aren't tested. There is also no test coverage for the core Vulkan 1.0 vk::CmdDraw* equivalent of
unknown088160a2019-05-23 17:43:13 -06006353 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006354 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6355 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6356 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006357
6358 m_commandBuffer->EndRenderPass();
6359 m_commandBuffer->end();
6360
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006361 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6362 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006363}
6364
sfricke-samsung860d3b22020-05-04 21:08:29 -07006365TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6366 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6367
6368 SetTargetApiVersion(VK_API_VERSION_1_2);
6369 ASSERT_NO_FATAL_FAILURE(Init());
6370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6371 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6372 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6373 return;
6374 }
6375
6376 VkBufferObj indirect_buffer;
6377 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6378 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6379
6380 VkBufferObj indexed_indirect_buffer;
6381 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6382 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6383
6384 VkBufferObj count_buffer;
6385 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6386
6387 VkBufferObj index_buffer;
6388 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6389
6390 CreatePipelineHelper pipe(*this);
6391 pipe.InitInfo();
6392 pipe.InitState();
6393 pipe.CreateGraphicsPipeline();
6394
6395 // Make calls to valid commands but without the drawIndirectCount feature set
6396 m_commandBuffer->begin();
6397 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6398
6399 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6400
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006401 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006402 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6403 sizeof(VkDrawIndirectCommand));
6404 m_errorMonitor->VerifyFound();
6405
6406 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6407
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006408 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006409 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6410 sizeof(VkDrawIndexedIndirectCommand));
6411 m_errorMonitor->VerifyFound();
6412
6413 m_commandBuffer->EndRenderPass();
6414 m_commandBuffer->end();
6415}
6416
unknown088160a2019-05-23 17:43:13 -06006417TEST_F(VkLayerTest, ExclusiveScissorNV) {
6418 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6419
6420 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6421 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6422 } else {
6423 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6424 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6425 return;
6426 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006427 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006428 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6429 for (auto device_extension : required_device_extensions) {
6430 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6431 m_device_extension_names.push_back(device_extension);
6432 } else {
6433 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6434 return;
6435 }
6436 }
6437
6438 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006439 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006440 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6441
6442 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006443 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6444 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006445 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6446
6447 features2.features.multiViewport = VK_FALSE;
6448
6449 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6450 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6451
6452 if (m_device->phy().properties().limits.maxViewports) {
6453 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6454 return;
6455 }
6456
6457 // Based on PSOViewportStateTests
6458 {
6459 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6460 VkViewport viewports[] = {viewport, viewport};
6461 VkRect2D scissor = {{0, 0}, {64, 64}};
6462 VkRect2D scissors[100] = {scissor, scissor};
6463
6464 using std::vector;
6465 struct TestCase {
6466 uint32_t viewport_count;
6467 VkViewport *viewports;
6468 uint32_t scissor_count;
6469 VkRect2D *scissors;
6470 uint32_t exclusive_scissor_count;
6471 VkRect2D *exclusive_scissors;
6472
6473 vector<std::string> vuids;
6474 };
6475
6476 vector<TestCase> test_cases = {
6477 {1,
6478 viewports,
6479 1,
6480 scissors,
6481 2,
6482 scissors,
6483 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6484 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6485 {1,
6486 viewports,
6487 1,
6488 scissors,
6489 100,
6490 scissors,
6491 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6492 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6493 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006494 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006495 };
6496
6497 for (const auto &test_case : test_cases) {
6498 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6499 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6500
6501 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6502 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6503 helper.vp_state_ci_.pViewports = test_case.viewports;
6504 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6505 helper.vp_state_ci_.pScissors = test_case.scissors;
6506 helper.vp_state_ci_.pNext = &exc;
6507
6508 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6509 exc.pExclusiveScissors = test_case.exclusive_scissors;
6510 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006511 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006512 }
6513 }
6514
6515 // Based on SetDynScissorParamTests
6516 {
6517 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006518 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006519
6520 const VkRect2D scissor = {{0, 0}, {16, 16}};
6521 const VkRect2D scissors[] = {scissor, scissor};
6522
6523 m_commandBuffer->begin();
6524
Mark Lobodzinski20310782020-02-28 14:25:17 -07006525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006526 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6527 m_errorMonitor->VerifyFound();
6528
Mark Lobodzinski20310782020-02-28 14:25:17 -07006529 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006530 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6531 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6532 m_errorMonitor->VerifyFound();
6533
Mark Lobodzinski20310782020-02-28 14:25:17 -07006534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006535 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6536 m_errorMonitor->VerifyFound();
6537
Mark Lobodzinski20310782020-02-28 14:25:17 -07006538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006539 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006540 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006541 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6542 m_errorMonitor->VerifyFound();
6543
Mark Lobodzinski20310782020-02-28 14:25:17 -07006544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6545 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006546 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6547 m_errorMonitor->VerifyFound();
6548
Mark Lobodzinski20310782020-02-28 14:25:17 -07006549 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006550 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6551 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6552 m_errorMonitor->VerifyFound();
6553
6554 struct TestCase {
6555 VkRect2D scissor;
6556 std::string vuid;
6557 };
6558
6559 std::vector<TestCase> test_cases = {
6560 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6561 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6562 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6563 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6564 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6565 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6566 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6567 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6568
6569 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006570 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006571 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6572 m_errorMonitor->VerifyFound();
6573 }
6574
6575 m_commandBuffer->end();
6576 }
6577}
6578
6579TEST_F(VkLayerTest, MeshShaderNV) {
6580 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6581
6582 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6583 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6584 } else {
6585 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6586 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6587 return;
6588 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006589 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006590 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6591 for (auto device_extension : required_device_extensions) {
6592 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6593 m_device_extension_names.push_back(device_extension);
6594 } else {
6595 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6596 return;
6597 }
6598 }
6599
Tony-LunarG048f5012020-04-29 16:55:11 -06006600 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006601 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6602 return;
6603 }
6604
6605 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006606 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006607 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6608
6609 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006610 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6611 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006612 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6613 features2.features.multiDrawIndirect = VK_FALSE;
6614
6615 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6616 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6617
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006618 static const char vertShaderText[] = R"glsl(
6619 #version 450
6620 vec2 vertices[3];
6621 void main() {
6622 vertices[0] = vec2(-1.0, -1.0);
6623 vertices[1] = vec2( 1.0, -1.0);
6624 vertices[2] = vec2( 0.0, 1.0);
6625 gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);
6626 gl_PointSize = 1.0f;
6627 }
6628 )glsl";
unknown088160a2019-05-23 17:43:13 -06006629
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006630 static const char meshShaderText[] = R"glsl(
6631 #version 450
6632 #extension GL_NV_mesh_shader : require
6633 layout(local_size_x = 1) in;
6634 layout(max_vertices = 3) out;
6635 layout(max_primitives = 1) out;
6636 layout(triangles) out;
6637 void main() {
6638 gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);
6639 gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);
6640 gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);
6641 gl_PrimitiveIndicesNV[0] = 0;
6642 gl_PrimitiveIndicesNV[1] = 1;
6643 gl_PrimitiveIndicesNV[2] = 2;
6644 gl_PrimitiveCountNV = 1;
6645 }
6646 )glsl";
unknown088160a2019-05-23 17:43:13 -06006647
6648 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6649 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6650 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6651
6652 // Test pipeline creation
6653 {
6654 // can't mix mesh with vertex
6655 const auto break_vp = [&](CreatePipelineHelper &helper) {
6656 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6657 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006658 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006659 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6660
6661 // vertex or mesh must be present
6662 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006663 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006664 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6665
6666 // vertexinput and inputassembly must be valid when vertex stage is present
6667 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6668 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6669 helper.gp_ci_.pVertexInputState = nullptr;
6670 helper.gp_ci_.pInputAssemblyState = nullptr;
6671 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006672 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006673 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6674 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6675 }
6676
6677 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006678 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006679
6680 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6681 buffer_create_info.size = sizeof(uint32_t);
6682 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6683 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006684 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006685 ASSERT_VK_SUCCESS(result);
6686
6687 m_commandBuffer->begin();
6688
Mark Lobodzinski20310782020-02-28 14:25:17 -07006689 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6690 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006691 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6692 m_errorMonitor->VerifyFound();
6693
6694 m_commandBuffer->end();
6695
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006696 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006697}
6698
6699TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6700 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6701 ASSERT_NO_FATAL_FAILURE(Init());
6702 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6703
6704 VkEvent event;
6705 VkEventCreateInfo event_create_info{};
6706 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006707 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006708
6709 m_commandBuffer->begin();
6710
Shannon McPherson93970b12020-06-12 14:34:35 -06006711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006712 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006713 m_errorMonitor->VerifyFound();
6714
Shannon McPherson93970b12020-06-12 14:34:35 -06006715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006716 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006717 m_errorMonitor->VerifyFound();
6718
Shannon McPherson93970b12020-06-12 14:34:35 -06006719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006720 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006721 m_errorMonitor->VerifyFound();
6722
Shannon McPherson93970b12020-06-12 14:34:35 -06006723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006724 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006725 m_errorMonitor->VerifyFound();
6726
Shannon McPherson93970b12020-06-12 14:34:35 -06006727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006729 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6730 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006731 m_errorMonitor->VerifyFound();
6732
Shannon McPherson93970b12020-06-12 14:34:35 -06006733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006735 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6736 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006737 m_errorMonitor->VerifyFound();
6738
Shannon McPherson93970b12020-06-12 14:34:35 -06006739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6740 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006741 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6742 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006743 m_errorMonitor->VerifyFound();
6744
Shannon McPherson93970b12020-06-12 14:34:35 -06006745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006747 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6748 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006749 m_errorMonitor->VerifyFound();
6750
6751 m_commandBuffer->end();
6752
6753 VkSemaphoreCreateInfo semaphore_create_info = {};
6754 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6755 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006756 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006757
6758 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6759 VkSubmitInfo submit_info = {};
6760
6761 // Signal the semaphore so the next test can wait on it.
6762 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6763 submit_info.signalSemaphoreCount = 1;
6764 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006765 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006766 m_errorMonitor->VerifyNotFound();
6767
6768 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6769 submit_info.signalSemaphoreCount = 0;
6770 submit_info.pSignalSemaphores = nullptr;
6771 submit_info.waitSemaphoreCount = 1;
6772 submit_info.pWaitSemaphores = &semaphore;
6773 submit_info.pWaitDstStageMask = &stage_flags;
6774
Mark Lobodzinski20310782020-02-28 14:25:17 -07006775 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
6776 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006777 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006778 m_errorMonitor->VerifyFound();
6779
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006780 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006781
6782 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6783 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6784 meshStage = vs.GetStageCreateInfo();
6785 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6786 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6787 taskStage = vs.GetStageCreateInfo();
6788 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6789
6790 // mesh and task shaders not supported
6791 const auto break_vp = [&](CreatePipelineHelper &helper) {
6792 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6793 };
6794 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006795 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006796 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6797 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6798 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6799
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006800 vk::DestroyEvent(m_device->device(), event, nullptr);
6801 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006802}
Chris Mayerc93536f2019-09-19 16:34:49 +02006803
6804TEST_F(VkLayerTest, ViewportWScalingNV) {
6805 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6806
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006807 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006808
6809 VkPhysicalDeviceFeatures device_features = {};
6810 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6811
6812 if (!device_features.multiViewport) {
6813 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6814 return;
6815 }
6816
6817 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6818 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6819 } else {
6820 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6821 return;
6822 }
6823
6824 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6826
6827 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006828 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006829
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006830 const char vs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006831 #version 450
6832 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6833 vec2( 1.0f, 1.0f),
6834 vec2(-1.0f, -1.0f),
6835 vec2( 1.0f, -1.0f) };
6836 out gl_PerVertex {
6837 vec4 gl_Position;
6838 };
6839
6840 void main() {
6841 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006842 }
6843 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006844
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006845 const char fs_src[] = R"glsl(
Chris Mayerc93536f2019-09-19 16:34:49 +02006846 #version 450
6847 layout(location = 0) out vec4 outColor;
6848
6849 void main() {
6850 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07006851 }
6852 )glsl";
Chris Mayerc93536f2019-09-19 16:34:49 +02006853
6854 const std::vector<VkViewport> vp = {
6855 {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}};
6856 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6857 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6858
6859 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6860
6861 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6862 vpsi.viewportWScalingEnable = VK_TRUE;
6863 vpsi.viewportCount = vp_count;
6864 vpsi.pViewportWScalings = scale.data();
6865
6866 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6867 vpci.viewportCount = vp_count;
6868 vpci.pViewports = vp.data();
6869 vpci.scissorCount = vp_count;
6870 vpci.pScissors = sc.data();
6871 vpci.pNext = &vpsi;
6872
6873 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6874
6875 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006876 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006877
6878 // Create pipeline with w-scaling enabled but without a valid scaling array
6879 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006880 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006881 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6882
6883 vpsi.pViewportWScalings = scale.data();
6884
6885 // Create pipeline with w-scaling enabled but without matching viewport counts
6886 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006887 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006888 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6889
6890 const VkPipelineLayoutObj pl(m_device);
6891
6892 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6893 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6894
6895 VkPipelineObj pipe(m_device);
6896 pipe.AddDefaultColorAttachment();
6897 pipe.AddShader(&vs);
6898 pipe.AddShader(&fs);
6899 pipe.SetViewport(vp);
6900 pipe.SetScissor(sc);
6901 pipe.CreateVKPipeline(pl.handle(), renderPass());
6902
6903 VkPipelineObj pipeDynWScale(m_device);
6904 pipeDynWScale.AddDefaultColorAttachment();
6905 pipeDynWScale.AddShader(&vs);
6906 pipeDynWScale.AddShader(&fs);
6907 pipeDynWScale.SetViewport(vp);
6908 pipeDynWScale.SetScissor(sc);
6909 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6910 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6911
6912 m_commandBuffer->begin();
6913
6914 // Bind pipeline without dynamic w scaling enabled
6915 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006916 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006917 m_errorMonitor->VerifyNotFound();
6918
Chris Mayerc93536f2019-09-19 16:34:49 +02006919 // Bind pipeline that has dynamic w-scaling enabled
6920 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006921 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006922 m_errorMonitor->VerifyNotFound();
6923
6924 const auto max_vps = m_device->props.limits.maxViewports;
6925
Mark Lobodzinski20310782020-02-28 14:25:17 -07006926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006927 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6928 m_errorMonitor->VerifyFound();
6929
6930 m_errorMonitor->ExpectSuccess();
6931 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6932 m_errorMonitor->VerifyNotFound();
6933
6934 m_commandBuffer->end();
6935}
sfricke-samsung914e8002020-01-07 22:26:18 -08006936
6937TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6938 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6939
6940 // Enable Sampler YCbCr Conversion req'd extensions
6941 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6942 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6943 if (mp_extensions) {
6944 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6945 }
6946 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006947 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006948 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6949 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6950 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6951 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6952 if (mp_extensions) {
6953 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6954 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6955 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6956 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6957 } else {
6958 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6959 return;
6960 }
6961
6962 // Explictly not enable Ycbcr Conversion Features
6963 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6964 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6965 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6966 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6967
6968 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6969 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6970 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6971 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6972 return;
6973 }
6974
6975 // Create Ycbcr conversion
6976 VkSamplerYcbcrConversion conversions;
6977 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6978 NULL,
6979 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6980 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6981 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6982 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6983 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6984 VK_CHROMA_LOCATION_COSITED_EVEN,
6985 VK_CHROMA_LOCATION_COSITED_EVEN,
6986 VK_FILTER_NEAREST,
6987 false};
6988
Mark Lobodzinski20310782020-02-28 14:25:17 -07006989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006990 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6991 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006992}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006993
6994TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6995 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6996
6997 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6998 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6999 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7000 return;
7001 }
7002 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7003
7004 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7005
7006 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7007 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7008 return;
7009 }
7010 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7011
7012 {
7013 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7014 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7015 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7016
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007017 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7018 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007019 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7020
7021 if (!tf_features.transformFeedback) {
7022 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7023 return;
7024 }
7025 }
7026
7027 ASSERT_NO_FATAL_FAILURE(InitState());
7028 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7029
7030 {
7031 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
7032 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7033 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7034
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007035 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007036 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7037 info.size = 4;
7038 VkBufferObj buffer;
7039 buffer.init(*m_device, info);
7040 VkDeviceSize offsets[1]{};
7041
7042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
7043 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
7044 m_errorMonitor->VerifyFound();
7045 }
7046
7047 {
7048 auto vkCmdBeginTransformFeedbackEXT =
7049 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7050 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7051
7052 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
7053 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7054 m_errorMonitor->VerifyFound();
7055 }
7056
7057 {
7058 auto vkCmdEndTransformFeedbackEXT =
7059 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7060 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7061
7062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
7063 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7064 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7065 m_errorMonitor->VerifyFound();
7066 }
7067}
7068
7069TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
7070 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
7071
7072 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7073 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7074 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7075 return;
7076 }
7077 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7078
7079 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7080
7081 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7082 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7083 return;
7084 }
7085 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7086
7087 {
7088 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7089 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7090 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7091
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007092 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7093 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007094 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7095
7096 if (!tf_features.transformFeedback) {
7097 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7098 return;
7099 }
7100
7101 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7102 }
7103
7104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7105
7106 auto vkCmdBindTransformFeedbackBuffersEXT =
7107 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
7108 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
7109
7110 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007111 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7112 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007113 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7114
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007115 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007116 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7117 info.size = 8;
7118 VkBufferObj const buffer_obj(*m_device, info);
7119
7120 // Request a firstBinding that is too large.
7121 {
7122 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
7123 VkDeviceSize const offsets[1]{};
7124
7125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
7126 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7127 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
7128 nullptr);
7129 m_errorMonitor->VerifyFound();
7130 }
7131
7132 // Request too many bindings.
7133 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7134 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
7135 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
7136
7137 std::vector<VkDeviceSize> offsets(bindingCount);
7138
7139 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
7140 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
7141 nullptr);
7142 m_errorMonitor->VerifyFound();
7143 }
7144
7145 // Request a size that is larger than the maximum size.
7146 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7147 VkDeviceSize const offsets[1]{};
7148 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7149
7150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7151 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7152 m_errorMonitor->VerifyFound();
7153 }
7154 }
7155
7156 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007157 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007158 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7159 info.size = 8;
7160 VkBufferObj const buffer_obj(*m_device, info);
7161
7162 // Request an offset that is too large.
7163 {
7164 VkDeviceSize const offsets[1]{info.size + 4};
7165
7166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7167 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7168 m_errorMonitor->VerifyFound();
7169 }
7170
7171 // Request an offset that is not a multiple of 4.
7172 {
7173 VkDeviceSize const offsets[1]{1};
7174
7175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7176 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7177 m_errorMonitor->VerifyFound();
7178 }
7179
7180 // Request a size that is larger than the buffer's size.
7181 {
7182 VkDeviceSize const offsets[1]{};
7183 VkDeviceSize const sizes[1]{info.size + 1};
7184
7185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007186 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7187 m_errorMonitor->VerifyFound();
7188 }
7189
7190 // Request an offset and size whose sum is larger than the buffer's size.
7191 {
7192 VkDeviceSize const offsets[1]{4};
7193 VkDeviceSize const sizes[1]{info.size - 3};
7194
7195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7196 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7197 m_errorMonitor->VerifyFound();
7198 }
7199
7200 // Bind while transform feedback is active.
7201 {
7202 auto vkCmdBeginTransformFeedbackEXT =
7203 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7204 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7205 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7206
7207 VkDeviceSize const offsets[1]{};
7208
7209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7210 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7211 m_errorMonitor->VerifyFound();
7212
7213 auto vkCmdEndTransformFeedbackEXT =
7214 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7215 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7216 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7217 }
7218 }
7219
7220 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7221 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007222 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007223 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7224 info.size = 4;
7225 VkBufferObj const buffer_obj(*m_device, info);
7226
7227 VkDeviceSize const offsets[1]{};
7228
7229 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7230 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7231 m_errorMonitor->VerifyFound();
7232 }
7233
7234 // Don't bind memory.
7235 {
7236 VkBuffer buffer{};
7237 {
7238 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7239 ASSERT_TRUE(vkCreateBuffer != nullptr);
7240
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007241 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007242 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7243 info.size = 4;
7244 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7245 }
7246
7247 VkDeviceSize const offsets[1]{};
7248
7249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7250 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7251 m_errorMonitor->VerifyFound();
7252 }
7253}
7254
7255TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7256 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7257
7258 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7259 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7260 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7261 return;
7262 }
7263 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7264
7265 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7266
7267 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7268 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7269 return;
7270 }
7271 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7272
7273 {
7274 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7275 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7276 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7277
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007278 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7279 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007280 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7281
7282 if (!tf_features.transformFeedback) {
7283 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7284 return;
7285 }
7286
7287 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7288 }
7289
7290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7291
7292 auto vkCmdBeginTransformFeedbackEXT =
7293 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7294 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7295
7296 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007297 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7298 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007299 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7300
7301 // Request a firstCounterBuffer that is too large.
7302 {
7303 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7304
7305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7306 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7307 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7308 m_errorMonitor->VerifyFound();
7309 }
7310
7311 // Request too many buffers.
7312 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7313 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7314
7315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7316 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7317 m_errorMonitor->VerifyFound();
7318 }
7319 }
7320
7321 // Request an out-of-bounds location.
7322 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007323 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007324 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7325 info.size = 4;
7326 VkBufferObj const buffer_obj(*m_device, info);
7327
7328 VkDeviceSize const offsets[1]{1};
7329
7330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7331 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7332 m_errorMonitor->VerifyFound();
7333 }
7334
7335 // Request specific offsets without specifying buffers.
7336 {
7337 VkDeviceSize const offsets[1]{};
7338
7339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7340 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7341 m_errorMonitor->VerifyFound();
7342 }
7343
7344 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7345 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007346 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007347 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7348 info.size = 4;
7349 VkBufferObj const buffer_obj(*m_device, info);
7350
7351 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7352 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7353 m_errorMonitor->VerifyFound();
7354 }
7355
7356 // Begin while transform feedback is active.
7357 {
7358 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7359
7360 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7361 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7362 m_errorMonitor->VerifyFound();
7363
7364 auto vkCmdEndTransformFeedbackEXT =
7365 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7366 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7367
7368 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7369 }
7370}
7371
7372TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7373 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7374
7375 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7376 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7377 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7378 return;
7379 }
7380 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7381
7382 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7383
7384 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7385 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7386 return;
7387 }
7388 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7389
7390 {
7391 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7392 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7393 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7394
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007395 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7396 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007397 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7398
7399 if (!tf_features.transformFeedback) {
7400 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7401 return;
7402 }
7403
7404 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7405 }
7406
7407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7408
7409 auto vkCmdEndTransformFeedbackEXT =
7410 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7411 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7412
7413 {
7414 // Activate transform feedback.
7415 auto vkCmdBeginTransformFeedbackEXT =
7416 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7417 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7418 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7419
7420 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007421 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7422 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007423 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7424
7425 // Request a firstCounterBuffer that is too large.
7426 {
7427 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7428
7429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7430 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7431 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7432 m_errorMonitor->VerifyFound();
7433 }
7434
7435 // Request too many buffers.
7436 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7437 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7438
7439 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7440 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7441 m_errorMonitor->VerifyFound();
7442 }
7443 }
7444
7445 // Request an out-of-bounds location.
7446 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007447 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007448 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7449 info.size = 4;
7450 VkBufferObj const buffer_obj(*m_device, info);
7451
7452 VkDeviceSize const offsets[1]{1};
7453
7454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7455 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7456 m_errorMonitor->VerifyFound();
7457 }
7458
7459 // Request specific offsets without specifying buffers.
7460 {
7461 VkDeviceSize const offsets[1]{};
7462
7463 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7464 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7465 m_errorMonitor->VerifyFound();
7466 }
7467
7468 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7469 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007470 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007471 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7472 info.size = 4;
7473 VkBufferObj const buffer_obj(*m_device, info);
7474
7475 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7476 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7477 m_errorMonitor->VerifyFound();
7478 }
7479 }
7480
7481 // End while transform feedback is inactive.
7482 {
7483 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7484
7485 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7486 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7487 m_errorMonitor->VerifyFound();
7488 }
7489}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007490
sfricke-samsung39ee2442020-07-22 21:21:15 -07007491TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7492 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007493
7494 // protect memory added in VK 1.1
7495 SetTargetApiVersion(VK_API_VERSION_1_1);
7496
7497 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7498 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7499 } else {
7500 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7501 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7502 return;
7503 }
7504 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7505
7506 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7507 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7508 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7509
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007510 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7511 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007512 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7513
7514 if (protected_memory_features.protectedMemory == VK_FALSE) {
7515 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7516 return;
7517 };
7518
7519 // Turns m_commandBuffer into a protected command buffer
7520 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7521
7522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7523 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7524 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7525 return;
7526 }
7527
7528 VkBufferObj indirect_buffer;
7529 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7530 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7531
7532 VkBufferObj indexed_indirect_buffer;
7533 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7534 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7535
7536 VkBufferObj index_buffer;
7537 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7538
7539 CreatePipelineHelper pipe(*this);
7540 pipe.InitInfo();
7541 pipe.InitState();
7542 pipe.CreateGraphicsPipeline();
7543
sfricke-samsung39ee2442020-07-22 21:21:15 -07007544 VkQueryPool query_pool;
7545 VkQueryPoolCreateInfo query_pool_create_info{};
7546 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7547 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7548 query_pool_create_info.queryCount = 1;
7549 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7550
sfricke-samsung071af2d2020-07-02 10:37:22 -07007551 m_commandBuffer->begin();
7552 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7553
7554 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7555
7556 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7557 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7558 m_errorMonitor->VerifyFound();
7559
7560 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7561
7562 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7563 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7564 sizeof(VkDrawIndexedIndirectCommand));
7565 m_errorMonitor->VerifyFound();
7566
7567 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007568
7569 // Query should be outside renderpass
7570 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7571
7572 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7573 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7574 m_errorMonitor->VerifyFound();
7575
7576 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7577 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7578 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7579 m_errorMonitor->VerifyFound();
7580
sfricke-samsung071af2d2020-07-02 10:37:22 -07007581 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007582
7583 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007584}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007585
7586TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7587 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7588
7589 SetTargetApiVersion(VK_API_VERSION_1_1);
7590
7591 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7592 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7593 } else {
7594 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7595 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7596 return;
7597 }
7598 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7599
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007600 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7601 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7602 return;
7603 }
7604
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007605 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7606 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7607 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7608
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007609 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7610 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007611 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7612
7613 if (protected_memory_features.protectedMemory == VK_FALSE) {
7614 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7615 return;
7616 };
7617
7618 // Turns m_commandBuffer into a unprotected command buffer
7619 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7620
7621 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7622 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7623
7624 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7625 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7626 return;
7627 }
7628
7629 // Create actual protected and unprotected buffers
7630 VkBuffer buffer_protected = VK_NULL_HANDLE;
7631 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7632 VkBufferCreateInfo buffer_create_info = {};
7633 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7634 buffer_create_info.pNext = nullptr;
7635 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007636 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7637 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7638 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007639 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7640
7641 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7642 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7643 buffer_create_info.flags = 0;
7644 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7645
7646 // Create actual protected and unprotected images
7647 VkImageObj image_protected(m_device);
7648 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007649 VkImageObj image_protected_descriptor(m_device);
7650 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007651 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007652 VkImageView image_views_descriptor[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007653 VkImageCreateInfo image_create_info = {};
7654 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7655 image_create_info.pNext = nullptr;
7656 image_create_info.extent = {64, 64, 1};
7657 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
7658 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7659 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007660 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7661 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007662 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7663 image_create_info.arrayLayers = 1;
7664 image_create_info.mipLevels = 1;
7665
7666 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7667 image_protected.init_no_mem(*m_device, image_create_info);
7668 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007669 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007670
locke-lunarg0de02522020-10-27 22:55:17 -06007671 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7672 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7673 image_views_descriptor[0] = image_protected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7674
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007675 image_create_info.flags = 0;
7676 image_unprotected.init_no_mem(*m_device, image_create_info);
7677 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007678 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007679
locke-lunarg0de02522020-10-27 22:55:17 -06007680 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7681 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7682 image_views_descriptor[1] = image_unprotected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7683
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007684 // Create protected and unproteced memory
7685 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7686 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7687
7688 VkMemoryAllocateInfo alloc_info = {};
7689 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7690 alloc_info.pNext = nullptr;
7691 alloc_info.allocationSize = 0;
7692
7693 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7694 VkMemoryRequirements mem_reqs_protected;
7695 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7696 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7697 VkMemoryRequirements mem_reqs_unprotected;
7698 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7699 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7700
7701 // Get memory index for a protected and unprotected memory
7702 VkPhysicalDeviceMemoryProperties phys_mem_props;
7703 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7704 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7705 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7706 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7707 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7708 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7709 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7710 memory_type_unprotected = i;
7711 }
7712 // Check just protected bit is in type at all
7713 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7714 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7715 memory_type_protected = i;
7716 }
7717 }
7718 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7719 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7720 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7721 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7722 return;
7723 }
7724
7725 alloc_info.memoryTypeIndex = memory_type_protected;
7726 alloc_info.allocationSize = mem_reqs_protected.size;
7727 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7728
7729 alloc_info.allocationSize = mem_reqs_unprotected.size;
7730 alloc_info.memoryTypeIndex = memory_type_unprotected;
7731 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7732
7733 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7734 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7735 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7736 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
7737
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007738 // A renderpass and framebuffer that contains a protected and unprotected image view
7739 VkAttachmentDescription attachments[2] = {
7740 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7741 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7742 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7743 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7744 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7745 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7746 };
7747 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7748 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7749 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7750 VkSubpassDependency dependency = {0,
7751 0,
7752 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7753 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7754 VK_ACCESS_SHADER_WRITE_BIT,
7755 VK_ACCESS_SHADER_WRITE_BIT,
7756 VK_DEPENDENCY_BY_REGION_BIT};
7757 VkRenderPassCreateInfo render_pass_create_info = {
7758 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7759 VkRenderPass render_pass;
7760 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7761 VkFramebufferCreateInfo framebuffer_create_info = {
7762 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7763 VkFramebuffer framebuffer;
7764 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7765
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007766 // Various structs used for commands
7767 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7768 VkImageBlit blit_region = {};
7769 blit_region.srcSubresource = image_subresource;
7770 blit_region.dstSubresource = image_subresource;
7771 blit_region.srcOffsets[0] = {0, 0, 0};
7772 blit_region.srcOffsets[1] = {8, 8, 1};
7773 blit_region.dstOffsets[0] = {0, 8, 0};
7774 blit_region.dstOffsets[1] = {8, 8, 1};
7775 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7776 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7777 VkBufferCopy buffer_copy = {0, 0, 64};
7778 VkBufferImageCopy buffer_image_copy = {};
7779 buffer_image_copy.bufferRowLength = 0;
7780 buffer_image_copy.bufferImageHeight = 0;
7781 buffer_image_copy.imageSubresource = image_subresource;
7782 buffer_image_copy.imageOffset = {0, 0, 0};
7783 buffer_image_copy.imageExtent = {1, 1, 1};
7784 buffer_image_copy.bufferOffset = 0;
7785 VkImageCopy image_copy = {};
7786 image_copy.srcSubresource = image_subresource;
7787 image_copy.srcOffset = {0, 0, 0};
7788 image_copy.dstSubresource = image_subresource;
7789 image_copy.dstOffset = {0, 0, 0};
7790 image_copy.extent = {1, 1, 1};
7791 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007792 VkRect2D render_area = {{0, 0}, {8, 8}};
7793 VkRenderPassBeginInfo render_pass_begin = {
7794 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7795 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7796 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7797 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007798
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07007799 const char fsSource[] = R"glsl(
7800 #version 450
7801 layout(set=0, binding=0) uniform foo { int x; int y; } bar;
7802 layout(set=0, binding=1, rgba8) uniform image2D si1;
7803 layout(location=0) out vec4 x;
7804 void main(){
7805 x = vec4(bar.y);
7806 imageStore(si1, ivec2(0), vec4(0));
7807 }
7808 )glsl";
locke-lunarg0de02522020-10-27 22:55:17 -06007809 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7810
7811 CreatePipelineHelper g_pipe(*this);
7812 g_pipe.InitInfo();
7813 g_pipe.gp_ci_.renderPass = render_pass;
7814 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7815 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7816 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7817 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7818 color_blend_attachments[0] = g_pipe.cb_attachments_;
7819 color_blend_attachments[1] = g_pipe.cb_attachments_;
7820 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7821 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7822 g_pipe.InitState();
7823 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7824
7825 VkSampler sampler;
7826 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7827 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7828 ASSERT_VK_SUCCESS(err);
7829
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007830 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007831 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007832 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7833 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7834 g_pipe.descriptor_set_->UpdateDescriptorSets();
7835
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007836 m_commandBuffer->begin();
7837
7838 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7839 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7840 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7841 m_errorMonitor->VerifyFound();
7842
7843 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7844 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7845 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7846 m_errorMonitor->VerifyFound();
7847
7848 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7849 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7850 &subresource_range);
7851 m_errorMonitor->VerifyFound();
7852
7853 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7854 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7855 m_errorMonitor->VerifyFound();
7856
7857 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7858 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7859 m_errorMonitor->VerifyFound();
7860
7861 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7862 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7863 &buffer_image_copy);
7864 m_errorMonitor->VerifyFound();
7865
7866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7867 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7868 &buffer_image_copy);
7869 m_errorMonitor->VerifyFound();
7870
7871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7872 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7873 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7874 m_errorMonitor->VerifyFound();
7875
7876 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7877 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7878 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7879 m_errorMonitor->VerifyFound();
7880
7881 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7882 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7883 &buffer_image_copy);
7884 m_errorMonitor->VerifyFound();
7885
7886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7887 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7888 &buffer_image_copy);
7889 m_errorMonitor->VerifyFound();
7890
7891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7892 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7893 m_errorMonitor->VerifyFound();
7894
7895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7896 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7897 m_errorMonitor->VerifyFound();
7898
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007899 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7900
7901 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7902 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7903 m_errorMonitor->VerifyFound();
7904
locke-lunarg0de02522020-10-27 22:55:17 -06007905 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7906 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7907 &g_pipe.descriptor_set_->set_, 0, nullptr);
7908 VkDeviceSize offset = 0;
7909 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7910 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
7911
7912 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7916 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
7917
7918 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7919 m_errorMonitor->VerifyFound();
7920
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007921 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007922 m_commandBuffer->end();
7923
7924 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007925 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007926 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7927 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007928 g_pipe.descriptor_set_->UpdateDescriptorSets();
7929
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007930 protectedCommandBuffer.begin();
7931
7932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7933 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7934 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7935 m_errorMonitor->VerifyFound();
7936
7937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7938 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7939 &subresource_range);
7940 m_errorMonitor->VerifyFound();
7941
7942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7943 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7944 m_errorMonitor->VerifyFound();
7945
7946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7947 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7948 1, &buffer_image_copy);
7949 m_errorMonitor->VerifyFound();
7950
7951 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7952 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7953 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7954 m_errorMonitor->VerifyFound();
7955
7956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7957 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7958 1, &buffer_image_copy);
7959 m_errorMonitor->VerifyFound();
7960
7961 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7962 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7963 m_errorMonitor->VerifyFound();
7964
7965 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7966 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7967 m_errorMonitor->VerifyFound();
7968
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007969 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7970
7971 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7972 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7973 m_errorMonitor->VerifyFound();
7974
locke-lunarg0de02522020-10-27 22:55:17 -06007975 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7976 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7977 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7978 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7979 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
7980
7981 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7983 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7984 m_errorMonitor->VerifyFound();
7985
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007986 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007987 protectedCommandBuffer.end();
7988
sfricke-samsung96cd9932020-08-23 20:57:11 -07007989 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7990 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7991
7992 VkProtectedSubmitInfo protected_submit_info = {};
7993 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7994 protected_submit_info.pNext = nullptr;
7995
7996 VkSubmitInfo submit_info = {};
7997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7998 submit_info.pNext = &protected_submit_info;
7999 submit_info.commandBufferCount = 2;
8000 submit_info.pCommandBuffers = comman_buffers;
8001
8002 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06008003 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07008004 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8005 m_errorMonitor->VerifyFound();
8006
8007 protected_submit_info.protectedSubmit = VK_FALSE;
8008 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
8009 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8010 m_errorMonitor->VerifyFound();
8011
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07008012 vk::DestroyBuffer(device(), buffer_protected, nullptr);
8013 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
8014 vk::FreeMemory(device(), memory_protected, nullptr);
8015 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07008016 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
8017 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06008018}
locke-lunarg6b0de702020-08-07 17:42:13 -06008019
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008020TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06008021 TEST_DESCRIPTION(
8022 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
8023 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
8024
8025 ASSERT_NO_FATAL_FAILURE(Init());
8026
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008027 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06008028 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
8029 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
8030 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8031 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
8032
8033 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
8034 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8035 return;
8036 }
8037
8038 VkFormat buffer_view_format =
8039 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
8040 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
8041 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
8042 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
8043 return;
8044 }
8045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8046
8047 VkPhysicalDeviceFeatures device_features = {};
8048 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
8049 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
8050 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
8051 return;
8052 }
8053
8054 VkImageObj image(m_device);
8055 image.Init(image_ci);
8056 VkImageView image_view = image.targetView(image_format);
8057
8058 VkSampler sampler = VK_NULL_HANDLE;
8059 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
8060 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
8061
8062 VkBufferObj buffer;
8063 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
8064
8065 VkBufferViewCreateInfo bvci = {};
8066 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8067 bvci.buffer = buffer.handle();
8068 bvci.format = buffer_view_format;
8069 bvci.range = VK_WHOLE_SIZE;
8070 VkBufferView buffer_view;
8071 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
8072
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008073 char const *fsSource = R"glsl(
8074 #version 450
8075 layout(set=0, binding=3, r32f) uniform image2D si0;
8076 layout(set=0, binding=2, r32f) uniform image2D si1[2];
8077 layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;
8078 layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];
8079 void main() {
8080 imageAtomicExchange(si0, ivec2(0), 1);
8081 imageAtomicExchange(si1[0], ivec2(0), 1);
8082 imageAtomicExchange(si1[1], ivec2(0), 1);
8083 imageAtomicExchange(stb2, 0, 1);
8084 imageAtomicExchange(stb3[0], 0, 1);
8085 imageAtomicExchange(stb3[1], 0, 1);
8086 }
8087 )glsl";
locke-lunarg6b0de702020-08-07 17:42:13 -06008088
8089 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8090 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8091
8092 CreatePipelineHelper g_pipe(*this);
8093 g_pipe.InitInfo();
8094 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06008095 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8096 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8097 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
8098 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06008099 g_pipe.InitState();
8100 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8101
locke-lunarg76e8dee2020-08-21 13:20:02 -06008102 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06008103 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008104 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008105 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06008106 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08008107 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06008108 g_pipe.descriptor_set_->UpdateDescriptorSets();
8109
8110 m_commandBuffer->begin();
8111 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8112 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8113 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8114 &g_pipe.descriptor_set_->set_, 0, nullptr);
8115
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008116 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06008117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
8119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
8121 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8122 m_errorMonitor->VerifyFound();
8123
8124 m_commandBuffer->EndRenderPass();
8125 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06008126 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
8127 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06008128}
locke-lunargae1bbab2020-09-10 11:55:56 -06008129
8130TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
8131 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
8132
8133 ASSERT_NO_FATAL_FAILURE(Init());
8134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8135
8136 // push constant range: 0-99
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008137 char const *const vsSource = R"glsl(
8138 #version 450
8139 layout(push_constant, std430) uniform foo {
8140 bool b;
8141 float f2[3];
8142 vec3 v;
8143 vec4 v2[2];
8144 mat3 m;
8145 } constants;
8146 void func1( float f ){
8147 // use the whole v2[1]. byte: 48-63.
8148 vec2 v2 = constants.v2[1].yz;
8149 }
8150 void main(){
8151 // use only v2[0].z. byte: 40-43.
8152 func1( constants.v2[0].z);
8153 // index of m is variable. The all m is used. byte: 64-99.
8154 for(int i=1;i<2;++i) {
8155 vec3 v3 = constants.m[i];
8156 }
8157 }
8158 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008159
8160 // push constant range: 0 - 95
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008161 char const *const fsSource = R"glsl(
8162 #version 450
8163 struct foo1{
8164 int i[4];
8165 }f;
8166 layout(push_constant, std430) uniform foo {
8167 float x[2][2][2];
8168 foo1 s;
8169 foo1 ss[3];
8170 } constants;
8171 void main(){
8172 // use s. byte: 32-47.
8173 f = constants.s;
8174 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8175 for(int i=1;i<2;++i) {
8176 int ii = constants.ss[i].i[3];
8177 }
8178 }
8179 )glsl";
locke-lunargae1bbab2020-09-10 11:55:56 -06008180
8181 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8182 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8183
8184 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8185 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8186
8187 VkPipelineLayoutCreateInfo pipeline_layout_info{
8188 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8189
8190 VkPipelineLayout pipeline_layout;
8191 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8192
8193 CreatePipelineHelper g_pipe(*this);
8194 g_pipe.InitInfo();
8195 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8196 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8197 g_pipe.InitState();
8198 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8199
8200 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8201 VkPipelineLayout pipeline_layout_small;
8202 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8203
8204 CreatePipelineHelper g_pipe_small_range(*this);
8205 g_pipe_small_range.InitInfo();
8206 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8207 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8208 g_pipe_small_range.InitState();
8209
sfricke-samsung7699b912021-04-12 23:01:51 -07008210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008212 g_pipe_small_range.CreateGraphicsPipeline();
8213 m_errorMonitor->VerifyFound();
8214
8215 m_commandBuffer->begin();
8216 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8217
8218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8219 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8220 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8221 &g_pipe.descriptor_set_->set_, 0, nullptr);
8222 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8223 m_errorMonitor->VerifyFound();
8224
locke-lunargae1bbab2020-09-10 11:55:56 -06008225 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008226
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008227 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8228 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8229 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8230 // for more details.
8231 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8232 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8233 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8234 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8235 // m_errorMonitor->VerifyFound();
8236
8237 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8238 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8239 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8240 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008241
8242 m_errorMonitor->ExpectSuccess();
8243 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8244 68, dummy_values);
8245 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8246 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008247}
8248
8249TEST_F(VkLayerTest, VerifyVertextBinding) {
8250 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8251
8252 ASSERT_NO_FATAL_FAILURE(Init());
8253 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8254
8255 VkBufferObj vtx_buf;
8256 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8257 vtx_buf.init(*m_device, info);
8258
8259 CreatePipelineHelper pipe(*this);
8260 pipe.InitInfo();
8261 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8262 VkVertexInputBindingDescription vtx_binding_des[3] = {
8263 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8264
8265 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8266 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8267 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8268 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8269 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8270 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8271 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8272 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8273 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8274 pipe.InitState();
8275 pipe.CreateGraphicsPipeline();
8276
8277 m_commandBuffer->begin();
8278 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8279 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8280 VkDeviceSize offset = 0;
8281 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8282
8283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8288 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8289 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008290
8291 m_commandBuffer->EndRenderPass();
8292 m_commandBuffer->end();
8293}
locke-lunargd7a08e92020-10-21 00:24:00 -06008294
8295TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8296 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8297 ASSERT_NO_FATAL_FAILURE(Init());
8298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8299
8300 CreatePipelineHelper pipe(*this);
8301 pipe.InitInfo();
8302
8303 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8304
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008305 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008306 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8307 dyn_state_ci.pDynamicStates = dyn_states.data();
8308 pipe.dyn_state_ci_ = dyn_state_ci;
8309 pipe.InitState();
8310 pipe.CreateGraphicsPipeline();
8311
8312 m_commandBuffer->begin();
8313 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8314 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8315
8316 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8317 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8318 VkRect2D scissor = {{0, 0}, {16, 16}};
8319 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8320 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8321
8322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8323 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8324 m_errorMonitor->VerifyFound();
8325
8326 m_commandBuffer->EndRenderPass();
8327 m_commandBuffer->end();
8328}
locke-lunarg0de02522020-10-27 22:55:17 -06008329
8330TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8331 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8332 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8333 if (version < VK_API_VERSION_1_1) {
8334 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8335 return;
8336 }
8337 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8338
8339 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8340 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8341 } else {
8342 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8343 return;
8344 }
8345
8346 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8348
8349 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8350 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008351
8352 VkFormatProperties format_props;
8353 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8354 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8355 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8356 return;
8357 }
8358
locke-lunarg0de02522020-10-27 22:55:17 -06008359 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8360 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8361
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008362 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008363 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008364 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008365 image_format_info.type = image_ci.imageType;
8366 image_format_info.format = image_ci.format;
8367 image_format_info.tiling = image_ci.tiling;
8368 image_format_info.usage = image_ci.usage;
8369 image_format_info.flags = image_ci.flags;
8370
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008371 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8372 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008373
8374 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8375
8376 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8377 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8378 return;
8379 }
8380
8381 VkImageObj image(m_device);
8382 image.Init(image_ci);
8383 VkImageView imageView = image.targetView(format, imageViewType);
8384
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008385 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008386 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8387 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8388 VkSampler sampler;
8389 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8390
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008391 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008392 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8393 sampler_ci.pNext = &reduction_mode_ci;
8394 VkSampler sampler_rediction;
8395 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8396
8397 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8398
8399 CreatePipelineHelper g_pipe(*this);
8400 g_pipe.InitInfo();
8401 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8402 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8403 g_pipe.InitState();
8404 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8405
8406 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8407 g_pipe.descriptor_set_->UpdateDescriptorSets();
8408
8409 m_commandBuffer->begin();
8410 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8411 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8412 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8413 &g_pipe.descriptor_set_->set_, 0, nullptr);
8414
8415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8416 m_commandBuffer->Draw(1, 0, 0, 0);
8417 m_errorMonitor->VerifyFound();
8418
8419 m_commandBuffer->EndRenderPass();
8420 m_commandBuffer->end();
8421 m_commandBuffer->reset();
8422
8423 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8424 g_pipe.descriptor_set_->UpdateDescriptorSets();
8425
8426 m_commandBuffer->begin();
8427 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8428 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8429 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8430 &g_pipe.descriptor_set_->set_, 0, nullptr);
8431
8432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8433 m_commandBuffer->Draw(1, 0, 0, 0);
8434 m_errorMonitor->VerifyFound();
8435
8436 m_commandBuffer->EndRenderPass();
8437 m_commandBuffer->end();
8438}
8439
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008440TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008441 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 -07008442 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8443
8444 if (DeviceExtensionSupported(gpu(), nullptr, VK_IMG_FILTER_CUBIC_EXTENSION_NAME)) {
8445 m_device_extension_names.push_back(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8446 } else {
8447 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8448 return;
8449 }
8450
8451 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8453
8454 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8455 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
8456 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8457 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8458
8459 VkImageObj image(m_device);
8460 image.Init(image_ci);
8461 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8462 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8463
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008464 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008465 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8466 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8467 VkSampler sampler;
8468 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8469
8470 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8471
8472 CreatePipelineHelper g_pipe(*this);
8473 g_pipe.InitInfo();
8474 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8475 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8476 g_pipe.InitState();
8477 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8478
8479 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8480 g_pipe.descriptor_set_->UpdateDescriptorSets();
8481
8482 m_commandBuffer->begin();
8483 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8484 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8485 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8486 &g_pipe.descriptor_set_->set_, 0, nullptr);
8487
8488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8489 m_commandBuffer->Draw(1, 0, 0, 0);
8490 m_errorMonitor->VerifyFound();
8491
8492 m_commandBuffer->EndRenderPass();
8493 m_commandBuffer->end();
8494}
8495
locke-lunarg0de02522020-10-27 22:55:17 -06008496TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8497 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8498 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8499 if (version < VK_API_VERSION_1_1) {
8500 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8501 return;
8502 }
8503 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8504 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8505 } else {
8506 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8507 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8508 return;
8509 }
8510 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8511
8512 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8513 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8514 } else {
8515 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8516 return;
8517 }
8518
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008519 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008520 multiview_features.multiview = VK_TRUE;
8521 VkPhysicalDeviceFeatures2 pd_features2 = {};
8522 pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8523 pd_features2.pNext = &multiview_features;
8524
8525 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8527
8528 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8529 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8530 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008531 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8532 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008533 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8534 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8535 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8536 return;
8537 }
8538 CreatePipelineHelper pipe(*this);
8539 pipe.InitInfo();
8540 pipe.InitState();
8541 pipe.CreateGraphicsPipeline();
8542
8543 m_commandBuffer->begin();
8544 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8545 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8546
8547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8548 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8549 m_errorMonitor->VerifyFound();
8550
8551 m_commandBuffer->EndRenderPass();
8552 m_commandBuffer->end();
8553}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008554
8555TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8556 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8557
8558 // Enable KHR_fragment_shading_rate and all of its required extensions
8559 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8560 if (fsr_extensions) {
8561 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8562 }
8563 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8564
8565 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8566 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8567 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8568 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8569 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8570 if (fsr_extensions) {
8571 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8572 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8573 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8574 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8575 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8576 } else {
8577 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8578 return;
8579 }
8580
8581 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = {};
8582 fsr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
8583 fsr_features.pipelineFragmentShadingRate = true;
8584
8585 VkPhysicalDeviceFeatures2 device_features = {};
8586 device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8587 device_features.pNext = &fsr_features;
8588
8589 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8590
8591 // Find address of extension call and make the call
8592 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8593 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8594 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8595
8596 VkExtent2D fragmentSize = {1, 1};
8597 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8598 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8599
8600 m_commandBuffer->begin();
8601 fragmentSize.width = 0;
8602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8603 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8604 m_errorMonitor->VerifyFound();
8605 fragmentSize.width = 1;
8606
8607 fragmentSize.height = 0;
8608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8609 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8610 m_errorMonitor->VerifyFound();
8611 fragmentSize.height = 1;
8612
8613 fragmentSize.width = 3;
8614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8615 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8616 m_errorMonitor->VerifyFound();
8617 fragmentSize.width = 1;
8618
8619 fragmentSize.height = 3;
8620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8621 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8622 m_errorMonitor->VerifyFound();
8623 fragmentSize.height = 1;
8624
8625 fragmentSize.width = 8;
8626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8627 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8628 m_errorMonitor->VerifyFound();
8629 fragmentSize.width = 1;
8630
8631 fragmentSize.height = 8;
8632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8633 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8634 m_errorMonitor->VerifyFound();
8635 fragmentSize.height = 1;
8636 m_commandBuffer->end();
8637}
8638
8639TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8640 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8641
8642 // Enable KHR_fragment_shading_rate and all of its required extensions
8643 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8644 if (fsr_extensions) {
8645 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8646 }
8647 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8648
8649 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8650 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8651 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8652 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8653 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8654 if (fsr_extensions) {
8655 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8656 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8657 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8658 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8659 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8660 } else {
8661 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8662 return;
8663 }
8664
8665 ASSERT_NO_FATAL_FAILURE(InitState());
8666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8667
8668 // Find address of extension call and make the call
8669 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8670 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8671 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8672
8673 VkExtent2D fragmentSize = {1, 1};
8674 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8675 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8676
8677 m_commandBuffer->begin();
8678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8679 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8680 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8681 m_errorMonitor->VerifyFound();
8682 m_commandBuffer->end();
8683}
8684
8685TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8686 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
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
8695 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8696 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8697 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) {
8701 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8702 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8703 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
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008711 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8712 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008713
8714 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8715 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8716 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8717
8718 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8720
8721 // Find address of extension call and make the call
8722 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8723 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8724 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8725
8726 VkExtent2D fragmentSize = {1, 1};
8727 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8728 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8729
8730 m_commandBuffer->begin();
8731
8732 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8734 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8735 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8736 m_errorMonitor->VerifyFound();
8737 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8738
8739 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8741 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8742 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8743 m_errorMonitor->VerifyFound();
8744 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8745
8746 m_commandBuffer->end();
8747}
8748
8749TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8750 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8751
8752 // Enable KHR_fragment_shading_rate and all of its required extensions
8753 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8754 if (fsr_extensions) {
8755 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8756 }
8757 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8758
8759 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8760 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8761 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8762 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8763 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8764 if (fsr_extensions) {
8765 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8766 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8767 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8768 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8769 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8770 } else {
8771 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8772 return;
8773 }
8774
8775 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8776 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8777 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008778 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8779 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008780 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8781
8782 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8783 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8784 return;
8785 }
8786
8787 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8788
8789 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8790 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8791
8792 // Find address of extension call and make the call
8793 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8794 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8795 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8796
8797 VkExtent2D fragmentSize = {1, 1};
8798 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8799 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8800
8801 m_commandBuffer->begin();
8802 fragmentSize.width = 2;
8803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8804 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8805 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8806 m_errorMonitor->VerifyFound();
8807 fragmentSize.width = 1;
8808
8809 fragmentSize.height = 2;
8810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8811 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8812 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8813 m_errorMonitor->VerifyFound();
8814 fragmentSize.height = 1;
8815}
8816
8817TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8818 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8819
8820 // Enable KHR_fragment_shading_rate and all of its required extensions
8821 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8822 if (fsr_extensions) {
8823 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8824 }
8825 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8826
8827 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8828 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8829 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8830 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8831 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8832 if (fsr_extensions) {
8833 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8834 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8835 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8836 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8837 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8838 } else {
8839 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8840 return;
8841 }
8842
8843 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8844 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8845 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8846 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008847 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8848 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008849 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8850
8851 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8852 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8853 return;
8854 }
8855
8856 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8857 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8858 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008859 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8860 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008861 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8862
8863 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8864 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8865 return;
8866 }
8867
8868 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8870
8871 // Find address of extension call and make the call
8872 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8873 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8874 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8875
8876 VkExtent2D fragmentSize = {1, 1};
8877 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8878 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8879
8880 m_commandBuffer->begin();
8881 if (fsr_features.primitiveFragmentShadingRate) {
8882 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8884 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8885 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8886 m_errorMonitor->VerifyFound();
8887 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8888 }
8889
8890 if (fsr_features.attachmentFragmentShadingRate) {
8891 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8893 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8894 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8895 m_errorMonitor->VerifyFound();
8896 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8897 }
8898 m_commandBuffer->end();
8899}
8900
8901TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8902 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8903
8904 // Enable KHR_fragment_shading_rate and all of its required extensions
8905 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8906 if (fsr_extensions) {
8907 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8908 }
8909 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8910
8911 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8912 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8913 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8914 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8915 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8916 if (fsr_extensions) {
8917 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8918 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8919 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8920 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8921 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8922 } else {
8923 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8924 return;
8925 }
8926
8927 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8928 if (eds_extension) {
8929 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8930 } else {
8931 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8932 return;
8933 }
8934
8935 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8936 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8937 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8938 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008939 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8940 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008941 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8942
8943 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8944 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8945 return;
8946 }
8947
8948 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8949 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8950 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008951 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008952 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008953 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8954 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008955 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8956
8957 if (!fsr_features.primitiveFragmentShadingRate) {
8958 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8959 return;
8960 }
8961
8962 if (!features2.features.multiViewport) {
8963 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8964 return;
8965 }
8966
8967 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8969
sfricke-samsung1c0b96a2021-07-08 22:24:09 -07008970 char const *vsSource = R"glsl(
8971 #version 450
8972 #extension GL_EXT_fragment_shading_rate : enable
8973 void main() {
8974 gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
8975 }
8976 )glsl";
Tobias Hector04f2ab22020-12-01 10:59:33 +00008977
Tobias Hector04f2ab22020-12-01 10:59:33 +00008978 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8979
8980 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008981 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8982 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008983 pipe.AddShader(&fs);
8984 pipe.AddDefaultColorAttachment();
8985 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008986 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008987 {
8988 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8989 pipe.AddShader(&vs);
8990 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8991 ASSERT_VK_SUCCESS(err);
8992 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008993 m_commandBuffer->begin();
8994 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8995
8996 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8997
8998 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8999 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
9000 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
9001 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
9002
9003 // error produced here.
9004 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
9005
9006 m_errorMonitor->VerifyFound();
9007
9008 m_commandBuffer->EndRenderPass();
9009 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07009010}
ziga-lunargdada63d2021-07-13 22:10:11 +02009011
9012TEST_F(VkLayerTest, InvalidCmdUpdateBufferSize) {
9013 TEST_DESCRIPTION("Update buffer with invalid dataSize");
9014
9015 ASSERT_NO_FATAL_FAILURE(Init());
9016
9017 uint32_t update_data[4] = {0, 0, 0, 0};
9018 VkDeviceSize dataSize = sizeof(uint32_t) * 4;
9019 VkMemoryPropertyFlags reqs = 0;
9020 VkBufferObj buffer;
9021 buffer.init_as_src_and_dst(*m_device, dataSize, reqs);
9022
9023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-dataSize-00033");
9024 m_commandBuffer->begin();
9025 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer.handle(), sizeof(uint32_t), dataSize, (void *)update_data);
9026 m_commandBuffer->end();
9027 m_errorMonitor->VerifyFound();
9028}